※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

トップページ


CMidiMsgクラスの実装

ここでは前項で定義したCMidiMsgクラスについて説明する。

CMidiMsgクラスの実装

CMidiMsgクラスではコンストラクタでclearMidiMsg()関数を呼び出し初期化している。
clearMidiMsg()関数はメンバー変数に初期値を代入している。終了処理はないため、デストラクタでは何もしていない。

  1. CMidiMsg::CMidiMsg(void)
  2. {
  3. clearMidiMsg();
  4. }
  5.  
  6.  
  7. CMidiMsg::~CMidiMsg(void)
  8. {
  9. }
  10.  
  11. void CMidiMsg::clearMidiMsg()
  12. {
  13. // メンバー変数を初期化する
  14. cur=0;
  15. num=0;
  16. memset(buf, 0, sizeof(MidiMessage)*MIDIMSG_MAXNUM);
  17. }

CMidiMsgクラス addMidiMsg()関数

次にaddMidiMsg()関数について説明する。

メンバ関数 戻り値 引数 内容
addMidiMsg() int VstMidiEvent *midievent MIDIメッセージをMIDIバッファへの保存する関数。
引数は受け取るMIDIメッセージ(VstMidiEvent型のポインタ)
MIDIバッファへの追加に成功すると1、失敗すると0が返る。

この関数はVSTから受け取ったMIDIメッセージをMIDIバッファへ保存するための関数で、processEvents()関数内で、下記のように呼び出されることを想定している。

  1. VstInt32 MyMidiSample2VST::processEvents (VstEvents* events)
  2. {
  3. // MIDIバッファを初期化。
  4. clearMidiMsg();
  5.  
  6. int loops = (events->numEvents);
  7.  
  8. // VSTイベントの回数だけループをまわす。
  9. for (int i = 0;i < loops; i++)
  10. {
  11. // 与えられたイベントがMIDIならばMIDIバッファに追加する。
  12. if ((events->events[i])->type == kVstMidiType)
  13. {
  14. VstMidiEvent *midievent = (VstMidiEvent*)(events->events[i]);
  15. if( !addMidiMsg(midievent) )
  16. {
  17. break;
  18. }
  19. }
  20. }
  21.  
  22. // 1を返さなければならない
  23. return 1;
  24. }

processEvents()関数内では、はじめにclearMidiMsg()関数でMIDIバッファ初期化している。
(clearMidiMsg()関数についてはコンストラクタの部分で説明したとおりである。)
次にVSTイベント(VstEvents* events)がいくつあるか確認し、VSTイベントの数だけ繰返し(for文)をおこない、VSTイベントがMIDIメッセージの場合にaddMidiMsg()関数を使用して、MIDIバッファへ保存している。

addMidiMsg()関数は下記のようにMIDIバッファに空きがあるかを確認し、空きがあればMIDIバッファに保管する。保管後は、MIDIバッファ内のMIDIメッセージ数を更新するようにしている。
また、VSTホストからMIDIメッセージを受け取る際はVstMidiEvent型で渡されることを想定し、簡単に処理できるようにaddMidiMsg()関数をオーバーロードしている。
  1. int CMidiMsg::addMidiMsg(VstMidiEvent *midievent)
  2. {
  3. // VstMidiEventからMidiMessgeへデータをコピーする
  4. MidiMessage tmp;
  5. tmp.deltaFrames = midievent->deltaFrames;
  6. tmp.message = midievent->midiData[0] & 0xF0;
  7. tmp.channel = midievent->midiData[0] & 0x0F;
  8. tmp.data1 = midievent->midiData[1];
  9. tmp.data2 = midievent->midiData[2];
  10.  
  11. return addMidiMsg(tmp);
  12. }
  13.  
  14. int CMidiMsg::addMidiMsg(MidiMessage msg)
  15. {
  16. // バッファがいっぱいなら0を返す
  17. if (num >= MIDIMSG_MAXNUM)
  18. return 0;
  19.  
  20. // バッファにMIDIメッセージを保存
  21. buf[num] = msg;
  22.  
  23. // バッファに保存されているMIDIメッセージの数を増やす。
  24. num++;
  25. if (num > MIDIMSG_MAXNUM) {num = MIDIMSG_MAXNUM;}
  26.  
  27. return 1;
  28. }

CMidiMsgクラス getMidiMsg()関数、getMidiMessageNum()関数、getNextDeltaFrames()関数

【作成中】


MIDIメッセージ処理用クラス定義

【作成中】



ここで作成するVSTサンプルのソースコード全体はここにある。





同一カテゴリのTips


項目 No. 概要
MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数
No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化
No.3 ホストアプリケーションからMIDIメッセージを受け取る方法
No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法
No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)


javascript plugin Error : このプラグインで利用できない命令または文字列が入っています。