axjack's blog

axjack is said to be an abbreviation for An eXistent JApanese Cool Klutz.

Busの練習

Busを介して音を出す、はずであった。作ったコードのoBusiBusでそれらしいことをしたつもりである。しかし、どちらかというと

//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

Order of execution | SuperCollider 3.9dev Help

Synth | SuperCollider 3.9dev Help