パラメーターのあるエフェクターを作成する

パラメーターのあるエフェクターを作成する

前項では簡単なエフェクターを作成いたしました。
今回は前項のエフェクターにパラメーターをホストアプリケーション上からコントロールするための機能を追加してみます。

作成する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プラグインを操作するには十分だと思います。

次項はここで作成したエフェクターにさらにプリセット機能を追加してみたいと思います。


2 thoughts on “パラメーターのあるエフェクターを作成する

  1. トレモロエフェクトを利用したくて、参考にさせていただきました。
    無事、ビルドできました。有難うございます。
    VST SDKは、会員登録なしでもDeveloperのサイトから落とせました。

    ビルドだけなら不要だと思いますが、VS2013 Community Edititonは、Professional同等の機能が使えるのでおすすめです。

    • altさんありがとうございます。

      いつの間にやらVST SDKは会員登録なしになったようですね。
      VST SDKダウンロードの説明ページも更新させていただきました。
      ひとつ導入の手間が減ってうれしい限りです。

      VS2013の新しいエディションも情報ありがとうございます。
      こちらもそのうち過去のコンテンツも修正したいと思います。

コメントを残す