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」としています。
なお、今回作成するVSTプラグインのパラメーターの番号は下記の通りとしています。
番号 | パラメーター |
---|---|
0 | トレモロのSpeed |
1 | トレモロのDepth |
VSTプラグインクラスの定義
次にVSTプラグインクラスの定義を行います。今回は前項のメンバー関数に加えてパラメーターに関する関数を定義しています。(赤色部分)
それぞれの関数についての概要は下記の通りです。
- 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を対応する番号のパラメーターの値に変換して、それぞれの変数に代入するだけとなります。
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に変換して返すだけとなります。
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で終端する必要があります。
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で終端する必要があります。
詳細につきましてはgetParameterName関数ほぼ同様ですので省略させていただきます。
getParameterDisplay関数
getParameterDisplay関数では、VSTプラグインのパラメータの値を見やすい形(文字列)にしてホストアプリケーションに返します。
呼び出されるタイミングはgetParameter関数とほぼ同様です。
処理としては、第1引数のindexの値に応じて、対応する番号のパラメーターの値を第2引数のtextに格納します。
他のgetParameter系関数同様に、第2引数のlabelは8Byteの文字列でNULLで終端する必要があります。
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の新しいエディションも情報ありがとうございます。
こちらもそのうち過去のコンテンツも修正したいと思います。