Linux 版 Csound
Csound 是一种音乐创作和声音编程语言,最初由 Barry Vercoe 在 MIT 编写。正如 Nick Bailey 在 1998 年 10 月的 LJ 文章 “Sculptor: A Real Time Phase Vocoder” 中指出的那样,Barry 最初的 MUSIC11 程序最终从 PDP-11 汇编器移植到 UNIX C,并在那里变成了 Csound。MUSIC11 来源于 Max Mathews 开创性的 MusicV 程序,Max Mathews 或许是计算机音乐技术最受尊敬的 “奠基人”。
MusicV 的主要创新之一是单元生成器的实现,这是一个 “黑盒” 概念,极大地扩展了语言的扩展性。单元生成器可以是信号发生器或修改器、修补运算码、传感器,或者它可以提供声音文件 I/O 和信号显示类型。Csound 已经发展成为 Music V 的杰出后继者,快速适应了新的合成方法和 DSP 算法。它现在处于现代计算机音乐软件的最前沿。Linux Csound 不仅仅跟上了这种发展的步伐,它还提供了在其他平台上可用的版本中找不到的功能。
1996 年,我想尝试一下 Linux 操作系统。我知道某些软件合成语言可以在其下运行,而这些语言在 DOS/Windows 机器上不可用。虽然 Csound 确实可以在 Microsoft 操作系统(以及许多其他操作系统)下运行,但我有兴趣了解它在 Linux 下的运行情况。Jonathan Mohr 已经为 Linux 添加了实时音频支持,但我立即发现自己偶然发现了另一个大型 “DIY”(自己动手)项目。从英国巴斯 FTP 站点(“规范” 包的主要存储库)获得的源代码是一个通用的 UNIX 包,没有特定于 Linux 的 Makefile 或任何其他编译便利设施。虽然我还是 Linux 和 C 编程语言的新手,但我还是投入其中并开始努力。在 John Fitch(巴斯站点和规范源代码的维护者)以及 Csound 邮件列表的热心成员的帮助下,我最终为整个源代码树生成了一组可用的 Makefile。我很快就拥有了一个快速的 Linux Csound,它完全支持 X 显示、实时音频输出和所有当前的运算码。Burton Beerman 教授慷慨地在他的 Bowling Green State University 的 MusTec 服务器上为我的 Linux Csound 软件包提供了一个 FTP 站点,并且在两年内,我一直在该站点和巴斯站点维护公共版本。
1998 年初,我收到了来自 AIMI(意大利音乐信息学协会)的 Nicola Bernardini 教授的消息。他彻底重写了 Linux Csound Makefile,并想知道我是否有兴趣将它们添加到源代码包中。他的提议来得正是时候,因为我知道代码维护需要更坚实的结构。Nicola 的专业知识恰好是在正确时刻出现的正确因素。他的 Makefile 使我能够快速准备各种发行包(带或不带 X 支持、静态构建或共享库、启用/禁用实时音频等),并编译更完整的源代码树构建版本。最重要的是,Makefile 创建了 libcsound.so,一个共享库,它极大地减少了二进制文件的内存占用(从大约 450KB 减少到不到 20KB)。
大约在同一时间,开发者 Gabriel Maldonado 编写了一组 MIDI 输出运算码,允许将 Csound 用作 MIDI 作曲/控制乐器。Csound 已经支持 MIDI 输入,直接来自 /dev/midi 或 Type 0 标准 MIDI 文件(参见 实时 Midi 输入)。Gabriel 的运算码有所不同:它们允许探索 MIDI 作曲算法,同时进行 Csound 其余部分的实时 I/O。从理论上讲,可以有一个 MIDI 设备控制一个 Csound 乐器,而另一个乐器将其输出发送到 devaudio。如果有全双工声卡的支持,甚至可以为 MIDI 和音频端口实现异步 I/O。
遗憾的是,还没有为 Linux Csound 编写例程来接受来自 Gabriel 运算码的数据并将其发送到 MIDI 端口。在研究了 John Fitch 的 Windows Csound MIDI 输出处理程序的代码后,我决定尝试为 Linux 编写适当的调用。我笨手笨脚地使用了 OSS/Free API,最终编写了激活请求的 MIDI 接口并接受从 Maldonado 运算码发送给它的控制数据的代码。Linux Csound 与任何其他版本一样是最新的,并且编写 MIDI 输出的必要代码非常简单,主要由对声卡 API 宏的几个调用组成。
为 Linux Csound 采取的下一个主要步骤是建立 CVS 存储库。我一直在向 Nicola 抱怨,我发现自己不断检查规范 UNIX 包中的所有内容,这时他建议需要一个修订控制系统。他自愿在 AIMI 设置它,经过一些反复试验的黑客攻击后,他建立了一个我们今天使用的系统。CVS 存储库为规范源代码和特定于 Linux 的代码维护单独的目录。通过这种方式,我们可以避免仅仅为了 Linux 而重写源代码,并且我们始终可以参考 “未触及” 的原始版本。允许匿名访问 CVS,但对更改的提交会受到维护者的仔细审查。
当然,除非有开发者贡献,否则 CVS 开发存储库用处不大,因此合乎逻辑的下一步是组建 Csound UNIX 开发组。程序员 Robin Whittle 和 Damien Miller 立即加入,Damien 慷慨地提供了一个网页,其中包含所有对加入该组感兴趣的人的相关信息。值得注意的是,该组是为开发而设,而不仅仅是为开发者而设。我们欢迎任何有兴趣看到 Linux Csound 成长为同类最佳语言的人。我们当然欢迎程序员,但也欢迎音乐家、音响发烧友、DSP 工程师以及任何对 Csound 及其可能性感兴趣的人。
1998 年 10 月,两位新成员为该小组的活动做出了重大贡献。Gabriel Maldonado 将他的整个源代码树捐赠给了 CVS 存储库,这使 Linux Csound 能够跟上他的 Windows 版本的开发。(这种慷慨在 Csound 社区中非常典型。在 Csound 邮件列表中发生了大量的代码共享,免费提供了新的乐器设计,以及关于各种计算机音乐问题的许多健康的辩论。)另一个重要的补充是 Fred Floberg,他的贡献需要特别描述。
Csound 对实时音频的内部支持一直依赖于对 OSS 声卡驱动程序的 API 的调用。虽然对于随意使用来说肯定足够了,但许多声音概念,例如全双工和多路复用实时音频 I/O,是 OSS/Free 驱动程序无法实现的。但是,ALSA 驱动程序确实支持这些用途;感谢 Fred Floberg 的代码,Linux Csound 现在显式支持 ALSA 接口。(由 Jaroslav Kycela 领导的 ALSA 项目正在形成一个新的扩展声音系统 API,它与 OSS/Free 兼容,但允许对 OSS/Free 不支持的声卡功能进行更高级的使用。)Fred 目前正在扩展 MIDI 文件支持。Csound 现在仅支持 Type 0 MIDI 文件,但 Linux Csound 应该很快支持 Type 1,甚至可能支持 Type 2 标准 MIDI 文件格式。
此外,感谢 Robin 和 Damien,Linux Csound 发行版现在支持流行的 RPM 打包,并且可以为 glibc (libc6) 系统构建。Debian 用户会很高兴地注意到,开发者 G<\#252>nter Geiger 已经准备了一个 DEB 格式的软件包。最后,Nicola Bernardini 编写了一个 Csound 乐团(乐器设计)解析器,我们希望它最终能够被吸收到软件包中。这样的实用程序对 GUI 设计者非常有帮助,这引出了我的下一个主题:Linux Csound 和 X 的强大功能。
我的 Linux soundapps 网页在 “Csound 助手” 部分显示了二十多个条目。以下简短的描述只是简短的描述,绝不表示这些应用程序的全部功能。此处显示的示例适用于运行 X 的 Linux 系统;Linux soundapps 页面上也包含了一些出色的命令行实用程序,适用于这些工具。所有这些实用程序都适用于当前版本的 Linux Csound(3.47 或更高版本)。
请注意,这些应用程序中的每一个都是使用免费提供的工具构建的。GNU C 和 C++ 编译器、Tcl/Tk、Java、LessTif 和 WINE 是 Linux 声音和 MIDI 软件发展中的强大盟友。他们的开发者因其为 Linux 社区的利益所做的出色工作而受到赞扬。
Cecilia(由蒙特利尔大学的 Jean Piche 和 Alexandre Burton 开发)是一个完全开发的 Csound 作曲和声音处理环境。Cecilia 完全用 Tcl/Tk 编写,利用了 Linux Csound 提供的所有可能性,呈现了一个漂亮的图形界面(当然是可定制的)和一个强大的作曲语言 (Cybil)。支持众多实时控件,程序的几乎所有方面都是用户可定义的,提供了出色的在线帮助,并且 GUI 完全利用了 X 环境中的 Tk。Cecilia 在 1997 年布尔日第二届国际音乐软件竞赛中获得了计算机辅助作曲和实现软件奖的第一名。(参见图 1。)
在规模的另一端是开发者 Matti Koskinen 的 rain,一个 GIF 到 Csound 分数转换器。Csound 分数是 Csound 乐器的控制文件,为其提供事件开始时间、持续时间、幅度、频率、波形选择等值。Matti 的实用程序只是获取 GIF 图像,应用一些用户定义的值,并神奇地将其转换为 Csound 分数。然后可以在应用程序中合成和播放该分数,或者可以将其保存到磁盘以供以后处理(可能在 Cecilia 中)。(参见图 2。)
Adsyn 是 Csound “hetro” 分析数据文件的图形编辑器。hetro 是 Csound 声音文件实用程序程序之一,其操作非常简单。它使用外差滤波器组分析声音文件,并创建分离的频率和幅度值的数据文件。Adsyn 可以读取并以图形方式表示该数据文件,并且可以使用鼠标自由更改频率和幅度分量。可以调用 Csound 的重合成运算码 (adsyn);然后可以从 Adsyn 中合成和播放编辑后的文件。Oyvind Hammer 教授最初在挪威音乐和声学研究中心 NoTAM 为 SGI 机器编写了 Adsyn。在他的恩准下,我开始了到 Linux 的移植。在 Nicola Bernardini 的大力帮助下,它完成了。(参见图 3。)
Ceres2 是 Johnathan Lee 增强版的 Oyvind Hammer 的 Ceres,我在 1998 年 9 月的 LJ 文章 “将 SGI 音频应用程序移植到 Linux” 中描述过它。Johnathan 极大地扩展了原始软件引擎的编辑功能,该引擎本质上对声音文件执行快速傅里叶变换 (FFT),并呈现其频率内容和活动的图形表示。可以以各种方式编辑图形显示,可以使用大量变换(频谱突变),可以指定最多三个图形线性控制功能,并且支持多种输出格式,包括两种类型的 Csound 分数。Ceres2 还扩展了一些命令行分析变量,例如 FFT 大小、分析窗口大小和窗口重叠。Linux 端口是由我完成的,但它依赖于在原始 Ceres 上已经完成的工作,Richard Kent 提供了很大的帮助,Richard Kent 还提供了宝贵的 tichstuff 库,这些库取代了 SGI 库。(参见图 4。)
Rosegarden 套件包括一个 MIDI 音序器、一个通用音乐记谱显示,以及能够将您的作品保存为 Csound 分数文件的非常好的功能。对于最习惯标准乐谱约定的用户来说,这样的工具特别有用,它允许他们使用熟悉的符号进行作曲,然后轻松转换他们的作品以用于 Csound 乐器。(参见图 5。)
Java 编程语言非常适合轻松创建平台中立的用户界面。Jean-Pierre Lemoine 的 HPKComposer 是一个 “纯 Java” 应用程序的绝佳示例,它可以在 Windows、Mac OS 和 UNIX 变体下运行。Linux 的准备工作很简单,具体取决于在版本 1.1.6 或更高版本中成功安装 Java 开发环境 (JDK)、Sun Microsystems 的 Swing 类库(版本 1.1 beta3)和 Csound。HPKComposer 将 CMask 程序的各个方面与 Csound 的合成和 DSP 方法结合在一起:倾向掩码用于创建合成算法,这些算法通过 Csound 的合成引擎(运算码)来实现。支持 VRML 显示,程序是用户可扩展的,尽管 Java 当前的声音支持仅限于 8 位 8 kHz 音频,但当 JDK 1.2 到来时,它将支持 16 位 44.1 kHz CD 音质的声音。(参见图 6。)
Russell Pinkston 的 Win95 版 PatchWork 是用于设计 Csound 乐器的图形 “修补程序”。虽然存在此程序的 UNIX/Linux 版本 (XPatchWork),但它尚未维护,并且需要进行一些认真的调试。但是,Linux WINE Windows 模拟器可以运行 Win95 版本,再次证明 Linux 总能找到出路。(参见图 7。)
开发者 Richard Karpen 慷慨地与 Csound 社区分享了他的许多运算码,其中一个称为 “space”。在 Csound 手册中关于 space 的条目中提到了一个 GUI,用于创建 GEN28 存储函数表所需的值,而 SoundSpace 就是那个 GUI。这个独特的实用程序用核心 Java 编写,提供了一个可视化界面,用于确定最多 8 个声音文件在听觉空间中的位置和声音轨迹,并支持立体声和 4 声道输出。(参见图 8。)
未来会怎样?在本文发表时,我希望能够运行更多 Csound/Java 应用程序。开发者 Michael Gogins 表示对看到他的 “Silence” Csound 环境在 Linux Java 下运行非常感兴趣,而著名的 IRCAM 音乐和声音研究中心宣布,他们的 MAX for Java 的 Linux 版本将在 1998 年底发布。谁知道呢?也许有一天我会完成我的 Csounder 的 Tcl/Tk 克隆,Csounder 是流行的 Windows 版 Csound “启动器”(或者至少让它在 WINE 下更好地工作)。
最新版本的 Linux Csound(3.49.xx 及更高版本)可以构建用于 64 位 DEC Alpha。感谢开发者 Ed Hall,Linux Csound 可以声称是第一个广泛且免费向公众提供的 64 位音乐和声音合成语言。
Nicola Bernardini 继续改进发行版打包:构建 Linux Csound 比以往任何时候都更容易,这要归功于他集成了 configure 实用程序。容纳 autoconf 和 automake 的工作正在进行中,因为使用可用的最佳工具来创建最佳可能的发行版是主要目标。
开发组面临的有趣问题之一是如何使 Csound 可重入,从而为 Csound 启用插件架构。对我们许多人来说,这样的 undertaking 意味着完全重写 Csound,谁知道这可能会导致什么——“Linux Csound 之子”,也许?如果您想加入一个非常有趣的分布式开发项目,请查看 “资源” 中列出的链接,并随时加入开发组邮件列表。
Richard Boulanger 是伯克利音乐学院音乐合成系的教授。在 1999 年春季,他的 Csound 书籍最终将由 MIT Press 出版。在随附的 CD 之一中,您会找到一篇关于在 Linux 下运行 Csound 的文章(当然,到那时它将过时)。是的,它是我写的,但我提到它不是为了自我吹嘘。这本书是一本巨著,其中包括来自国际 Csound 社区所有主要(和一些不太重要的)成员的贡献。它应该会启发许多新用户,其中一些人将首次发现 Csound 在 Linux 平台上可用。
Linux Csound 为实时计算机音乐表演提供了巨大的可能性。随着实时支持的进步,Linux Csound 有望保持在合成方法、界面设计、DSP 算法和作曲策略的最前沿。它是当代声音探索的理想工具,它再次证明了 Linux 的灵活性和强大功能,Linux 是现代音乐家的前沿操作系统。
David Phillips (dlphilp@bright.net) 是一位居住在俄亥俄州的作曲家/表演者。最近的计算机音乐活动包括为艺术家 Phil Sugden 创作环境音乐作品,在 Bowling Green State University 讲授计算机音乐编程语言,以及维护 Linux 版 Csound 的 “官方” 版本。Dave 还喜欢阅读拉丁诗歌、练习太极拳,以及与他可爱的伴侣 Ivy Maria 共度的任何时光。