2016-01-08 33 views
0

如果你有一個函數定義:Supercollider- SynthDef相當於使用2個不同的合成器

{ 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等價物?此外,有沒有更好的方法來定義上面的函數?

回答

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"); 
+0

謝謝!這爲我清除了一些東西。但是,爲什麼我得到這個錯誤: ( SynthDef(「crazycats」,{Out.ar(0,[SinOsc.ar(440,0,0.2),Saw.ar(662,0.2)])}) ; 合成器( 「crazycats」); ) *** ERROR:SynthDef crazycats沒有找到 失敗SERVER/s_new SynthDef沒有找到 – Rithesh

+0

是的,我想你忘了添加。新增方法上SynthDef。這就是爲什麼.. – Rithesh

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(「crazy cats」);

這裏的優點是,現在我們已經在服務器中定義了合成器。所以,我們可能只是將名爲「瘋狂貓」的合成器分配給任何變量並使用它。然而,功能並非如此,因爲每次調用時都會重新評估。

感謝@丹S的答案!

相關問題