卡内基梅隆大学的声音语言研究
Nyquist 来自 Roger B. Dannenberg 在美国匹兹堡卡内基梅隆大学进行的计算机音乐研究。其早期系统谱系包括 Arctic、Canon 与 Fugue:它们试图用函数式方法表达音符、乐句和连续变化的声音,而不只写一串命令去驱动发声设备。
前作也留下具体限制。Canon 不处理数字采样音频;Fugue 可以把声音当作值来操作,却会为整个声音分配大量存储空间。音乐作品稍长,或多个声音相互叠加,存储消耗就成为问题。Nyquist 因此在保留高层音乐表达的同时,重新设计声音的计算与保存方式。
1992年论文与1993年可取得的实现
Dannenberg 与同校的 Clifford W. Mercer 在1992年国际计算机音乐会议论文中,介绍了称为 Nyquist 的 Fugue 重实现。作者后来把它列为第一篇 Nyquist 论文。研究面向通用处理器逐渐能够承担的软件声音合成,将符号处理与信号计算放在同一系统中。
1993年,Dannenberg 又发表实现论文,说明动态计算图、采样块共享和存储回收,并在文末写明可向作者取得 Nyquist。两份材料足以把早期技术公开阶段定位在1992—1993年;它们没有给出一个软件“绝对首次发行日”。
一个声音相加的程序
1993年论文用表达式“(s-add (osc) (osc))”解释方法。两个 osc 表达式分别产生信号,s-add 将它们相加。在语言层面,声音是可以传给函数、赋给变量和重复使用的值;程序员描述需要怎样的声音组合,而不是手工规定每个采样计算先后运行。
实现并不立即造出整段结果。请求一块输出采样时,加法对象向两个振荡器索取相应采样块,完成相加后再交付结果。振荡器保存自身状态,以便下一次请求继续计算。用同一声音的不同部分组成更大结构时,也可以共享已算出的块。
论文还举出把两个声音分别移到较晚开始时间再相加的情况。在只有一方发声的区间,系统可以连接已有采样块,而不是不断执行“声音加零”或复制全部数据。高层程序的简洁,依靠的正是运行时对时间与数据的处理。
参考:[2]
共享、回收与音乐上的停止时间
共享也带来管理问题:一个声音可能有多个读取者,各自走到不同位置。Nyquist 为读取者保存头部状态,让它们沿同一采样块链表取值;只有在需要越过已有末尾时,挂起的计算才补上新的块。引用计数则帮助识别不再需要的块,使存储可以回收。
音乐事件的结束又不总等于最后一个采样消失。一个音符在停止持续激励后,余音仍可能衰减。Nyquist 用“逻辑停止时间”组织 seq 顺序算子,让下一个事件可以按前一事件的音乐位置启动,而不必等余音全无。
这使乐谱层面的顺序与声音层面的重叠可以共存。1993年的论文也讨论多采样率、多声道及相应开销;便利的语言特性要求更复杂的内部表示,并非完全没有成本。
参考:[2]
早期实验的目标与后续阶段
1992年的实验使用 IBM RS/6000 工作站,对同一合成任务测量 Nyquist 与 Csound 等实现。作者关注通用处理器是否能有效承担声音计算,以及不同块大小、时间精度和运行开销之间的取舍。论文中的测试结果属于明确硬件和程序条件,不能扩成对所有音乐工作的性能排名。
当时的实时目标仍有待解决的问题,包括垃圾收集与运行环境。1993年论文所述可取得的实现,是研究和试用的具体阶段。作者在1997年又发表更完整的语言与实现说明;后来语法、发行版本及集成方式的发展,属于1992年论文之后的阶段。