C++でVST作りコンテンツへスキップC++でVST作りVSTプログラミングに関する情報です。前回作成したVSTではただGUIウィンドウが開くだけでしたので、パラメーターは一切操作できませんでした。今回は前回作成したVSTにつまみ(ノブ)やスライダー等を追加し、パラメーターを操作できるようにする方法を説明いたします。今回作成するプラグインは下記のようなものとなります。ボリュームコントロール、トレモロ、パンニングの機能を持つエフェクターパラメーターは3つボリュームコントロール(0.0~1.0の範囲のパラメーター)トレモロスピード(0.5~30.0Hzの範囲のパラメーター)トレモロタイプ(ボリュームコントロール・トレモロ・パンニングの文字列リストパラメーター)入力バス、出力バスは1つで、共にステレオ(2ch)自作のGUIウィンドウが開く。UIとして下記を実装。GUIが4.2以下となるため修正等が必要となる可能性があります。各バージョンのSDKが必要な場合のリンクはこちらに記載しております。今回作成したVST3のソースファイルはこちらになります。vst3dev10_20190509コンパイル・ビルドの方法は簡単にこちらでご説明しております。GUIではつまみ(ノブ)やスライダーなど、いくつかのGUIコントロール用のクラスが標準で用意されています。下記以外のコントロールについては「TIPS、一覧表、その他」にも記載しております。クリックするごとにオンとオフを切り替えるボタン。クリックした瞬間だけオンになるボタン。ドラッグすることで値を操作できるつまみ(ノブ)。クリックごとに値が切り替わるスイッチ。今回のVSTでは上記の中からつまみ(ノブ)、縦型スライダー、コンボボックスを利用いたします。つまみ(ノブ)の作成関数まず、つまみ(ノブ)を作成するためcreateKnob()関数を作成します。関数作成自体は必須ではありませんが、つまみを複数作る場合などに便利なためです。GUIクラスのメンバー関数として定義しています。GUIEditorクラスを呼び出したコントローラ操作クラスを示す。GUIEditorクラスを呼び出したコントローラ操作クラスを示す。読み込んだ画像は忘れず解放backbmp->forget();handlebmp->forget();}createKnob()関数の引数には、パラメータIDと座標(x、y)を指定するようにしています。コントロールはパラメーターと関連付けるので、パラメータIDが必要になります。フレーム(描画領域)上の位置を指定するための座標(x、y)が必要になります。createKnob()関数ではまず、つまみ(ノブ)の背景画像とハンドル画像を読み込んでいます。sizeにそのサイズを設定します。このsizeはつまみ(ノブ)サイズだけでなくフレーム上の配置位置も兼ねています。CRectのoffset()関数を使用して位置を設定します。各画像と配置位置・サイズが決まれば、CKnobクラスを作成します。GUIクラスのポインタ」「パラメータID」「背景画像」「ハンドル画像」の順に指定します。これでつまみ(ノブ)が作成できるので、パラメータの現在の値をつまみ(ノブ)に反映し、フレームに登録すれば表示させることができます。つまみ(ノブ)の背景画像とハンドル画像はCKnob側に設定されるので不要となるため解放しておきます。次にスライダーを作成するためcreateSlider()関数を作成します。GUIクラスのメンバー関数として定義しており、作成自体は必須ではありません。若干のマージンを持たせる。若干のマージンを持たせる。読み込んだ画像は忘れず解放backbmp->forget();handlebmp->forget();}createSlider()関数の引数は、createKnob()関数と同様です。作成手順もほぼ同じとなっております。ハンドル画像」の順に指定します。最大値・最小値のハンドル位置の座標は基準がフレーム(配置領域)の左上となっていますのでご注意ください。コンボボックスの作成関数コンボボックスも作成するための関数、createCombobox()関数を作成します。GUIクラスのメンバー関数として定義しており、作成自体は必須ではありません。コンボボックスをフレームに登録frame->addView(control);}createCombobox()関数の引数はcreateKnob()関数と同様です。createCombobox()関数ではまず、コンボボックスのサイズと位置を設定しています。設定方法はCKnobやCVerticalSliderなどの他のコントロールと同様です。サイズと位置の設定がおわれば、COptionMenuクラスを作成します。GUIクラスのポインタ」「パラメータタグ」の順に指定します。コンボボックスは作成するだけだと選択肢が一つもありませんので、選択肢を追加するためaddEntry()関数を使用します。選択肢はパラメータ操作クラスや音声処理関数と順番を合わせる必要があるので注意ください。今回は「Volume」「Tremolo」「Panning」の順に合わせています。リスト項目を追加param2->appendString(STR16("Tremolo"));param2->appendString(STR16("Panning"));選択肢追加後は、見た目を整えるためフォントと文字色・背景色を設定しています。標準で下記のフォントが定義されており、setFont()関数に指定可能です。その他のフォントを指定する方法は割愛いたします。13また、文字色・背景色についても下記の色が標準で定義されており、setFontColor()関数など指定可能です。その他の色の指定方法は割愛いたします。255最後にコンボボックスをフレーム(配置領域)に登録しています。作成した関数を使って実際にフレーム(配置領域)に各コントロールを追加します。opne()関数でフレーム(配置領域)作成後に先ほどの各関数を呼び出します。フレーム(配置領域)がすでに作成・設定されているか確認。frameは継承元クラスで定義されている。作成に失敗したら(NULLなら)終了。フレーム(配置領域)がすでに作成・設定されているか確認。frameは継承元クラスで定義されている。作成に失敗したら(NULLなら)終了。true;}コントロール操作時の処理の追加フレーム(配置領域)に追加しただけでは、操作の結果を取得することができません。valueChanged()関数を修正し、つまみ(ノブ)やスライダー等が操作されたときにパラメーターに反映させます。どのパラメーターが操作されたかを取得する。パラメーターの値を取得する。どのパラメーターが操作されたかを取得する。パラメーターの値を取得する。value);}valueChanged()関数の引数には操作されたコントローラ(つまみなど)のポインターが渡されます。最初にパラメータIDと値を取得し、それをパラメータ操作クラスに渡して反映しています。その後、音声処理クラスも同様に値を反映するよう通知しています。リソースファイルつまみ(ノブ)とスライダーで画像を使用しています。これらの画像はリソースから読み込む必要がありますのでリソースファイルにも追加いたします。追加方法は前回をご参照ください。GUIにコントロールを追加することができます。ここでは一部のコントロールの追加方法のみですのが、他のコントロールについてはそのうち記載したいと思います。今回も詳細な点は省略しておりますので、不明点がございましたら、掲示板かTwitterにてご連絡いただければと思います。今回作成したVST3のソースファイルはこちらになります。20171126_vst3コンパイル・ビルドの方法は簡単にこちらでご説明しております。VST3.6プラグインの作りご指摘やご質問などがございましたら、コメント欄か掲示板、Twitterでご連絡いただければと思います。