使用 Linux 进行算法音乐创作,第 1 部分
Dave 将引导读者了解三个旨在通过数字方式创作音乐的 Linux 软件包。
在接下来的几周里,我的文章将重点介绍专门为通过算法进行音乐创作而设计的软件系统。维基词典将算法定义为“……一个精确的逐步计划,用于计算过程,该过程从输入值开始,并在有限的步骤内产生输出值”。按照这个定义,算法音乐创作是使用此类程序来生成作品的音高、力度、节奏、乐器配置和其他形式方面的数值的过程。
我将描述的软件包是将一组工具捆绑在一起的系统,这些工具通常包括语言组件、某种形式的图形 I/O 以及用于各种输出目标的编译器。这些系统对于作曲家如何使用系统本身或其生成的数据没有施加任何特定规则。完整的作品可以通过算法方式生成,或者系统可以用于在原本严格确定的作品中生成单个乐句的一系列变体。软件服从所用算法的计划,产生其计算结果,并将这些结果交给作曲家。作曲家服从创作冲动的要求,并可以自由支配生成的材料。
在本文中,我将评测 Heinrich Taube 教授的 Grace。接下来的文章将介绍 Michael Gogins 的 CsoundAC 和 Christopher Ariza 的 athenaCL。每个系统都有其独特的特点,并且每个系统都是算法作曲家软件库的宝贵补充。
Grace
Common Music/Grace 是一个软件系统,旨在帮助作曲家创作采用机会、随机、分形和其他随机方法为其音乐素材生成数值的音乐风格。Common Music 是一种音乐编程语言,其中包含多种对算法作曲特别重要的函数和例程。Grace 是图形实时算法作曲环境 (Graphic Realtime Algorithmic Composition Environment),是一个基于 JUCE 的 Common Music GUI,包括 Sal 和 Scheme 语言方言的代码编辑器、一组预定义的乐器、带有播放和各种显示选项的交互式绘图器、各种输出目标以及对主机系统音频和 MIDI I/O 服务的访问。Common Music 透明地集成到 Grace 系统中,因此在本文的其余部分,我将简单地称为 Grace,大小写与 GUI 启动画面中显示的相同。

顺便说一句,Taube 博士于 1989 年在斯坦福大学的 计算机音乐和声学研究中心(更广为人知的名称是 CCRMA,发音就像 karma)启动了 Common Music 项目。1996 年,Common Music 在布鲁塞尔国际音乐软件竞赛中获得一等奖,该系统至今仍在伊利诺伊大学香槟分校/厄巴纳分校不断发展。
安装与配置
如果您运行 Fedora 或 Ubuntu,获取 Grace for your system 的最简单方法是下载预编译的二进制文件。如果您需要或想要自己构建它,该过程并不十分困难,但是您将需要安装一两个不常见的依赖项。有关构建系统的完整说明,请参见 Common Music 网站。
无需为系统范围的使用安装二进制文件。要运行它,只需进入您打开软件包文件的目录并在那里启动二进制文件,即
cd $HOME/Grace ./Grace
您很快就会看到如图 1 所示的 Grace 控制台。现在您需要从音频菜单下的对话框中配置其音频和 MIDI 设置(图 2)。Linux 版本的 Grace 支持 ALSA 和 JACK 音频。就我个人而言,我更喜欢 JACK,但是该系统与任何引擎都能很好地配合使用。但是,如果您决定使用 JACK,则可能需要增加其缓冲区周期大小。我通常以较小的周期(128)运行我的 M-Audio Delta 66 以获得低延迟性能。唉,使用该设置,Grace 音频文件播放器在播放过程中会出现明显的间断 - 用 JACK 的术语来说是 xruns - 因此我将周期大小调整为 1024 并消除了 xruns。

MIDI 配置对话框允许您选择首选的 MIDI 输入和输出端口,但不幸的是,配置有些混乱。无论我在配置对话框中选择了哪个端口,只有 Juce Midi I/O 端口(图 3)发送和接收数据。只要这些端口配置正确,一切都工作正常,但是这种混乱可能会令人恼火。

配置音频和 MIDI 端口后,您就可以使用 Grace 进行作曲了。
Grace 编程
我将直接进入 Grace 的代码级别编程,因此,如果我暂时不解释某些内容,请耐心等待。Sal 是一种编程语言,但不需要计算机科学学位即可掌握其要点。编辑现有代码并构建我自己的有用代码片段库被证明是我进入该语言的最佳途径。我不会声称精通整个语言 - 我在工作中尚未需要许多方面 - 但是我发现学习我需要/想要知道的部分很容易。当然,如果您有一些其他编程语言的经验,您进入 Sal 的方式将更加顺畅。
我们将从使用系统的代码编辑器之一创建一些 MIDI 数据并将其发送到 MIDI 输出端口开始我们的探索。从“文件”菜单中打开一个新的编辑器。我们的示例以 Sal2 语言编写,因此打开编辑器的“选项”菜单并将语法设置为 Sal2。您可以选择将其设置为默认语法,也可以根据需要将其设置为 Lisp、原始 Sal 或纯文本。
Grace 的前身是 Common Music,这是一种明确派生自 Lisp 的语言,专为音乐创作而设计。在 GraceCL 版本的系统中仍然支持 Common Music,并且 Scheme 实现保留了足够的括号来满足大多数铁杆 Lisp 用户,但我相信新用户更可能享受以 Sal 进行编程的相对轻松。与原始 Common Music 语言一样,Sal 包括用于乐句生成和操作、模式排序/重新排序、频谱合成、元胞自动机和许多其他有趣过程的工具。它还具有简洁语法的吸引力。
考虑一下从 midiout.sal 教程中提取的这段 Sal 代码片段
loop repeat 8 for t from 0 by .125 send("mp:midi", t, key: between(40, 90)) end
不错。没有括号或其他语法上的麻烦。
复制该片段并将其粘贴到您打开的编辑器中(图 4)。通过在编辑器中选择代码块 - 或仅将光标放在 end 标记之后 - 并按下 Ctrl + Enter 组合键来运行代码。或者,您可以从编辑器的“Eval”菜单中选择“执行”项。如果连接配置正确,您应该能够将新创建的 MIDI 消息从编辑器路由到您的系统可用的任何 MIDI 设备(软件或硬件)。对于此处的示例,我建议使用带有通用 MIDI 音色库的合成器或采样器。

即使对于非程序员来说,某些代码的功能也可能是显而易见的。循环重复自身 8 次并执行循环内的指令,即 for 语句和 send 命令。for 语句通过将变量 t 的值设置为 0 并在循环的每次迭代中将其增加 .125 来定义变量 t。send 命令以以下格式发送 MIDI 消息
send (midi_port:midi_note_event start_time MIDI_keynumber)
在代码块中,消息开始时间由变量 t 定义。在每次循环重复时,消息开始时间将增加 .125 秒。MIDI 音符编号由一个名为 between 的函数定义,该函数选择一个介于 40 和 90 之间的随机整数(MIDI 音符编号范围为 0 到 127)。不需要显式的 MIDI 音符关闭消息,Common Music 将在消息持续时间的末尾自动结束消息,即在消息持续 .125 秒后。
因此,我们的代码片段创建了八个不同的随机选择的 MIDI 音符事件,这些事件以均匀间隔的时间间隔出现,并将每个事件发送到为该任务选择的 MIDI 端口(请参阅“音频/MIDI 输出”菜单项)。从那里开始,它将何去何从取决于用户,尽管在这种情况下,我建议将 MIDI 输出路由到合成器或采样器。
让我们在三个访问点对代码进行一些简单的更改。我们将更改循环的重复次数,我们将重新定义 t 的持续时间,并且我们将扩大 between 函数的数字范围。
loop repeat 16 for t from 0 by .250 send("mp:midi", t, key: between(32,96)) end
此时,精明的 MIDI 音乐家可能会想知道通常伴随 MIDI 音符事件的其他信息。不用担心,除非另有说明,否则其他信息 - 速度、控制器数据、音高弯音 - 都以默认值存在。例如,如果未填充 key: 插槽,则将使用其默认值 60。
为了最后的润色,我们将添加一个随机 MIDI Program Change 编号,以便为每次运行选择一个新的乐器。我们希望将输出保存到 MIDI 文件,因此我们还将添加一种机制来执行此操作
file "midi-loop-01.mid" () loop repeat 12 for t from 0 by .125 send("mp:prog", val: random(16)) send("mp:midi", t, key: between(32,96)) end end
现在,当代码执行时,它将像以前一样实时执行其操作,并创建一个性能的 MIDI 文件。顺便说一句,在示例中,文件将写入当前目录,但是您可以指定您喜欢的任何路径。
我将其留给读者进一步实验。请查阅 Grace 帮助菜单中的 Common Music 参考文档,以查看可以使用哪些其他随机化例程来替换我们的示例代码中使用的例程。从“帮助”菜单中加载其他示例和教程,试验代码,然后再进行更多试验。
使用绘图器作曲
绘图器(图 5)是一个归一化的 2D 图形,其功能类似于钢琴卷帘式音序器显示,减去了跟踪光标。通过在按住 Ctrl 键的同时用鼠标单击(任何鼠标按钮都可以)在图形上添加一个点,并且可以通过选择一个点然后按 Delete 键来删除该点。双击一个点以打开精确编辑器,双击图形内的任何其他位置以打开当前图层的编辑器。

您可以通过“音频”菜单中的“播放绘图”对话框播放图形。此对话框确定播放长度、音符持续时间和幅度值、MIDI 通道以及其他播放功能。您还可以通过此面板将绘图的输出另存为 MIDI 文件。

数据显示可以设置为仅点、连接点(包络显示)、未指向的线、垂直和水平框以及其他表示形式。可以通过“绘图”菜单下的“导出”对话框将绘图器的数据转换为 Sal、Lisp 或 XML。数据可以格式化为包络列表或点记录,并发送到您当前的代码编辑器、新编辑器或剪贴板。您可以将 MIDI 文件加载到绘图器中 - 在这种情况下,显示不再归一化(图 6)- 并且可以随意编辑和导出该数据。此功能为大型数据集的转换过程打开了一些令人着迷的可能性,但是,唉,篇幅有限,无法进一步探索绘图器。我们必须继续描述 Grace 目标。
结尾
在本系列的下一部分中,我们将继续探索使用 Grace 系统制作的算法音乐。