0

如果你有一个函数定义:

{ 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 的等价物是什么?此外,有没有更优雅的方式来定义上面的函数?

4

2 回答 2

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");
于 2016-01-09T11:04:54.313 回答
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) ] ) ).add;

Synth("疯猫");

这里的好处是,现在我们在服务器中定义了合成器。因此,我们可以将名为“crazy cats”的合成器分配给任何变量并使用它。但是,函数并非如此,因为每次调用它时,都会对其进行重新评估。

感谢@Dan S 的回答!

于 2016-01-09T17:36:59.413 回答