VST GUIにおける複数コントロールの同期
VST GUIを作成するうえで、下記のように「つまみ(ノブ)を操作すると同時にスライダーも動く」のように複数のコントロールで連携や同期をとりたい場合があります。今回はその実装方法を説明いたします。
なお、VST GUIの基本的な作成方法として下記をご理解いただいている前提で進めさせていただきます。
また、こちらのTipsで紹介している各コントロールを作成する関数も使用しています。
今回のサンプルではつまみ(ノブ)コントロールと縦型スライダーを同時に動かします。
まず、VST GUIクラスのopen()関数内で各コントロールを作成します。(参考:「つまみ(ノブ)の実装」「縦型スライダーの実装」)
コントロール作成時に作成したコントロールのポインタをあらかじめ定義したメンバー変数に保存しておきます。メンバー変数はあらかじめ定義しておきます。
【guieditor.h】
1 2 3 4 5 6 7 8 9 |
class MyVSTGUIEditor : public VSTGUIEditor, public IControlListener { protected: CControl* control1; CControl* control2; public: ~~ 中略 ~~ } |
【guieditor.cpp】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
bool PLUGIN_API MyVSTGUIEditor::open(void* parent, const PlatformType& platformType) { // GUIウィンドウが開かれたときに、UIを作成する ~~ 中略 ~~ // --------------------------------------------- // ここから各コントロールの作成 control1 = createKnob(1, 10, 60); control2 = createVSlider(1, 50, 10); ~~ 中略 ~~ // GUIウィンドウのオープンに成功した場合はtrueを返す return true; } |
つづいてコントロールを操作したときに呼び出されるvalueChanged()関数で同期するための処理を追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
void MyVSTGUIEditor::valueChanged(CControl* pControl) { // どのパラメーターが操作されたかを取得する。 int32 index = pControl->getTag(); // パラメーターの値を取得する。 float value = pControl->getValueNormalized(); // 取得した値をパラメーターに反映させる controller->setParamNormalized(index, value); // 音声処理クラスに反映した値を通知する controller->performEdit(index, value); // 同期させたいコントロールが操作されたかどうか確認 if (pControl == control1 || pControl == control2) { // それぞれのコントロールの値を同じに設定 control1->setValueNormalized(value); control2->setValueNormalized(value); // それぞれのコントロールを再描画する control1->setDirty(); control2->setDirty(); } } |
どのコントロールが操作されたかを確認し、それが同期させたいコントロールの場合に値を同期させます。
(今回の場合、つまみ(ノブ)コントロールか縦型スライダーの場合)
取得した値をそれぞれのコントロールに設定します。
設定後は画像を更新するためそれぞれのコントロールのsetDirty()関数を呼び出します。
以上で複数コントロールの同期ができます。
上記以外にもVST3.6についての情報があります。下記をご参照ください。
また、質問やご指摘はコメント欄や掲示板、Twitterでいただけばとおもいます。
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp