2012/02/04

DelayをJavaで自作

以前AudacityのNyquistでもディレイを作ったけど、あれはスクリプトで、あらかじめ用意された命令を組合わせたに過ぎない。今回はJavaでローレベルのディレイを作って、原理を体感しようと思う。ディレイの基本についてはこちらのページ

個人的に必要と思っている主な仕様
音声ファイルをバイナリーで読み込んで、リングバッファに貯めて、原音と任意の遅延タップをミックスして、Wavファイルとして出力するだけ。
ステレオ処理 左右独立のディレイタイムとディケイの設定
ディレイタイムは2秒あれば十分
サンプル単位とmsecとの切替
LPF&HPF IIR 2pole カットオフ周波数の調整 先週作ったIIRを実装する
フィードバック -1.0~1.0 位相の反転可能
32bit floatのみ対応(個人的に他は必要ないので)
サンプリング周波数44.1kHz(48kHz,96kHzも可)
左右の信号が混じる処理もしてみたい。これを発展させれば左右に飛び交う効果も作れるので。

上記を実現するためのブロック図を描いてみた。今回のディレイ規模なら、いきなりプログラムでも問題ないのだけど、今後、機能を追加したり、差し替えたりすることを考慮すると、ブロック図にした方が確実。これを元にプログラミングをしてみる。

HPFはWETに入ってきたら1回だけ通過させる。LPFは出力のたびに通過するので、FBがあれば、通るたびに音はこもっていく仕掛け。

プログラミング開始
悪い癖で、オブジェクト指向を無視して、いきなり作ってしまった・・・。小さいプログラムなので、さらっと出来てしまう。後々改造しやすいように作りたいところだが、まだ経験不足。同じような計算式があちこちにある・・・ 

ついでにマルチタップ化を試してみたら、これは必要なさそうだ。マルチタップは設定が微妙で使い方が難しい。リバーブの初期反射などを作るときには良いかもしれないけど、手動で設定するには向いていない。

フォーマットは個人用ということで、あれこれ対応させる必要もなく、ステレオのwavファイル32bit-float専用。モノラルの場合は、左右同じ設定であれば処理される。左右の設定を変えると、でたらめになる。サンプリング周波数は基本的に44.1kHzでテストしている。たぶん48kHzでも使えると思うが不具合があるかもしれない。

インターフェイスも作ってみた。プログラミングは中身を作る2倍の時間がかかっている。やっぱりGUIは面倒くさい。できればしたくない・・・。でも自分で使うだけでもGUIは必要。最低限の内容でまとめてみた。もはやスライダーを作る元気はないので、数字を直接打ち込むだけのGUI。それでもsampleをmsecに変換したりとか、変な数値はキャンセルするとか、やることは多い。

ダウンロード Wav 32bit-float専用バージョン 24KB

さて、実際試してみると、不具合の連発。メモリ管理はちょっとはまった。連続して使うと前の音がメモリに入っていて邪魔をする。たった一つの変数も邪魔をするので、作業終了時に毎回クリアさせた。そんな些細なことを小一時間かけて修正。なんとか基本的な動作はOKになった。

これをベースに、今後いくつか機能を加えてコーラスとかフランジャーも試してみようかと思う。ほとんど必要性はないのだけど、原理を実感したいだけ。

サンプル音源
FlashからWebM(HTML5で見れる)になって音が良くなったYouTubeに置いてみた。デフォルトだと今でもFlashになるようなので、手動でHTML5に切り替える必要がある。設定は http://www.youtube.com/html5 にて有効にする。内容は1年以上前に録音したものだけど。改めて自作ディレイにかけてみた。アコースティックギターを左右に遅らせて振っている。


sound programming 目次はこちら