プリセットのあるエフェクターを作成する

プリセットのあるエフェクターを作成する

パラメーターのあるエフェクターを作成するでは簡単なエフェクターパラメーター操作機能を追加いたしました。
今回はさらにプリセット機能を追加してみます。

作成するVSTプラグインの概要は下記のとおりです。

  • ホストアプリケーション上でエフェクターとして動作する
  • 入力、出力共にステレオ(2チャンネル)
  • 入力された音声にトレモロをかけて出力する
  • ホストアプリケーションからトレモロのSpeedとDepthがコントロールできる
  • 3つのプリセットを持ち、ホストアプリケーションから切り替えることができる
  • サンプリング周波数は44,100Hzのみ対応

なお、前回作成したVSTプラグインはここを参照してください。 → パラメーターのあるエフェクターを作成する
また、プロジェクトの作成方法についてはここを参照してください。 → Visual Studioのプロジェクト作成する


プリセット機能を追加するには

まず、VST基本クラスにsetProgram関数とgetProgramName関数を継承元クラス(AudioEffectX)からオーバーライドして定義します。

次に、継承元コンストラクタ(AudioEffectX)の第2引数 numProgramsにプリセットの数を設定します。

これで、ホストアプリケーションからエフェクターのプリセットが切り替えられるようになります。

なお、パラメーターと同様に各プリセットには必ず0番からの通し番号を決めておく必要があります。


ソースコードの説明

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

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

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


プリセット数の変更

前項からの変更点はVSTプラグインのプリセット数(MY_VST_PRESET_NUM)のみとなります。(10行目、赤色部分)
今回は「Default」「Slow Tremolo」「Fast Tremolo」の3つのプリセットを考えているため、3としております。

なお、プリセットの番号は下記の通りとしています。

番号 プリセット名
0 Default トレモロをかけない状態
1 Slow Tremolo ゆっくりとしたトレモロ
2 Fast Tremolo 早いトレモロ

VSTプラグインクラスの定義

次にVSTプラグインクラスの定義を行います。今回は前項のメンバー関数に加えてプリセットに関する関数を定義しています。(赤色部分)

それぞれの関数についての概要は下記の通りです。

  • setProgram関数
  • 概要 ホストアプリケーションが、VSTプラグインのプリセットを設定するための関数。
    戻り値 概要
    戻り値はありません
    引数 変数名

    概要
    program VstInt32

    設定するプリセットの番号。
  • getProgramName関数
  • 概要 ホストアプリケーションが、VSTプラグインのプリセット名を取得するための関数。
    戻り値 概要
    戻り値はありません
    引数 変数名

    概要
    program VstInt32

    名前を取得するプリセットの番号。
    name char*

    プリセット名を保存する文字列配列。
    配列サイズは24Byteで、NULL文字で終端させる必要がある。

※VstInt32型はVST SDKで定義されている32ビットの整数型です。(intやlongをtypedefで定義しなおしているだけです。)


VSTプラグインの初期化と音声処理

続いて、VSTプラグインの初期化と音声処理(コンストラクタとprocessReplacing関数)を行いますが、
これらの関数についても前項同様、変更点はありません。
説明については「簡単なエフェクターを作成してみる」の「VSTプラグインの初期化」と「入力信号への正弦波の掛け合わせ」ををご参照ください。


setProgram関数

setProgram関数では、VSTプラグインのプリセットが設定された際の処理を記載します。

処理としては単純で、引数のprogramの値に応じて各パラメーター変数の値を設定した後、継承元クラス(AudioEffectXクラス)の変数curProgramに引数のprogramを代入します。

変数curProgramは「現在のプリセットが何番か?」を示すために使用される変数です。
setProgram関数では必ず変数curProgramに引数のprogramを代入してください。


getProgramName関数

getProgramName関数では、VSTプラグインの現在指定されているプリセット名をホストアプリケーションに返すための処理を記載します。

こちらも処理としては単純で、継承元クラスの変数curProgramの値に応じて、対応する番号のプリセット名を引数のnameに格納します。

vst_strncpy関数の詳細は前項のgetParameterName関数の項目をご確認ください。
また、kVstMaxProgNameLenはVST SDK 2.4のaeffect.hで定義されている定数でkVstMaxProgNameLen = 24となります。


コンパイルとビルド

上記の追加を行った後、コンパイルとビルドを行えば、プリセット機能のあるトレモロVSTプラグイン完成するはずです。

VSTプラグインを作成してみるで説明したとおり、いくつかのwarningとエラーが発生しますが、プロジェクトのReleaseフォルダ配下に「~~.dll」が作成されていれば特に問題はありません。


最後に

いかがでしたでしょうか?

今回は前項のトレモロにプリセット機能を実装しました。
使う側にとってプリセット機能は非常に便利だと思います。プリセット機能自体の実装は非常に簡単ですので、VSTプラグインを公開する場合などはぜひ実装してみてください。


コメントを残す