質問
C++ で簡単な MIDI コンソール アプリケーションを作成しました。全体は次のとおりです。
#include <windows.h>
#include <iostream>
#include <math.h>
using namespace std;
void CALLBACK midiInputCallback(HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
switch (wMsg) {
case MIM_MOREDATA:
case MIM_DATA:
cout << dwParam1 << " ";
PlaySound("jingle.wav", NULL, SND_ASYNC | SND_FILENAME);
break;
}
}
int main() {
unsigned int numDevs = midiInGetNumDevs();
cout << numDevs << " MIDI devices connected:" << endl;
MIDIINCAPS inputCapabilities;
for (unsigned int i = 0; i < numDevs; i++) {
midiInGetDevCaps(i, &inputCapabilities, sizeof(inputCapabilities));
cout << "[" << i << "] " << inputCapabilities.szPname << endl;
}
int portID;
cout << "Enter the port which you want to connect to: ";
cin >> portID;
cout << "Trying to connect with the device on port " << portID << "..." << endl;
LPHMIDIIN device = new HMIDIIN[numDevs];
int flag = midiInOpen(&device[portID], portID, (DWORD)&midiInputCallback, 0, CALLBACK_FUNCTION);
if (flag != MMSYSERR_NOERROR) {
cout << "Error opening MIDI port." << endl;
return 1;
} else {
cout << "You are now connected to port " << portID << "!" << endl;
midiInStart(device[portID]);
}
while (1) {}
}
デバイスから受信した MIDI メッセージを処理するためのコールバック関数があることがわかります。 MSDN でのこの機能の説明は次のとおりです。. 。そのページには、次のような意味があると書かれています。 dwParam1
そして dwParam2
メッセージタイプ (wMsg
)、 のように MIM_DATA
.
のドキュメントを調べてみると、 MIM_DATA
, 、ダブルワードであることがわかります(DWORD
?) そして、それには「上位の単語」と「下位の単語」があること。データを送信した MIDI デバイス上のコントロールの名前や送信する値などのデータを取得するにはどうすればよいですか?
誰かが私のコードをより良く修正できる場合は、修正していただければ幸いです。
ありがとう :)
解決
使用する必要があるデータにアクセスするには dwParam1
そして dwParam2
そしてマクロを呼び出します HIWORD
そして LOWORD
彼らから最高の言葉と最低の言葉を得るために。それぞれ使用します HIBYTE
そして LOBYTE
それらの単語からデータを取得します。の場合には MIM_DATA
, 残念ながら、これはバイトエンコードされた MIDI データなので、それらの具体的な意味を見つける必要があります -- これらはここに文書化されています -- MIDIメッセージ.
ただし、MSDN ページに記載されているように、コードには潜在的な問題があります。
「アプリケーションは、コールバック関数内からマルチメディア関数を呼び出すべきではありません。他のシステム関数は、コールバックから安全に呼び出すことができます」。
そして、コールバックで PlaySound を呼び出しています...