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