2012/02/11

Modulator (Chorus&Flanger) をJavaで自作

先週はディレイを作ったので、その応用となるコーラスでもプログラミングしようかと思う。コーラスは名前の通り、多重演奏的な音響効果が得られるもの。個人的には使いそうもないけど、モジュレーション系のエフェクトの勉強はしておきたいので、設計的興味ということで、チャレンジしてみようと思う。

予備知識もあまりないので、ARIのホームページを参考に考えてみる。原理の説明は少しあるのだが、具体的な部分はないので、後は適当に作ろうかと思う。分かったことは複数のディレイを作って、ディレイタイムを共通の5~30msec程度に設定。そして取り出し位置を変調により変化させる。ディレイが3つであれば、開始位置を2pi/3ラジアンずらして合成するとよい。またフィードバックはない。これ以上の情報は調べていないので、以下のことは間違っているかもしれない。勝手な想像でプログラムを組んでます。

変調と言われても、あまりピンとこないので、下図のようにイメージしてみた。最近あまり見かけないがカセットテープが分かりやすいと思えた。まず2つの再生ヘッドがある。DrySoundという再生ヘッドは通常の音を再生する。もうひとつのDelayTimeの再生ヘッドはDrySoundよりも少し遅れて再生する。このヘッドが-1~1の間を滑らかに行ったり来たりする。+1をどこにするのか不明だが、最大でもDryの再生ヘッド位置より進むことはあり得ないので、この位置を限界として+1とした。その移動スピードは0.1~10Hzの範囲で往復。動きはサイン波を使い、振幅値が移動地点になる。

この再生ヘッドの移動で、音はどう変化するのだろうか。テープの進行方向にDelayTime再生ヘッドが移動するときはテープ本来のスピードよりも、ゆっくりになるので、音程は下がる。逆方向に移動するときはスピードが速くなるので、音程が上がる。Dry音と同じピッチは+1と、-1のときで、サイン波を微分して0の位置になったとき。つまり再生ヘッドが一時的に停止した状態のとき。こういう仕掛けで、音程が微妙に上がったり下がったりする。このDelayTime再生ヘッドが3つあって、それぞれがDelayTime位置を0として、0、2pi/3、4pi/3ラジアンの位置からスタートする。フリーの数理処理ソフトMaximaでグラフにすると、こんな感じになる。Xが時間で、Yが再生ヘッドの移動量。

LFO制御による移動再生ヘッド3つとドライ音を合成すると、微妙なピッチのズレが発生するので、多重演奏的な効果が得られるということ。中身のイメージが固まれば、後はプログラミングに置き換えるだけの話。

ブロック図
LFOから3つの初期角度を取り出して利用するが、それぞれの値を変えられるようにしようと思う。また左右独立LFOとした。問題は変調方法。たぶんいろいろな方法があるのだろうけど、単純にサンプルレートに応じて、サイン波を出すことにした。そのY軸の値がディレイタイムの変調となる。0の場合は、設定したディレイタイムとなり、1の場合はドライと同一ポイントとなる。値は、ほとんどの場合、サンプルとサンプルの間を示すことになるので、前後のサンプルの値を抜き出して補間する必要がある。とりあえず前後2点のサンプルを直線で結んで関数を導き、そこから算出した。もう少し凝った補間でもいいのだけど、音を聴いたら、これで十分な気がした。フランジャーもコーラスと同じような内容なので、今回同居させてみた。違いは設定範囲とフィードバックがあることぐらいかな? ということでフィードバックをつけた。もはやコーラスとフランジャーの融合なので、名前はモジュレーターへ変更。

自分で使うレベルなら、プログラムの中身はあっさり完成。やっぱり時間のかかっているのはインターフェイスまわり。面倒だったので安全性はあまり考慮していない。おかしな値を入れても、強引に計算してしまう。まぁ実験用なら、その方が限界が見えてきて理解が深まるというもの。作ってみた感想は、設定項目が意外と多いなぁ・・・。

Download NamagiMod32bitF.jar 29KB

簡単な説明
スタンドアローンでwavファイルを加工するエフェクト。ダウンロードしたjarファイルをダブルクリックで上記ウィンドウが開く(要Java)。そして32bit floatのwavファイルをドラッグ&ドロップして認識させる。32bit float以外は使えない。そして各パラメータの設定をして、Modulationボタンを押すと、ファイルと同じ階層に新たに..._mod.wavが作られる。これがエフェクトが適用されたwavファイルとなる。オリジナルファイルには手を加えない。2度目以降は..._mod.wavが上書きされていく。

各パラメータについて
テキストフィールドが2つ並んでいる項目は左と右チャンネル。一番下のGainだけはWetとDryになっている。

DelayTime(Range) コーラスでは5~30mSecぐらいで使用する。これ以上短くするとフランジャー(0.01~10msec)になる。長すぎるとDepthの設定にもよるが気持ち悪くなる。

Rate 0.1~10Hz
LFOの周期 変調速度(再生ヘッドの移動速度)通常1Hzよりも低めで使わないと揺れすぎて気持ち悪い。LFOはLow Frequency Oscilator(低周波発振器)の略。

Depth(LFO Level) 0.0~1.0
変調の振幅を調整(再生ヘッドの移動距離)これはDelayTimeにもよるが大抵0.5以下で使わないと音程感が崩れていく。Depthは常にDelayTimeとセットで考える必要がある。Delayを長くするならDepthを小さくするなど。

Phase 0~2pi radian
チャンネルごとに3つの任意の初期角度(再生ヘッドのスタート位置)とゲインが設定できる。ボタンはON/OFF切替で各チャンネル1~3を自由に組合わせられる。3つ同時使用の場合は、周期に対して1/3ずらすのが一般的。単位はradianなので、0以上2pi未満の間で設定するのが基本。Phaseの下の段は、それぞれのGain(音量)となっていて、合計で1.0が最大と考えていい。またマイナスの値にすることで位相を反転できる。個人的には、この部分をいろいろいじって実験してみたかったので作ったようなもの。VSTコーラスの多くは内部で処理されていて、よく分からない場合が多い。

HPF/LPF(ハイパス/ローパス・フィルター)
HPFはWetの信号に一度だけかける。LPFはFeedbackするたびにかかっていく。バターワースで1poleは1次、2poleは2次のこと。次数が上がるほど急なカットができる。

Feedback
コーラスでは使わないパラメータ。フランジャーとして使うときに使用する。0は実質OFFとなっている。マイナスは位相の反転となる。

Decay / Cross / Gaiin Wet / Dry
上のブロック図を見てもらった方が早い。各部の出力のボリューム調整となる。-100dB以下でOFFになる。

起動直後の設定はコーラスの設定になっている。左右のパラメータを微妙に変えると広がりが出る。フランジャーとして使うときには、DelayTimeを4msecとか、かなり短くして、フィードバックを0.6ぐらいかける。Phaseはひとつだけの方がいいかもしれない。

サンプル音源
やや極端な設定にして、エレキギターのコードにかけてみた。1回目が無加工で、2回目がコーラス。3回目がフランジャーの設定。フランジャーはPhaseひとつしか使わず、初期角度を左右でπずらした。


今回コーラスというエフェクターを始めて使ってみた。積極的に音を加工するつもりもないので、実際には使うことはなさそうだ。ただ仕組みが理解できたので、それなりに得るものはあった。次はフェイザーでもつくろうかな? 1年放置してあるチューナーという手もあるか。

sound programming 目次