MIDIノートオン・オフの出力
VSTではMIDIメッセージを出力することができます。
これにより、MIDIエフェクトのようなものや音声信号からMIDIへの変換などを行うことができます。
ここでは、音声処理クラスからMIDIメッセージを出力する方法を説明いたします。
なお、MIDIメッセージの入力などについては下記をご参照ください。
MIDIメッセージの受取1 | MIDIのNote On、Note Offメッセージを受け取る方法の記載しています。簡単なモノフォニックシンセサイザーを作成しています。 |
MIDIメッセージの受取2 | MIDIのControl Change、Pitch Bendなどのメッセージを受け取る方法の記載しています。 |
サンプルでは、入力されたMIDIノートオン・オフメッセージそのまま出力するだけのものを作成しています。
まずは音声処理クラスのinitialize関数に出力用のEventBusを追加します。(「入力イベントバスの追加」とほぼ同じです。)
【processor.cpp】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
tresult PLUGIN_API MyVSTProcessor::initialize(FUnknown* context) { // まず継承元クラスの初期化を実施 tresult result = AudioEffect::initialize(context); if (result == kResultTrue) { // 入力と出力を設定 addEventInput(L"MIDI In",1 ); addEventOutput(L"MIDI Out",1); } // 初期化が成功すればkResultTrueを返す。 return result; } |
次に音声処理クラスのprocess関数にMIDIノートオン・オフメッセージを出力する処理を追加します。
MIDIノートオン・オフメッセージを出力するには、data変数からoutputEventsを取得し、このoutputEventsにイベント(MIDIノートオン・オフメッセージ)を追加します。
【processor.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 |
tresult PLUGIN_API MyVSTProcessor::process(ProcessData& data) { // 与えられたイベントがあるときdataのinputEventsに // IEventListクラスへのポインタのアドレスが入る IEventList* eventList = data.inputEvents; if (eventList != NULL) { // MIDIノートOn/Offを出力するには、data.outputEventsにイベントを追加する。 // nullptrの場合(出力用のイベントバスが無い場合)、終了する。 IEventList* outEventList = data.outputEvents; if (outEventList == nullptr) { return kResultTrue; } // イベントの数を取得する。 int32 numEvent = eventList->getEventCount(); for (int32 i = 0; i < numEvent; i++) { // i番目のイベントデータを取得する Event event; if (eventList->getEvent(i, event) == kResultOk) { // 出力用のイベントバスにイベントを追加する outEventList->addEvent(event); } } } // 問題なければkResultTrueを返す(おそらく必ずkResultTrueを返す) return kResultTrue; } |
以上で音声処理クラスからMIDIメッセージを出力することができます。
上記以外にもVST3.6についての情報があります。下記をご参照ください。
また、質問やご指摘はコメント欄や掲示板、Twitterでいただけばとおもいます。
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp