算法音乐作曲与 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。