今回は、Freeverb3開発についてちょっと書いてみようと思います。 Freeverb3というのは畳み込みアルゴリズムを含む小さな信号処理ライブラリで、 主に、音声処理/DAWでリバーブの効果処理を行うことを目的にしていますが、その他に帯域フィルタ、リミッタ等が入っています。
UNIXで音楽等を聞くのにはxmms、bmp、audaciousを使用していましたが、 それらにもともとから附属している音響効果プラグインはどれも貧弱で、そのうちいくつかは、少し使っただけですぐエラーで落ちてしまうような ひどいものばかりでした。そこで目を付けたのがfreeverbでした。そもそも、その当時はソースコードがフリーで 手に入るのはそれくらいしかなかったんですが。オリジナルのfreeverbは、 DreampointのJezar氏によって製作されたコムフィルタ(comb filter)とオールパスフィルタ(allpass filter) による単純なリバーブであり、それに色々と手をつけてきっちり動くものを作ることにしました。
ただ、初めてそのソースコードを目にしたときは何をしているか全くわかりませんでした。 例えば、以下のようなコードが何をしているか見当もつかなかったわけです。
なぜ入力を反転するのか、フィードバックの係数による効果とは、など、出力される音響の仕組みがソースコードからだけは意味不明なのです。 それを読み解くには、離散信号処理についての色々な知識が必要でした。 アルゴリズムだけで言えば、差分・和分・漸化式ということになり意外に簡単な分野に入ります。実は高校数学でもやったことがあるくらいです。 もちろん、それだけでは入力信号の解析はできないので、さらなる理解のためには所謂大学数学の範囲が必要になってきます。
大学入試の勉強の時に「大学入試数学のルーツ」とかいうちょっと飛んでいる本をやっていた時にディラックのデルタ関数が出ていて、 当時は一体なんのための関数だろうか、何じゃらほいといういう感じでしたが、インパルス応答を考えながらアルゴリズムを書いていると、 先人達の作ってきた数学の重要さ・面白さがじわじわと感じられてきたのが思い出されます。 うろ覚えですがz変換やLaplace変換と変換表も載ってた記憶があり、当時は完全訳わかめでしたが、 フィルタを実装してみてやっとちょっとだけ分かったという感じです。
そんなこんなで位相・周波数応答・群遅延等から始まって、極・零、安定性からdenormalなど浮動小数点についての話までいつのまにか たどりついていたときには、FFT(DFT)による畳み込みに関して、SIRというソフトが目に入っていました。 SIRは、Windows VST用の畳み込み効果のためのプログラムで、ただの音声からあたかもホールでなっているようにする 音声を作成するといった用途に使います。サンプルはFreeverb3の下の方やそのサンプルページに 用意してあります。originalがもとの音声、Impulse Response(IR_theater.wav)が映画館を仮想的に実現するための インパルスで畳み込んだ音声です。おそらくそれっぽく聞こえるでしょう。SIR自体は大分前に作られたもので、 速度的にかなり遅く、UNIXではもちろん使えないので、畳み込みの最適化等についても作ることにしました。
段々とソースコード量が膨らんできた頃、CVSによるバージョン管理を考え始め、SF.NETに行き着きました。 オープンソースのプロジェクトを持てるサイトはいくつかありましたが、大きさ等や認知度の点からSF.NETを採用しました。 たとえば、SF.JPなどもありますが、もしFreeverb3がこちらでホストされていたら、Freeverb3自体の認知度は もっと低かったでしょう。バグを見つけるには多くの人に使われなければならないのです。バグの指摘以外では、 ドイツのどこかの工科大学の学生さんから、リングバッファのアルゴリズムに関して、なんでこれで動くのかという初歩的な質問が来たことがありました。
開発当初は、WindowsにはSIRがあるので、UNIX用のプラグインを作るだけでよいだろうと思っていたのですが、 SIRがあまりにも遅いので、Windowsでも同じアルゴリズムを使えるようになればと思い、VSTの開発も始めました。 VSTとは、DAWなどでよく使われているソフトの一種で、CDのマスタリングなどで音を良くしたいとか聞きやすくしたいとか残響を加えたいといった、 音声に変化を与えるためのものです。ちなみに、その当時は安定した環境がMinGWくらいしかなく、 ビルドするのも一苦労でしたが、一回ツールセットを整えてしまえば後は楽にビルドすることができます。
さらに高速にするために、SSE等のSIMDを使ったアセンブラも利用するようになりました。以前はコンピュータ系の広告で SSE対応とか銘打って売られているのを目にすることがあったものですが、実際にSSE等を利用するには、 開発者のかなりの努力が必要となるということは初めてわかりました。 今でこそインテルやGCC等のコンパイラがかなり良くなってきて、自動的に並列化してくれるようですが、 当時は自分でよく考えてコードを打たないときちんと最適化してくれなかったのです。高速化技法については、 別ページで詳しく述べています。
このライブラリを作成した目的の一つに、YAMAHAのFinal Masterと同じようなマスタリングコンプレッサ機能を持つ マスタリングソフトウエアを作ることがありました。そのため、FIRフィルタ作成機能もつけてあります。 VSTではWindCompressorという名前を付けてFinal Masterに似せて作ってあります。 機会があれば、特にスピーチに適用してみてください。非常に聞き取りやすい声になると思います。
そんなこんなで利用者がだんだん増えてきたようですが、有る程度まとまった時間がとれないとなかなか開発は難しいですね。
plis tak mi auot from yuor mail list.
-- This Engrew sentence contains very few errors. -- From a message sent to
Shlomi Fish
-- Shlomi Fish
-- Shlomi Fish's Aphorisms Collection ( http://www.shlomifish.org/humour.html )
Tel Aviv - a functional definition:
Free parking space free space.
Shachar Shemesh
[Blog Post](http://blog.shemesh.biz/?p=435)
-- Shachar Shemesh
-- "Tel Aviv - a Functional Definition" (Blog Post) ( http://blog.shemesh.biz/?p=435 )