我已經用C++編寫了一個簡單的MIDI控制檯應用程序。這是整個事情:C++:從MIDI信息中獲取數據(DWORD)
#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消息。 Here is the description of this function on MSDN。在該頁面上,他們說dwParam1
和dwParam2
的含義被指定爲消息類型(wMsg
),如MIM_DATA
。
如果查找MIM_DATA
的文檔,我可以看到它是一個雙字(DWORD
?),它有一個「高位字」和「低位字」。現在我怎樣才能獲得數據,如發送數據的MIDI設備上的控件名稱以及它發送的值?
我將不勝感激,如果有人能糾正我的代碼,如果它可以做得更好。
謝謝:)
這真的很酷。 :)它的作品,沒想到它會那麼簡單! 並感謝您提供這樣快速和有益的答覆。 – Midas 2009-12-30 22:12:44
感謝您關於'PlaySound'的說明。這只是一個嘗試,在那裏使用該功能,所以我仍然可以改變這一點。 – Midas 2009-12-31 09:28:30