つまみ(ノブ)等の実装方法
前回作成したVSTではただGUIウィンドウが開くだけでしたので、パラメーターは一切操作できませんでした。
今回は前回作成したVSTにつまみ(ノブ)やスライダー等を追加し、パラメーターを操作できるようにする方法を説明いたします。
今回作成するプラグインは下記のようなものとなります。
- ボリュームコントロール、トレモロ、パンニングの機能を持つエフェクター
- パラメーターは3つ
- ボリュームコントロール(0.0~1.0の範囲のパラメーター)
- トレモロスピード(0.5~30.0Hzの範囲のパラメーター)
- トレモロタイプ(ボリュームコントロール・トレモロ・パンニングの文字列リストパラメーター)
- 入力バス、出力バスは1つで、共にステレオ(2ch)
- 自作のGUIウィンドウが開く。UIとして下記を実装。
- トレモロタイプを切り替えるコンボボックス
- トレモロスピードを操作するつまみ(ノブ)
- ボリュームを操作するスライダー
なお、ここで説明するVST GUIのバージョンはVST GUI 4.3となります。
VST SDK 3.6.7以前はVST GUIが4.2以下となるため修正等が必要となる可能性があります。各バージョンのSDKが必要な場合のリンクはこちらに記載しております。
このVST3プラグインのサンプルソースファイルはこちらからダウンロードできます→vst3dev_20210403
ZIPファイルの中の「vst3dev10_VST GUI つまみ(ノブ)等の実装方法」フォルダが今回のサンプルソースファイルになります。
コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法
GUIコントロールについて
VST GUIではつまみ(ノブ)やスライダーなど、いくつかのGUIコントロール用のクラスが標準で用意されています。
下記以外のコントロールについては「VST開発TIPS、一覧表、その他」にも記載しております。
【GUIコントロールの一例】
コントロール | 定義済クラス | 概要 | |
---|---|---|---|
ボタン | On/Offボタン | COnOffButton | クリックするごとにオンとオフを切り替えるボタン。 |
キックボタン | CKickButton | クリックした瞬間だけオンになるボタン。 | |
つまみ(ノブ) | つまみ(ノブ) | CKnob | ドラッグすることで値を操作できるつまみ(ノブ)。 |
アニメーションつまみ(ノブ) | CAnimKnob | ドラッグすることで値が操作できるつまみ(ノブ) 値ごとに表示される画像が異なる |
|
スライダー | 縦型スライダー | CVerticalSlider | 上下にドラッグすることで値が操作できるスライダー |
横型スライダー | CHorizontalSlider | 横向きになっただけで縦型スライダーと同じ | |
スイッチ | 縦型スイッチ | CVerticalSwitch | クリックごとに値が切り替わるスイッチ。 |
横型スイッチ | CHorizontalSwitch | 横向きになっただけで縦型スイッチと同じ | |
テキスト | テキストラベル | CTextLabel | 文字列を表示するラベル |
テキストエディット | CTextEdit | 任意の文字列を入力するための入力欄 | |
コンボボックス | COptionMenu | リストから文字列を入力するための入力欄 |
今回のVSTでは上記の中からつまみ(ノブ)、縦型スライダー、コンボボックスを利用いたします。
つまみ(ノブ)の作成関数
まず、つまみ(ノブ)を作成するためcreateKnob()関数を作成します。
関数作成自体は必須ではありませんが、つまみを複数作る場合などに便利なためです。
この関数はVST GUIクラスのメンバー関数として定義しています。
【guieditor.cpp】
createKnob()関数の引数には、パラメータータグ(ID)と座標(x、y)を指定するようにしています。
コントロールはパラメーターと関連付けるので、パラメータータグ(ID)が必要になります。また、フレーム(描画領域)上の位置を指定するための座標(x、y)が必要になります。
createKnob()関数ではまず、つまみ(ノブ)の背景画像とハンドル画像を読み込んでいます。
次に背景画像からつまみ(ノブ)のサイズを取得し、CRect sizeにそのサイズを設定します。
このsizeはつまみ(ノブ)サイズだけでなくフレーム上の配置位置も兼ねています。CRectのoffset()関数を使用して位置を設定します。
各画像と配置位置・サイズが決まれば、CKnobクラスを作成します。
CKnobクラスのコンストラクタには、「サイズ」「VST GUIクラスのポインタ」「パラメータータグ(ID)」「背景画像」「ハンドル画像」の順に指定します。
これでつまみ(ノブ)が作成できるので、パラメーターの現在の値をつまみ(ノブ)に反映し、フレームに登録すれば表示させることができます。
つまみ(ノブ)の背景画像とハンドル画像はCKnob側に設定されるので不要となるため解放しておきます。
なお、作成・登録したコントロール(ここではCKnobクラス)は解放する必要はありません。frameが破棄されるタイミングで解放されます。
スライダーの作成関数
次にスライダーを作成するためcreateSlider()関数を作成します。
この関数もcreateKnob()関数と同様でVST GUIクラスのメンバー関数として定義しており、作成自体は必須ではありません。
【guieditor.cpp】
createSlider()関数の引数は、createKnob()関数と同様です。
作成手順もほぼ同じとなっております。
CVerticalSliderクラスのコンストラクタには、「サイズ」「VST GUIクラスのポインタ」「パラメータータグ(ID)」「最大値のときのハンドル位置」「最小値のときのハンドル位置」「背景画像」「ハンドル画像」の順に指定します。
最大値・最小値のハンドル位置の座標は基準がフレーム(配置領域)の左上となっていますのでご注意ください。
コンボボックスの作成関数
コンボボックスも作成するための関数、createCombobox()関数を作成します。
この関数もcreateKnob()関数と同様でVST GUIクラスのメンバー関数として定義しており、作成自体は必須ではありません。
【guieditor.cpp】
createCombobox()関数の引数はcreateKnob()関数と同様です。
createCombobox()関数ではまず、コンボボックスのサイズと位置を設定しています。
設定方法はCKnobやCVerticalSliderなどの他のコントロールと同様です。
サイズと位置の設定がおわれば、COptionMenuクラスを作成します。
COptionMenuクラスのコンストラクタには、「サイズ」「VST GUIクラスのポインタ」「パラメータータグ(ID)」の順に指定します。
コンボボックスは作成するだけだと選択肢が一つもありませんので、選択肢を追加するためaddEntry()関数を使用します。
選択肢はパラメーター操作クラスや音声処理関数と順番を合わせる必要があるので注意ください。
今回は「Volume」「Tremolo」「Panning」の順に合わせています。
【参考:controller.cpp】
選択肢追加後は、見た目を整えるためフォントと文字色・背景色を設定しています。
標準で下記のフォントが定義されており、setFont()関数に指定可能です。
その他のフォントを指定する方法は割愛いたします。
定義 | フォント | フォントサイズ |
---|---|---|
kNormalFontVeryBig | Arial | 18 |
kNormalFontBig | Arial | 14 |
kNormalFont | Arial | 12 |
kNormalFontSmall | Arial | 11 |
kNormalFontSmaller | Arial | 10 |
kNormalFontVerySmall | Arial | 9 |
kSymbolFont | Symbol | 13 |
また、文字色・背景色についても下記の色が標準で定義されており、setFontColor()関数など指定可能です。
その他の色の指定方法は割愛いたします。
定義 | 色 | R | G | B | A |
---|---|---|---|---|---|
kTransparentCColor | 透明 | 255 | 255 | 255 | 0 |
kBlackCColor | 黒 | 0 | 0 | 0 | 255 |
kWhiteCColor | 白 | 255 | 255 | 255 | 255 |
kGreyCColor | グレー | 127 | 127 | 127 | 255 |
kRedCColor | 赤 | 255 | 0 | 0 | 255 |
kGreenCColor | 緑 | 0 | 255 | 0 | 255 |
kBlueCColor | 青 | 0 | 0 | 255 | 255 |
kYellowCColor | 黄色 | 255 | 255 | 0 | 255 |
kMagentaCColor | マゼンタ | 255 | 0 | 255 | 255 |
kCyanCColor | シアン | 0 | 255 | 255 | 255 |
最後にコンボボックスをフレーム(配置領域)に登録しています。
コントロールの追加
作成した関数を使って実際にフレーム(配置領域)に各コントロールを追加します。
opne()関数でフレーム(配置領域)作成後に先ほどの各関数を呼び出します。
【guieditor.cpp】
コントロール操作時の処理の追加
フレーム(配置領域)に追加しただけでは、操作の結果を取得することができません。
valueChanged()関数を修正し、つまみ(ノブ)やスライダー等が操作されたときにパラメーターに反映させます。
【guieditor.cpp】
valueChanged()関数の引数には操作されたコントローラ(つまみなど)のポインターが渡されます。
最初にパラメータータグ(ID)と値を取得し、それをパラメーター操作クラスに渡して反映しています。
その後、音声処理クラスも同様に値を反映するよう通知しています。
リソースファイル
つまみ(ノブ)とスライダーで画像を使用しています。
これらの画像はリソースから読み込む必要がありますのでリソースファイルにも追加いたします。
追加方法は前回をご参照ください。
【resource.rc】
最後に
以上でVST GUIにコントロールを追加することができます。
ここでは一部のコントロールの追加方法のみですのが、他のコントロールについてはそのうち記載したいと思います。
なお、今回も詳細な点は省略しておりますので、不明点がございましたら、掲示板かTwitterにてご連絡いただければと思います。
また、「はじめてのVST3プラグイン作り」として作成した記事はここまでとなります。
本シリーズを一通り読んでいただければ、基本的なVSTプラグインであれば作ることができるかと思います。
VSTプラグインの開発を進めていくうえで、足りない部分が出てくるかと思いますが、このシリーズ以外にもいくつか記事にしておりますので、参考にしていただければ幸いです。
このVST3プラグインのサンプルソースファイルはこちらからダウンロードできます → vst3dev_20210403.zip
VST SDK 3.6.7以前の場合 はこちらです。 → 20171126_vst3
コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法
VST3プラグイン作りの情報はこちらにもございます → はじめてのVST3プラグイン作り
ご指摘やご質問などがございましたら、コメント欄か掲示板、Twitterでご連絡いただければと思います。
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp