OSC 简介
在我之前AlgoScore 简介的结尾,我曾表示,我最希望该程序增加的功能是支持 OpenSound Control (OSC)。现在,我的愿望已经实现,最新版本的 AlgoScore 支持 OSC,这让我非常高兴。本文将介绍 OSC,并解释为什么它让我更加愉快。
简要历史
OSC 的历史始于 MIDI 的历史。当主要的硬件合成器制造商采用 MIDI 作为设备间通信的标准时,它被广泛且公正地誉为音乐技术的突破。凭借一台计算机、适当的软件和一些合成器,一位音乐家可以独立完成整首乐曲的创作、录制和制作。MIDI 彻底改变了音乐产业,它的持续使用很好地衡量了该标准的成功。然而,MIDI 远非完美,许多音乐用途并不能通过 MIDI 软件和硬件得到良好或完全的服务。因此,人们提出了替代协议。
1994 年,ZIPI 协议发布,并在 Computer Music Journal 上进行了描述。ZIPI 解决了 MIDI 的许多缺点,但该规范未能引起显著的兴趣,无论是商业上的还是其他方面的。幸运的是,ZIPI 的设计者并没有因这次经历而气馁,他们继续研究 MIDI 的可能替代方案。
1997 年,ZIPI 的开发者 Matt Wright 和 Adrian Freed 公布了 OpenSound Control 协议,更广为人知的简称是 OSC。OSC 是现代网络数据传输控制系统的典范。这种系统定义了它携带的数据类型,并管理这些数据类型的流。与其他传输协议一样,OSC 实现了计算机和其他媒体设备之间的通信,当然,OSC 也允许在同一台机器上运行的程序之间进行通信。OSC 的设计初衷是用于音乐目的,但它当然也能够用于其他用途。
OSC 特性
OSC 网站提供了该协议吸引力的以下列表:
- 开放式、动态、URL 风格的符号命名方案。
- 符号和高分辨率数值参数数据。
- 用于指定单个消息的多个接收者的模式匹配语言。
- 高分辨率时间标签。
- 消息“捆绑”,其效果必须同时发生。
- 查询系统,用于动态查找 OSC 服务器的功能并获取文档。
- 基于网络的系统利用通用的 UDP/TCP 传输机制。
这些特性本身可能很有趣,但它们作为基于计算机的音乐家的吸引力如何呢?要回答这个问题,我们需要重新审视 MIDI,特别是它的缺点。
正如我之前暗示的那样,MIDI 对作曲家来说一直是喜忧参半。它当然是一种赋能技术,但其功能有明确的限制。有时,这些限制仅仅是不方便,而在其他时候,它们可能是项目的致命缺陷。MIDI 一些更令人沮丧的限制包括:
- 串行传输机制 - 数据必须按顺序排列,对于重数据流来说存在问题。
- 传输速率慢 - 对于重负载来说再次存在问题。
- 音高的整数表示 - 忽略了其他可行的表示。
- 偏向 12 音平均律 - 见上文。
- 偏向键盘控制器 - 难以在管乐器、吉他和其他乐器上实现。
- 控制器值的整数表示 - 导致控制器移动期间的粒度不足。
- 定时分辨率不足 - 同样是整数表示。
- 需要特殊硬件 - 用于外部连接。
OSC 的设计解决了 MIDI 最令人沮丧的方面,尤其是在传输速度和使用假设方面。对于音高表示或任何其他音乐表示没有限制,只要数据格式得到协议的支持。支持的数据格式可以包括整数、浮点数、双精度数和其他类型,这是一种比 MIDI 允许的方案灵活得多的方案。传输速率以比 MIDI 快得多的网络速度进行,并且 OSC 对消息捆绑的支持减轻了不必要的延迟。该协议不对其目标设备做出任何假设,并且除了典型的网络接口之外,不需要任何特殊硬件。
关于 MIDI 再说一句。为了避免让人觉得我不喜欢这个协议,我必须说,我喜欢 MIDI 为我自己的音乐家生涯所做的一切。对于其预期的用途,MIDI 是一项了不起的成就,对于某些类型的作曲,MIDI 仍然是我的首选环境。然而,一旦作曲家离开稳定的节拍和平均律的世界,MIDI 很快就会暴露出它的局限性。MIDI 控制音频合成环境,例如 Csound 或 ChucK,在某种程度上是可行的,但这些系统允许比 MIDI 可以处理的更灵活的音高和节奏方法。OSC 为控制此类环境中的合成参数提供了更好的解决方案。
开发工具
值得注意的库实现包括 liblo,Steve Harris 的轻量级 OSC 库,以及 oscpack,Ross Bencina 的用于处理 OSC 消息流的 C++ 类库。其他特定于语言的实现包括 Net::OpenSoundControl Perl 模块,SimpleOSC for Python,以及 JavaOSC。
Disposable SoftSynth Interface (DSSI) 音频处理插件 API 采用 OSC 用于插件内部与其用户界面之间的通信。根据 DSSI 网站的说法,OSC“...确保插件的控件始终可在外部访问,提供自动化的保证,并鼓励清晰的插件结构。”
顺便说一句,如果您知道我认为应该提及的其他 OSC 开发工具,请将它们添加到本文末尾的评论中。
使用 OSC
现在我们了解了 OSC 是什么以及它的作用,让我们来看一个实际的例子。长期读者可能还记得,我一直对 Jean-Pierre Lemoine 的 AVSynthesis 非常着迷,这是一个将 Csound 和 OpenGL 的功能结合起来以创建梦幻般的音频和视频显示的程序。AVSynthesis 已经支持 MIDI 一段时间了,最近增加了 OSC 支持。这两个系统都可以用来控制程序几乎所有的参数,但 OSC 提供了平滑实时结果所需的更精细的粒度分辨率。Jean-Pierre 在 AVSynthesis 包中添加了一个外部 OSC 控制面板(图 1),这是一个非常有用的补充,它将 OSC 消息映射到 MIDI 控制下声明的任何参数。唉,该面板的滑块无法自动化,因此它的效用仅限于一次编辑一个参数。一个更有趣的场景是使用可编程的 OSC 消息传递器驱动 AVSynthesis 参数,并且由于 AlgoScore 新增的 OSC 支持,我可以实现这个场景。

图 2 展示了 AlgoScore 配置为向 AVSynthesis 发送五个 OSC 消息流。每个流由线段包络、调制正弦波或 OSC 事件生成器创建,所有这些对象都连接到 AlgoScore 的 osc_bus 对象。OSC 总线被定义为处理五种消息类型,其中四种旨在控制各种音频/视频参数。剩余的类型控制指定层(即 AVSynthesis 主显示中的轨道)的音量。当我在其 OSC 接收模式下启动 AVSynthesis 时,在该程序中没有任何反应,直到我启动 AlgoScore,此时 AVSynthesis 中所有受 OSC 控制的参数都将由来自 AlgoScore 的 osc_bus 的消息流更新。

让我们详细考虑一下这两个程序的设置。要将 AlgoScore 配置为 OSC 消息生成器,我遵循了以下步骤:
- 在 AlgoScore 中打开一个新项目。
- 定义演奏乐谱长度。
- 添加一个 osc_bus 对象。
- 设置 osc_bus 属性。
- 添加 linseg 和其他控制对象。
- 设置它们的属性。
- 使用 datagen 对象创建事件生成器。
- 添加 Nasal 代码以创建事件。
- 将对象连接到 OSC 总线。
我之前关于 AlgoScore 的文章提供了有关该程序及其用法的更多详细信息。
此方案不需要像 QJackCtl 或 Patchage 这样的外部连接实用程序。AlgoScore 和 AVSynthesis 配置为就 OSC 主机和端口号达成一致(见下文),这就是定义它们连接所需的一切。可以建立来自其他程序的更多连接,但我将此练习留给读者。
作为数据生成器,AlgoScore 必须将其 OSC 消息配置为接收器所需的格式。AVSynthesis 支持以下两种消息类型:
/AVS/layerN /AVS/pN
其中 N 是层号或分配给 AVSynthesis 中一个或多个参数的 MIDI 连续控制器编号。这些消息在 AVSynthesis 中被进一步定义为期望 0 到 1 之间的浮点数数据。它们在 AlgoScore 的 osc_bus 属性对话框(图 3)中的完整声明需要数据类型,其中整个消息遵循此模型:
{foo:['/foo', 'f']}
此消息的语法为 label:['/address', 'data_format']。在本例中,'f' 表示浮点数据类型(默认值),但该值可以是 AlgoScore 的 OSC 实现支持的任何类型之一。

我希望 AlgoScore 的 OSC 总线控制 AVSynthesis 中的第 1 层音量以及分配给 MIDI 连续控制器 #1 的任何参数,因此我在 osc_bus 对象的属性对话框中输入了以下声明:
{layer1:['/AVS/layer1', 'f'], ctrl1:['/AVS/p1', 'f']}
当我将一个输出对象连接到总线时,AlgoScore 询问我是否要为 layer1 或 ctrl1(即消息标签)建立连接。根据连接,发送到总线的数据将发送到其在 AVSynthesis 中的地址。
我的 AVSynthesis 配置文件 (data/config.xml) 包括 OSC 主机机器名称和 OSC 端口的以下设置:
OSCHost="localhost" OSCPort="7770"
这些值与 AlgoScore 的 osc_bus 属性对话框中的设置相同:
osc.udp://127.0.0.1:7770
图 4 显示了整个系统,其中 JACK、AlgoScore 和 AVSynthesis 运行和谐。

性能因素
在默认分辨率(0.02 秒 = 50 赫兹)下,多个流导致 OSC 总线饱和,从而导致 AVSynthesis 中的音频不连续。分辨率为 0.2 秒时性能更好,尽管仍然存在一些音频故障。下一个版本的 AlgoScore 将提供改进的定时功能,我期待在本文描述的组合环境中对其进行测试。这样的环境必然需要 CPU 算力,但我承认我才刚刚开始探索如何调整 OSC 的性能。
Linux 音频软件中的支持
具有 OSC 支持的著名应用程序包括 Ardour 音频工作站和 Dave Griffith 的 Fluxus 音频/视频实时编码系统。在音频处理环境中,支持尤其强大,在 ChucK、Csound、Pd、Squeak 和 SuperCollider3 中都有实现。
了解更多
有关 OSC 的主要信息来源包括 OpenSoundControl.org 和 CNMAT OSC 页面。Wikipedia 上关于 OSC 的页面提供了对该项目的良好总结,并列出了指向各种支持 OSC 的程序的链接,而 Google 搜索“Open Sound Control”会产生可预测的大量相关和不相关的结果。
结语
对于某些音乐目的,MIDI 的功能已足够。然而,MIDI 对于其他音乐目的的服务并不那么好,其局限性会限制表达的可能性。OSC 有效地消除了这些限制。我希望看到 OSC 像 MIDI 一样得到广泛应用,因此如果您是音频应用程序开发人员,我希望您考虑在您的软件中添加 OSC 支持。
即将推出:更多新版本、更新、访谈、报告、简介、评论和随笔。