VSTプラグインを作成してみる

VSTプラグインを作成してみる

簡単なVSTプラグインを作成する方法について説明します。
ここで説明するVSTプラグインは入力信号をそのまま出力するだけのVSTプラグインとなります。概要は下記のとおりです。

  • 音楽ソフトウェア上でエフェクターとして動作する
  • 入力、出力共にステレオ(2チャンネル)
  • 入力された音声をそのまま出力する

なお、ここではVST SDKのダウンロードプロジェクト作成が完了していることが前提となっております。


ソースコードの説明

ここで作成するVSTプラグインの全ソースコードは下記のリンク先に記載しています。
ここでは下記のソースコードをもとに説明いたします。

ソースファイル 概要
MyMinimumVST.cpp VSTプラグインのメインとなるソースファイル。

ソースコード全体はここに記載しています。 → ソースコード全体


ヘッダーファイルのインクルード

まず、VSTプラグインを作るために必要なヘッダーファイルのインクルードと定数の定義を行います。

4行目ではVSTプラグインを作成する際に必要なヘッダーファイルをインクルードしています。
インクルードしているaudioeffectx.hはVSTプラグインで利用する構造体やクラスなどが記載されたヘッダーファイルです。
VST/VSTiプラグインを作成する際は必ずaudioeffectx.hをインクルードします。

9~18行目では作成するVSTで使用する定数の定義しています。値の定義だけですので詳細は省略します。


VSTプラグインの基本となるクラスの定義

次に、AudioEffectXクラスを継承してVSTプラグインの基本となるクラスを定義します。(AudioEffectXクラスは先ほどインクルードしたaudioeffectx.hに記載されています。)

今回作成する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関数を作成します。

createEffectInstance関数ではVSTプラグインの基本クラスのインスタンスをnewで生成し、そのポインタをreturnで返さなければなりません。
この関数はVSTプラグインを作成する場合に必ず必要ですが、VST SDKの仕様のようですので詳しいことはわかりません。
VST/VSTiプラグイン作成の際の約束事として認識しておいてください。


VSTプラグインの基本クラスのコンストラクタ

VSTプラグインの基本クラスのコンストラクタではVSTに関する設定と初期化を行います。

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プラグインを公開する場合は、http://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に代入することで、ホストアプリケーション(音楽制作ソフト等)に渡すことができます。

まず、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プラグインとして読み込めるものを作成するだけであればたいして難易度は高くないと思います。
次項は簡単なエフェクターを作成し、実際に音声信号を処理してみたいと思います。


コメントを残す