AlgoScore - 数字音乐

作者:Dave Phillips

今年早些时候,我发现了 Jonatan Liljedahl 的 AlgoScore,这是一个基于 Csound 的声音和音乐创作程序。可惜的是,当时我无法在 Dave 工作室的机器上运行 AlgoScore。我构建的 Csound 使用双精度数值,而 AlgoScore 与该构建选项不兼容。然而,Jonatan 最近重新审视了这个问题,解决了它(在 Victor Lazzarini 和 Csound 开发者邮件列表上的其他朋友的帮助下),我现在可以使用双精度 Csound 编译和运行 AlgoScore。

图 1:AlgoScore

Csound 是一个令人惊叹的声音和音乐制作与处理环境,拥有数百个函数和例程,几乎可以以任何可以想象的方式弯曲、折叠和纺织您的声音杰作。然而,尽管 Csound 具有强大的功能,但学习使用 Csound 对新手来说可能尤其麻烦。Csound 是一种编程语言,具有基于文本的本机界面,这一事实常常让那些被 Csound 丰富资源诱人描述所吸引的潜在用户感到沮丧。对于许多新用户来说,这种基于文本的界面是环境中最令人沮丧的方面。

程序员们设计了各种实用程序和应用程序来缓解使用 Csound 的困难。大多数软件都用 GUI 替换了文本界面。GUI 对于简单的启动器和单用途实用程序可能很简单,或者对于功能更全面的环境可能非常复杂。大多数程序的设计都包括最少的文本输入和最大程度地使用 GUI 的图形工具。AlgoScore 的设计认识到并解决了对适合任务的文本和可视化工具的需求。

它是什么,它不是什么

在 AlgoScore 网站上,Jonatan Liljedahl 将他的程序介绍为

...一个用于算法作曲的图形环境,音乐直接在交互式图形乐谱中构建。

根据维基词典,算法是

一个精确的逐步计划,用于计算过程,该过程以输入值开始,并在有限的步骤中产生输出值。

算法音乐作曲是将此类计算过程应用于生成音乐素材(音高、力度、节奏、乐器、形式等)的值的过程。本文篇幅有限,无法进一步讨论算法音乐,但在 Google 上搜索“算法作曲”会找到大量学习资料。我强烈推荐 algorithmic.net 作为起点。

AlgoScore 不是“图形作曲”环境,即声音不是由图形本身创建的。AlgoScore 提供图形对象,但它们的最终内容和形状来自 Csound 和/或 Nasal 代码(软件包中包含 Nasal 解释器)。因此,与简化 Csound 的其他程序不同,AlgoScore 需要一些计算机编程知识。幸运的是,Csound 和 Nasal 是相对简单的语言,即使只熟悉一点,也能让您深入了解 AlgoScore 的可能性。

AlgoScore 的主显示屏呈现一个时间线,各种对象将沿其排列。这些对象包括音频和 MIDI 总线、数据生成器、包络结构和许多其他有用的类型。对象可以直接连接到时间线,或者它们的输出可以路由到在到达输出总线之前调制其他对象,并且每个对象都有一组独特的参数,可以自由编辑。如前所述,您的编辑将导致对象的新形状。图 2 和图 3 显示了“连接前和连接后”的图像,以阐明此过程。

图 2:对象调制 - 连接前

图 3:对象调制 - 连接后

构图是通过反复测试您的代码对对象的影响以及对象对时间线和彼此的影响来构建的。这种工作流程类似于其他非实时作曲环境,例如 HighCOpenMusic。您设置初始对象,根据需要连接它们,调整和扭动参数值以满足您的心意,聆听结果,并重复该过程,直到作品完成并让您满意为止。那时,您可以选择将其留待以后编辑,也可以将其导出为 WAV 或 MIDI 文件。

需要明确的是,AlgoScore 不是 MIDI 音序器或音频编辑器。它的事件显示不能直接编辑,但您的作品可以导出为 WAV 或 MIDI 文件,以便在您喜欢的程序中进行后期处理。AlgoScore 不提供对 Csound 中所有功能的访问,但该程序是可扩展的,并且可以由用户定义的对象进行自定义。

获取和安装

适用于 Linux 的 AlgoScore 仅以源代码 tarball 形式提供,这意味着您必须自己构建和安装该软件(OSX 用户可以下载预构建的软件包)。AlgoScore 本身有一些特定的依赖项,例如最新版本的 Csound 和 JACK,并且其构建过程需要最新版本的 Cmake 实用程序。只要您满足其要求,构建程序并不困难。请参阅 AlgoScore 网站以获取下载链接以及有关安装的更多详细信息。

顺便说一句,我在编译 AlgoScore 时遇到了一些问题。我按照包含的说明构建了程序,但二进制文件在打开时发生了段错误。在与 Jonatan Liljedahl 进行了一些交流后,确定 CFLAGS 必须包含 -O2 或 -O3 的优化标志。我输入了

    export CFLAGS="-O2"

在 bash 提示符下,重新编译了 AlgoScore,程序打开时没有报错。

我能够在 32 位和 64 位系统上构建和安装 AlgoScore,但 64 Studio 的 JACK 版本太旧,无法使用 AlgoScore 的 JackMIDI。唉,由于编译器错误,我无法构建 JACK 当前的 SVN 源代码。AlgoScore 在我的 64 位机器上可以作为纯音频系统良好运行,但我期待尽快使用其 MIDI 功能。

图 4:从 AlgoScore 到 QSynth

Csound 是 AlgoScore 用于作品播放和导出的音频渲染引擎。为了获得最佳效果,请使用最新版本的 Csound,尽管 5.xx 系列中的大多数版本都应该可以正常工作。关于 JACK 的情况有所不同。大多数版本的 JACK 都适用于 AlgoScore 的音频方面,但该程序的 MIDI 方面利用了相对较新的 JackMIDI 协议,该协议仅在 JACK 大于 0.102.0 的版本中可用。图 4 显示了 QJackCtl 中的 JackMIDI 连接面板,以及同一会话的音频和 ALSA 音序器连接。如果您的 QJackCtl 未显示 JackMIDI 面板,您可能需要升级 QJackCtl。旧版本的 JACK 也可能存在问题,即使它们支持 JackMIDI。早期的实现与最近的版本并不相同,因此您可能需要升级 JACK。

程序默认设置在大多数系统上都应该令人满意,但使用“文件/首选项”对话框进行配置非常简单。许多功能可以在此对话框中自定义,包括 GUI 主题和您选择的外部文本编辑器。

使用 AlgoScore

AlgoScore 的界面约定有些不寻常。弹出菜单可通过将鼠标指针放在对象上,然后按计算机键盘上的相关命令键来使用。例如,如果指针位于包络对象上,我可以按“p”键打开对象属性对话框。在对话框中编辑参数后,我单击“应用”按钮,瞧,对象的形状会使用新值更新。同样,如果我将鼠标指针放在数据生成器上并按下“e”键,则会打开一个文本编辑器,其中包含数据生成器包含的代码。同样,“应用”按钮将更新生成器的结果。例如,如果 MIDI 事件生成器连接到 evgraph(事件图)对象,它将使用生成器创建的新事件集重新填充图形。非常酷。

其他约定包括对象拖动、复制和删除。右键单击形状将打开其连接对话框,右键单击主显示画布的空白区域将弹出对象创建器对话框。双击该对话框中的选择以将对象添加到画布。通过选择源对象连接对话框中的“输出”选项来建立连接(见上文)。当您释放鼠标右键时,将出现一条虚拟线,可以将其连接到总线或其他对象。当导线固定到其目标时,将出现另一个对话框,用于连接的功能,即对象是调制另一个对象的频率、直接向输出总线提供事件流还是执行其他有效的操作。

发出声音

从 AlgoScore 获取声音非常简单。在图 5 所示的示例中,数据生成器已连接到 MIDI 输出总线。生成器创建 MIDI 音符事件,并通过 MIDI 总线将其发送到您连接到 AlgoScore 的 JackMIDI 连接的任何目标。音频输出以类似的方式使用音频输出总线创建,并且音频和 MIDI 总线可以同时存在于同一作品中。JackMIDI 提供时间戳 MIDI 事件流,可确保 MIDI 和音频总线上的事件紧密协调。

图 5:数据生成器对象正在工作

AlgoScore 可以通过其 signal_bus 对象用作外部控制设备。根据手册,此总线通过 JACK 信号端口发送原始浮点值,然后可以将其连接到 JACK 系统中的另一个程序。midi_bus 可以以类似的方式使用,以提供一个简洁的图形环境来生成 MIDI 事件流,然后可以将其路由到远程控制程序,例如 AVSynthesis。默认情况下,MIDI 总线接受音符开/关、弯音轮和音量(CC #7)事件,以及原始 MIDI 字节的消息类型。

图 6 显示了 AlgoScore 工作的一个简单示例。数据生成器生成一组事件,这些事件被路由到 MIDI 总线,AlgoScore 与 JackMIDI 的连接(或 MIDI 文件输出的源)。生成器的事件也发送到 evgraph 对象,即事件显示图。在图表下方,我放置了一个 linseg 对象,这是一个具有简单上升和下降曲线的包络。此包络连接到 MIDI 总线,在那里它使用 MIDI 音量控制器消息流调制数据生成器音符。

图 6:调制的 MIDI

让我们仔细看看该数据生成器中的 Nasal 代码

    out.resolution = 0;         # required
    out.interpolate = 0;        # required
    out.data = setsize([], 85); # number of events generated

    math.seed(690);             # for the randomizing functions

    forindex(i; out.data) {         # start event production loop
      t = math.irand2(0, length);   # randomize start time
      n = math.irand2(60, 90);      # randomize note number
      v = 20 + math.linrand() * 100; # randomize velocity
      d = math.linrand() + 2.0;     # randomize duration
      out.data[i] = [t, [n, v, d]]; # create the event
    }                               # end production

注释澄清了这段代码是一个小机器,它创建了 85 个 MIDI 音符事件流,这些事件具有不同的开始时间、持续时间、音符编号和力度。当 datagen 对象连接到 MIDI 总线并且 AlgoScore 处于播放模式时,音符将沿总线发送到您选择的 JackMIDI 目标,通常是软合成器或外部音源模块。

如前所述,显示屏底部的 linseg 对象表示上升和下降的 MIDI 连续控制器消息流。首次调用该对象时,需要更改其默认属性值。图 7 显示了 linseg 对象的属性对话框,该对话框已编辑了长度、高度、填充和包络断点。此处将对象的功能定义为控制 MIDI 总线上的事件流的音量,但它也可以定义弯音曲线。对象可以自由连接到总线、图形和其他对象,但有一些限制。AlgoScore 的控制台窗口将报告任何无效连接或错误数据

图 7:linseg 对象的属性编辑器

当所有对象值都设置好并且所有数据生成器都进行了初始运行时,我单击传输/状态栏中的“播放”按钮,以将实时 MIDI 事件流发送到 AlgoScore 的 JackMIDI 输出端口。或者,我可以选择“文件/导出总线”将乐谱的输出保存为标准 MIDI 文件。

我只遇到了两个值得注意的性能问题。第一个问题很麻烦,但很容易解决。如果 MIDI 音符事件的持续时间超过 evgraph 对象的长度,则可能会导致音符卡住。要解决此问题,请断开外部合成器的连接,延长图形以适应事件持续时间,然后重新连接合成器。您可能需要关闭并重新打开目标声音设备以消除卡住的音符。第二个问题发生在 AlgoScore 的 JACK 连接僵化时,这又是另一个容易解决的问题,这要归功于“乐谱/重新连接 JACK”菜单项。

文档

在此用户看来,学习如何使用 AlgoScore 的最佳方法是玩示例,调整参数以查看和听到“如果发生什么”。如需更多帮助,AlgoScore 网站包含 HTML 和 PDF 格式的完整软件包文档,以及指向 使用 AlgoScore 制作的音乐的视觉和录音示例的链接。邮件列表和 IRC 线路完善了通信渠道,AlgoScore 的作者在这些渠道中回复有关他的程序的任何和所有问题。

结尾

我偏爱延迟时间算法作曲系统。我喜欢思考我在做什么,也喜欢计划我将要做什么,但同时我也希望系统结果给我带来惊喜和启发。对于我的目的,AlgoScore 提供了两种方法的最佳效果。由于精心设计的用户界面,周转时间很快,并且播放是即时且简单的。在这一点上,我对 AlgoScore 的唯一愿望是支持 OSC。Jean Pierre-Lemoine 最近为 AVSynthesis(更多基于 Csound 的软件)添加了 OSC 支持,我很乐意在 AlgoScore 中设计 OSC 消息生成器,这些生成器可以路由到控制 AVSynthesis 中的音频和视觉参数。啊,音乐机器的甜蜜梦想。

加载 Disqus 评论