VST3プラグインでMIDIメッセージを受信する方法2
前回はMIDIのノートオン/ノートオフメッセージを受信する方法を記載いたしました。
今回はMIDIのコントロールチェンジやピッチベンドを受信する方法を記載したいと思います。
今回作成するプラグインは「VST3プラグインのパラメーター実装方法」で作成したプラグインをベースにします。
理由はやはり余計なコードが少ないためです。必要に応じて他のページの内容と組み合わせてご利用ください。
- パラメーターは1つ(ボリュームコントロール)
- MIDIコントロールチェンジ(No.7とNo.11)により上記パラメーター(ボリューム)をコントロールする
- 入力のボリュームをパラメーターにより調整して出力する
- 入力バス、出力バスは1つで、共にステレオ(2ch)
今回ベースとなるプラグインの説明はこちらに記載しています。
このVST3プラグインのサンプルソースファイルはこちらからダウンロードできます→vst3dev_20210403
ZIPファイルの中の「vst3dev07_MIDIメッセージを受信する方法2」フォルダが今回のサンプルソースファイルになります。
コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法
入力イベントバスの追加
まずは、MIDIのコントロールチェンジを受け取るために、音声処理クラスのinitialize()関数でaddEventInput()関数を呼び出して、入力イベントバスを追加します。
addEventInput()関数をについては前回の内容をご確認ください。
【processor.cpp】
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
tresult PLUGIN_API MyVSTProcessor::initialize(FUnknown* context) { // まず継承元クラスの初期化を実施 tresult result = AudioEffect::initialize(context); if (result == kResultTrue) { // 入力と出力を設定 addAudioInput(STR16("AudioInput"), SpeakerArr::kStereo); addAudioOutput(STR16("AudioOutput"), SpeakerArr::kStereo); // 入力のEventBusを追加する addEventInput(STR16("Event Input"), 1); // 以下固有の初期化を実施。 volume = 1.0f; } // 初期化が成功すればkResultTrueを返す。 return result; } |
MIDIコントロールチェンジ受信方法
MIDIのコントロールチェンジやピッチベンド情報を受け取る方法は非常に単純で、パラメーター操作クラスのパラメーターとMIDIコントロールチェンジ/ピッチベンドを関連付けるだけです。
パラメーターとMIDIコントロールチェンジ/ピッチベンドを関連付けるためには、IMidiMappingクラスを利用します。
具体的にはパラメーター操作クラスでIMidiMappingクラスも継承し、getMidiControllerAssignment()関数をオーバーライドします。
IMidiMappingクラスの利用には「ivstmidicontrollers.h」をインクルードする必要があります。
【controller.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 |
// VST3 SDKのインクルードファイル #include "public.sdk/source/vst/vsteditcontroller.h" // 自作VST用のインクルードファイル #include "myvst3define.h" #include "pluginterfaces/vst/ivstmidicontrollers.h" // MIDIのPitchBendやControlChangeを扱うために必要 // VST3作成に必要なの名前空間を使用 namespace Steinberg{ namespace Vst { // =================================================================================== // VSTのパラメーターを操作するためのControllerクラス // =================================================================================== class MyVSTController : public EditController , public IMidiMapping // MIDIのPitchBendやControlChangeを扱うために必要 { public: // クラスを初期化する関数(必須) tresult PLUGIN_API initialize(FUnknown* context); // 自作VST Controllerクラスのインスタンスを作成するための関数(必須) static FUnknown* createInstance(void*) { return (IEditController*)new MyVSTController(); } // MIDIのPitchBendやControlChangeとパラメーターを関連付ける関数 virtual tresult PLUGIN_API getMidiControllerAssignment(int32 busIndex, int16 channel, CtrlNumber midiControllerNumber, ParamID& id); // VST基本インターフェイス(IMidiMapping 等)をオーバーライドした場合に必要な宣言(詳細不明) // DEF_INTERFACEにインターフェイスを継承した分だけ加えていく。 OBJ_METHODS(MyVSTController, EditController) DEFINE_INTERFACES DEF_INTERFACE(IMidiMapping) END_DEFINE_INTERFACES(EditController) REFCOUNT_METHODS(EditController) }; |
注意として、VST SDK 3.6の基本インターフェイスのクラスを使用した場合は、OBJ_METHODS()マクロを使用して継承元クラスの関数や定義を置き換える必要があります。
VST SDK 3.6の基本インターフェイスは頭文字が「 I 」で始まるクラスになります。
IMidiMappingクラス以外に継承した場合、継承した分だけDEF_INTERFACE()マクロを呼び出します。
詳細不明なため、説明は省略いたします。
MIDIコントロールチェンジの関連付け
実際にMIDIコントロールチェンジとパラメーターを関連付るのはgetMidiControllerAssignment()関数で行います。
getMidiControllerAssignment()関数ではホスト(DAWなど)からイベントバス・MIDIチャンネル・コントロールチェンジ番号の情報が渡されるので、対応するパラメーターのタグ(ID)をホスト(DAWなど)に渡すだけです。
【controller.cpp】
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
tresult PLUGIN_API MyVSTController::getMidiControllerAssignment(int32 busIndex, int16 channel, CtrlNumber midiControllerNumber, ParamID& id) { // midiControllerNumberに関係付けたいパラメータータグ(ID)をidに代入することで // MIDIコントロールチェンジとパラメーターを関連付ける // イベントバスやMIDIチャンネルに応じて関連付けを変更したい場合は // busIndexやchannelを使用して条件分けする switch (midiControllerNumber) { case kCtrlExpression: case kCtrlVolume: // 関連付けるパラメーターがある場合、kResultTrueを返す id = PARAM1_TAG; return kResultTrue; } // 関連付けるパラメーターがない場合、kResultFalseを返す return kResultFalse; } |
getMidiControllerAssignment()関数の内容は下記となります。
- getMidiControllerAssignment()関数
概要 | MIDIコントロールチェンジ/ピッチベンドとパラメーターを関連付けます。 ホスト(DAWなど)がVSTプラグインのパラメーターと関連があるかどうかを確認するため、MIDIコントロールチェンジ/ピッチベンドを受信した際に呼び出されます。 |
||
---|---|---|---|
戻り値 | 型 | 概要 | |
tresult | 関連付けに成功したらkResultTrue、失敗したらkResultFalseを返す | ||
引数 | 型 | 変数名 | 概要 |
int32 | busIndex | MIDIコントロールチェンジが入力されるイベントバスの番号 | |
int16 | channel | MIDIコントロールチェンジのチャンネル番号 | |
CtrlNumber | midiControllerNumber | MIDIコントロールチェンジの番号(CtrlNumberはint16型を再定義したもの) | |
ParamID& | id | MIDIコントロールチェンジに関連付けるパラメータータグ(ID)を格納する変数 |
kCtrlExpressionやkCtrlVolumeはVST SDK 3.6で定義されたMIDIコントロールチェンジ番号です。数字で記載しても問題ありません。
定義されているMIDIコントロールチェンジ番号の詳細は割愛しますが、よく利用される定義については下記となります。
よく使いそうなMIDIコントロールチェンジ
CC No | VST SDKの定義 | 名称 |
---|---|---|
1 | kCtrlModWheel | モジュレーションホイール |
7 | kCtrlVolume | チャンネルボリューム |
10 | kCtrlPan | パン |
11 | kCtrlExpression | エクスプレッション |
64 | kCtrlSustainOnOff | サステインペダル(ダンパーペダル) |
71 | kCtrlFilterCutoff | フィルターカットオフ |
72 | kCtrlReleaseTime | リリースタイム |
73 | kCtrlAttackTime | アタックタイム |
74 | kCtrlFilterResonance | フィルターレゾナンス |
75 | kCtrlDecayTime | ディケイタイム |
VST SDK 3.6で定義されたMIDIコントロールチェンジの一覧についてはこちらに記載しております。
ピッチベンドの関連付け
MIDIのピッチベンドとパラメーターを関連付るのにもgetMidiControllerAssignment()関数を利用します。
MIDIコントロールチェンジは127までですが、midiControllerNumberに128と129がそれぞれ下記のように定義されております。
CC No | VST SDKの定義 | 名称 |
---|---|---|
128 | kAfterTouch | アフタータッチ |
129 | kPitchBend | ピッチベンド |
【例】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
tresult PLUGIN_API MyVSTController::getMidiControllerAssignment(int32 busIndex, int16 channel, CtrlNumber midiControllerNumber, ParamID& id) { // midiControllerNumberに関係付けたいパラメータータグ(ID)をidに代入することで // MIDIコントロールチェンジとパラメーターを関連付ける // イベントバスやMIDIチャンネルに応じて関連付けを変更したい場合は // busIndexやchannelを使用して条件分けする switch (midiControllerNumber) { case kAfterTouch: // 関連付けるパラメーターがある場合、kResultTrueを返す id = AFTERTOUCH_TAG; return kResultTrue; case kPitchBend: // 関連付けるパラメーターがある場合、kResultTrueを返す id = PITCHBEND_TAG; return kResultTrue; } // 関連付けるパラメーターがない場合、kResultFalseを返す return kResultFalse; } |
最後に
以上でMIDIのコントロールチェンジやピッチベンド情報を受け取ることができます。
次回はVSTプラグインの見た目をよくし、使いやすくするためにGUIの実装方法を説明いたします。
このVST3プラグインのサンプルソースファイルはこちらからダウンロードできます → vst3dev_20210403.zip
コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法
VST3プラグイン作りの情報はこちらにもございます → はじめてのVST3プラグイン作り
ご指摘やご質問などがございましたら、コメント欄か掲示板、Twitterでご連絡いただければと思います。
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp