VST 2.4サポート終了について
ここではVST 2.4の開発について記載させていただいておりますが、公式サポートが終了しており内容を更新しておりません。
これから開発を始める方は、新しいVSTバージョンで開発することをお勧めさせていただきます。
新しいVSTバージョンの開発情報はこちら → はじめてのVSTプラグインの作り
VSTプラグインを作成してみる
簡単なVSTプラグインを作成する方法について説明します。
ここで説明するVSTプラグインは入力信号をそのまま出力するだけのVSTプラグインとなります。概要は下記のとおりです。
- 音楽ソフトウェア上でエフェクターとして動作する
- 入力、出力共にステレオ(2チャンネル)
- 入力された音声をそのまま出力する
なお、ここではVST SDKのダウンロードとプロジェクト作成が完了していることが前提となっております。
VST2.4ではなく、VST3.6を使用したい場合はこちらをご覧ください → VST3開発環境の準備
ソースコードの説明
ここで作成するVSTプラグインの全ソースコードは下記のリンク先に記載しています。
ここでは下記のソースコードをもとに説明いたします。
ソースファイル | 概要 |
---|---|
MyMinimumVST.cpp | VSTプラグインのメインとなるソースファイル。 |
ソースコード全体はここに記載しています。 → ソースコード全体
ヘッダーファイルのインクルード
まず、VSTプラグインを作るために必要なヘッダーファイルのインクルードと定数の定義を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// ============================================================================================ // インクルードファイル // ============================================================================================ #include "audioeffectx.h" // ============================================================================================ // 設計情報の記入 // ============================================================================================ #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数 #define MY_VST_PARAMETER_NUM 0 //パラメータの数 #define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2 #define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2 #define MY_VST_UNIQUE_ID 'SMPL' //ユニークID //公開する場合は以下URLで発行されたユニークIDを入力する。 //https://ygrabit.steinberg.de/~ygrabit/public_html/index.html |
4行目ではVSTプラグインを作成する際に必要なヘッダーファイルをインクルードしています。
インクルードしているaudioeffectx.hはVSTプラグインで利用する構造体やクラスなどが記載されたヘッダーファイルです。
VST/VSTiプラグインを作成する際は必ずaudioeffectx.hをインクルードします。
9~18行目では作成するVSTで使用する定数の定義しています。値の定義だけですので詳細は省略します。
VSTプラグインの基本となるクラスの定義
次に、AudioEffectXクラスを継承してVSTプラグインの基本となるクラスを定義します。(AudioEffectXクラスは先ほどインクルードしたaudioeffectx.hに記載されています。)
20 21 22 23 24 25 26 27 28 29 30 31 |
// ============================================================================================ // VSTの基本となるクラス // ============================================================================================ class MyMinimumVST : public AudioEffectX { public: MyMinimumVST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数 virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); }; |
今回作成するVSTプラグインは入力信号をそのまま出力するだけのVSTプラグインですので、VSTプラグインとして動作するのに最低限必要なメンバー関数のみを定義しています。
最低限必要なメンバー関数はコンストラクタとprocessReplacing関数です。processReplacing関数は継承元のAudioEffectXクラスに記載されているメンバー関数をオーバーライドします。
ここでは26行目でコンストラクタを定義し、29行目でprocessReplacing関数を定義しています。それぞれの関数についての概要は下記のとおりです。
- コンストラクタ
概要 | VSTプラグインクラスのコンストラクタ。 初期化はすべてこのコンストラクタ内で行います。 |
||
---|---|---|---|
引数 | 型 | 変数名 | 概要 |
audioMasterCallback | audioMaster | ホストアプリケーション(音楽制作ソフト等)から渡される変数。 コンストラクタ以外で使用することが無いため特に意識する必要は無い。 |
- processReplacing関数
概要 | 音声信号を処理する関数。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
float** | input | VSTプラグインに入力される音声信号のバッファ。 inputs[チャンネル数][バッファサイズ]という形式の2次元配列になっている。 書き込まれている音声信号は-1.0~+1.0の範囲になっている。 |
|
float** | output | VSTから出力される音声信号のバッファ。 outputs[チャンネル数][バッファサイズ]という形式の2次元配列になっている。 書き込む音声信号は-1.0~+1.0の範囲にする。 |
|
VstInt32 | sampleFrames | inputs、outputsのバッファサイズ |
※VstInt32型はVST SDKで定義されている32ビットの整数型です。(intやlongをtypedefで定義しなおしているだけです。)
createEffectInstance関数の作成
続いて、ホストアプリケーション(音楽制作ソフト等)がVSTプラグインクラスのインスタンスを作成ために必要なcreateEffectInstance関数を作成します。
33 34 35 36 37 38 39 40 |
// ============================================================================================ // このVSTのを生成するための関数 // ============================================================================================ AudioEffect* createEffectInstance (audioMasterCallback audioMaster) { //newでこのVSTを生成したポインタを返す return new MyMinimumVST (audioMaster); } |
createEffectInstance関数ではVSTプラグインの基本クラスのインスタンスをnewで生成し、そのポインタをreturnで返さなければなりません。
この関数はVSTプラグインを作成する場合に必ず必要ですが、VST SDKの仕様のようですので詳しいことはわかりません。
VST/VSTiプラグイン作成の際の約束事として認識しておいてください。
VSTプラグインの基本クラスのコンストラクタ
VSTプラグインの基本クラスのコンストラクタではVSTに関する設定と初期化を行います。
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
// ============================================================================================ // コンストラクタ(VSTの初期化) // ============================================================================================ MyMinimumVST::MyMinimumVST(audioMasterCallback audioMaster) : AudioEffectX(audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM) { //VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。 //必ず呼び出さなければならない。 setNumInputs(MY_VST_INPUT_NUM); //入力数の設定 setNumOutputs(MY_VST_OUTPUT_NUM); //出力数の設定 setUniqueID(MY_VST_UNIQUE_ID); //ユニークIDの設定 //このVSTがSynthかどうかのフラグを設定。Synthの場合…true、Effectorの場合…false isSynth(false); //このVSTが音声処理可能かどうかのフラグを設定。音声処理を行わないVSTはないので必ずこの関数を呼び出す。 canProcessReplacing(); //上記の関数を呼び出した後に初期化を行う } |
45~46行目では、継承元クラス(AudioEffectXクラス)のコンストラクタの引数を設定しています。
設定している引数は3つで、一つ目がaudioMaster、2つ目が作成するVSTプラグインのプリセットの数、3つ目が作成するVSTプラグインのパラメーターの数となります。プリセット数とパラメーター数は事前に定義した値を設定しています。(9、10行目にて定義しています。それぞれ1と0となります。)
- 継承元コンストラクタ
引数 | 型 | 変数名 | 概要 |
---|---|---|---|
audioMasterCallback | audioMaster | 作成するVSTプラグインのaudioMasterをそのまま渡す。 | |
VstInt32 | numPrograms | プリセットの数。必ず1以上にする。 | |
VstInt32 | numParams | パラメーターの数。必ず0以上にする。 |
52~53行目は、作成するVSTプラグインの入力・出力チャンネル数を設定しています。
入力・出力チャンネル数の設定をするため、setNumInputs関数とsetNumOutputs関数を使用しています。
それぞれの関数には事前に定義した値を設定しています。(12、13行目にて定義しています。両方ともステレオのため2となります。)
- setNumInputs関数
概要 | 作成するVSTプラグインの入力チャンネル数を設定する関数。必ずコンストラクタ内で呼び出す。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
VstInt32 | inputs | 入力チャンネル数。モノラルの場合…1、ステレオの場合…2。 |
- setNumoutputs関数
概要 | 作成するVSTプラグインの出力チャンネル数を設定する関数。必ずコンストラクタ内で呼び出す。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
VstInt32 | outputs | 出力チャンネル数。モノラルの場合…1、ステレオの場合…2。 |
54行目では作成するVSTプラグインの固有IDを設定しています。固有IDはホストアプリケーションがプリセットやパラメータ情報を保存・管理するために使用されます。
作成したVST/VSTiプラグインを公開する場合は、https://ygrabit.steinberg.de/~ygrabit/public_html/index.htmlより取得した固有IDを設定する必要があります。今回は公開しないので、適当な値(12行目にて定義した値’SMPL’)を渡しています。
- setUniqueID関数
概要 | 作成するVSTプラグインのIDを設定する関数。必ずコンストラクタ内で呼び出す。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
VstInt32 | iD | VST/VSTiプラグインの固有ID。FourCC形式で設定する。 VST/VSTiプラグインを公開する場合は登録ページで固有IDを取得する必要がある。 |
57行目では作成するVSTプラグインがエフェクターかデジタル楽器かを設定します。この設定によって、ホストプログラム上での動作が変わります。
今回作成するVSTプラグインはエフェクターとして動作させたいため、falseを設定しています。
- isSynth関数
概要 | 作成するVSTプラグインがエフェクターかデジタル楽器かを設定する関数。必ずコンストラクタ内で呼び出す。 | ||
---|---|---|---|
戻り値 | 型 | 変数名 | 概要 |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
bool | state | 作成するVSTがエフェクターかデジタル楽器かどうかのフラグ。 デジタル楽器の場合…true、エフェクター場合…falseとする。(デフォルトはtrueとなる。) |
60行目では作成するVSTプラグインがprocessReplacing関数を使用できるかどうかの設定を行っています。設定にはcanProcessReplacing関数を使用します。
processReplacing関数を使用できないVST/VSTiプラグインは無いため、必ずcanProcessReplacing関数を呼び出す必要があります。
- canProcessReplacing関数
概要 | 作成するVSTプラグインがprocessReplacing関数を利用できるかどうかを設定する。必ずコンストラクタ内で呼び出す。 | ||
---|---|---|---|
戻り値 | 型 | 概要 | |
戻り値はありません | |||
引数 | 型 | 変数名 | 概要 |
bool | state | processReplacing関数が使えないVSTプラグインは無いので、必ずtrueとする。引数なしの場合trueとなる。 |
コンストラクタにおける設定の必須項目は以上です。必要であれば上記設定の後にコードを追加します。
VSTプラグインの基本クラスのprocessReplacing関数
VSTプラグインの基本クラスのprocessReplacing関数では音声信号の処理をおこないます。
処理した音声信号は第2引数のoutputsに代入することで、ホストアプリケーション(音楽制作ソフト等)に渡すことができます。
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
// ============================================================================================ // コンストラクタ(VSTの初期化) // ============================================================================================ void MyMinimumVST::processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames) { int L = 0; int R = 1; for (int i = 0; i < sampleFrames; i++) { //ここで音声処理を行う。 //出力バッファへ書き込む。 outputs[L][i] = inputs[L][i]; outputs[R][i] = inputs[R][i]; } } |
まず、processReplacing関数の引数intputsとoutputsですが、クラス定義の部分で説明したとおり、下記のような2次元配列になっております。
- inputs[チャンネル数][バッファサイズ]
- outputs[チャンネル数][バッファサイズ]
チャンネル数はそれぞれsetNumInputs関数とsetNumOutputs関数で指定した値です。バッファサイズはsampleFramesと同じ値となります。(sampleFramesはホストアプリケーションが決定します。)
つまり、今回の場合、intputsとoutputsは下記となります。
- inputs[2][sampleFrames]
- outputs[2][sampleFrames]
なお、inputsとoutputsのバッファの各値は-1.0~+1.0の範囲となります。
次に、71~72行目ですが、ここではわかりやすいようにそれぞれのチャンネルを変数で定義しています。(わかりやすくするためですので、この処理は必須ではありません。)
そして、74~81行目が実際に音声信号を処理している部分となります。
今回は入力信号をそのまま出力するだけのVSTプラグインですので、inputsの値をそのままoutputsに代入する処理をバッファのサイズ分(つまりsampleFrames分)だけ繰り返しています。
コンパイルとビルド
ソースコード記入後、コンパイルとビルドを行います。Visual Studio 2013 Expressのメニューから「ビルド」を選べばコンパイルとビルドが行えます。
ビルド時に下記のwarningが出ますが問題ありません。(Visual Studioがセキュリティ的により安全な関数を使うように促しているだけです。)
- warning C4996: ‘strncpy’: This function or variable may be unsafe. Consider using strncpy_s ~~~
また、ビルド完了後、Visual C++のプロジェクトのReleaseフォルダ配下に「~~.dll」というファイルができていれば成功です。
なお、下記エラーが出ますがこちらも問題ありません。
- プログラム ‘C:\Users~~~\Projects\プロジェクト名\Release\~~~.dll’ を開始できません。
ビルドしたVSTプラグインはCubaseやSonarなどの音楽制作ソフトウェア(DAW)にエフェクターとして読み込ませることができます。
ビルドに失敗する場合、プロジェクトの設定に誤りがある可能性があります。
「Visual Studioのプロジェクト作成する」を参考に、プロジェクトの設定を見直してみてください。
まとめ
VSTプラグインを作成する上でのまとめとしては下記のとおりです。
細かい点については各項目を参照してください。
- ヘッダーファイル「audioeffectx.h」は必ずインクルードする。
- AudioEffectXクラスを継承してVSTプラグイン基本クラスを作る
- VSTプラグイン基本クラスはコンストラクタとprocessReplacing関数は必ず定義する。
- プラグインの設定、初期化はすべてコンストラクタで行う。
- processReplacing関数で音声信号の処理を行う。
- createEffectInstance関数を作成する。
ソースコード全体 → ソースコード全体
最後に
いかがでしたでしょうか?
VSTプラグインとして読み込めるものを作成するだけであればたいして難易度は高くないと思います。
次項は簡単なエフェクターを作成し、実際に音声信号を処理してみたいと思います。