高域ダンピング
リバーブを自然な感じで響かせるためには、「だんだん音がぼやけて行く、目立たなくなる」という要件が満たされるとベターです。自然界ではあらゆるもの、それこそ空気自体がローパスフィルタとしての働きを持っていて、遠くの音がぼやけて聞こえるのもこのためです。
これを実現するためには、ディレイタップのフィードバックにローパスフィルタをかけることをお薦めします。ローパスフィルタの実現方法は色々なパターンがあって、これはこれで書いていくとキリがないですが、とりあえず「1次IIRフィルタ」というのが一番簡単な方法かと思います。要するに、
出力波形=入力波形×(1-α)+1サンプル前の出力波形×α
というような式で、αが0だとフィルタはかからず、αが0.5だとそこそこかかって、αが0.99だとかなりかかる。 αが1だと音が出ない。という感じになります。
最もシンプルですが、とりあえずローパスフィルタを作りたい時はそこそこ使えます。もっと詳しく知りたい人は、「IIRフィルタ」「FIRフィルタ」などをネットで検索してみてください。
ステレオ感
大車輪リバーブレーションモデル(名前付いてるし)で、実は一番面倒だったのはステレオ感のコントロールです。
基本は1つ1つのディレイタップを左右で異なるフィードバック量にするのですが、ディレイタイムがランダムに変わるので、特にディレイタップ数が少ない場合は、定位が右か左にずれてしまいます。ぶっちゃけこの問題は解決してないというか、ある程度ディレイタップ数を増やすことでなんとか誤魔化しています。
まとめ
今回はデジタルオーディオエフェクトの代表格とも言えるリバーブ(残響音)の生成アルゴリズムを掘り下げて考えてみました。この分野はとても奥が深く、工夫の余地が残されています。商用のハードウェアやソフトウェアでも、新しいアイデアに基づく製品がいまだに数多く発表されているくらいです。
この記事が、色々なアイデアを試して独創的な音作りにチャレンジする人のための道しるべとなれば幸いです。
サンプルの解説
サンプルファイルには、今回の大車輪リバーブを使ったサンプルサウンドとソースコードが入っています。
サンプルサウンド(reverb1.mp3)の内容は以下の通りです。
| 1つめ | 原音 |
| 2つめ | 25個のディレイタップ |
| 3つめ | 300個のディレイタップ |
| 4つめ | 30個だけど短めのディレイタイム |
| 5つめ | 50個だけど「短すぎ&濃すぎ」と「薄すぎ」の組み合わせ |
ソースコード(daisha.cpp)はC++で書いています。GN_INPUT_FILENAMEで定義した入力ファイルを読み込んで、大車輪リバーブを施した結果を、GN_OUTPUT_FILENAMEで定義した出力ファイルへ書き込みます。
入力ファイルのフォーマットは、float型のバイナリー配列で、1つの値がモノラル音声の1サンプルに相当します。出力ファイルもfloat型のバイナリー配列ですが、IS_STEREOがtrueの場合は、L、R、L、R、……という順序でステレオ音声として格納されます。
