最小構成のVST GUI
前回はInline UI Editor for VST3を使ってGUIを作成する方法を説明いたしました。
今回はプログラムでGUIを作成する方法を説明いたします。
まずは、VST GUIに最低限必要なファイルやクラスなどについて説明いたします。
今回作成するプラグインは「パラメーター実装方法2」で作成したプラグインにGUIを追加していきます。
今回はただGUIウィンドウが開くだけのプログラムになります。各パラメーターは次回以降で操作できるようにしていきます。
- ボリュームコントロール、トレモロ、パンニングの機能を持つエフェクター
 - パラメーターは3つ
 - ボリュームコントロール(0.0~1.0の範囲のパラメーター)
 - トレモロスピード(0.5~30.0Hzの範囲のパラメーター)
 - トレモロタイプ(ボリュームコントロール・トレモロ・パンニングの文字列リストパラメーター)
 - 入力バス、出力バスは1つで、共にステレオ(2ch)
 - 自作のGUIウィンドウが開く(ただし、パラメーターは一切操作できない。)
 
なお、ここで説明するVST GUIのバージョンはVST GUI 4.3となります。
VST SDK 3.6.7以前はVST GUIが4.2以下となるため修正等が必要となる可能性があります。各バージョンのSDKが必要な場合のリンクはこちらに記載しております。
このVST3プラグインのサンプルソースファイルはこちらからダウンロードできます→vst3dev_20210403
ZIPファイルの中の「vst3dev09_最小構成のVST GUI」フォルダが今回のサンプルソースファイルになります。
コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法
VST GUIクラスの定義
VSTプラグインにGUIを追加するにはVST GUIクラスを定義します。
VST GUIクラスはVSTGUIEditorクラスとIControlListenerクラスを継承して定義します。
【guieditor.h】
| 
					 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41  | 
						#ifndef __GUIEDITOR_H__ #define __GUIEDITOR_H__ // VST3 SDKのインクルードファイル #include "public.sdk/source/vst/vstguieditor.h" #include "pluginterfaces/vst/ivstplugview.h" // 自作VST用のインクルードファイル #include "myvst3def.h" // VST3作成に必要なの名前空間を使用 namespace Steinberg { namespace Vst { using namespace VSTGUI; // ============================================================================================ // VSTのGUIクラス // ============================================================================================ class MyVSTGUIEditor : public VSTGUIEditor, public IControlListener { public: 	// コンストラクタ(必須) 	MyVSTGUIEditor(void* controller); 	// GUIウィンドウを開いたときに呼び出される関数(必須) 	virtual bool PLUGIN_API open(void* parent, const PlatformType& platformType = PlatformType::kDefaultNative); 	// GUIウィンドウを閉じたときに呼び出される関数(必須) 	virtual void PLUGIN_API close(); 	// GUIウィンドウのコントローラを操作したときに呼び出される関数(必須) 	void valueChanged(CControl* pControl); 	// VSTGUIEditorクラスの各種設定を自作GUIクラス置き換えるマクロ(必須) 	DELEGATE_REFCOUNT(VSTGUIEditor) }; } } // namespace SteinbergとVstの終わり #endif  | 
					
まず、クラス定義に必要なヘッダファイル(下記)を読み込んでいます。
- public.sdk/source/vst/vstguieditor.h
 - pluginterfaces/vst/ivstplugview.h
 
(「myvst3def.h」はパラメータータグ(ID)が#defineで定義されているだけのファイルです。GUIでもパラメータータグ(ID)が関係するので読み込んでいます。)
続いてVSTGUIEditorクラスとIControlListenerクラスを継承してVST GUIクラスであるMyVSTGUIEditorクラスを定義しています。
MyVSTGUIEditorクラスでは、VST GUIに最低限必要な下記の関数をオーバーライドしています。
- コンストラクタ
 
| 概要 | MyVSTGUIEditorクラスのコンストラクタ 継承元クラスの初期化などを行う  | 
||
|---|---|---|---|
| 戻り値 | 型 | 概要 | |
| コンストラクタのため戻り値はありません | |||
| 引数 | 型 | 変数名 | 概要 | 
| void* | controller | GUIと関連付けるパラメーター操作クラスへのポインタ | |
- open()関数
 
| 概要 | GUIウィンドウを開いたときに呼び出される関数 ここでつまみ(ノブ)やスライダーなどのコントロールを作成する。  | 
||
|---|---|---|---|
| 戻り値 | 型 | 概要 | |
| bool | 成功すればtrue、失敗すればfalseを返す | ||
| 引数 | 型 | 変数名 | 概要 | 
| void* | parent | 自作VST GUIクラス用のウィンドウハンドル。(Windowsの場合HWND型のポインタと思われる。) ウィンドウハンドルはホスト(DAWなど)で生成されたものが渡される。  | 
|
| const PlatformType& | platformType | 詳細不明。 | |
- close()関数
 
| 概要 | GUIウィンドウを閉じられたときに呼び出される関数 ここでフレーム(コントロールの配置領域)の解放などを行う。  | 
||
|---|---|---|---|
| 戻り値 | 型 | 概要 | |
| 戻り値はありません | |||
| 引数 | 型 | 変数名 | 概要 | 
| 引数はありません。 | |||
- valueChanged()関数
 
| 概要 | つまみ(ノブ)やスライダーなどのコントロールが操作された際に呼び出される関数 | ||
|---|---|---|---|
| 戻り値 | 型 | 概要 | |
| 戻り値はありません | |||
| 引数 | 型 | 変数名 | 概要 | 
| CControl* | pControl | 操作されたコントロールを示すのポインタ | |
最後に継承元のVSTGUIEditorクラスの各種設定を自作VST GUIクラスの内容に置き換えるDELEGATE_REFCOUNTマクロを使います。
DELEGATE_REFCOUNTマクロの詳細については割愛いたします。
VST GUIクラスの実装
定義したVST GUIクラスを実装します。
まず、コンストラクタでは、作成するGUIのウィンドウサイズを設定します。
【guieditor.cpp】
| 
					 12 13 14 15 16 17 18 19  | 
						MyVSTGUIEditor::MyVSTGUIEditor(void* controller) 	: VSTGUIEditor(controller) { 	// コンストラクタでウィンドウサイズを設定する 	// 設定しなければ、ウィンドウが開かない 	ViewRect viewRect(0, 0, 200, 200); 	setRect(viewRect); }  | 
					
ViewRect構造体を定義し、GUIのウィンドウサイズを指定します。ここでは「左 0」「上0」「右200」「下200」の座標を設定しています。
(単位はピクセル。おそらく左と上は常に0を指定する。)
その後、setRect()関数の引数に指定し、GUIのウィンドウサイズを設定いたします。
setRect()関数は継承元のVSTGUIEditorクラスに定義されています。詳細は割愛します。
次に、GUIウィンドウが開かれたとき、閉じられたときに処理される関数を実装します。
GUIウィンドウが開かれたときはopen()関数が呼び出されます。
【guieditor.cpp】
| 
					 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51  | 
						bool PLUGIN_API MyVSTGUIEditor::open(void* parent, const PlatformType& platformType) { 	// GUIウィンドウが開かれたときに、UIを作成する 	// まずはフレーム(配置領域)がすでに作成・設定されているか確認。 	// すでに作成・設定されている場合(frameがNULLでない場合)は終了 	// frameは継承元クラスで定義されている。 	if (frame) { return false; } 	// 作成するフレームのサイズを設定 	CRect size(0, 0, 200, 200); 	// フレームを作成。作成に失敗したら(NULLなら)終了。 	// 引数には、フレームサイズ、自作GUIクラスのポインタを指定する 	frame = new CFrame(size, this); 	if (frame == NULL) { return false; } 	// 作成したフレームに背景画像を設定 	CBitmap* cbmp = new CBitmap("background.png"); // リソースから背景画像を読み込む 	frame->setBackground(cbmp); // フレームに背景画像を設定 	cbmp->forget();	// フレームに設定後は背景画像はforgetで解放しておく 	// 作成したフレームを開く 	frame->open(parent); 	// GUIウィンドウのオープンに成功した場合はtrueを返す 	return true; }  | 
					
open()関数ではフレームと呼ばれるつまみ(ノブ)やスライダーなどの配置領域をまずは作成します。
フレームのサイズは基本的にGUIウィンドウと同じサイズでいいと思われます。(今回は200×200ピクセル)
作成した状態ではフレームの背景はありませんのでリソースから画像ファイルを読み込み、設定しています。(UIで使用する画像ファイルはリソースから読み込む必要があります。)
各関数やクラスの詳細は割愛させていただきます。
GUIウィンドウが閉じられたときはclose()関数が呼び出されます。
【guieditor.cpp】
| 
					 55 56 57 58 59 60 61 62 63 64 65 66 67  | 
						void PLUGIN_API MyVSTGUIEditor::close() { 	// GUIウィンドウが閉じたときに、UIを削除する 	// フレームを解放 	// 背景画像や追加したつまみ(ノブ)やスライダーなどもあわせて解放される 	// (個別で解放する必要はない) 	if (frame) 	{ 		frame->forget(); 		frame = 0; 	} }  | 
					
close()関数ではフレームを解放します。
最後につまみ(ノブ)やスライダーなどのコントローラが操作されたときに呼び出される関数を実装します。
コントローラが操作されたときはvalueChanged()関数が呼び出されます。
【guieditor.cpp】
| 
					 72 73 74  | 
						void MyVSTGUIEditor::valueChanged(CControl* pControl) { }  | 
					
今回は特につまみ(ノブ)やスライダーなどのコントローラを実装していませんので何もしていません。
リソースファイル
今回の自作VST GUIでは背景画像を利用しています。
背景画像はリソースから読み込まなければならないため、下記のようにリソースファイルを作成しています。
【resource.rc】
| 
					 1 2 3 4 5 6 7 8  | 
						#include <windows.h> #include <commctrl.h> #include <richedit.h> LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL // GUI用イメージ background.png   PNG   ".\\img\\background.png"  | 
					
リソースファイルの詳細は割愛させていただきます。
最初の5行(LANGUAGE ~~~まで)はそのまま記載し、その後に使用する画像ファイルのリソースを記載します。
画像ファイルのリソース記載は
 リソース名、カテゴリ(PNG固定)、ファイルパス(プロジェクトからの相対パス。””で囲む。)
の順に行います。
リソース名はファイル名と同じにします。(他のリソース名でもいいと思いますが、試していません。)
VST GUIで対応している画像ファイルはPNG形式のみですのでカテゴリはPNG固定です。
パラメーター操作クラスのGUI生成関数
作成したVST GUIクラスはパラメーター操作クラスから生成できるようにする必要があります。
パラメーター操作クラスから生成するには新たにcreateView()関数を定義します。
【controller.h】
| 
					 22 23 24 25 26 27 28 29 30 31 32 33 34  | 
						class MyVSTController : public EditController { public: 	// クラスを初期化する関数(必須) 	tresult PLUGIN_API initialize(FUnknown* context); 	// 自作VST GUIEditorを作成する関数 	IPlugView* PLUGIN_API createView(const char* name); 	// 自作VST Controllerクラスのインスタンスを作成するための関数(必須) 	static FUnknown* createInstance(void*) { return (IEditController*)new MyVSTController(); } };  | 
					
- createView()関数
 
| 概要 | 自作VST GUIを呼び出す関数 | ||
|---|---|---|---|
| 戻り値 | 型 | 概要 | |
| IPlugView* | 作成したVST GUIクラスへのポインタ | ||
| 引数 | 型 | 変数名 | 概要 | 
| const char* | name | 詳細不明。呼び出すビュー名を指定するものだと思われる | |
GUI生成関数の実装としては、引数のnameに”editor”を指定された際に自作VST GUIクラスを作成してそのポインタを返すだけです。
【controller.cpp】
| 
					 46 47 48 49 50 51 52 53 54 55 56  | 
						IPlugView* PLUGIN_API MyVSTController::createView(const char* name) { 	// editorを指定された場合 	if (strcmp(name, "editor") == 0) 	{ 		// 自作GUIクラスのインスタンスを作成し返す 		MyVSTGUIEditor* view = new MyVSTGUIEditor(this); 		return view; 	} 	return 0; }  | 
					
VST SDK3.6.7以前の場合
VST SDK3.6.8から若干VST GUIのクラス名等が変更となっております。VST SDK3.6.7以前を使用する場合は下記の点をご注意ください
■継承するクラスが異なる
継承するクラスがIControlListenerクラスではなくCControlListenerクラスです。(VSTGUIEditorクラスは変わりません。)
【guieditor.h】
| 
					 1 2  | 
						class MyVSTGUIEditor : public VSTGUIEditor, public CControlListener {  | 
					
■フレームのオープンが不要
VST SDK3.6.7以前ではCFrameクラスのコンストラクタでフレームを開く処理が入っていますので、frame->oepn()が不要となります。
また、フレームを開く処理が入っている関係でコンストラクタにウィンドウハンドルであるparentを指定する必要があります。
【guieditor.cpp】
| 
					 1  | 
							frame = new CFrame(size, parent, this);  | 
					
最後に
以上がVST GUIに最低限必要なファイルやクラスなどについて説明になります。
詳細な点は省略しておりますので、不明点がございましたら、掲示板かTwitterにてご連絡いただければと思います。
次回は実際につまみ(ノブ)やスライダーを実装する方法について記載したいと思います。
このVST3プラグインのサンプルソースファイルはこちらからダウンロードできます → vst3dev_20210403.zip
VST SDK 3.6.7以前の場合 はこちらです。 → 20171123_vst3
コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法
VST3プラグイン作りの情報はこちらにもございます → はじめてのVST3プラグイン作り
ご指摘やご質問などがございましたら、コメント欄か掲示板、Twitterでご連絡いただければと思います。
■掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp