RTcmix for Linux:第一部分
RTcmix 是一种执行音频合成和效果处理的软件包。基本上,它是 Cmix 语言的实时版本。通过一种名为 MINC(MINC 不是 C)的 C 风格脚本语言来实现对程序执行的标准控制。早在“开源”这个词被创造出来之前,它就已经是开源的了。这一事实是其发展的关键。
在过去的 20 年里,实际上有数十位 RTcmix 黑客。我已经尽力对本文涉及的内容给予了一些肯定。您也可以查看最新发行版中包含的 AUTHORS 文件(请参阅下面的“获取和安装”)。
Cmix 来源于 MIX 程序,这是一个由 Paul Lansky(在普林斯顿大学)于 1978 年编写的 20 轨混音器,它在 IBM 大型机上的 VMS 上以 FORTRAN 运行。添加了合成功能,Paul 在 1983-84 年将 Cmix 移植到 BSD2.9 UNIX 下的 PDP11/34 上运行。1985 年,他将其移植到 DEC MicroVAX 上的 Ultrix 系统。他和 Lars Graf 在 1987 年添加了 MINC 解析器,Brad Garton 和 Dave Madole 在各个部分提供了帮助。Cmix 在 NeXt(和其他 UNIX 系统)下愉快地存在了几年,其用户群主要在学术机构。它一直并将继续用于教学、计算机音乐创作和研究开发。
Doug Scott 和 Paul Lansky 在 1995 年将最初的实时版本移植到 SGI。而在 1993 年的某个时候,作为哥伦比亚大学计算机音乐中心 (CMC) 的学生和研究助理,我首次尝试了 Linux 移植,这必须使用 Sox 来反转大端文件。那真是太有趣了。1995 年底,Brad Garton(CMC 主任)和我创建了一个带有调度器的实时版本。RTcmix 诞生了,最初在 IRIX 下运行。移植到 Linux 基本上需要将 IRIX 音频 API 替换为 OSS(开放声音系统)。最初的 IRIX 版本在 1997 年的国际计算机音乐会议 (ICMC) 上展示。此后不久,Luke DuBois(也在 CMC)添加了一个 API,使编写 TCP 套接字数据更容易。Doug Scott 在 1997 年建立了一个机制,可以在运行时动态加载乐器。John Gibson(在 UVA)在 1999 年使用 Bill Schottstaedt(在斯坦福大学)的 sndlib 接口清理了读取和写入不同音频文件格式的业务。John 和我最近添加了两个新功能:通过内部“总线”机制路由音频和多声道音频支持。这项工作在去年于德克萨斯州丹顿举行的美国电声音乐协会 (SEAMUS) Y2K 会议上进行了展示。实时控制合成参数、创建各种接口以及更强大的套接字支持的工作也在继续进行。
设置 CVS(并发版本系统)以帮助管理代码促进了近期的协作和开发。RTcmix 的主要核心部分在 GPL(GNU 通用公共许可证)下发布,各种组件(例如,乐器和效果器)根据其来源使用不同的许可证。
为了使用 RTcmix 的实时音频功能,您需要安装并设置 Linux 的 OSS 音频驱动程序(请参阅资源)。对 ALSA(高级 Linux 声音架构)的支持仍未经测试,但已在计划中。如果您想将 RTcmix 用作实时音频处理器,您需要确保您的声卡支持全双工操作。Linux 版本的 RTcmix 可以通过 ftp 从以下地址下载
presto.music.virginia.edu/pub/RTcmix
截至本文撰写时,最新版本为 3.0。完整软件包以单独的软件包形式存在。RTcmix-3.0.0.tar.gz:核心引擎和调度器。insts.jg-3.0.0.tar.gz:John Gibson 编写的乐器。insts.mch-3.0.0.tar.gz:多声道乐器。insts.std-3.0.0.tar.gz:标准乐器套件。[在出版时,所有这些软件包的当前版本均为 3.0.2 — ED]
我可能应该在这里评论一些术语。RTcmix “乐器”可以是效果处理器(例如,DELAY)或合成器(例如,FM 合成)。
乐器软件包应解压缩到与主代码相同的目录中。因此,如果您将主代码 (RTcmix) 解压缩到 /usr/local/src,您最终将得到 /usr/local/src/RTcmix-3.0.0。将乐器软件包解压缩到该目录中。对于 insts.std.tgz,您最终将得到 /usr/local/src/RTcmix-3.0.0/insts.std-3.0.0。您可以将主代码解压缩到您喜欢的任何目录中(例如,您的主目录或任何其他位置)。
为了保持乐器和 RTcmix 版本的一致性,我们在它们的目录中添加了版本标签。为了简化编译,您应该将这些符号链接到默认名称。例如,insts.std.tgz 将解压缩到 insts.std-3.0.0。您应该将其符号链接为
ln -s insts.std-3.0.0 insts.std
一旦您解压缩并链接了所有内容,您就可以设置编译了。这里没有 ./configure 实用程序。您必须编辑 RTcmix 根目录中的 makefile.conf。只需要更改几行。从文件顶部开始读取
# Change stuff in here as needed # The directory containing the RTcmix directory TOPDIR = /usr/local/src # The name of the RTcmix directory CMIXDIR = $(TOPDIR)/RTcmix-3.0.0 # The dir that will contain links to the # instrument dynamic shared objects LIBDESTDIR = $(CMIXDIR)/shlib # add new instruments to this list (e.g., # insts.std, insts.jg) INST_DIRS = insts.base #insts.std insts.jg insts.mch您真正需要潜在更改的只有 TOPDIR,这取决于您解压缩 RTcmix 的位置,以及 INST_DIRS,这取决于您下载了哪些乐器软件包。
一旦您进行了适当的更改,您就可以从顶层 RTcmix 目录执行 make && make install。这将编译所有内容并将 CMIX 可执行文件放在 TOPDIR/bin 中,并将共享库放在 TOPDIR/shlib 中。确保 bin 目录是您的 PATH 的一部分。
MINC 脚本语言为 RTcmix 提供了强大且易于学习的界面。更多术语:MINC 脚本被称为乐谱文件。如果您理解 C 语言,使用 MINC 将是微不足道的。一些主要区别是每行末尾没有分号,也没有函数(抱歉)。使用 MINC (RTcmix) 制作音乐的艺术是世界各地多所高等教育机构开设的几个学期的大学和研究生课程的主要重点。我无法在这里完整地介绍它。相反,我们将看看一些说明各种功能的乐谱文件。
要执行乐谱文件,只需将其通过 stdin 管道输入到 CMIX 中即可。
CMIX < scorefile
从命令行将启动它。在内部,此语法将乐谱文件传递给解析器(由 yacc/bison 编译),解析器又将事件传递给调度器。当在实时演奏模式(即,使用外部控制源)中使用时,RTcmix 解析器监听 TCP 套接字,动态解析数据。在这种情况下,解析器和调度器使用 linuxthreads 库实现。以下乐谱文件包含在 RTcmix 3.0 版本中,由 John Gibson 设计。
列表 1 说明了一个相当简单的乐谱文件,它使用了两个 RTcmix 乐器。还有几十个。WAVETABLE,顾名思义,是一种波表查找乐器。REVERBIT 也具有描述性,对音频流运行混响效果。在本例中,WAVETABLE 的输出被管道输入到 REVERBIT,然后输出到您的音频设备和/或音频文件。
让我们逐步了解一下乐谱文件
rtsetparams(44100, 2)
此命令对于所有 RTcmix 乐谱文件都是必需的。它将音频设备设置为以 44100hz 的立体声运行。可选的第三个参数允许您配置音频缓冲区大小,以减少演奏中的延迟(例如,当从另一个应用程序控制 RTcmix 时)。默认值为 8,192 帧。
接下来,我们声明我们将要使用的“乐器”
load("WAVETABLE") load("REVERBIT")
如上所述,RTcmix 支持库的动态加载。这些命令在运行时加载乐器。这允许比同时加载所有乐器更小的内存占用。它还允许您编写使用多个乐器的乐谱。
接下来的几行被注释掉了。取消注释它们将允许音频写入声音文件以及音频设备。set_option 命令(停用)各种 RTcmix 功能。例如:set_option("AUDIO_OFF") 将关闭写入音频设备的功能—当您的乐谱文件迫使您的计算机超出其能力时非常有用。
为了将音频从一个源映射到另一个源,最终映射到您的扬声器或声音文件,我们调用
bus_config("WAVETABLE", "aux 0-1 out") bus_config("REVERBIT", "aux 0-1 in", "out 0-1")
如前所述,RTcmix 最新的功能之一是路由音频流的能力。为了保持与已建立的混音惯例的传统,我们采用了“总线”范例。内部总线标记为“aux”,可以从中读取(作为“in”)或写入(作为“out”)。输入设备标记为“in”,输出总线(音频设备)标记为“out”。总线指定的约定是:bus_type “number” [aux 的 in 或 out]。因此,“out 0”将是一个输出通道(例如,扬声器),“in 0”是一个线路输入或麦克风。这不应与 “aux 0 in” 相混淆,后者是正在被特定乐器读取的内部总线的规范。
因此,上面的语句首先将 WAVETABLE 的输出路由到 aux(内部总线)0 和 1。然后设置 REVERBIT 的 bus_config 以从 aux 0 和 1(WAVETABLE 的输出)读取,并将其输出写入立体声音频设备(out 0-1)。同一个乐器可以有多个总线配置。每个都继承最近一次调用。
乐谱中的下一行设置了一个全局变量 totdur。变量在初始化时(即,当 RTcmix 解析器读取您的文件时)自动声明。没有保留的全局变量名。
为了设置内部合成参数的“控制速率”更新(例如,幅度包络更新),我们使用 reset 命令。因此 reset(2000) 每 44,100 个样本更新 2,000 次—每 20.5 个样本。
以下两行不太容易理解
setline(0,0, 1,1, 5,0) makegen(2, 10, 10000, 1,.5,.3,.1)
与许多经过多年开发的软件包一样,RTcmix 也存在一些遗留问题。Cmix 中的单元生成器由 makegen 语句定义。Makegen 用于特定乐器的各种内部方面:幅度包络、查找波形、音高颤音等等。setline 命令是一个相关的语句,专门用于设置幅度包络。时间-值对在时间 0 设置幅度为 0,在时间 1 设置幅度为 1,在时间 5 设置幅度为零。此处的“时间”是相对的,并将根据您的“音符”(见下文)的持续时间进行相应地拉伸。WAVETABLE 乐器需要某种波形才能读取以发出声音。它将此信息存储在“slot 2”中。Slot 1 用于由 setline 定义的幅度包络。是的,您可以将 makegen 命令替换为该 setline (gen24)。Gen10 指定将正弦波加载到相应的槽(在本例中为 2)。在这种情况下,波表的大小(以样本为单位)为 10,000。其余参数是连续谐波的幅度。至少在本文中,这已经是最复杂的了。
在分配更多全局变量后,我们使用以下命令播种随机数生成器
srand(3284)
实际的音乐制作由以下几行完成
for (st = 0; st < totdur; st = st + .45) WAVETABLE(st, dur, amp, freq, random())这是一个简单的 for 循环,它执行到 st 大于 totdur(之前定义)为止。WAVETABLE(以及所有其他 RTcmix 函数和乐器)的参数被称为 p 字段。对于 WAVETABLE
p0 = 开始时间
p1 = 持续时间
p2 = 数字幅度(在本例中介于 0 和 32767 之间)
p3 = 频率(以 hz 为单位)
p4 = 立体声扩展
乐谱的最后几行使用 setline(0,1, 1,1) 重置幅度包络,因为我们希望为 REVERBIT 函数使用稍微不同的包络,我们使用以下命令调用它:REVERBIT(st=0, insk=0, totdur, amp, revtime, revpct, rtchandel, cf)。
REVERBIT 的 p 字段是
p0 = 开始时间
p1 = inskip,即开始读取输入的时间。(对于 bus_configs 使用 0;从文件读取时使用其他值。)
p2 = 持续时间
p3 = 幅度乘数(通常介于 0 和 1 之间)
p4 = 混响时间
p5 = 混响百分比
p6 = 右声道延迟
p7 = 低通滤波器的截止频率(以 hz 为单位)
p8(可选)= 应用直流阻断滤波器(布尔值)
就是这样。只需键入以下命令即可执行乐谱
CMIX < WAVETABLE_REVERBIT_1.sco列表 2 是一个音乐上更简单的示例,但说明了 RTcmix 处理实时传入音频流的强大能力。
为了设置我们的音频设备以进行同步读取和写入,我们再次使用 set_option 命令
set_option("full_duplex_on")
必须在 rtsetparams 调用之前执行此命令,因为它设置了一个内部标志,rtsetparams 在执行音频设备的实际设置时使用该标志。与之前一样,我们将设备设置为 44K 立体声,但这次将内部缓冲区大小减小到 512 帧以实现实时性能。
要告诉 RTcmix 从音频设备读取,我们使用
rtinput("AUDIO", "MIC")
MIC 参数仅在 IRIX 版本的 RTcmix 中是必需的。我们也可以说
rtinput("some_file.aiff")改为读取音频文件。
RTcmix 是一个非常强大且灵活的软件包,这归功于许多人的工作,并且可能归功于其开源性质。多年来,不同的人添加了不同的功能。它不断发展。Linux 操作系统一直是开发和性能的绝佳平台。随着近期 Linux 对高端多声道数字声卡的支持(例如,RME Digi96 系列)的出现,RTcmix 的能力与操作系统一起增长。
本文仅触及了 RTcmix 潜力的表面。未来的文章将更深入地讨论编写 RTcmix 乐器并在实时控制它们的过程(例如,使用像 GTK 这样优秀的开源 GUI 软件包)。
最后,令人惊叹的是,计算机、操作系统和软件包可以协同工作得如此之好以至于可以制作音乐。然而,这绝不是新的想法。Ada Lovelace 显然与 Charles Babbage 长时间讨论了这种“新型计算设备”的优点。他的论点与一个无与伦比的国际象棋选手有关,而她的论点与一种可以创作和创造任何类型或复杂程度的音乐的设备有关。
电子邮件:topper@virginia.edu
David Topper (topper@virginia.edu) 是弗吉尼亚大学弗吉尼亚计算机音乐中心的技术主管。自下载了 40 张软盘的 Slackware(内核 1.0.9)作为 CS 本科生以来,Linux 一直是他的主要操作系统。他坚信,只要像 Linux 这样的自由软件继续蓬勃发展,计算机就可以像古代天文学家的望远镜一样,成为人类思想和精神的工具。他的网页位于 www.people.virginia.edu/~djt7p