Processing,带声音

作者: Dave Phillips

Processing

现代计算机的图形功能确实令人惊叹。无论是查看动画曼德布罗特集,观看 DVD,在 CAD 程序中设计高度详细的 3D 图像,还是仅仅玩现代游戏,令人印象深刻的图形都是常态。直到最近,创建令人惊叹的显示效果还取决于对程序和编码环境的深入了解,这似乎需要数字图像处理硕士学位和视频硬件的深奥知识。事实上,创建复杂图形的旧方法确实几乎如此苛刻。但是旧方法总是在稳步地演变成新方法,新方法正在为普通用户带来更强大的功能,即使在计算机图形学和数字信号处理等专业领域也是如此。

Processing 代表了新方法,势不可挡。它是一种专门为计算机图形学领域的初学者设计的编程语言,但功能强大到足以吸引高级艺术家和程序员的注意。请注意,Processing 是一种图形编程语言,而不是一种图形化语言。您在文本编辑器中编写代码行,并在 Processing 环境中执行该代码。如果您的代码通过检查,则会打开一个显示窗口并运行编码例程。错误会在日志面板中报告,并且错误代码会在文本编辑器中高亮显示。经验丰富的程序员会将 Processing 识别为 Processing 编程语言的集成开发环境 (IDE)。事实上,该语言的主要活动中心被称为 Processing 开发环境,即 PDE。

在继续之前,我建议访问展览,了解一下该系统已经完成的工作。Processing 吸引了各种各样的用户,展览展示了这种多样性,并提供了一些令人印象深刻的例子。

安装与配置

您需要 Sun 的 Java SDK >= 1.5 才能运行 Processing。Java JRE 本身是不够的,因此请务必安装完整的 SDK。仅显式支持官方 Sun 软件包,如果您坚持使用其他版本的 Java,则不提供任何保证。

Ubuntu 10.04(32 位)的官方软件仓库中没有 Processing,这是本报告的测试系统。我访问了 Processing 网站,下载了版本 1.2.1 的 tarball,将其解压缩到我的 $HOME 目录中,然后进入了我新创建的 $HOME/processing-1.2.1 目录。那里的一个 shell 脚本启动程序

  $ sh processing

或者,您可以使用 chmod 使脚本可执行

  $ chmod +x processing
  $ ./processing

启动脚本后,您可能需要等待片刻,直到 Processing 初始化自身。一切就绪后,您将看到图 1 中所示的 Processing 开发环境 GUI。默认情况下,系统会打开一个新的草图(Processing 工作文件),该草图已准备好输入。

 

 

 

图 1. Processing PDE。

 

Processing 的设计带有一个巧妙的“钩子”,几乎可以保证吸引用户。在其最基本的形式中,该语言从单行代码应使屏幕上发生某些事情的原则开始。例如,运行以下代码将创建一个 80 像素宽/高的圆

  ellipse(50, 50, 80, 80)

前两个值将圆定位在其显示窗口中,距窗口左侧 50 像素,距窗口顶部 50 像素。我们的 Processing 之旅由此开始。随着我们的进步,我们学习如何动画化、颜色填充和倍增我们的图像。Processing 的艺术的一部分是从简单组件生成高度复杂性,因此基本阶段的吸引力对于新用户非常重要。成就培养信心,Processing 在语言习得的初级阶段取得了巨大的成功。

入门指南》书中的下一个例子展示了在更大的程序中使用的同一行代码

  void setup() {	// Defines the display window parameters.
    size(480, 120);
    smooth();
  }

  void draw() {		// Defines an action taken if a mouse-button is pressed.
    if (mousePressed) {
      fill(0);
    } else {
      fill(255);
    }
    ellipse(mouseX, mouseY, 80, 80);
  }

我们简单椭圆以前的固定位置现在受鼠标移动的影响,即,如果鼠标指针在显示窗口中,则当按下鼠标按钮时,圆会跟随指针。该示例还很好地演示了典型 Processing 程序中的各种约定。setup() 和 draw() 函数通常存在 - 我还不确定它们是否绝对必要 - 我们的 ellipse() 函数现在受 draw() 函数内流程的影响。交互性是许多 Processing 程序的常态,该示例让我们了解了设计交互代码可以多么简单。当然,事情可能会变得相当复杂,但我将进一步探索留给读者。

顺便说一句,PDE 使用起来很愉快。该软件包包含许多优秀的例子,可以从 IDE 的“文件”菜单访问,从而邀请新用户随意探索 Processing。起初,我采取了结构化的方法来学习该系统,阅读《Processing入门指南》并运行其示例,所有示例都可以从“文件”菜单方便地访问。最近,我变得更大胆了,掠夺现有代码并编写小草图供我自己的使用,在一个易于管理的环境中边做边学。语言语法让我想起 Python - 带有一点 C 的味道 - 但我赶紧补充说,我的印象是一位业余语言学家的印象。无论如何,我很快就适应了 Processing 语言及其环境,这主要归功于包含优秀的示例代码。

库是开放的

各种贡献的库将 Processing 的可能性扩展到网络、OpenGL 渲染、动画、视频、硬件接口等领域。一些库将 Processing 的功能扩展到音频领域。默认软件包包括 Minim 库,这是一组音频函数,包括播放/录制控件、输入信号的 FFT 显示、带通滤波器以及用户自定义效果和信号创建的模板。Minim 使用 JavaSound API 作为其音频后端,这一事实可能是一个功能,也可能不是一个功能。JavaSound 的设计限制不允许任何对 JACK 的支持,其声卡检测仅限于带有板载混音器的声卡,从而排除了自动部署我的 M-Audio 系统。在这个限制内,Minim 的工作正如宣传的那样,它的例子为 Processing 中的音频编程提供了有用的入门代码。

Csound 用户会很高兴知道 Jacob Joaquin 的 csoundo,这是一个将 Processing 的图形强度与 Csound 的音频力量连接起来的库。是的,您需要了解一些 Csound 才能充分利用 csoundo 的功能,但安装包包含一些有用的例子,以提供连接的线索。SuperCollider3 的粉丝会同样高兴地看到 oscP5p5_sc,这些库将 Processing 连接到优秀的音频合成/作曲环境。

我已经安装了 EssSoundCipher 音频库,后者尤其有前景。它的大多数例子都完美运行,并且它是 Processing 的组合音频/MIDI 扩展。Beads 库同样有前景,我还发现了 Sonia,这是一个基于 Phil Burk 的酷 JSyn 插件的音频扩展。

这些扩展中的大多数都使用 Javasound API 的服务。这个事实不应该让普通的桌面系统担心,但正如我提到的,如果您的主要声卡是专业音频设备,您可能会遇到 Javasound 的问题。API 将默认音频设备设置为它发现的第一个带有板载混音器的设备。不幸的是,我的 M-Audio Delta 66 不包含这样的混音器,并且被 Javasound 忽略了。但是,这个问题有一个解决方案,至少 Minim 有一个解决方案。

如果您的主音频设备(ALSA 称之为 Card #0)没有混音器子系统,您仍然可以强制 Javasound 使用它。以下 Minim 代码将输出音频设备设置为我系统中的主设备

  // These declarations should be made before any code blocks.
  Minim minim;
  // For the Mixer and Mixer.Info objects.
  import javax.sound.sampled.*;
  // For setting output format, channels, buffers, etc.
  AudioOutput out;
  // Prepares an array for the data returned by mixer.Info.
  Mixer.Info[] mixer.Info; 

  // Add to the setup() routine *before* the loadFile statement.
  // Select mixer device here.
  mixerInfo = AudioSystem.getMixerInfo();
  int mixerIndex = 0; // My M-Audio system.
  Mixer mixer = AudioSystem.getMixer(mixerInfo[mixerIndex]);
  minim.setOutputMixer(mixer);
  out = minim.getLineOut(Minim.STEREO, 2048); // Set channels and buffer size.

最新的 Minim 包含一个例子 (setOutputMixer),它创建了一个 GUI,用于列出和选择您的输出混音器设备(图 2)。我想将该代码与上面的代码片段捆绑在一起,以便以简洁方便的方式将其全部重用为一个函数,但我的 Processing 技能仍然处于最低水平。我将致力于解决方案,当然,我欢迎来自精通 Processing 的读者的建议。同时,我将继续探索 Minim、SoundCipher、csoundo 以及我找到的任何其他音频扩展的许多可能性。需要明确的是,混音器问题很可能只在您拥有专业音频系统时才会发生。在我的笔记本电脑上,使用其消费级声卡硬件,Processing 及其音频库没有给我带来任何麻烦。

 

 

图 2. Minim 中的混音器选择 GUI。

 

关于 Minim 库再多说一句:Processing 包含 Minim 及其捆绑的外部程序,但版本 2.1.0 以 beta 版发布,其中包含一些简洁的新功能和示例代码。如果您决定运行较新版本,请务必将其安装到您的 $HOME/sketchbook/libraries/ 目录中,这是 Processing 现在期望找到所有贡献库的位置。

关于更广泛的 MIDI 支持的消息对于 Processing 的 Linux 用户来说似乎不太好。我安装了 proMIDIrwmidiMidiBus 库,但它们的例子都没有成功。有些似乎运行良好,但没有 MIDI 输出(这才是重点),而另一些则生成难以理解的错误消息(我仍在尝试确定“类型 PApplet 是模糊的”是什么意思)。我重建了所需的 jar 文件,但无济于事,所以我加入了 Processing 论坛,并希望很快在那里找到启发。[更新:] 唉,当涉及到 Processing 和 MIDI 时,探索者只能靠自己了。我没有收到论坛的回复,但还有其他相关的消息我尚未研究。但是,在我看来,Processing 可以使用一个关于如何使用其内部和外部音频/MIDI 功能的指南。

我找到了两个为 Processing 中的音乐创作而设计的库扩展。Tactu5 为系统添加了各种算法音乐功能 - 而且是实时的,不少于此 - jm-Etude 是一个辅助库,用于在 jMusic 格式中创建和演奏乐谱。这两个库都依赖于外部资源进行实际的声音合成,例如,一个独立的软合成器或 Java 声音合成器。唉,我还没有弄清楚如何将 Tactu5 连接到任何东西,但 jm-Etude 会自动将其输出路由到 Java 的内部合成器。这很酷 - 我导入所需的库,编写我的 jm-Etude 代码,它就可以运行和播放。真棒。

Processing 包含一些不错的功能,用于在您的草图中添加文本,所以当然它也必须有自己的文本到语音库。看,ttslib,FreeTTS 基于 Java 的语音合成器的包装器,FreeTTS。唉,我还没有时间测试它,但看起来它可能会很有趣(当然,也很有用)。

我才刚刚开始探索 Processing,就已经感到不知所措了。除了仅仅运行示例草图之外,我甚至还没有开始研究声音和视觉的结合。显然,Processing 有足够的扩展,可以让我长期忙于它。目前,我专注于 csoundo(当然)、SoundCipher、Minim 和 jm-Etude 的可能性,但谁知道我的探索会走向何方呢。

为了方便那些寻求快速了解我在 Ubuntu 10.04 上使用 Processing 1.2.1 的音频/MIDI 库的进展的人

但是等等,还没完

长期阅读我文章的读者可能已经意识到我对 Linux 视频领域的涉足,所以当然我寻找了 Processing 的视频工具。不幸的是,对于 Linux 用户来说,Processing 的设计者决定使用 Apple 的专有 Quicktime 库。确实有一个 Linux 友好的 libquicktime 项目旨在实现完全兼容性,但据我所知,它在目前的状态下对 Processing 没有用处。值得庆幸的是,我们有优秀的 GSVideoLinux 上的 JMyron 库,它们为 Linux 下的 Processing 提供了基本和高级视频功能(图 3)。我已经测试了这两个软件包,效果良好,我期待着进一步的探索。

 

 

 

图 3. Linux 版 JMyron。

 

我也开始对 Arduino 项目产生兴趣,特别是因为 Processing 和 Arduino 项目之间存在很强的联系。我已经很久没有参与任何硬件实验了,但 Arduino 项目对于喜欢独特控制界面的音乐家来说太有吸引力了。如果我真的参与其中,我一定会发布我的调查结果。

文档

Processing 有大量的文档。基于 Web 的材料可以在 Processing 主站点的论坛、YouTube 和 Vimeo 等媒体频道以及许多用户的个人页面上找到。Processing 在纸质版中也得到了很好的体现。如果您完全不熟悉计算机编程和计算机图形学领域,我推荐《Processing 入门指南》,这是由系统主要开发者编写的出色入门指南。在完成那个优秀的教程之后,您应该准备好处理更大的项目和关于 Processing 的更厚的书籍。Google 是您查找更多教程和例子的朋友,而 OpenProcessing 站点是任何有兴趣提高 Processing 知识的人必看的另一个地方。我还推荐 Learning Processing 站点,这是 Processing 初学者的一个优秀资源。

Processing 的缺点

该系统确实有一些有问题的部分。Processing 在其历史中经历了许多重大变化,导致版本之间出现可预测的不一致性。例如,我正在使用 Sun 的 Java SDK 1.6,这是最新最好的公共版本,也恰好是 Ubuntu 10.04 上默认安装的版本。不幸的是,一些贡献的库 jar 文件是用 Java 1.5 编译的,它们的二进制兼容性不能保证用于 1.6。更可悲的是,并非所有扩展都包含它们的源代码,当您开始收到关于特定函数和语言原语的错误消息时,代码就很重要了。消息的实用性各不相同 - 一些报告建议修复,另一些报告只提供问题的简要描述。Processing 主站点包含一些有用的资源,供用户冒险进行代码修复,但并非所有错误都已涵盖。

在我看来,尽管 Processing 拥有众多资源,但它缺乏一个明确定义的“中间地带”,即一条得到充分理解和充分记录的路径,该路径从基础知识逻辑地进行,并指导用户构建更大、更复杂的草图。基本示例比比皆是,高级艺术作品和其他令人印象深刻的展示也是如此,但似乎很少有指导性材料可以将不再是新手的用户带到下一个复杂级别。当然,这个观点是基于我对 Processing 的非常短暂的了解,我欢迎读者对中级学生的学习材料主题提出评论和建议。

比较

Miller Puckette 的 Pd 是一个音频编程环境,通过 GEM 库连接到 OpenGL。Pd 是一个图形编程系统,即,代表合成和/或其他信号处理组件的图标被连接到“画布”显示面板上的网络中。网络可以通过 MIDI 和 OSC 的外部设备或 Pd 的内部音序工具播放。Pd 的 UI 不如 Processing IDE 那么漂亮,但在我看来,当结合音频和图形数据流时,Pd 更容易使用。

Jean-Pierre Lemoine 的 AVSynthesis 沿着不同的路线工作。它的图形处理基于 JOGL OpenGL 着色器,它的图像处理角色仅限于创建图像变换序列。AVSynthesis 在各种性能模式下运行,包括实时交互模式。AVSynthesis 中的所有音频都由 Csound 处理,但它的实现是间接的 - 该程序包含其自己的基于 Csound 的乐器和信号处理器,用户不编写代码。完整的文档可用,演示视频可以在 YouTube 和 Vimeo 上找到。然而,AVSynthesis 非常深入,即使有 GUI,它也没有 Processing 那么容易学习。

Fluxus 是 Dave Griffiths 的多媒体制作环境,专门为实时编码而设计,维基百科页面将其描述为

... 实时编写软件的过程,作为一种即兴的基于时间的艺术形式......在计算机音乐中尤为普遍,将算法作曲与即兴创作相结合。实时编码也用于即兴创作视频动画,例如使用 Fluxus 环境。

Processing 草图当然能够进行交互操作,但 Fluxus 在另一个层面工作。用户/编码员成为表演者,而 Fluxus 完全是关于表演的。它的语言基础(Scheme 的一种方言)并不难学,并且该系统包含各种格式的文档,包括一系列教学在线视频。

结语

我渴望在 Processing 方面取得更高的成就,但我知道这需要一些时间。幸运的是,我可以访问大量的工具来学习更多关于该系统的信息,包括网络上大量的代码,所以我并不缺乏指导。唉,时间总是不站在我这边,而且这门技艺需要长时间学习,所以我将结束这篇简介,继续我的学习。我将在几周后回到这里,带来更多来自不断发展的 Linux 多媒体世界的最新消息。在此期间,请随时发布您自己使用 Processing 的经验报告,并务必告知我们任何指向更多关于 Processing 信息的指针,特别是音频/MIDI 库和示例代码的链接。我们将共同进步。

加载 Disqus 评论