VST 2.4サポート終了について
ここではVST 2.4の開発について記載させていただいておりますが、公式サポートが終了しており内容を更新しておりません。
これから開発を始める方は、新しいVSTバージョンで開発することをお勧めさせていただきます。
新しいVSTバージョンの開発情報はこちら → はじめてのVSTプラグインの作り
プリセットのあるエフェクターを作成する
パラメーターのあるエフェクターを作成するでは簡単なエフェクターパラメーター操作機能を追加いたしました。
今回はさらにプリセット機能を追加してみます。
作成するVSTプラグインの概要は下記のとおりです。
- ホストアプリケーション上でエフェクターとして動作する
- 入力、出力共にステレオ(2チャンネル)
- 入力された音声にトレモロをかけて出力する
- ホストアプリケーションからトレモロのSpeedとDepthがコントロールできる
- 3つのプリセットを持ち、ホストアプリケーションから切り替えることができる
- サンプリング周波数は44,100Hzのみ対応
なお、前回作成したVSTプラグインはここを参照してください。 → パラメーターのあるエフェクターを作成する
また、プロジェクトの作成方法についてはここを参照してください。 → Visual Studioのプロジェクト作成する
プリセット機能を追加するには
まず、VST基本クラスにsetProgram関数とgetProgramName関数を継承元クラス(AudioEffectX)からオーバーライドして定義します。
次に、継承元コンストラクタ(AudioEffectX)の第2引数 numProgramsにプリセットの数を設定します。
これで、ホストアプリケーションからエフェクターのプリセットが切り替えられるようになります。
なお、パラメーターと同様に各プリセットには必ず0番からの通し番号を決めておく必要があります。
ソースコードの説明
ここで作成するVSTプラグインの全ソースコードは下記のリンク先に記載しています。
ここでは下記のソースコードをもとに説明いたします。
ソースファイル | 概要 |
---|---|
MyMiniTremolo3VST.cpp | VSTプラグインのメインとなるソースファイル。 |
ソースコード全体はここに記載しています。 → ソースコード全体
プリセット数の変更
前項からの変更点はVSTプラグインのプリセット数(MY_VST_PRESET_NUM)のみとなります。(10行目、赤色部分)
今回は「Default」「Slow Tremolo」「Fast Tremolo」の3つのプリセットを考えているため、3としております。
7 8 9 10 11 12 13 14 15 16 |
// ============================================================================================ // 設計情報の記入 // ============================================================================================ #define MY_VST_PRESET_NUM 3 //プリセットプログラムの数 #define MY_VST_PARAMETER_NUM 2 //パラメータの数 #define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2 #define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2 #define MY_VST_UNIQUE_ID 'SMPL' //ユニークID |
なお、プリセットの番号は下記の通りとしています。
番号 | プリセット名 | |
---|---|---|
0 | Default | トレモロをかけない状態 |
1 | Slow Tremolo | ゆっくりとしたトレモロ |
2 | Fast Tremolo | 早いトレモロ |
VSTプラグインクラスの定義
次にVSTプラグインクラスの定義を行います。今回は前項のメンバー関数に加えてプリセットに関する関数を定義しています。(赤色部分)
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
// ============================================================================================ // VSTの基本となるクラス // ============================================================================================ class MyMiniTremolo3VST : public AudioEffectX { private: float theta; // sin関数の角度 θ。初期値は0 float tremolospeed; // 0をトレモロのスピードとする。角速度ωと同じ。 float tremolodepth; // 1をトレモロの効き具合とする。0~1の間。 VstInt32 currentpreset; public: MyMiniTremolo3VST(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 setProgram(VstInt32 program); virtual void getProgramName(char *name); // 音声信号を処理するメンバー関数 virtual void processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames); }; |
それぞれの関数についての概要は下記の通りです。
- setProgram関数
概要 | ホストアプリケーションが、VSTプラグインのプリセットを設定するための関数。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
program | VstInt32 | 設定するプリセットの番号。 |
- getProgramName関数
概要 | ホストアプリケーションが、VSTプラグインのプリセット名を取得するための関数。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
program | VstInt32 | 名前を取得するプリセットの番号。 | |
name | char* | プリセット名を保存する文字列配列。 配列サイズは24Byteで、NULL文字で終端させる必要がある。 |
※VstInt32型はVST SDKで定義されている32ビットの整数型です。(intやlongをtypedefで定義しなおしているだけです。)
VSTプラグインの初期化と音声処理
続いて、VSTプラグインの初期化と音声処理(コンストラクタとprocessReplacing関数)を行いますが、
これらの関数についても前項同様、変更点はありません。
説明については「簡単なエフェクターを作成してみる」の「VSTプラグインの初期化」と「入力信号への正弦波の掛け合わせ」ををご参照ください。
setProgram関数
setProgram関数では、VSTプラグインのプリセットが設定された際の処理を記載します。
処理としては単純で、引数のprogramの値に応じて各パラメーター変数の値を設定した後、継承元クラス(AudioEffectXクラス)の変数curProgramに引数のprogramを代入します。
変数curProgramは「現在のプリセットが何番か?」を示すために使用される変数です。
setProgram関数では必ず変数curProgramに引数のprogramを代入してください。
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
// ============================================================================================ // プリセットプログラムの設定を行うメンバー関数 // ============================================================================================ void MyMiniTremolo3VST::setProgram(VstInt32 program) { float Hz; // programで指定された設定を内部のパラメータに反映する switch (program) { case 0: // 1つ目のプリセットの指定があった場合 Hz = 1.0f; // トレモロの周期 tremolospeed = (2.0f * 3.14159265f * Hz) / 44100.0f; //トレモロの周期を角速度に変換 tremolodepth = 0.0f; //トレモロの振幅 なし break; case 1: // 2つ目のプリセットの指定があった場合 Hz = 4.0f; // トレモロの周期 tremolospeed = (2.0f * 3.14159265f * Hz) / 44100.0f; //トレモロの周期を角速度に変換 tremolodepth = 0.5f; //トレモロの振幅 0.5 break; case 2: // 3つ目のプリセットの指定があった場合 Hz = 15.0f; // トレモロの周期 tremolospeed = (2.0f * 3.14159265f * Hz) / 44100.0f; //トレモロの周期を角速度に変換 tremolodepth = 0.5f; //トレモロの振幅 0.5 break; } // 現在のプリセット番号を記憶する (curProgramは継承元クラスの変数) curProgram = program; } |
getProgramName関数
getProgramName関数では、VSTプラグインの現在指定されているプリセット名をホストアプリケーションに返すための処理を記載します。
こちらも処理としては単純で、継承元クラスの変数curProgramの値に応じて、対応する番号のプリセット名を引数のnameに格納します。
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 |
void MyMiniTremolo3VST::getProgramName(char *name) { // 現在指定されているプリセット名をnameに格納する // (curProgramは継承元クラスの変数) switch (curProgram) { case 0: // 1つ目のプリセット名をバッファに格納 vst_strncpy(name, "Default", kVstMaxProgNameLen); break; case 1: // 2つ目のプリセット名をバッファに格納 vst_strncpy(name, "Slow Tremolo", kVstMaxProgNameLen); break; case 2: // 3つ目のプリセット名をバッファに格納 vst_strncpy(name, "Fast Tremolo", kVstMaxProgNameLen); break; } } |
vst_strncpy関数の詳細は前項のgetParameterName関数の項目をご確認ください。
また、kVstMaxProgNameLenはVST SDK 2.4のaeffect.hで定義されている定数でkVstMaxProgNameLen = 24となります。
コンパイルとビルド
上記の追加を行った後、コンパイルとビルドを行えば、プリセット機能のあるトレモロVSTプラグイン完成するはずです。
VSTプラグインを作成してみるで説明したとおり、いくつかのwarningとエラーが発生しますが、プロジェクトのReleaseフォルダ配下に「~~.dll」が作成されていれば特に問題はありません。
最後に
いかがでしたでしょうか?
今回は前項のトレモロにプリセット機能を実装しました。
使う側にとってプリセット機能は非常に便利だと思います。プリセット機能自体の実装は非常に簡単ですので、VSTプラグインを公開する場合などはぜひ実装してみてください。