VST 2.4サポート終了について
ここではVST 2.4の開発について記載させていただいておりますが、公式サポートが終了しており内容を更新しておりません。
これから開発を始める方は、新しいVSTバージョンで開発することをお勧めさせていただきます。
新しいVSTバージョンの開発情報はこちら → はじめてのVSTプラグインの作り
パラメーターのあるエフェクターを作成する
前項では簡単なエフェクターを作成いたしました。
今回は前項のエフェクターにパラメーターをホストアプリケーション上からコントロールするための機能を追加してみます。
作成するVSTプラグインの概要は下記のとおりです。
- ホストアプリケーション上でエフェクターとして動作する
- 入力、出力共にステレオ(2チャンネル)
- 入力された音声にトレモロをかけて出力する
- ホストアプリケーションからトレモロのSpeedとDepthがコントロールできる
- サンプリング周波数は44,100Hzのみ対応
なお、前回作成したVSTプラグインはここを参照してください。 → 簡単なエフェクターを作成してみる
また、プロジェクトの作成方法についてはここを参照してください。 → Visual Studioのプロジェクト作成する
パラメーターをコントロールするには
まず、VST基本クラスにsetParameter関数とgetParameter関数を継承元クラス(AudioEffectX)からオーバーライドして定義します。
次に、継承元コンストラクタ(AudioEffectX)の第3引数 numParamsに操作可能なパラメータの数を設定します。
これで、ホストアプリケーションからエフェクターのパラメーターがコントロールできるようになります。
通常は、上記の関数以外に、getParameterName関数、getParameterLabel関数、getParameterDisplay関数も合わせて定義します。
なお、VSTプラグインの各パラメーターには必ず0番からの通し番号を決めておく必要があります。
これは、setParameter関数やgetParameter関数等でパラメータの値を設定・取得する際に番号が指定されるためです。
それぞれの関数の詳細については後述いたします。
ホストアプリケーションからのパラメーター操作
多くのVST/VSTiプラグインは、専用の操作画面(GUI)を持っています。(参考画像準備中)
しかし、今回作成するVSTプラグインではパラメータに関する関数のみで、専用の操作画面の定義をしていません。
このような場合、ホストアプリケーションの標準の操作画面が使用されます。
標準の操作画面は基本的には下記のような形になっています。
ホストアプリケーション標準の操作画面では下記の項目がパラメーター毎に用意されており、上から順番に0番目、1番目…とパラメーターの数だけ並んでいます。
- パラメーター名の表示
- パラメーターを操作するつまみ、もしくはスライダー
- パラメーターの値と単位の表示
ソースコードの説明
ここで作成するVSTプラグインの全ソースコードは下記のリンク先に記載しています。
ここでは下記のソースコードをもとに説明いたします。
ソースファイル | 概要 |
---|---|
MyMiniTremolo2VST.cpp | VSTプラグインのメインとなるソースファイル。 |
ソースコード全体はここに記載しています。 → ソースコード全体
パラメーター数の変更
前項からの変更点はVSTプラグインのパラメーター数(MY_VST_PARAMETER_NUM)のみとなります。(11行目、赤色部分)
今回はトレモロのSpeedとDepthの2つのパラメーターをホストアプリケーションから
コントロールしたいため「2」としています。
7 8 9 10 11 12 13 14 |
// ============================================================================================ // 設計情報の記入 // ============================================================================================ #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数 #define MY_VST_PARAMETER_NUM 2 //パラメータの数 #define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2 #define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2 |
なお、今回作成するVSTプラグインのパラメーターの番号は下記の通りとしています。
番号 | パラメーター |
---|---|
0 | トレモロのSpeed |
1 | トレモロのDepth |
VSTプラグインクラスの定義
次にVSTプラグインクラスの定義を行います。今回は前項のメンバー関数に加えてパラメーターに関する関数を定義しています。(赤色部分)
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
// ============================================================================================ // VSTの基本となるクラス // ============================================================================================ class MyMiniTremolo2VST : public AudioEffectX { private: float theta; // sin関数の角度 θ。初期値は0 float tremolospeed; // 0をトレモロのスピードとする。角速度ωと同じ。 float tremolodepth; // 1をトレモロの効き具合とする。0~1の間。 public: MyMiniTremolo2VST(audioMasterCallback audioMaster); // パラメータに関するメンバー関数 virtual void setParameter(VstInt32 index, float value); virtual float getParameter(VstInt32 index); virtual void getParameterName(VstInt32 index, char* text); virtual void getParameterLabel(VstInt32 index, char* label); virtual void getParameterDisplay(VstInt32 index, char* text); // 音声信号を処理するメンバー関数 virtual void processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames); }; |
それぞれの関数についての概要は下記の通りです。
- setParameter関数
概要 | ホストアプリケーションが、VSTプラグインのパラメーターを設定するための関数。 ホストアプリケーションからVSTプラグインのパラメーターを操作するためには必須の関数。 |
||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
index | VstInt32 | パラメーターの番号。 | |
value | float | 設定するパラメーターの値。値は必ず0.0~1.0の範囲。 |
- getParameter関数
概要 | ホストアプリケーションが、VSTプラグインの現在のパラメーター値を取得するための関数。 ホストアプリケーションからVSTプラグインのパラメーターを操作するためには必須の関数。 |
||
---|---|---|---|
戻り値 | 型 | 概要 | |
float | indexで示される番号のパラメーターを返す。返す値は必ず0.0~1.0の範囲にする | ||
引数 | 型 | 変数名 | 概要 |
index | VstInt32 | パラメーターの番号。 |
- getParameterName関数
概要 | ホストアプリケーションが、VSTプラグインのパラメーターの名前を取得するための関数。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
index | VstInt32 | パラメーターの番号。 | |
text | char* | パラメーターの名前を保存する文字列配列。配列サイズは8Byteで、NULL文字で終端させる必要がある。 |
- getParameterLabel関数
概要 | ホストアプリケーションが、VSTプラグインのパラメーターの単位名を取得するための関数。 例えば周波数であれば”Hz”、音量であれば”dB”、ミリ秒であれば”m sec”等の単位を第2引数の配列に書き込む。 |
||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
index | VstInt32 | パラメーターの番号。 | |
label | char* | パラメーターの単位名を保存する文字列配列。配列サイズは8Byteで、NULL文字で終端させる必要がある。 |
- getParameterDisplay関数
概要 | ホストアプリケーションが、VSTプラグインのパラメーター値の表示内容を取得するための関数。 setParameter関数、getParameter関数では0.0~1.0でパラメーター値を取り扱うが、パラメーター名や単位名に合わせて、パラメーター値の内容を表示させる場合に使用する。 |
||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
index | VstInt32 | パラメーターの番号。 | |
text | char* | パラメーター値の表示内容を保存する文字列配列。配列サイズは8Byteで、NULL文字で終端させる必要がある。 |
※VstInt32型はVST SDKで定義されている32ビットの整数型です。(intやlongをtypedefで定義しなおしているだけです。)
VSTプラグインの初期化と音声処理
続いて、VSTプラグインの初期化と音声処理(コンストラクタとprocessReplacing関数)を行います。
これらの関数については前項からの変更点はありません。
setParameter関数
新たに定義したsetParameter関数ではVSTプラグインのパラメーター値を設定を行います。
この関数はホストアプリケーションの操作画面でつまみ(スライダー)が操作された際に呼び出されます。
処理としては単純で、第1引数のindexに応じて、第2引数のvalueを対応する番号のパラメーターの値に変換して、それぞれの変数に代入するだけとなります。
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
// ============================================================================================ // パラメーターの設定、表示を行うメンバー関数 // ============================================================================================ void MyMiniTremolo2VST::setParameter(VstInt32 index, float value) { float Hz = 0.0f; //indexで指定されたパラメータに値を設定する。valueは0.0f~1.0fで与えられる。 switch (index) { case 0: // indexが0の場合、tremolospeedの値を設定 Hz = 0.5f + ( 29.5f * value ); // valueの値を0.5Hz~30Hzにする tremolospeed = (2.0f * 3.14159265f * Hz) / 44100.0f; //トレモロの周期を角速度に変換 break; case 1: // indexが1の場合、tremolodepthの値を設定 tremolodepth = value; break; } } |
124~127行目では番号が0の場合(つまりトレモロSpeedのつまみが操作された場合)の処理を記載しています。
125行目では0.0~1.0の範囲で渡される第2引数valueの値をトレモロの周期0.5Hz~30.0Hzに変換しています。
その後、126行目で変数tremolospeed(=角速度)に合わせて再度変換し、代入しています。
同様に、128~130行目では番号が1の場合(つまりトレモロDepthのつまみが操作された場合)の処理を記載しています。
トレモロDepthの範囲は0.0~1.0で第2引数valueと同じため、そのまま変数tremolodepthに代入しています。
getParameter関数
getParameter関数では、VSTプラグインのパラメータ値をホストアプリケーションに返すための処理を記載します。
この関数はホストアプリケーションの操作画面が開かれた時や、先ほどのsetParameter関数が呼び出された後等、
つまみ(スライダー)の位置を描画する際に使用されます。
処理としては単純で、引数のindexの値に応じて、対応する番号のパラメーターの変数の値を0.0~1.0に変換して返すだけとなります。
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
float MyMiniTremolo2VST::getParameter(VstInt32 index) { float Hz = 0.0f; //indexで指定されたパラメータの値を0.0f~1.0fの範囲で返す。 float value = 0.0f; switch (index) { case 0: // indexが0の場合、tremolospeedの値を0~1の範囲にして返す Hz = (tremolospeed * 44100.0f) / (2.0f * 3.14159265f); // トレモロの角速度を周期に変換 value = (Hz - 0.5f) / 29.5f; // Hzを0.0f~1.0fにする break; case 1: // indexが1の場合、tremolodepthの値を0~1の範囲にして返す value = tremolodepth; break; } return value; } |
142~145行目では番号が0(トレモロSpeed)の場合のパラメーター値を返す処理を記載しています。
143行目では変数tremolospeedをまず、トレモロの周期(0.5Hz~30.0Hzに変換しています。
その後、144行目で、トレモロの周期を0.0~1.0の範囲に変換し、戻り値として返しています。
同様に、146~148行目では番号が1(トレモロDepth)の場合のパラメーター値を返す処理を記載しています。
トレモロDepthの範囲は0.0~1.0で第2引数valueと同じため、そのまま戻り値として返しています。
getParameterName関数
getParameterName関数では、VSTプラグインのパラメータ名をホストアプリケーションに返すための処理を記載します。
呼び出されるタイミングはgetParameter関数とほぼ同様です。
処理としては、第1引数のindexの値に応じて、対応する番号のパラメーター名を第2引数のtextに格納します。
なお、第2引数のtextは8Byteの文字列でNULLで終端する必要があります。
153 154 155 156 157 158 159 160 161 162 163 164 165 |
void MyMiniTremolo2VST::getParameterName(VstInt32 index, char* text) { //indexで指定されたパラメータの名前をtextに格納する switch (index) { case 0: // indexが0の場合、tremolospeedのパラメーター名を返す vst_strncpy(text, "Speed", kVstMaxParamStrLen); break; case 1: // indexが1の場合、tremolodepthのパラメーター名を返す vst_strncpy(text, "Depth", kVstMaxParamStrLen); break; } } |
158行目~160行目が番号が0(トレモロSpeed)の場合、161行目~163行目が番号が1(トレモロDepth)の場合のパラメーター名を格納する処理を記載しています。
なお、ここで使われている、vst_strncpy関数については下記の通りです。
また、kVstMaxParamStrLenはVST SDK 2.4のaeffect.hで定義されている定数でkVstMaxParamStrLen = 8となります。
- vst_strncpy関数
概要 | 文字列をコピーし、最後にNULL文字を挿入する関数です。最後にNULL文字が挿入される以外、strncpy関数とほぼ同じです。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
char* | コピー先の文字列配列へのポインタ | ||
引数 | 型 | 変数名 | 概要 |
dst | char* | コピー先の文字列配列 | |
src | char* | コピー元の文字列配列 | |
maxLen | size_t | コピー先の文字列配列のサイズ |
getParameterLabel関数
getParameterLabel関数では、VSTプラグインのパラメータの単位をホストアプリケーションに返すための処理を記載します。
呼び出されるタイミングはgetParameter関数とほぼ同様です。
処理としては、第1引数のindexの値に応じて、対応する番号のパラメーターの単位を第2引数のlabelに格納します。
なお、第2引数のlabelは8Byteの文字列でNULLで終端する必要があります。
167 168 169 170 171 172 173 174 175 176 177 178 179 |
void MyMiniTremolo2VST::getParameterLabel(VstInt32 index, char* label) { //indexで指定されたパラメータの単位をlabelに格納する switch (index) { case 0: // indexが0の場合、tremolospeedの単位名を返す vst_strncpy(label, "Hz", kVstMaxParamStrLen); break; case 1: // indexが1の場合、tremolodepthの単位名を返す vst_strncpy(label, "", kVstMaxParamStrLen); break; } } |
詳細につきましてはgetParameterName関数ほぼ同様ですので省略させていただきます。
getParameterDisplay関数
getParameterDisplay関数では、VSTプラグインのパラメータの値を見やすい形(文字列)にしてホストアプリケーションに返します。
呼び出されるタイミングはgetParameter関数とほぼ同様です。
処理としては、第1引数のindexの値に応じて、対応する番号のパラメーターの値を第2引数のtextに格納します。
他のgetParameter系関数同様に、第2引数のlabelは8Byteの文字列でNULLで終端する必要があります。
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
void MyMiniTremolo2VST::getParameterDisplay(VstInt32 index, char* text) { float Hz = 0.0f; //indexで指定されたパラメータの表示内容をtextに格納する switch (index) { case 0: // indexが0の場合、tremolospeedの表示値を返す Hz = (tremolospeed * 44100.0f) / (2.0f * 3.14159265f); // トレモロの角速度を周期に変換 float2string(Hz, text, kVstMaxParamStrLen); break; case 1: // indexが1の場合、tremolodepthの表示値を返す float2string(tremolodepth, text, kVstMaxParamStrLen); break; } } |
187~190行目では番号が0(トレモロSpeed)の場合のパラメーター値を見やすい形式の文字列にして格納しております。
まず、188行目で変数tremolospeed(=角速度)の値を、周波数に変換しています。
その後189行目でfloat2string関数によりfloat型変数を文字列に変換し、第2引数textに格納しております。
191行目~193行目では番号が1(トレモロDepth)のパラメーター値を見やすい形式の文字列にして格納しております。
なお、float2stringについては下記の通りです。
- float2string関数
概要 | float型を文字列に変換する関数です。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
value | float | 文字列に変換するfloat型変数 | |
text | char* | コピー先の文字列配列 | |
maxLen | VstInt32 | コピー先の文字列配列のサイズ |
コンパイルとビルド
以上の内容でコンパイルとビルドを行えば、パラメーター操作可能なトレモロエフェクターとして動作するVSTプラグイン完成するはずです。
VSTプラグインを作成してみるで説明したとおり、いくつかのwarningとエラーが発生しますが、プロジェクトのReleaseフォルダ配下に「~~.dll」が作成されていれば特に問題はありません。
最後に
いかがでしたでしょうか?
今回は前項のトレモロにパラメーターを操作するための機能を実装しました。
ホストアプリケーション標準の操作画面はきれいではありませんが、自作したVSTプラグインを操作するには十分だと思います。
次項はここで作成したエフェクターにさらにプリセット機能を追加してみたいと思います。
トレモロエフェクトを利用したくて、参考にさせていただきました。
無事、ビルドできました。有難うございます。
VST SDKは、会員登録なしでもDeveloperのサイトから落とせました。
ビルドだけなら不要だと思いますが、VS2013 Community Edititonは、Professional同等の機能が使えるのでおすすめです。
altさんありがとうございます。
いつの間にやらVST SDKは会員登録なしになったようですね。
VST SDKダウンロードの説明ページも更新させていただきました。
ひとつ導入の手間が減ってうれしい限りです。
VS2013の新しいエディションも情報ありがとうございます。
こちらもそのうち過去のコンテンツも修正したいと思います。