Reverbの自作5 Schroederのアルゴリズム
なんとかリバーブらしいものまでこぎつけた。約2日使ってしまった。プログラミングだけなら1日かからないで出来たのだろうけど、Blogにまとめておく作業が半分以上という感じ。まとめる作業って馬鹿に出来ないぐらい時間がかかる。でもこの作業をしておくことが大事。
上図はリバーブで作り出した音を色分けしたもの。大雑把に青が直接音で、赤が初期反響音、水色が後部残響音となる。
設定値は残響時間を基本に遅延時間、フィードバックゲインを下記計算式を使って調整していく。combの遅延時間は30から45msec程度で、最小値と最大値の比率は約1.5がよいらしい。また遅延時間は相互に重ならないように、サンプル数が素数になるように、うまく組合わせる必要がある。手計算だとパラメーターの設定だけでも面倒なことになる。今回は基本的なしくみを知りたいだけなので、自動計算などはさせずに、ダイレクトに設定できるように作ってみた。設定値でどう音が変化するかを知るのが大きな目的。allpassは遅延時間が短めで、5msec、1.7msecとあったので、ほぼそのまま採用することにした。allpassのフィードバックゲインも推奨値があり0.7。
Tr: 残響時間 60dB減衰する時間
g: フィードバックゲイン
タウ: 遅延時間(ディレイタイム)
設定値
残響 1.5秒
サンプリング周波数 44100Hz
comb1: 39.0msec
feedback1: 0.83560301823125
comb2: 36.7msec
feedback2: 0.84450067298951
comb3: 33.2msec
feedback3: 0.85822270505402
comb4: 29.9msec
feedback4: 0.83214690068679
APF5: 5.05msec
feedback5: 推奨値0.7
APF6: 1.65msec
feedback6: 推奨値0.7
Audacityがver2.1.0になって、LADSPAの設定が pluginsettings.cfg ファイルに保存できるようになった。 ただ不安定で、ちゃんと書き込めないことも多いので、基本設定をここに書いておく。 ファイル場所はWinではここにある。
C:\Documents and Settings\USER\Application Data\Audacity\pluginsettings.cfg
Parameters=APF5="1.000000000000" APF6="1.000000000000" Comb1="1.000000000000" Comb2="1.000000000000" Comb3="1.000000000000" Comb4="1.000000000000" DelayTime1(msec)="39.000000000000" DelayTime2(msec)="36.700000000000" DelayTime3(msec)="33.200000000000" DelayTime4(msec)="29.900000000000" DelayTime5(msec)="5.050000000000" DelayTime6(msec)="1.650000000000" Dry="1.000000000000" Feedback1="0.83560301823125" Feedback2="0.84450067298951" Feedback3="0.85822270505402" Feedback4="0.83214690068679" Feedback5="0.7000000" Feedback6="0.70000" Wet="0.180000007153"
ドライ(リバーブなしのオリジナル)
Schroeder Reverb 残響 1.5sec
金属が反響しているような音になっているが、パラメーターを工夫すれば現状でも使えなくもないという印象。
sound programming 目次
Schroederによるリバーブアルゴリズム
1960年代の初期デジタルリバーブであるManfred Robert Schroeder(シュレーダー)のアルゴリズムをなぞってみる。内部的にはcomb fileterを4つ並列でつないで、その後にall-pass fileterを2個直列でつないでいる構造が、もっとも基本的なパターンらしい。comb fileterで長めの残響を作り出し、all-pass fileterで密度を上げ補間するような構造になっている。パラーメータを工夫することでリバーブの後部残響を生成することができる。リバーブの初期反射は別の構造なので、そのうち取り上げたいと思う。上図はリバーブで作り出した音を色分けしたもの。大雑把に青が直接音で、赤が初期反響音、水色が後部残響音となる。
ブロック図
ブロック図の作図手段が悩みどころ。毎回違うソフトを使っているのだが、今回フリーの汎用CADソフトjwwで描いてみた。この手の作業はCADが一番ストレスないわ。簡単に出来そうなソフトほど苦労するので、はじめから本格的なものを使った方が早かったというオチ。設定値は残響時間を基本に遅延時間、フィードバックゲインを下記計算式を使って調整していく。combの遅延時間は30から45msec程度で、最小値と最大値の比率は約1.5がよいらしい。また遅延時間は相互に重ならないように、サンプル数が素数になるように、うまく組合わせる必要がある。手計算だとパラメーターの設定だけでも面倒なことになる。今回は基本的なしくみを知りたいだけなので、自動計算などはさせずに、ダイレクトに設定できるように作ってみた。設定値でどう音が変化するかを知るのが大きな目的。allpassは遅延時間が短めで、5msec、1.7msecとあったので、ほぼそのまま採用することにした。allpassのフィードバックゲインも推奨値があり0.7。
Tr: 残響時間 60dB減衰する時間
g: フィードバックゲイン
タウ: 遅延時間(ディレイタイム)
Schroeder Reverb Audacity用 LADSPAプラグイン for Windows
Audacityでの利用画面。各comb、all-passのパラメーターを個別で操作できるようにした。またDRYとWETのgainを設けてみた。このプログラムのall-passはcombを通ったものしか扱わないので、all-passだけ通すということはできない。LADSPAの問題
LADSPAのインターフェイスの問題。スライダーが多くなると全体を表示しきれないので、ウィンドウを広げてやる必要がある。毎回これをやるというのも・・・ スクロールでアクセスするのもスマートでない。やはり一番の問題はパラメーターの数値が保存できないこと。毎回入力する必要がある。それに近似値扱いという歯切れの悪さ。もうLADSPAを使うのはこれでおしまいにしようと思う。LV2もAudacityで使うとなると、似た問題が出そうなので、やっぱり完全自作しかないかも。デルタ関数に適用してみる インパルス応答
残響1.5秒で設定している。リバーブらしいインパルス応答が得られている。DRYを1.0に設定しているので、0timeにデルタ関数がそのまま残っている。30msec後からがリバーブの波形。実際に使ってみる
実際いくつかの音にリバーブをかけてみた。下のサンプルは以前録音したエレクトリックギターにリバーブをかけてみたところ。遅延時間はサンプル数で素数が好ましいので、なるべく素数になるようにして設定してみた。計算はMaximaを使っている。本来は素数のチェックなんてやってられないのでプラグインの中で自動計算させるべきだろう。今は実験なのでそこまではやらない。残響時間は1.5秒で計算。all-passに関してはfeedbackは推奨値である0.7に設定している。設定値
残響 1.5秒
サンプリング周波数 44100Hz
comb1: 39.0msec
feedback1: 0.83560301823125
comb2: 36.7msec
feedback2: 0.84450067298951
comb3: 33.2msec
feedback3: 0.85822270505402
comb4: 29.9msec
feedback4: 0.83214690068679
APF5: 5.05msec
feedback5: 推奨値0.7
APF6: 1.65msec
feedback6: 推奨値0.7
Audacityがver2.1.0になって、LADSPAの設定が pluginsettings.cfg ファイルに保存できるようになった。 ただ不安定で、ちゃんと書き込めないことも多いので、基本設定をここに書いておく。 ファイル場所はWinではここにある。
C:\Documents and Settings\USER\Application Data\Audacity\pluginsettings.cfg
Parameters=APF5="1.000000000000" APF6="1.000000000000" Comb1="1.000000000000" Comb2="1.000000000000" Comb3="1.000000000000" Comb4="1.000000000000" DelayTime1(msec)="39.000000000000" DelayTime2(msec)="36.700000000000" DelayTime3(msec)="33.200000000000" DelayTime4(msec)="29.900000000000" DelayTime5(msec)="5.050000000000" DelayTime6(msec)="1.650000000000" Dry="1.000000000000" Feedback1="0.83560301823125" Feedback2="0.84450067298951" Feedback3="0.85822270505402" Feedback4="0.83214690068679" Feedback5="0.7000000" Feedback6="0.70000" Wet="0.180000007153"
ドライ(リバーブなしのオリジナル)
Schroeder Reverb 残響 1.5sec
金属が反響しているような音になっているが、パラメーターを工夫すれば現状でも使えなくもないという印象。
今後
リバーブの密度が薄いので、これを上げていくためにはall-pass部分の改良が必要。入れ子にして使うとよいみたいだ。 リバーブの後部残響の基礎が少し見えてきたので、今後はオリジナル要素も入れて改良をしていく。また初期反射は別のエフェクターとして考えていくつもり。Schroeder Reverb ソースコード LADSPA
ダラダラと無駄の多いソースになってしまっているが、実験用なのでいいでしょう。分かりやすさを優先。
|
sound programming 目次