VstInt32 processEvents (VstEvents* events)
| 戻り値(型) | 説明 |
| VstInt32 | 戻り値についてはホストアプリケーションで無視される。 ただし、念のため1を返すようにするとよい。 |
| 引数 | 説明 |
| VstEvents* events | イベントを保持しているVstEvents型変数(後述)へのポインタ |
【ホストアプリケーションの動作】 ①processEvents()関数呼び出し ↓ ②processReplacing()関数呼び出し ↓ ③いろいろ処理 ↓ ④processEvents()関数呼び出し ↓ ⑤processReplacing()関数呼び出し ↓ ⑥いろいろ処理 ↓ ⑦processEvents()関数呼び出し ↓ ⑧processReplacing()関数呼び出し ↓ : :
- VstInt32 MyMidiSampleVST::processEvents (VstEvents* events)
- {
- // MIDIのリストを初期化します。
- midimsgnum = 0;
- memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM);
-
- // VSTイベントの回数だけループをまわす。
- int loops = (events->numEvents);
- for (int i = 0;i < loops; i++)
- {
- // 与えられたイベントがMIDIならばmidimsgbufにストックする
- if ((events->events[i])->type == kVstMidiType)
- {
- VstMidiEvent *midievent = (VstMidiEvent*)(events->events[i]);
-
- midimsgbuf[midimsgnum].deltaFrames = midievent->deltaFrames;
- midimsgbuf[midimsgnum].message = midievent->midiData[0] & 0xF0; // MIDIメッセージ
- midimsgbuf[midimsgnum].channel = midievent->midiData[0] & 0x0F; // MIDIチャンネル
- midimsgbuf[midimsgnum].data1 = midievent->midiData[1]; // MIDIデータ1
- midimsgbuf[midimsgnum].data2 = midievent->midiData[2]; // MIDIデータ2
- midimsgnum++;
-
- // MIDIメッセージのバッファがいっぱいの場合はループを打ち切る。
- if (i >= MIDIMSG_MAXNUM)
- {
- break;
- }
- }
- }
-
- // 1を返しておく
- return 1;
- }
| 変数 | 型 | 説明 |
| numEvents | VstInt32 | VSTイベントの数。 |
| reserved | VstIntPtr | 使われていない変数。0で固定 |
| events [2] | VstEvent * | VSTイベントへのポインタ。numEvents分だけVSTイベントが格納されている。 |
| 変数 | 型 | 説明 |
| type | VstInt32 | VSTイベントのタイプ。実装されているタイプは以下の2つのみ。 kVstMidiType…data[ ]に保存されているデータがMIDIメッセージであることを示す kVstSysExType…data[ ]に保存されているデータがMIDI System Exclusiveメッセージであることを示す |
| byteSize | VstInt32 | VstEvent構造体のtypeとbyteSizeを除いたバイト数。24固定。 |
| deltaFrames | VstInt32 | processReplacing()関数内でMIDIメッセージの処理タイミング。 0~sampleFramesの範囲の値を持つ。 |
| flags | VstInt32 | 使われていない変数。 |
| data[16] | char | 実際のVSTイベントデータ。typeよって内容が変わる。 |
midimsgnum = 0;
memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); // VSTイベントの回数だけループをまわす。
int loops = (events->numEvents);
for (int i = 0;i < loops; i++)
{
:
:
} if ((events->events[i])->type == kVstMidiType)
{
VstMidiEvent *midievent = (VstMidiEvent*)(events->events[i]);
midimsgbuf[midimsgnum].deltaFrames = midievent->deltaFrames;
midimsgbuf[midimsgnum].message = midievent->midiData[0] & 0xF0; // MIDIメッセージ
midimsgbuf[midimsgnum].channel = midievent->midiData[0] & 0x0F; // MIDIチャンネル
midimsgbuf[midimsgnum].data1 = midievent->midiData[1]; // MIDIデータ1
midimsgbuf[midimsgnum].data2 = midievent->midiData[2]; // MIDIデータ2
midimsgnum++;
} | 変数 | 型 | 説明 |
| type | VstInt32 | VstEvent構造体と同じ。 |
| byteSize | VstInt32 | VstEvent構造体と同じ。 |
| deltaFrames | VstInt32 | VstEvent構造体と同じ。 |
| flags | VstInt32 | 使われていない変数。 |
| noteLength | VstInt32 | 用途不明 |
| noteOffset | VstInt32 | 用途不明 |
| midiData [4] | char | MIDIメッセージ。 midiData[0]…MIDIステータス(メッセージ)とMIDIチャンネルが入っている。 midiData[1]…MIDIメッセージのデータ1 midiData[2]…MIDIメッセージのデータ2 midiData[3]…将来的な拡張のため予約。0が入っている。 |
| detune | char | 用途不明。-64~+63の値が入っている。 |
| noteOffVelocity | char | 用途不明。0~127の値が入っている。 |
| reserved1 | char | 将来的な拡張のため予約。0が入っている |
| reserved2 | char | 将来的な拡張のため予約。0が入っている |
| 項目 | No. | 概要 |
| MIDIメッセージ処理 | No.1 | MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 |
| No.2 | VSTの初期化とMIDIメッセージ処理関連の変数の初期化 | |
| No.3 | ホストアプリケーションからMIDIメッセージを受け取る方法 | |
| No.4 | MIDIメッセージをprocessReplacing()関数中で処理する方法 | |
| No.5 | MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版) |