簡體   English   中英

C ++:從MIDI消息中獲取數據(DWORD)

[英]C++: Get data from MIDI message (DWORD)

我用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上此功能的說明 在那個頁面上,他們說dwParam1dwParam2的含義被指定給messagetype( wMsg ),就像MIM_DATA一樣。

如果我查看MIM_DATA的文檔,我可以看到它是雙字( DWORD ?)並且它有一個'高字'和'低字'。 我現在如何獲取數據,如MIDI設備上發送數據的控件名稱以及它發送的值?

如果有人可以更好地修改我的代碼,我將不勝感激。

謝謝 :)

要訪問數據,您需要使用dwParam1dwParam2並調用宏HIWORDLOWORD來獲取它們的高位和低位字。 分別使用HIBYTELOBYTE從這些單詞中獲取數據。 MIM_DATA情況下,不幸的是,這是字節編碼的MIDI數據,所以你必須找到那些的具體含義 - 這些記錄在這里 - MIDI消息

但是,您的代碼存在潛在問題 - 正如我們在MSDN頁面中所讀到的那樣:

“應用程序不應該從回調函數內部調用任何多媒體函數,因為這樣做會導致死鎖。其他系統函數可以安全地從回調中調用”。

你在Callback中調用PlaySound ......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM