NAudio は良い解決策かもしれませんが、私の経験では、コードはスパゲッティのようなもので、うまく説明できないことがわかりました。これは、OpenMidiProject の midi プレーヤーのコードのサンプルです。ソース ファイル (ヘッダー、ライブラリ、および dll) をダウンロードする必要がありますが、私はそれらを使って作業するのが大好きです。基本的に、このライブラリが行うことは、自動的に midi イベントを解析して再生することです。
このコードの操作について質問がある場合は、遠慮なく質問してください。これはコンパイルされるので、これをコンパイルするのに問題がある場合は、自分で行う必要があります。
#include <stdio.h>
#include <windows.h>
#include "..\\MIDIIO\\MIDIIO.h"
#include "..\\MIDIData\\MIDIData.h"
#include "..\\MIDIClock\\MIDIClock.h"
/* Don't forget to add MIDIIO(d).lib to your project */
/* Don't forget to add MIDIData(d).lib to your project */
/* Don't forget to add MIDIClock(d).lib to your project */
int main () {
long lTimeMode = 0;
long lTimeResolution = 0;
long lTempo = 60000000 / 120; /* [microsec/quarter note] */
long lEndTime = 0;
long lOldTime = 0;
long lCurTime = 0;
MIDIOut* pMIDIOut = NULL;
MIDIData* pMIDIData = NULL;
MIDITrack* pMIDITrack = NULL;
MIDIEvent* pMIDIEvent = NULL;
MIDIClock* pMIDIClock = NULL;
pMIDIOut = MIDIOut_Open ("Microsoft GS Wavetable Synth");
if (pMIDIOut == NULL) {
printf ("MIDIOut Open failed.\n");
return 0;
}
pMIDIData = MIDIData_LoadFromSMF ("test.mid");
if (pMIDIData == NULL) {
printf ("MIDIData Load failed.\n");
return 0;
}
lTimeMode = MIDIData_GetTimeMode (pMIDIData);
lTimeResolution = MIDIData_GetTimeResolution (pMIDIData);
lEndTime = MIDIData_GetEndTime (pMIDIData);
pMIDIClock = MIDIClock_Create (lTimeMode, lTimeResolution, lTempo);
if (pMIDIClock == NULL) {
printf ("MIDIClock_Create failed.\n");
return 0;
}
printf ("Now playing...\n");
MIDIClock_Start (pMIDIClock);
while (lCurTime <= lEndTime) {
lCurTime = MIDIClock_GetTickCount (pMIDIClock);
forEachTrack (pMIDIData, pMIDITrack) {
forEachEvent (pMIDITrack, pMIDIEvent) {
long lTime = MIDIEvent_GetTime (pMIDIEvent);
if (lOldTime <= lTime && lTime < lCurTime) {
if (MIDIEvent_IsTempo (pMIDIEvent)) {
long lTempo = MIDIEvent_GetTempo (pMIDIEvent);
MIDIClock_SetTempo (pMIDIClock, lTempo);
}
if (MIDIEvent_IsMIDIEvent (pMIDIEvent) ||
MIDIEvent_IsSysExEvent (pMIDIEvent)) {
unsigned char byMessage[256];
long lLen = MIDIEvent_GetLen (pMIDIEvent);
MIDIEvent_GetData (pMIDIEvent, byMessage, 256);
MIDIOut_PutMIDIMessage (pMIDIOut, byMessage, lLen);
}
}
}
}
lOldTime = lCurTime;
Sleep (5);
}
MIDIClock_Stop (pMIDIClock);
printf ("Now end.\n");
MIDIClock_Delete (pMIDIClock);
MIDIData_Delete (pMIDIData);
MIDIOut_Close (pMIDIOut);
return 1;
}