ChucK による Fuzz の実装

ChucK の触りかたがぼちぼち分かってきたので簡単なエフェクタを実装してみる。まずは Fuzz から。

SndBuf osc => Gain overdrive => Gain limitter => dac;
"lost_control.wav" => osc.read; // <-- 適当な Wave ファイルを指定する

0.5 => float MAX_GAIN;  // <-- 出力時の最大 gain
5.0 => float OVERDRIVE; // <-- どのくらい歪ませるか

MAX_GAIN * OVERDRIVE => overdrive.gain;
for(0 => int i; ; i++) {

  1.0 => limitter.gain;
  if(MAX_GAIN < Math.fabs(overdrive.last())) { // 出力予定の gain より大きかったら余計な振幅を削る 
    if(overdrive.last() != 0) { // ゼロ除算の予防
      MAX_GAIN / Math.fabs(overdrive.last()) / OVERDRIVE => limitter.gain;
    }
  }

  1::samp => now; // サンプルごとにループ
}

ここでは 2 つの Gain を使用している。1 つ目の gain (overdrive) で出力の振幅を大きくしてから、もう 1 つの gain (limitter) で膨らみすぎた振幅の上部を削り取っている。limitter での出力レンジの調整は、overdrive の最後の出力値 (overdrive.last() の値) を元に limitter の gain を調整して、最終的な dac への出力が MAX_GAIN を超えないようにしている。

正しい実装になっている自信はないものの、適当に聞いた感じではそれっぽく歪んでいるようだ。