Supercollider-SynthDef相当于使用2种不同的合成器

时间:2016-01-08 02:34:27

标签: supercollider

如果你有一个功能定义:

{ SinOsc.ar(440, 0, 0.2) }.play;

等效于:

SynthDef.new("SinOsc", { Out.ar(0, SinOsc.ar(440, 0, 0.2)) }).play;

对于立体声,你只需说:

SynthDef.new("SinOsc", { Out.ar([0,1], SinOsc.ar(440, 0, 0.2)) }).play;

如果你想这样做怎么办:

{ [ Mix( [ SinOsc.ar(440, 0, 0.2) ] ),  Mix( [ Saw.ar(662,0.2) ] ) ] }.play;

SynthDef的等价物是什么?此外,还有一种更优雅的方式来定义上面的功能吗?

2 个答案:

答案 0 :(得分:3)

SynthDef的等价物只是将它包装在一个synthdef中(并添加一个Out.ar),非常类似于你已经写过的内容:

 { [ Mix( [ SinOsc.ar(440, 0, 0.2) ] ), Mix( [ Saw.ar(662,0.2) ] ) ] }.play;

 SynthDef("crazycats", { Out.ar(0, [ Mix( [ SinOsc.ar(440, 0, 0.2) ] ), Mix( [ Saw.ar(662,0.2) ] ) ]) }).add;
 Synth("crazycats");

在你的问题中,你写了SynthDef(...).play,这不是真正正确的事情。这就是为什么我在上面写了两行 - 一行来定义SynthDef,一行来实例化它。

并且您不需要那些Mix个对象,因为每个对象只有一个振荡器,所以简化

 { [ Mix( [ SinOsc.ar(440, 0, 0.2) ] ), Mix( [ Saw.ar(662,0.2) ] ) ] }.play;

 { [ SinOsc.ar(440, 0, 0.2), Saw.ar(662,0.2) ] }.play;

所以synthdef更好

 SynthDef("crazycats", { Out.ar(0, [ SinOsc.ar(440, 0, 0.2) , Saw.ar(662,0.2) ]) }).add;
 Synth("crazycats");

答案 1 :(得分:0)

因此,声明立体声输出,例如:

{[SinOsc.ar(440,0,0.2),Saw.ar(662,0.2)]} .play;

可以使用SynthDef重写为:

SynthDef("疯狂的猫",Out.ar(0,[SinOsc.ar(440,0,0.2),Saw.ar(662,0.2)]))。添加;

Synth("疯狂的猫");

这里的优点是,现在我们在服务器中定义了synth。所以,我们可能只是分配名为"疯狂的猫"任何变量并使用它。然而,功能并非如此,因为每次调用它时,都会重新评估它。

感谢@Dan S的回答!