在戴夫工作室的超级碰撞:SuperCollider3 的新世界,第二部分

作者:Dave Phillips

在本系列的第一部分,我介绍了 SuperCollider3 及其最基本的操作。现在让我们通过添加一些随机化、一个简洁的 GUI 和一些 MIDI 控制,使事情变得更有趣。

创建 GUI

让我们添加一个简单的 GUI 来控制合成器。我们将使用一个名为 AutoGui 的 SuperCollider Quark 的服务,以便为我们这些新手简化操作。

    a = SynthDef(\sinetest, {arg out = 1, freq = 440; Out.ar(out, SinOsc.ar(freq))}) ;
    z = SynthDefAutogui(\sinetest, scopeOn:false) ;

简单,只需两行代码即可生成图 1 中所示的合成器控制面板。

 

图 1. SuperCollider 的 AutoGui Quark 在工作。

顾名思义,AutoGui 类自动创建一个 GUI 来表示 SynthDef 的元素,即 SuperCollider 合成器定义。在示例中,SynthDef 由我们的简单合成器和一个添加的输出通道设置器构建。AutoGui 对 SynthDef 执行其魔法,瞧,我们有了一个带有图形控制面板的合成器,仅用两行 SuperCollider 代码制成。

AutoGui 只是 SuperCollider GUI 功能的众多实现之一。其他有趣的体现包括 Fredrik Olofsson 的 red* quarks、James Harkins 的 dewdrop 库、Crucial 扩展和 EZ-GUI 类。与系统的其他方面一样,SuperCollider 为您提供了多种方法来完成这项工作。

 

photo of the hadron quark

图 2. Hadron Quark 的展示。(完整尺寸

在离开我们的简单示例之前,让我们看看更具野心的 GUI。图 2 展示了 Batuhan Bozkurt 的 Hadron,这是一个包含各种 GUI 组件的 SuperCollider quark。乍一看,Hadron 有点像穿了 Pd 外衣的 SuperCollider,但 Hadron 是一个个人系统,而不是通用的 GUI。像大多数 SuperCollider GUI 示例一样,Hadron 最初是为其创建者的特定目的而设计的,并且由于其更广泛的实用性,它已被打包为 quark,供其他用户探索。我的首次实验包括在我的画布布局上添加更多合成器和效果处理器——所有状态都可保存和加载——并且我已经开始研究编写自己的 Hadron 插件的指南。

关于音符的注释

到现在为止,声音设计师可能对 SuperCollider 有点兴趣了,但作曲家可能会想知道这有什么大惊小怪的。我们的小例子仅仅以单一频率和默认幅度值播放正弦波。但是,请考虑以下代码

   a = {SinOsc.ar(Rand(200,400))}.play;

现在,对于代码的每次运行,将使用不同的频率值,该频率值在 200 到 400 Hz 之间随机化。从作曲的角度来看,我们的示例变得更有趣了,但它需要一些重复才能从中获得类似乐句的东西。以下代码提供了一种解决方案——一个 Task——用于生成一系列随机选择的音调

    (
    SynthDef("Randy", {arg out = 0;    // Single-channel output.
        Out.ar(out,
            SinOsc.ar(
                // Randomize integer frequency values.
                Rand(200,400),       
                // Apply an amplitude envelope to each note.
                0, Line.kr(0.2, 0, 1, doneAction:2))   
            )
    }).send(s);    // Send the definition to the server.
    )

    (
    t = Task({
            16.do({
                    Synth.new("Randy"); 0.5.wait;   
            })
    }).play;
    )

当 Task 被评估时,名为 Randy 的合成器将播放 16 次,每次都以不同的频率,音符之间间隔半秒。现在,对于我们的作曲家来说,事情看起来更有趣了,尤其当她开始弄清楚如何将随机化应用于其他变量时,例如等待时间和 do 长度。当她学习如何创建一个 GUI 来触发此 Task 时,她可能会更感兴趣,但在我们进一步深入了解 SuperCollider 的 GUI 功能之前,让我们看看它的 MIDI 连接性。

一点 MIDI,拜托

下一个示例将我们的小型正弦波合成器置于 MIDI 控制之下。该示例还介绍了一个更复杂的 SynthDef,其中添加了一个门限值,用于构建包络以塑造每个播放音符的音频输出,类似于上面的示例。我将 Akai LP25 键盘插入笔记本电脑的 USB 端口,然后打开 QJackCtl 中的 ALSA MIDI 面板,将 LP25 连接到 SuperCollider MIDI 输入端口。在评估以下代码的每个块后,我在键盘上弹奏了几个音符,听到了我们简单的正弦波合成器现在被调制的甜美音调

    MIDIIn.connect;
    s = Server.local;
    s.boot;
    s.latency = 0;

    (
    SynthDef("sinetest", {arg out = 1, freq = 440, gate = 0.0;
        x = SinOsc.ar(freq);
        x = EnvGen.kr(Env.adsr, gate,Latch.kr(gate,gate)) * x;
        Out.ar(out, x);
    }).send(s);
    )

    x = Synth("sinetest");

    //set the action:
    (
    MIDIIn.noteOn = {arg src, chan, num, vel;
            x.set(\freq, num.midicps / 4.0);
            x.set(\gate, vel / 200 );
    };
    MIDIIn.noteOff = { arg src,chan,num,vel;
            x.set(\gate, 0.0);
    };
    )

(感谢 SuperCollider 手册的作者提供了此代码的基本版本。但是,在评论部分可以看到一种更好——也是首选——的方法,感谢 James Harkins)。

酷,而且不太复杂。文档包含许多其他示例,因此如果 MIDI 是您的音乐媒介,您将需要查看相关文档以获得更多见解和有用的代码。

关于 GUI 的更多内容

SuperCollider 的 GUI 元素与语言很好地集成在一起,并且有大量关于其使用的文档。该系统很灵活,只需稍作努力即可将较旧的 SuperCollider 代码投入现代使用。类重定向根据识别的操作系统自动分配 GUI 工具包,但用户可以控制受支持的 GUI 视图的部署。

SuperCollider 3.5 使用新的 Qt 界面元素作为其默认 GUI。但是,如果需要,我可以轻松地在 Swing 和 Qt 之间切换,并且许多代码示例都是为跨平台应用程序编写的。能够切换 GUI 视图可能非常有帮助。例如,如果您尝试在 GUI 设置为 Swing 时打开 SuperCollider 帮助文档,您将收到此错误

ERROR:_ViewRedirect_is_an_abstract_class_and_should_not_be_instantiated_directly._*new_method_not_valid.

您可以通过暂时切换 GUI 工具包来解决此问题。运行 GUI.qt,您就可以访问帮助文件。保持帮助文档打开,然后如果您想重新将 Swing 声明为项目代码的活动 GUI 视图,则运行 GUI.swing。

SuperCollider 的 GUI 功能已经超越了书中描述的那些。熟悉 SuperCollider 的用户应该不必担心——Cocoa 和 Swing GUI 仍然受支持,而 Qt 图形功能已集成到 SuperCollider 的基本设计中。您可以通过在您最喜欢的精通 SuperCollider 的编辑器中评估 GUI.schemes 命令来了解您的系统上存在哪些 GUI 工具包。我的系统返回此信息

    IdentityDictionary[ (swing -> class SwingGUI), (qt -> class QtGUI), (colpen -> class ColPenGUI) ]

这告诉我我有 Swing 和 Qt 作为 GUI 视图选项。该字典还列出了一个名为 ColPen 的专用 GUI 类,它似乎是 wslib quark 中的一个组件,但我还没有对其进行任何操作。SuperCollider 文档表明,也可以从 Emacs 图形小部件构建 GUI,尽管我还没有尝试过这种功能。

SuperCollider 的 GUI 元素是用于构建特定项目 GUI 的组件,也就是说,您不会找到一个漂亮的通用 SuperCollider 前端,其中包含旋钮、滑块和其他图形元素。通常,您将为您的特定目的构建自己的 GUI,但如果您需要一个起点,您可以在现有项目 GUI 的示例中找到一个。它们的范围从带有几个按钮和滑块的简单 UI 到多个窗口中控件的复杂排列,包括着色、文本输入和数字框、文件选择器、波形查看器以及其他酷炫的图形。

我承诺提供一个代码示例,该示例创建一个 GUI 来控制之前在“关于音符的注释”部分中看到的 Task。这是代码,但是您需要从 Task 中删除 .play 命令,UI 才能正常工作

    w = Window.new("A Task", Rect(400, 400, 200, 30)).front;
    w.view.decorator = FlowLayout(w.view.bounds);
    Button.new(w, Rect(0, 0, 100, 20)).states_([["Play/Resume", Color.black, Color.clear]])
      .action_({ t.resume(0);});
    Button.new(w, Rect(0, 0, 40, 20)).states_([["Pause", Color.black, Color.clear]])
      .action_({ t.pause;});
    Button.new(w, Rect(0, 0, 40, 20)).states_([["Finish", Color.black, Color.clear]])
      .action_({
        t.stop;
        x.release(0.1);
        w.close;
    });

图 3 展示了结果。它看起来并不怎么样,但它的代码指向了更大的可能性。正如我们所希望的那样,我们的作曲家朋友现在对 SuperCollider 更感兴趣了。她看到她完全控制了按钮背后的逻辑,这在她的商业软件中是不可能的,并且她的想象力已经开始处理我们的小例子的含义。

photo of a task GUI

图 3. 用于 Task 的 GUI。

新用户应阅读帮助系统的“GUI 简介”,这是编写用于基本和高级 GUI 构建的代码的指南。如果您计划为您的项目制作自己的 GUI,请将其视为必读内容。一些 SuperCollider quarks 包括自定义 GUI 组件,这些组件在考虑您自己的界面设计时很有用。感兴趣的用户应该研究 ixiViews、dewdrop_lib、crucial_lib、Hadron 和 AutoGui quarks 以获得一些设计良好的 UI。另请参阅 EZ-GUI 类的帮助文件,这是一组方便的图形控件,用于快速界面开发。

结尾,第二部分

现在必须走了,但我会在回来后继续探索 SuperCollider 的高级功能。在此期间,您可以下载最新的正式版本——现在可能已更新到 3.4.4——或者检索并构建未发布的 3.5 版本的源代码。玩得开心,几周后见。
 

加载 Disqus 评论