算法音乐作曲与 Linux,第二部分
在本系列文章的这一部分中,我们将完成对 Grace 算法作曲环境的巡览。
目标Grace 可以为其输出格式化为以下目标和文件类型
- 音频 - 实时和文件 (WAV, AIFF 等)
- MIDI - 实时和文件 (MID)
- OSC - 实时
- Csound - 实时和乐谱文件
- FOMUS - 文件 (LilyPond 和其他)
我们已经考虑过 Grace 作为 MIDI 文件和实时演奏的生成器。现在让我们看看它如何与 Csound 协同工作。
Csound 连接如果您还不了解 Csound,这里是来自 cSounds.com 网站的描述
Csound 是一个声音设计、音乐合成和信号处理系统,为作曲和演奏提供工具
就目前而言,我们有兴趣将 Csound 用作合成器。我们将使用 Grace 作为 Csound 格式乐谱的生成器,然后我们将使用 Csound 合成器演奏的乐器将该乐谱渲染为音频文件。

音频菜单包含一个 Csound 相关功能的子菜单,包括 Grace 的 Csound 设置对话框(图 7)。默认选项对于新用户来说应该没问题,而经验丰富的 Csound 用户会欣赏随意重新定义这些选项的选择。顺便说一句,生成的声音文件将放置在当前工作目录或 SFDIR(Csound 环境变量)指定的目录中。
process randscore()
repeat 196
send("cs:i", pick(1,2,3,4),
between(0,300),
pick(.5,1,1.5,2,2.5,3,3.5,4),
between(1000,7000),
between(100,1400),
pick(1,2,3,4))
wait between(.5,2.5)
end
sprout (randscore(), "simple.sco")
图 8 显示了运行该代码的结果。每次随机化都会为 Csound 乐谱语句中的每个槽(称为 p 字段)设置一个特定值。前三个 p 字段保留用于乐器编号、开始时间和持续时间。这些字段分配无法更改,但从 p4 开始的字段可以定义乐器使用的操作码所需的任何其他内容。在示例中,最后三个随机化为幅度、频率和函数表编号分配值,之后 wait 命令指示重复过程等待 0.5 到 2.5 秒之间的时间。

使用这种代码创建庞大的乐谱是一件微不足道的事情。我曾多次使用 Common Music 创建大型乐谱,如果没有它的帮助,这些乐谱是不可能实现的。Grace 让这个过程变得更加容易。
FOMUS 和 GraceDavid Psenicka 的 FOMUS 太酷了。这个程序接受您的 Grace 输出,并将其转换为与 Finale、Sibelius、Common Music Notation 和 LilyPond 音乐记谱软件包兼容的格式。令人高兴的是,出色的 LilyPond 是这些软件包之一,让 Linux 用户有机会看到他们的算法程序的结果转化为标准乐谱。FOMUS - 名称代表 "FOrmat MUSic" - 不是一个乐谱编辑器,但其输出可以在目标程序中进行编辑。
以下示例展示了 FOMUS 在 Grace 中的工作。请记住,由于算法的性质,每次运行代码,乐谱都会有所不同。
;;; define a process called fomex
process fomex ()
;;; a for loop that defines the voice number, i.e. upper or lower staff
for v from 1 to 2
;;; loop for the value of off in steps of 1/2,
;;; i.e. eighth notes (quavers)
loop for off from 0 to 10 by 1/2
;;; create a fomus note message with delta time of off
send( "fms:note", time: off,
;;; if off is less than 10 set the note duration
;;; to an eighth note
;;; else make it a quarter note (crotchet)
dur: #?(off < 10, 1/2 , 1),
;;; if the voice number is 2 set the pitch
;;; between MIDI note numbers 35 to 60
;;; else give it a pitch between MIDI note numbers 60 to 85
pitch: #?(v = 2, between(35, 60), between(60, 85)),
;;; use the odds function to determine where to apply
;;; the LilyPond directive to create phrase curves (..)
voice: v, marks: odds(.333, {"(.."}))
;;; end the loop
end
;;; end the process definition
end
现在我们使用 sprout 调度器运行我们的 fomex 进程,以创建一个 LilyPond 文件
;;; start the run
begin
;;; define some score attributes
with parts = {{:id "apart" :name "Piano" :inst "piano"}}
;;; run the fomex process to create a LilyPond-ready file
;;; with the score attributes defined above
sprout( fomex(), "fomex.ly", parts: parts)
;;; end the run
end

这些示例是来自 Examples 中的 fomus.sal 代码的略微编辑版本。我添加了注释,以期以同行音乐家可以理解的方式澄清其活动,图 9 应该可以启发任何想知道代码到底在做什么的人。如果您安装了 LilyPond 和 PDF 查看器,Grace 将自动设置 FOMUS -> LilyPond -> 查看器链。太棒了,并且对生产周期非常有帮助。
OSC 振荡开放声音控制 (OSC) 数据传输协议也受到 Grace 的支持。我在之前的文章 OSC 简介 中描述过 OSC,因此我将读者参考该文章以了解缺失的背景知识。这里足以说明 Grace 的工作方式与我的文章中描述的 OSC 感知程序完全相同。

最新版本的 Ardour 包括支持使用 OSC 消息控制 DAW(数字音频工作站)(图 10)。对于我们这些喜欢玩算法混音的人来说,这个功能非常令人兴奋。让我们看一个简单的代码示例,该代码旨在通过 OSC 消息控制 Ardour 的某些方面。
Ardour 默认情况下不启用其 OSC 连接,因此首先我们需要访问其“选项/杂项选项”菜单并激活“使用 OSC”项。但是,在我们从 Grace 发送任何消息之前,我们需要知道 Ardour 期望看到的消息格式。Ardour 有许多控件,所有这些控件现在或将来都可以通过 MIDI 和/或 OSC 访问。幸运的是,Ardour 同行 Gwen Coffy 准备了一份 Ardour 的 OSC 消息类型列表 及其格式。我们将从一个简单的示例开始,该示例切换播放和停止状态
;;; Open the OSC connection between Grace (sends on port 7779)
;;; and Ardour (receives on port 3819).
send("osc:open", 7779, 3819)
;;; Starts playback in Ardour.
send("osc:message", "/ardour/transport_play")
;;; Stops playback.
send("osc:message", "/ardour/transport_stop")
现在让我们 concoct 一些代码,其中 Grace 从 OSC 消息列表中随机选择要发送到 Ardour 的消息
process ardourcon()
repeat 8
send("osc:message", pick("/ardour/goto_start",
"/ardour/rewind",
"/ardour/transport_play",
"/ardour/transport_stop",
"/ardour/ffwd"))
wait 8
end
sprout(ardourcon())
每次执行代码时,它都会从选择列表中进行新的选择。由于重复不会排除之前的选择,因此运行可能会重复之前的选择,但请不要害怕,它仍然按预期工作。
该示例仅仅是对功能的简单演示。在这一点上,应该很明显,我们可以使用循环和其他控制结构,并为更多 Ardour 操作添加其他随机选择功能。我将探索这些可能性留给读者,并邀请 OSC 同行评论他们自己在使用 Grace/OSC/Ardour 三人组进行的实验。
Schottstaedt 连接Grace 很好地利用了来自同行 Commoner Bill Schottstaedt 的通用 Lisp 音乐 (Common Lisp Music) 和他的 SndLib 库的代码。音频菜单中的乐器浏览器(图 11)提供了六十多种在通用 Lisp 音乐中设计和测试的预构建乐器。许多乐器都包含示例文件,您可以试听以了解所选乐器是否适合您的音乐。这些乐器包括典型的音乐声音,例如钢琴、钟声和合成声音,以及一些更不寻常的声音,例如昆虫、动物和海浪声音的模拟器。

Grace 使用 SndLib 来支持 ALSA 音频和 MIDI 服务以及 JACK 音频服务器。唉,我无法在低延迟设置下使用 JACK,而不会出现 xruns 和音频失真。我通过将 JACK 的周期大小提高到 1024 来解决了 xruns/失真问题,但当然我不得不牺牲我的低延迟音频。哦,好吧,对于我的目的来说没什么大不了的。接下来,我为 Common Music 的 MIDI 数据目标指定了 MIDI Through,但是当我将 Through 端口连接到 QSynth 时,什么也没有发生。最终我意识到,尽管我在 Grace 中选择了设备,但我必须将 Juce Midi Output 端口连接到 QSynth,如图 3 所示。
顺便说一句,FOMUS 在其目标软件包中包括 Bill 的 通用音乐记谱法。如果这还不够,Grace 的 Scheme Lisp 方言的实现称为 S7,并且来自 - 您猜对了 - Bill Schottstaedt。
文档可以通过“帮助”菜单访问 Grace 的文档,其中提供了指向通用音乐、Sal、Scheme 和通用 Lisp 音乐的参考手册的链接。还提供了链接,可立即将您带到通用音乐和其他相关软件的网站起始页。“帮助”菜单包括 Sal 和 Scheme 方言的出色示例和教程,强烈推荐给新手和经验丰富的用户。您可以运行这些文件,而无需了解其宿主语言的任何知识。但是,这些文件都经过仔细注释,为所有用户提供了信息丰富的便利。
Taube 博士撰写了一本关于使用通用音乐进行算法音乐作曲的书,名为 Notes From The Metalevel。该书于 2004 年出版,在某些方面可以理解为已过时,但其对通用音乐的阐述仍然很有价值。我向任何认真对算法音乐作曲艺术感兴趣的人推荐它。
如果您在“帮助”菜单或 Rick 的书中找不到您需要的内容,您可以加入 cm-dist 邮件列表。该列表与通用 Lisp 音乐用户共享其流量,并且相关性水平非常高,即有很多信号,没有太多噪音。Rick 快速而友好地回应在使用通用音乐时遇到问题的用户,Bill Schottstaedt 也随时可以帮助解决他的软件问题。
结尾我希望您喜欢阅读这篇 Grace 简介。我也希望你们中的一些人受到启发,亲自查看该系统。多年来,我一直关注 Rick Taube 的工作,我必须说 Grace 是他对这项工作迄今为止最出色的阐述。通过利用 Csound、通用 Lisp 音乐、FOMUS、SndLib、OSC、MIDI、Emacs 以及他自己的通用音乐的力量,他为探索算法作为制作音乐的手段创造了一个最强大的环境。
在我的下一篇文章中,我将介绍另一个算法音乐作曲环境,即作曲家和 Csound 开发人员 Michael Gogins 的 CsoundAC。
