2012/02/20

Phaser Javaで自作

All-passフィルタを組み合わせて実際にエフェクタを作ってみようと思う。参考にしたエフェクタはAudacity標準のPhaserとVSTのClassic Phaserの2つ。一通り試してみたが、パラメータに不明な部分がある。StagesやLFOの速度、Feedbackなどはよいのだが、Depthの考え方にバラツキがあるように思えた。PhaserのDepthは一般的にLFOの揺れ幅を示すと思う。実際に加工してもそのように動作しているものが多そうだ。しかし、基準値が不明なのだ。Audacity標準Phaserでは、Depthが255だと0~約11kHzの間を回っているようだが、浅くしていくと、上限の周波数が低くなっていくようだ。Classic Phaserは動きが違っていて、常に0~21kHzまで効くようだ。DepthはノッチフィルターとしてのQの幅が変化、もしくはミックスの割合が変化。LFOの周期は一定。高域の特性はローパスフィルタで調整している。他のVSTのPhaserのパラメータを見ても、いろいろな表現があるようだし、それぞれの解釈で動作している。wikiではDepthはWetレベルを指している。自作は、いろいろな解釈があるDepthはやめて、LFOの範囲を周波数で設定することにした。例えば0~12kHzの間をLFOの周期で回るというイメージ。なるべく明確な設定が出来るようにしようと思う。

資料に関して
今まで作ってきたエフェクタの多くは、英語版Wikiなどに、それなりにまとまった情報があって、それを元に作ることが出来たりしたけど、今回は数式からそのまま作るようなことが出来なかった。原理の説明もほとんどなくて、ネットで見つけた情報にも明らかな間違いがあったり・・・ 特に自ら製作していない人の説明は当てにならない。結局、自分でプログラムを組みながら、様子を見るという方法をとった。原理的に大きな間違いはないと思うけども、解釈にズレはあるかもしれない。

Stagesの実験
ステージはAll-passフィルタのタップ数を指している。基本的には2タップ一組になっている。これらを共通のパラメーターのまま直列につなぐだけで、落ち込む周波数の谷の数が変化する。まずは各ステージにチャープ信号通して、原音とミックスしてみた。

2stages
DryとWetを 1:1 でミックスすると、ひとつの谷ができる。この谷がカットオフ周波数になる。
4stages
2つの谷ができる。 カット オフ周波数は中心の山になる。直列にすることで、山と谷の関係が変化する。
ステージが増えるとステージ/2の谷ができる。4の倍数ステージは カット オフが山になる。

Phaserとして利用するときは、この カット オフ周波数をLFOで移動させることで、ロータリースピーカーのようなうなりを出す。うねるエフェクタとしては先週作ったフランジャーがあるが、これは常に高音域まで影響を与えるコムフィルタの移動なので、より派手な変化となる。Phaserは上記のように谷の数が少なく、効き方もおとなしいという印象。

ブロック図
実験なので凝ったことはせずに、 All-passフィルタを直列につないで、LFOは左右共通にした。ゲインなども最小限にした。初期角度だけは左右独立設定にした。π(180度)ずらすことで、ぐるぐる回る感じになる。

各ステージのAPFの中身は下図のようにIIRの標準形になっている。中身は2次のAll-passフィルタ。係数等の詳細はこちらのページ

Javaでプログラミング
上記の実験を元にプログラム開始。先週のモジュレーションに比べればシンプルなプログラムなのだが、意外と微調整に苦労する。理屈どおりやっても、出てきた音に違和感を覚えたりして、その修正に時間がかかった。とくにSpeedのパラメータは重要で、かなり試行錯誤した。はじめ周波数域の移動をリニアにやってみたら、不快な音になって即却下。常用対数でやってみてもイマイチ。結局12を底としたところ、結構スムーズな音になったという具合。そのほかいろいろ微調整をしたくて、見慣れないパラメータが並んでしまった。
Download NamagiPhaser32bitF.jar 19KB
無理な設定を除去するような安全設計は、ほとんどしていないので、おかしな結果になったら、設定をじっくり見直して。

Stage 2~12
原音とミックスしたとき、ノッチフィルタの谷数が変化する。谷数はstage/2となる。大きい値にすると、ギュワギュワした音になる。2~4が控えめでオシャレ。

LFO Rate Hz
低周波発振器。

Width Hz
all-passフィルタの反転周波数の移動区間を指定する。0Hzからここで指定した周波数の間を往復する。はじめは低域側の周波数も指定するように作ったけど、低音域は結構重要で常時0Hzまで有効にしたほうがよいという結論になった。

Speed
0HzからWidthで設定した周波数までを往復するが、そのときのスピードの調整となる。これは周波数領域を対数に沿って移動する。低域はゆっくりと移動して、高域はそれなりに早く移動する。こうすることで感覚的にはスムーズな移動に聴こえる。その対数の底の設定となる。通常の周波数スペクトルでは10を底とするが、実際に作ってみると、10では低音域を早く通過しすぎる印象がある。ということで初期設定は12にした。わりとゆったりとうねる感じになる。場合によっては20ぐらいにするのもあり。

Phase L R
初期角度の指定。左右をπずらすことで、回転しているような効果を作り出せる。

Q
All-passフィルタの反転範囲の指定。多くのPhaserにはないパラメータ。0.1~10ぐらいで調整するとよいと思う。大きな数値ほど鋭いノッチフィルターとなり、Phaserとしては、効果が薄れる方向になる。ステージ数にもよるが、0.5ぐらいがはっきりとした効果が得られる。

Feedback -1~1
マイナスは位相を反転したフィードバックとなる。通常は0で十分だと思う。使う場合でも控えめにした方がよさそうだ。

Wet/Dry
同じレベルにすると効果が最大になる。効き過ぎる場合は、Wetを少なめにする。

サンプル音源
アコースティックギターのストロークに初期設定のまま掛けてみた。


最後に
Phaserの製作では、感覚を頼りに微調整することが多かった。理論は当然しっかりすべきことなのだが、それだけでは、まとまらないという感じ。音を聞いて、どこを修正したら、どうなるかがイメージすることが重要に思えた。そういう意味ではいい勉強になった。でも、このエフェクトも自分では使わないだろうなぁ・・・。

sound programming 目次