SynthDef
{}.play 标志法并非SuperCollider 3的首选标记法,但他却允许我们对合成快速上手。从现在起,你常看到的都将是使用SynthDef结构定义的UGen网络。然后很多合成都是由一个单独的SynthDef来创建,这对于制造一堆类似的声音和其它颗粒以及整体进程是尤其重要的。
SynthDef = Synthesizer Definition(合成器定义)
为了在SC中合成声音,你必须为UGen网络用编程语言写一个秘诀(recipe)。这个秘诀由一个特殊的语言结构写就而成,SynthDef。
SynthDef(\sine, {Out.ar(0,SinOsc.ar(Rand(440,880),0,0.1))}).load(s);
一旦一个秘诀被系统所认知,你便能以那个规则创制一个独立的合成器:
Synth(\sine);
实际上,你想用它们多少次都可以(每次跑下边的一行代码):
a=Synth(\sine); b=Synth(\sine); c=Synth(\sine);
然后每次一行地分别运行下列代码可以单独停止每一个合成:
a.free; b.free; c.free;
注意,每个合成器在创建之初的初始值都是在440到880之间,这是由于上述SynthDef中的Rand UGen所定义的。
以下是一步到位的写法:
SynthDef(\saw, {Out.ar(0,Saw.ar(Rand(440,880),0.1))}).play(s);
你会看到制造和使用SynthDef的方法中的一些变化:
SynthDef("aaa",{Out.ar(0,SinOsc.ar(440,0,0.1))}).send(s)
Synth("aaa"); // 现在运行这个
在命名SynthDef时,\aaa与”aaa”是相同的。SynthDef被发送而不是被载入,这属于技术上的细节,将SynthDef储存入硬盘而不是直接使用它们。
各种不同的SynthDef:
- .send——在目前仅发送SynthDef到合成服务器(synthesis server),不在硬盘上放置任何文件。
- .writeDefFile——将SynthDef写入硬盘上的一个文件,不将它载入到合成服务器。
- .load——将文件写入硬盘,因此它从现在起当你每次开启合成服务器的时候都被载入并快速发送。
- 还有一些诸如 .writeOnce 和 .store——我们将在我们需要它们的时候接触它们。
与我们之前使用SinOsc的例子唯一不同的地方,便是SynthDef包裹以及对Out UGen的使用。对于Out UGen完整的解释将在我们讨论总线(bus)的时候进行,但现在你可以将它暂时想做“在计算机的第一个音频输出播放”。
// 为秘诀加入频率引数 // 注意SynthDef可被命名为\sine或"sine" SynthDef(\sine,{arg freq=440, amp=0.1; Out.ar(0,SinOsc.ar(freq,0,amp))}).load(s); Synth("sine"); // 现在这个接受初始值 // 通过向SynthDef指明频率引数 // 从秘诀中创制另一个高八度的合成音 Synth("sine",[\freq,880]);
可以看到,这样做允许我们从一个普通的秘诀中制造出许多变化的合成音。
a=Synth(\sine); b=Synth(\sine,[\freq,550]); c=Synth(\sine,[\freq,660, \amp, 0.5]);
然后每次一行地分别运行下列代码可以单独停止每一个合成:
a.free; b.free; c.free;
练习:
试着将一个你曾经或正在使用的合成器patch转化为一个SynthDef。
你可以以下述代码为原型:
( SynthDef(\synthdefname,{arg input1; // 所有引数都到这 // 一些UGen的代码——之前位于{}.play里的东西 Out.ar(0, finaloutput) //finaloutput是你想听到的UGen最后的结果 }).send(s) ) Synth(\synthdefname, [\input1, inputval1]); // inputval1是恒量