VST3プラグインの読み込みと情報表示
前回はVST3ホストを作成する際の開発環境準備やVisual Studioプロジェクトの作成について記載いたしました。
今回はVST3プラグインを読み込むプログラムの説明を実施します。
今回作成するプラグインは下記のとおりです。
- VST3プラグインを読み込む(new)
- VST3プラグインの情報を表示する(new)
実際に音声処理を行うまではもう少し手順がありますが、まずは情報表示するところまで実施いたします。
このVST3プラグインのサンプルソースファイルはこちらからダウンロードできます→vst3host_20210410
ZIPファイルの中の「vst3host01_VST3プラグインの読み込みと情報表示」フォルダが今回のサンプルソースファイルになります。
なお、Visual Studioのプロジェクトは「コンソールアプリケーション」で作成しております。
プロジェクト設定などは「Visual Studioのプロジェクト設定」もご参照ください。
VST3プラグイン読み込みの流れ
VST3プラグインを読み込んで利用できるようにするには、大きく下記の流れで読み込みと初期化を行います。
- VST3プラグインのファイル(.vst3ファイル)をホストアプリケーションに組み込む(読み込む)
- VST3プラグインのファイル内にある音声処理クラスとパラメーター操作クラスの一覧を取得
- 音声処理クラスとパラメーター操作クラスの一覧から必要なクラスのインスタンスを作成
- 作成した音声処理クラスとパラメーター操作クラスのインスタンスを初期化
本ページで説明する内容は上記の1.と2.についてとなります。
はじめてのVST3ホスト
さっそく、VST3プラグインを読み込むプログラムを作成します。
ソースコードは下記となります。説明は後述します。
【main.cpp】
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
// ここからVSTホストに必要なヘッダ // VST3ファイルの読込に必要 // module_win32.cppをプロジェクトに追加すること // ※ module_win32.cppはWindows用なので、Linuxの場合はmodule_linux.cpp、 // macOSの場合はmodule_mac.mmをかわりに追加する。(たぶん) #include "public.sdk/source/vst/hosting/module.h" // ホスト用クラスを使用するときに必要なネームスペース using namespace VST3::Hosting; // ここからそれ以外のヘッダ #include <stdio.h> using namespace std; // メイン関数はここから int main() { string path = u8".\\vst_file_name.vst3"; // VST3プラグインのパス string error; // VST3プラグインのファイルを読み込みに失敗したときのエラー用 // --------------------------------------------------------------------------- // Moduleクラスを使用してVST3プラグインのファイルを読み込む shared_ptr<Module> module = Module::create(path, error); if (!module) { // 読み込みに失敗したら終了 printf("Error : VST3ファイルの読込に失敗\n"); printf(" : path = %s\n", path.c_str()); printf(" : error = %s\n", error.c_str()); return 1; } // --------------------------------------------------------------------------- // PluginFactoryクラスを取得する // PluginFactoryクラスはVST3プラグインファイル内にあるプラグイン情報取得や音声処理クラスと // パラメータ操作クラスを列挙・作成するクラス PluginFactory factory = module->getFactory(); // プラグインの情報を取得 FactoryInfo factoryInfo = factory.info(); printf("プラグイン情報\n"); printf(" Vendor : %s\n", factoryInfo.vendor().c_str()); printf(" URL : %s\n", factoryInfo.url().c_str()); printf(" EMail : %s\n", factoryInfo.email().c_str()); printf("\n"); // 音声処理クラス・パラメータ操作クラス情報を列挙 printf("クラス情報\n"); for (ClassInfo classInfo : factory.classInfos()) { printf(" Name : %s\n", classInfo.name().c_str()); printf(" UID : %s\n", classInfo.ID().toString().c_str()); printf(" Category : %s\n", classInfo.category().c_str()); printf(" Vendor : %s\n", classInfo.vendor().c_str()); printf(" Version : %s\n", classInfo.version().c_str()); printf(" VST SDK : %s\n", classInfo.sdkVersion().c_str()); printf(" SubCategory: %s\n", classInfo.subCategoriesString().c_str()); printf(" Flags : %d\n", classInfo.classFlags()); printf("\n"); } printf("\n"); // Moduleクラスはmake_sharedで作成されているので解放は不要。 // PluginFactoryクラスは解放の必要は特にない。 printf("終了します\n"); return 0; } |
必要なヘッダファイルと定義
VST3ホストの作成に必要なSDKヘッダファイル「module.h」をまず読み込みます。このヘッダファイルにはModuleクラスとPluginFactoryクラスの定義が記載されています。
次に、VST3のホストアプリケーションに関するクラスには名前空間「VST3::Hosting」が使われているため、これも定義します。
また、VST3ホストの作成に必要なSDKヘッダファイル内でC++の標準ライブラリのstringやshared_ptrなどが使用されているため、名前空間「std」も定義しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// ここからVSTホストに必要なヘッダ // VST3ファイルの読込に必要 // module_win32.cppをプロジェクトに追加すること // ※ module_win32.cppはWindows用なので、Linuxの場合はmodule_linux.cpp、 // macOSの場合はmodule_mac.mmをかわりに追加する。(たぶん) #include "public.sdk/source/vst/hosting/module.h" // ホスト用クラスを使用するときに必要なネームスペース using namespace VST3::Hosting; // ここからそれ以外のヘッダ #include <stdio.h> using namespace std; |
「module.h」を利用するためにはVisual StudioのプロジェクトにModuleクラスとPluginFactoryクラスのソースファイル(下記)を追加する必要があります。
- C:\VST_SDK\VST3_SDK\public.sdk\source\vst\hosting\module_win32.cpp
VST3プラグインファイル(.vst3ファイル)の読込
VST3プラグインのファイル(.vst3ファイル)を読み込むにはModuleクラスを使用します。
Moduleクラスを作成するには、Moduleクラス内でstaticで定義されたcreate関数を使用し、引数にVST3プラグインのファイルのパスを指定します。
なお、Module::create()関数の内部では、初期化時にVST3プラグインのInitModule()関数が呼ばれます。
- Module::create()関数
概要 | Moduleクラスのインスタンスを作成・初期化する関数。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
shared_ptr<Module> | 作成されたModuleクラスのポインタです。作成・初期化に失敗するとnullptrが返ります。 単なるポインタではなく、shared_ptrであることに注意してください。 |
||
引数 | 型 | 変数名 | 概要 |
string& | path | 読み込むVST3プラグインファイル(.vst3ファイル)のパスです。 | |
string& | errorDescription | Moduleクラスの作成・初期化の失敗時に、エラーメッセージが格納される変数です。 |
実際にModuleクラスを作成している部分は下記となります。
VST3プラグインファイルのパスは作成するVST3ホストから読み込める位置であればどこでもかまいません。(ここではVST3ホストと同じフォルダを想定しています。)
VST3の規格で定められているフォルダ(C:\Program Files\Common Files\VST3\)配下でなくても読み込めます。
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
int main() { string path = u8".\\vst_file_name.vst3"; // VST3プラグインのパス string error; // VST3プラグインのファイルを読み込みに失敗したときのエラー用 // --------------------------------------------------------------------------- // Moduleクラスを使用してVST3プラグインのファイルを読み込む shared_ptr<Module> module = Module::create(path, error); if (!module) { // 読み込みに失敗したら終了 printf("Error : VST3ファイルの読込に失敗\n"); printf(" : path = %s\n", path.c_str()); printf(" : error = %s\n", error.c_str()); return 1; } |
Moduleクラスはshared_ptrのため終了時に解放されます。deleteなどで解放する必要はありません。
また、Moduleクラスの開放時にVST3プラグインのDeinitModule()関数が呼ばれます。
ファクトリークラスの取得とプラグイン情報
VST3プラグインのファイル(.vst3ファイル)が読み込めれば、次はファイル内のVST3プラグイン情報の取得とVST3プラグインにある音声処理クラス・パラメータ操作クラスの列挙をしています。
VST3プラグイン情報取得やクラスの列挙などをするにはPluginFactoryクラスを使用します。
PluginFactoryクラスはModuleクラスのgetFactory()関数で取得することができます。特に難しい関数ではないので詳細は割愛しますが、戻り値がPluginFactoryクラスへの参照(PluginFactory&)であることに注意してください。
34 35 36 37 38 |
// --------------------------------------------------------------------------- // PluginFactoryクラスを取得する // PluginFactoryクラスはVST3プラグインファイル内にあるプラグイン情報取得や音声処理クラスと // パラメータ操作クラスを列挙・作成するクラス PluginFactory factory = module->getFactory(); |
getFactory()関数でPluginFactoryクラスを取得した後、VST3プラグインの情報(製作者、製品URL、EMailなど)を取得します。
PluginFactoryクラスのinfo()関数を呼び出すことで、VST3プラグインの情報(製作者、製品URL、EMailなど)が記載されたFactoryInfoクラスを取得することができます。
FactoryInfoクラスには、製作者を返すvendor()関数・製品URLを返すurl()関数・EMailを返すemail()関数(戻り値はすべてstring型)などがあります。
FactoryInfoクラスで取得できる情報は下記のソースコードにある情報でほぼすべてですので詳細は割愛します。
40 41 42 43 44 45 46 |
// プラグインの情報を取得 FactoryInfo factoryInfo = factory.info(); printf("プラグイン情報\n"); printf(" Vendor : %s\n", factoryInfo.vendor().c_str()); printf(" URL : %s\n", factoryInfo.url().c_str()); printf(" EMail : %s\n", factoryInfo.email().c_str()); printf("\n"); |
最後に、音声処理クラス・パラメータ操作クラス情報を列挙しています。
PluginFactoryクラスのclassInfos()関数を呼び出すことで、音声処理クラス・パラメータ操作クラスの情報が記載されたClassInfoクラスの動的配列(vector
ClassInfoクラスには、クラス名を返すname()関数やFUIDクラスを返すID()関数などがあります。ClassInfoクラスで取得できる情報は下記のソースコードにある情報でほぼすべてですので詳細は割愛します。
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
// 音声処理クラス・パラメータ操作クラス情報を列挙 printf("クラス情報\n"); for (ClassInfo classInfo : factory.classInfos()) { printf(" Name : %s\n", classInfo.name().c_str()); printf(" UID : %s\n", classInfo.ID().toString().c_str()); printf(" Category : %s\n", classInfo.category().c_str()); printf(" Vendor : %s\n", classInfo.vendor().c_str()); printf(" Version : %s\n", classInfo.version().c_str()); printf(" VST SDK : %s\n", classInfo.sdkVersion().c_str()); printf(" SubCategory: %s\n", classInfo.subCategoriesString().c_str()); printf(" Flags : %d\n", classInfo.classFlags()); printf("\n"); } printf("\n"); |
PluginFactoryクラス・FactoryInfoクラス・ClassInfoクラスは特に解放する必要はありません。
なお、気づいたかもしれませんが、FactoryInfoクラス・ClassInfoクラスの内容は、VST3プラグイン作成時に指定する、BEGIN_FACTORY_DEFマクロとDEF_CLASS2マクロの内容になります。
実行結果サンプル
上記のコードを実行すると下記のような表示となります。読み込んだVST3プラグインは私の作成した「Tempo Sync Filter」となります。
最後に
VST3プラグインの読み込みと情報表示は以上となります。
次回は、VST3プラグインから音声処理クラスを作成して初期化するところまでを説明いたします。
VST3プラグイン作りの情報はこちらにもございます → はじめてのVST3プラグイン作り
ご指摘やご質問などがございましたら、コメント欄か掲示板、Twitterでご連絡いただければと思います。
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp