VST作製~JUCEでShort Delay Pluginを作ったメモ
最初に
本記事は、以下のHaas効果なるステレオ効果を生じさせるVST Pluginを作製した際のメモになります。
偏ったDTM用語辞典 - ハースコウカ ハース効果:Haas Effectとは - DTM / MIDI 用語の意味・解説 | g200kg Music & Software
Haas効果を生じさせるには、ステレオ入力の片側チャンネルを数十ミリセカンドほど遅らせるようなVST(以下、Short Delay Plugin)を設計すればよさそうです。
Short Delay Pluginの仕様
以下のような仕様を満たすVSTを設計することにします。
- ステレオ入力の片側を0 ~ 50 msecの範囲でDelayさせて出力できる
- Delayさせるチャンネルは任意に選択可能
- Delayさせた入力とDelayさせてない素の入力を任意の量で混ぜ合わせたものを出力できる (Dry / Wetの設定が可能)
これに関しては、以下の完成したVSTのGUIを見ていただければ、何となく伝わるかと思います。
Delay EffectのDSP
ここで、Delay Effectとは、入力信号を一定の時間間隔で繰り返し再生するようなEffectであるとします。実際のDelay Effectorにおいて、上記の一定の時間間隔と繰り返しの回数は、それぞれ、Delay Time、Feedbackと言う名前のパラメータとして与えられていることが多いように思います。ここで、Delay TimeをT [s]、FeedbackをN [整数]としてやると、Delayされた出力成分は以下のように表現することができます。
ここで、y(t)とx(t)は時刻tにおける出力信号と入力信号になります。実際のDelay Effectorでは、Feedback回数に応じて、繰り返し音は減衰していくので、減衰量に関する定数を導入して、下記のようにした方がより現実的かと思います。
今回作製するShort Delay Pluginは、複数回の繰り返しと減衰の必要は無いのでN = 1、a = 1とします。さらに、Delay成分に素の入力(Dry)を混ぜ合わせたものを出力とする(仕様3より)ことを考慮して、全体として以下の処理をPuluginに実装してやることになります。
ここで、Delay成分の量を調整するパラメータを導入しています。m = 1でDelay成分のみ、m = 0の時にDry成分のみが出力されます。
DSPの実装
実装はJUCEを用いて行いました。実際のソースコードをここにベタ貼りするのもアレなので、詳細は下記のリポジトリ(Source/Modules/DelayComponent.h and cpp)を参照していただければと思います。また、実際に、ビルド済みのVST(32 bit / 64 bit)も置いてあるので、DAWに読み込ませたら動くと思います。ここでは、設計の要点のみを記載していきます。
DSP関連の実装部は以下の3つのClassに分けて行います。
- Parameters Class
- DelayComponent Class
- DelayProcessing Class
以下、順に要点のみを記載していきます。
Parameters Class
Short Delay Pluginには、3つの任意に設定可能なパラメータを持たせます。これらパラメータの値は、DAWホスト、VSTのDSP部、GUI部から参照・設定できるようにしたいので、パラメータ部だけを独立したClassにしています。
- delayChannel
- delayTime
- mixing
delayChannelは、EffectをかけるChannelを設定します(仕様2より)。0 or 1の値をとり、VSTの仕様上0がL channel、1がR channelに対応します。delayTimeは、0 ~ 1fの値をとるようにします。実際のEffect処理部でこれを0~50 ms範囲にスケール変換させます。mixingは、出力音のDelay成分(Wet成分)の量を調整するパラメータです(先の実装数式のmに相当)。
DelayComponent / DelayProcessor Class
これらClassが、Short Delat Effectの本体部分に相当します。DelayComponent Classには、過去の入力をDelayBufferに保持、そこから0 ~ 50 ms時間前の入力をDelay成分として取り出し、現在の入力(Dry成分)と混ぜ合わせてDAWのAudioBufferに出力するといったShort Delayに必要な各機能群を分けて実装しています。そして、DelayProcessing Classで、この一連の処理をそれぞれの入出力チャンネルのAudioBuffer全体に対して繰り返し適用する関数を実装します。
GUIの実装
割愛。自前で画像素材作れるセンスが無いので、全部JUCEの素材使って実装してます。詳細はソースコードを見ていただければ。