2017/05/16

SuperColliderでエフェクト

SynthDef で定義したエフェクトを InOut でルーティングします。

Bus

SuperColliderではBusを指定することでルーティングを行います。

BusにはAudioBusとControlBusの2つがあります。AudioBusは.ar、ControlBusは.krの管理に使います。ここでは単にBusと言う場合、AudioBusを指すことにします。

Bus0からの数チャンネルはハードウェアへの出力となります。例えばステレオ環境ならBus0が左、Bus1が右チャンネルとなります。 ServerOptions から出力チャンネル数を調べることができます。

// s = Server.local;
s.options.numAudioBusChannels; // ハードウェアの出力チャンネル数

以下でAudioBusとControlBusの最大チャンネル数を調べます。デフォルトの最大チャンネル数はAudioBusが1024、ControlBusが16384となります。

s.options.numAudioBusChannels;
s.options.numControlBusChannels;

In, Out

In で入力Bus、 Out で出力Busを指定します。以下の例ではBus10に出力した SawIn で受け取り、 BMoog フィルタを適用してBus0に出力します。

~bus = 10;

{
  var numChannels = s.options.numOutputBusChannels;
  var input = In.ar(~bus, numChannels);
  var filter = BMoog.ar(input, 500, 0.991);
  Out.ar(0, filter)
}.play;

{
  var osc = Saw.ar(100, 0.2);
  Out.ar(~bus, Pan2.ar(osc))
}.play;

Pfxb

パターンにエフェクトをかけるときは Pfxb が使えます。

thisThread.randSeed = 200;

SynthDef(\hihat,
  { | out(0), amp(1), pan(0), dur(0.1), curve(-64) |
    var envAmp = Env.perc(0, dur, 1, curve);
    var envGenAmp = EnvGen.ar(envAmp, doneAction: 2);
    var noise = FBSineC.ar(40000, 4, 1.02, 1.05);
    var dckill = BHiPass4.ar(noise, 240, 4, amp * envGenAmp);
    OffsetOut.ar(out, dckill)
  }
).add;

SynthDef(\delay,
  { | out(0), in(0), freq(0.1) |
    var input = In.ar(in, 1);

    var filter = input;
    var delay = 0.1;
    8.do({
      filter = AllpassL.ar(filter, delay, delay.rand, delay.rand, 0.5, filter)
    });

    OffsetOut.ar(out, Pan2.ar(filter))
  }
).add;

TempoClock.default.tempo = 118 / 60;

~bind = Pbind(
  \instrument, \hihat,
  \out, 10, // bus 10 に出力。
  \dur, 0.25,
  \curve, Pseq([-39, -70, -2, -33], inf),
  \amp, 0.1
);

Pfxb(
  ~bind,
  \delay,
  \in, 10,  // bus 10 から入力。
  \out, 0,
  \freq, 0.1
).play;