デジタル・ディレイを作る - REAPERのJSFXでエフェクトを作る(2)

公開:2016-07-30 18:38
更新:2017-09-22 05:40
カテゴリ:reaper,jsfx

ディレイとは

ディレイとは、こだまのような効果を与えるエフェクトのことである。実際の効果は以下の動画を参考にされたい。

ディレイの仕組み

ディレイを作るのは比較的簡単である。ディレイのためのバッファメモリ(リングバッファ)を用意して、元音と遅らせた音をミックスするのが基本である。 アルゴリズムとしては以下となる。

  1. バッファメモリを0クリアする。読み出し位置も0にセットする。
  2. 出力データとバッファから読み出し位置のデータを加算(ミックス)して出力に送る。
  3. 読み出し位置のメモリに出力データをセットする。
  4. 読み出し位置を1加算する。加算した結果バッファメモリのサイズを超える場合は読み出し位置に0をセットする。
  5. 2.に戻る

2.の後に3.を行うのがミソといえばミソである。

ただこれだけだと遅延するだけでこだまのように遅延した音が徐々に減衰するような感じにはならないので、フィードバック・ループを構成する。フィードバック・ループを考慮したアルゴリズムは以下となる。

  1. バッファメモリを0クリアする。読み出し位置も0にセットする。
  2. 出力データとバッファから読み出し位置のデータを加算(ミックス)して出力に送る。
  3. 読み出し位置のメモリに(出力データ+読み出し位置のデータ×フィードバック係数(0~1))をセットする。
  4. 読み出し位置を1加算する。加算した結果バッファメモリのサイズを超える場合は読み出し位置に0をセットする。
  5. 2.に戻る

ソースコード

ソースコードは以下のとおりである。アルゴリズムに忠実に実装しているが、+αの機能として、ディレイタイムを変えることができるようにしたり、ドライとウェットのミックス度合を変えたりすることができるようにしている。

desc:SF:Delay

slider1:500<0,1000,1> Delay Time(ms)
slider2:50<0,100,1>FeedBack (%)
slider3:50<0,100,1>Wet (%)
slider4:50<0,100,1>Dry (%)

@init
index = 0;

@slider

wet = (slider3 / 100);
dry = (slider4 / 100);
bufSize = slider1 / 1000 * srate * 2;
feedback = slider2 / 100;

@block

@sample

l = spl0;
r = spl1;

spl0=l * dry + index[0] * wet;
spl1=r * dry + index[1] * wet;

// feedback loop
index[0] = l + index[0] * feedback;
index[1] = r + index[1] * feedback;

(index += 2) > bufSize?index = 0;

JSFXで面白いのはバッファ用のメモリがあらかじめ8,388,608個分用意されていることである。変数に[]をつけて指標アクセスすると、変数で設定した初期位置+[x]で指定したオフセットxの位置にあるメモリを読み出したり、書き込んだりできる。なので別途メモリを確保したりする必要はないのである。