CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

デジタルリバーブ

ディレイの単一出力をフィードバックさせると繰り返しエコーが得られますが、エフェクトとしては繰返しが規則正しすぎ、町の防災放送か野球場のアナウンスのようで不自然で品がありません。
実際の建物の中での反射音は複数回壁に反射してあゆる方向から来る自然な残響になりますが、これをシミュレートするのは膨大な計算量が必要です
 
ここでは簡単に複数の遅延時間を持つディレイを組み合わせてそれらしくしてみます
イメージ 1
 
 
ディレイの途中にタップを設け、ここからの出力を混ぜ合わせてランダムな残響をつくれますが、このタップ位置が重要です。遅延時間同士の公倍数が小さいと意味がありません。
そこで思い出したのが昔のBBD素子です。アナログ回路でリバーブを作り出すことができ、そのとき使われたのがリバーブ用のBBD、MN3011です。当時1個5~6千円のICでそうとう高かった覚えがあります。
データシートを探してくると、ありました。
タップは6個で396/662/1194/1726/2790/3328段目となっています。
何でこの値かはわかりませんが実験の結果でしょう。
 
イメージ 2
 
BBDの転送クロックが10kHzのときそれぞれのタップでの遅延時間は
19.8/33.1/59.7/86.3/139.5/166.4msになるとあるので、これをそっくり頂いてしまいます。
 
デジタルディレイでサンプリング周波数が25kHzのときのメモリ段数を計算すると
495/828/1493/2158/3488/4160段になるので書き込みポインタよりこの数だけ後から読み出すと必要な遅延が得られます。
これをコーディングしたのが以下のプログラムです。
 
イメージ 3
 
ここでは簡単に全てのタップからの信号を均等に混ぜ合わせています。
また前回、モジュールを関数化してすっきりさせたのをまた元のべた書きに戻しちゃっていますが実はサンプリング周期の1スロット内でできる処理はこれがギリギリなのです。外部関数をコールしたり、ちょっと処理を付け加えると割込みが起きなかったり暴走したりで何とか切り詰めた結果がこれです。