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のサンプルソースコード全体(暫定版) |