Busを介して音を出す、はずであった。作ったコードのoBus
やiBus
でそれらしいことをしたつもりである。しかし、どちらかというと
//use one bus ( ~b1 = Bus.audio(s,1); {Out.ar(0,In.ar(~b1,1))}.play; {Out.ar(~b1,SinOsc.ar(440))}.play; ) //use two busses ( ~b1 = Bus.audio(s,1); ~b2 = Bus.audio(s,1); {Out.ar(0,In.ar(~b1,1))}.play; {Out.ar(~b1,In.ar(~b2,1))}.play; {Out.ar(~b2,LFTri.ar(440))}.play; )
と明示的にBusを作った方が良かったと最後になって気付いた。
メモ
Synth.newPaused
で一時停止した状態のSynthを作ることが出来る。~x = Synth.newPaused(...)
を実行した後に~x.run
と実行すると再生することが出来る。Synth.after(aNode,defName)
でaNodeの後ろにSynthを作ることが出来る。source -> effect
のような流れを作る場合に使う。左右の信号に掛けるLFOの位相をそれぞれ変え(例:左は0, 右はpi/2)ておくと、位相のズレを体感することが出来る(論より証拠)。
作ったコード
s.meter(0,2); s.plotTree; //Triangle Osc ( SynthDef(\tri,{ |freq = 440,oBus = 10| var out,sig; sig = Mix.fill(4,{|i|LFTri.ar(freq/(1+i),0,1/4)}); out = sig; Out.ar(oBus,out); }).add; ) //Effector ( SynthDef(\eff,{ |iBus = 10,afreq=1| var in,in_r,in_l; in = In.ar(iBus); in_r = in * SinOsc.kr(afreq,0,0.2,0.4); in_l = in * SinOsc.kr(afreq,pi/2,0.2,0.4); Out.ar(0,[in_r,in_l]); }).add; ) //kick ( SynthDef(\kick,{ var env = EnvGen.ar(Env(levels:[100,200,60,0],times:[0.01,0.2,0.2,0.2],curve:-10)); var sig = SinOsc.ar(env,0,1,0) + WhiteNoise.ar(0.01); sig = sig * EnvGen.ar(Env.perc(attackTime:0,releaseTime:0.3),doneAction:2); Out.ar(0,sig!2); }).add; ) //Synth ( ~tri = Synth.newPaused(\tri,[\freq,200]); //~eff = Synth(\eff); ~eff = Synth.after(~tri,\eff); ) //run Synth ~tri.run; //Routine ( ~r = Routine({ var n = 10; loop{ n.do({|i| ~eff.set(\afreq,(i+1)); (i+1).postln; 4.wait; }); } }); ~rk = r({loop{Synth(\kick);1.wait;}}); ) ( ~rk.play(); ~r.play(); )
参考
Bus | SuperCollider 3.9dev Help