声音前沿:Csound 的最新动态?

作者:Dave Phillips

4 月 19 日,我将登上飞往德国的航班,在那里我将参加第三届 Linux 音频年度会议。会议将在卡尔斯鲁厄这座美丽的城市,在令人惊叹的 ZKM,即 Zentrum fur Kunst und Medientechnologie(艺术与媒体技术中心)举行。我对这次会议感到兴奋,尤其因为前两次会议在短期和长期影响方面都非常成功。这是一个与 Linux 音频软件领域的领军人物会面和交流的绝佳机会,所以如果您在该地区,请顺道拜访 ZKM 并查看庆祝活动。我在本文末尾包含了会议详情的 URL;查看一下以了解日程安排。正如您可以从主题列表中看到的那样,这将是又一次盛会。

今年的会议至少包括两个关于 Csound 的演讲。我对此感到高兴,因为 Csound 是最好和开发时间最长的软件声音合成 (SWSS) 语言之一。几年前,Csound 社区的成员成功游说修改了其原始许可条款,使其真正融入自由和开源阵营,最近的开发努力似乎证明了这一决定的正确性。本文简要介绍了 Csound 最新开发分支的进展情况,程序员和用户称之为 Csound5。

一点背景知识

Csound 自 20 世纪 70 年代以来一直在开发中,早于个人计算机。正如可能预期的那样,其代码库变得有些陈旧,尤其是在现代编程技术方面。Csound 的易扩展性促进了其处理能力的极大扩展,但在较低级别,代码目前正在进行全面修订。原始源代码树的几乎每个方面都受到了新的审查,这应该会使 Csound 更快、更高效。

顺便说一句,Csound 有两个并行的开发轨道,一个版本保留了大部分经典的 Csound 代码库 (Csound4),另一个版本则对代码进行了广泛而深刻的更改 (Csound5)。这两个轨道都在努力保持同步,并理解 Csound5 将成为早期代码的最终继任者。

Csound5 引入的不仅仅是源代码的简单重组。模块化得到了大力推行,代码级别进行了许多更改,并且引入了许多新功能。代码级别的更改包括诸如完全删除静态和全局变量以及引入新的构建过程等改进——GNU autotools 已被 SCons 系统取代。然而,本文的重点是用户级别,所以让我们看看 Csound5 为我们带来了哪些新的优点。

获取 Csound5

Linux 版 Csound5 目前仅在 CVS 源代码中可用。检索、编译和安装 Csound5 的完整说明包含在 Csound 手册中(请参阅“资源”),因此我不会在此重复说明。但是,我必须指出,编译 Csound5 需要许多新工具。对于基本构建,您需要 Python 2.3、SCons 构建系统、libsndfile 声音文件 I/O 库和 PortAudio/MIDI 实时 I/O 系统。如果您想启用 Csound 的图形操作码,还需要 FLTK 图形工具包。要构建 CsoundVST GUI,您还需要 SWIG 接口生成器和 boost C++ 库。SCons 在理清依赖关系方面做得很好,但完整构建所需的许多组件并未包含在主流 Linux 发行版中。因此,用户有责任正确安装和配置所需的软件。

尽管存在依赖关系,但实际构建 Csound5 并不特别困难。运行scons -h查看可用的 Csound 特定选项,然后运行scons以及您选择的选项。例如,在我的低功耗笔记本电脑上,我构建了不带 CsoundVST 的 Csound5,如下所示

scons buildCsoundVST=0

要安装 Csound5,我成为 root 用户并运行此命令

scons buildCsoundVST=0 install

要清理源代码,我使用scons -c。然而,将所有必要的组件组合在一起以使 Csound5 启动并运行是一项不简单的任务。如果您不习惯从源代码编译程序,您可能需要等待公共二进制文件的发布。在那之前,您唯一的选择是从源代码编译 Csound5。

Csound 现代化

经典的 Csound 处理用户创建的两个文件,一个 orc 文件,它是 Csound 乐器或乐器;以及 sco 文件,它是 orc 文件乐器演奏的分数。现代方法摒弃了这种双文件方法,而是使用所谓的 CSD 文件,这是一种类似 XML 的文件格式,其中包含 orc 和 sco 文件内容以及将文件渲染为声音所需的命令行选项。以下是 Csound 经典模式下的一个简单示例

;;; simple.orc

sr=44100	; sample rate
kr=441		; control rate
ksmps=100	; number of samples per control cycle
nchnls=1	; number of audio output channels

instr 1		; begin instrument block
kamp = p4	; amplification value (k = control-rate signal)
kfreq = p5	; frequency value
ifn = 1		; stored function table number (i = init-time value)
aosc oscil kamp,kfreq,ifn   ; invoke oscillator opcode (a = audio-rate signal)
kenv linseg 0,p3*.50,1,p3*.50,0 ; create an envelope
aout = aosc*kenv	; scale oscillator output by envelope
out aout	; send it out as an audio signal
endin		; end instrument block


;;; simple.sco

f1 0 8192 10 1	; store function table #1, a sine wave

    ; The following event statements provide data for instr 1's parameters.
    ; These values are known as p-fields (parameter fields). The first three
    ; fields are fixed-definition fields, where p1=instrument number, 
    ; p2=start-time, and p3=duration. The definitions for all other p-fields
    ; are arbitrary. See instr 1 for the meaning of p4 and p5.

i1 0 1 8000 440	
i1 1 1 9000 494 
i1 2 1 9500 554 
i1 3 1 8500 440
e	; end score	

此代码表示两个单独的文件。要从中创建声音,需要使用 Csound 二进制文件编译它们,如下所示

csound -o devaudio -d -m0 simple.orc simple.sco

在此示例中,音频数据被路由到实时音频输出设备 (devaudio)。-d 和 -m 选项减少了图形和消息传递,以获得更好的实时播放效果。Csound 提供了许多其他命令行选项;运行csound --help以获取完整列表。

更现代的方法是将上述所有元素组合到一个统一的文件格式中,Csound 用户称之为 CSD 文件。以下是将上述代码转换为 CSD 格式的代码

<CsoundSynthesizer>

<CsOptions>
;;; Command options for simple.csd
-o devaudio -d -m0
</CsOptions>

<CsInstruments>
       instr 1
       kamp = p4
       kfreq = p5
       ifn = 1
       aosc oscil kamp,kfreq,ifn
       kenv linseg 0,p3*.50,1,p3*.50,0
       aout = aosc*kenv
       out aout
       endin
</CsInstruments>

<CsScore>
       f1 0 8192 10 1
       i1 0 1 8000 440
       i1 1 1 9000 494
       i1 2 1 9500 554  
       i1 3 1 8500 440
       e
</CsScore>

</CsoundSynthesizer>

请注意,标头块不是绝对必要的;Csound 为速率和通道应用默认值。另请注意,CsOptions 块不需要显式声明 Csound 二进制文件或 orc/sco 内容的单独文件名。使用命令csound simple.csd运行此文件。放置在命令行上的选项会覆盖在其他位置找到的定义,例如 CSD CsOptions 块、由环境变量定义的块(Csound 有许多环境变量)或您的 ~/.csoundrc 文件中的定义。您可以将您喜欢的选项放入 .csoundrc 文件中以供自动重用。我的文件如下所示

-+rtaudio=alsa --expression-opt -odac2 -d -m0 -M0

这些选项告诉 Csound 选择 ALSA 作为我的声音系统,优化表达式以加快渲染速度,使用我系统中的第三个音频设备进行音频输出(dac2 是我的 M-Audio Delta 66),管理显示和消息传递输出,并选择第一个可用的 MIDI 设备进行 MIDI 输入(-M0 是我的 SBLive 上的外部硬件 MIDI 端口)。其他可能的选项包括选择 JACK 音频支持、MIDI 输出设备和缓冲区设置,以优化您的声卡的使用。再次强调,请参阅csound --help以获取有关 Csound 运行时选项的详细信息。

CsoundVST

虽然上述方法是可行的,但它们需要在工作流程中执行单独的步骤。也就是说,您在文本编辑器中编写文件,然后编译它们并试听结果,可能还需要在声音文件编辑器中进一步编辑音频文件,然后根据需要重复该过程。如果能够从单个界面管理整个工作周期,那当然会很好,而这正是 CsoundVST 提供的功能。

At the Sounding Edge: What's Going On with Csound?

图 1. CsoundVST GUI

Csound 开发人员 Michael Gogins 为我们提供了 CsoundVST,作为 Csound5 的一个集成图形界面(图 1)。CsoundVST 结合了编辑/编译/运行周期中的所有步骤,并添加了一些简洁的便利功能。用户可配置的项目包括 VST 插件模式、Csound 性能模式和您选择的声音文件编辑器。提供版本控制,这是一个不错的功能,可以创建一系列编号的输出文件。还提供了基本的启动/停止性能控制。图 2 显示了这个新的 Csound GUI 在运行,运行的是上面示例中的代码。

At the Sounding Edge: What's Going On with Csound?

图 2. 示例 CsoundVST 运行代码

正如您在图中看到的那样,CsoundVST 分为两个部分显示。顶部的按钮栏非常容易理解,工具提示帮助应该可以澄清任何晦涩的目的。图 1 中显示的选项卡部分处于经典 Csound 性能模式。当选择 Python 性能模式时,选项卡部分会更改为图 3 中所示的排列。

At the Sounding Edge: What's Going On with Csound?

图 3. Python 模式下的 CsoundVST

图 3 中的代码来自 Koch.py,这是一个由 Michael Gogins 编写并捐赠给 Csound5 示例目录的 Python 脚本。该脚本使用原生 Python 代码来创建 Csound 分数生成器。然后,它使用一系列导入的 Csound 相关函数来定义用于处理生成的分数的 Csound 乐器。脚本的最后几行调用带有适当选项的 Csound 二进制文件以实时运行。单击 GUI 中的“Perform”按钮以渲染脚本,就像您渲染 Csound orc/sco 或 CSD 文件一样。

CsoundVST 加载单独的 orc/sco 文件,它还加载 CSD 文件,自动将它们解析为 GUI 的相应部分——选项、乐器、分数。“Save”按钮仅以 CSD 格式保存您的工作;也就是说,它不单独保存 orc 和 sco 文件。

Csound5 和 JACK

JACK 音频服务器是开源音频软件领域最伟大的成就之一。JACK 专为强大的低延迟和易于连接而设计,毫不夸张地说,对 JACK 的支持已成为任何严肃的 Linux 声音程序的预期资产。

感谢开发人员 Istvan Varga,Csound5 提供了对 JACK 的基本支持。目前,连接过程有点繁琐,但再次强调,可以使用 .csoundrc 文件来简化任务。以下命令声明 JACK 为首选音频系统,并将 Csound 的音频输出自动连接到第一个 ALSA 播放端口

-+rtaudio=jack --expression-opt -b 512 -B 2048 -odac:alsa_pcm:playback_ -d -m0

这些设置适用于我的 SBLive。-b 软件缓冲区值应等于 JACK 的缓冲区大小;它必须小于 -B(硬件缓冲区值),并且两个缓冲区标志都必须是 2 的幂。此外,JACK 采样率必须等于您的乐器的采样率。图 4 显示了由于这些设置,Csound 如何作为客户端出现在 QJackCtl 音频连接选项卡中。

At the Sounding Edge: What's Going On with Csound?

图 4. 作为 JACK 客户端的 Csound5

未来的改进可能包括对 JACK 传输控制机制的支持。但即使在当前状态下,Csound5 的 JACK 支持也是对系统的一个极好的补充。

MIDI 连接

代码修复已修复和增强了 Csound 的 MIDI 支持,极大地改进了 Csound5 的这一方面。Csound5 现在依赖于 PortMIDI 系统进行基本的 MIDI 连接。对于 Csound 整体而言,此更改是一个巨大的改进,并有望为 MIDI I/O 提供一个通用的跨平台层。Linux 用户现在可以享受与任何可用 MIDI 端口的连接,包括 ALSA 的虚拟 MIDI 端口,从而允许与单个端口建立多个连接。

blue

虽然它不是任何官方 Csound 软件包的一部分,但我必须特别提及开发人员 Steven Yi 的 blue,这是一个功能强大的图形环境,用于使用 Csound 制作音乐。blue 是一个基于 Java 的应用程序,可兼容任何版本的 Csound,并包含许多图形工具,用于创建 Csound 分数和乐器。唉,我没有足够的篇幅在这篇文章中充分描述 blue 的广泛功能,但图 5 应该可以让您了解 blue 的一些资源。

At the Sounding Edge: What's Going On with Csound?

图 5. blue Csound 制作环境

blue 为 Csound 作曲家提供了一些真正独特的资源,例如其图形评分工具和 blueDX7 GUI,用于编辑 DX7 原始 sysex 音色库,以便在 Csound 中使用(图 6)。blueShare 功能使用户可以访问用户定义操作码的在线数据库。为 Jython 和 Rhino 语言(分别是 Python 和 JavaScript 的方言形式)提供了接口。此外,还提供了一个类似于 blueDX7 的图形乐器构建器,用于设计具有实时参数控制面板的 Csound 乐器。如果您正在寻找适用于 Linux 的最完整的 Csound 助手应用程序,那么您正在寻找 blue。

At the Sounding Edge: What's Going On with Csound?

图 6. blueDX7 乐器编辑器

临别赠言

我希望您对 Csound 新世界的抢先体验感到好奇。对于音乐行业涌现的所有花哨的新设备和软件,似乎没有哪一个能与 Csound 的强大功能相提并论。是的,您必须学习如何使用它,但网上有大量的文档和许多教程。此外,互联网上可以找到大量完全用 Csound 创作的优秀作品。Csound 可能是仍在持续使用的最古老的 SWSS 语言,其最近的发展表明,它将在很长一段时间内继续使用。

我要感谢以下人员为保持 Csound 的活力和健康所做的巨大努力:John ffitch(El Maestro)、Richard Boulanger、Richard Dobson、Michael Gogins、Matt Ingalls、Steven Yi 和 Istvan Varga 都值得高度赞扬,我必须特别感谢 John ffitch 和 Istvan Varga 对 UNIX/Linux Csound 的奉献以及他们对像我这样永远的 Csound 新手的慷慨帮助。

加载 Disqus 评论