前回に続いてSuperColliderの話題ですが、MaxやPureDataのようにオーディオデータを順番に接続して処理するにはどうしたらいいか、下記サイトを参考に遅延処理をテストしてみました。
http://doc.sccode.org/Tutorials/Mark_Polishook_tutorial/17_Delays_reverbs.html
環境: SuperCollider 3.9.3 / macOS High Sierra
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
( SynthDef("someGrains", { arg centerFreq = 777, freqDev = 500, grainFreq = 0.5; var gate; gate = Impulse.kr(grainFreq); Out.ar( 0, SinOsc.ar( LFNoise0.kr(4, freqDev, centerFreq), 0, EnvGen.kr(Env.sine(0.1), gate, 0.1) ) ) }).add; SynthDef("aDelay", { arg delay = 1.0; Out.ar( 1, DelayN.ar( In.ar(0, 1), delay, delay ) ) }).add; SynthDef("aDelay2", { arg delay = 0.5; Out.ar( 0, Pan2.ar( DelayN.ar( In.ar(1, 1), delay, delay ), -1) ) }).add; SynthDef("aDelay3", { arg delay = 0.25; Out.ar( 0, Pan2.ar( DelayN.ar( In.ar(1, 1), delay, delay ), 0) ) }).add; ) ( Synth.head(s, "someGrains"); Synth.tail(s, "aDelay"); Synth.tail(s, "aDelay2"); Synth.tail(s, "aDelay3"); ) |
いろいろな記述の仕方があるようですが、一番理解しやすい形を試してみました。
Out.ar(bus,outputdata) -> In.ar(bus, channel)
Outで指定したbusナンバーをInに指定してデータを受け取ります。
どの音がどの処理に相当するかわかりやすくするため、音をPanで振りました。(-1が左(L)、0がセンター(C))
Panを使わないと、Outのbus 0が左(L)、1が右(R)になります。
プログラムは、短い音を2秒間隔(L)で鳴らし、続いてそのディレイ音が1秒後(R)、1.25秒後(C)、1.5秒後(L)となります。
(なかなかクセがあるコードです)