我已经写在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?),并且它具有“高字”和“低位字”。我怎么能现在得到的数据一样,sended数据的MIDI设备上的控件的名称,并将其发送什么价值?

我将不胜感激,如果有人可以纠正我的代码,如果这是可以做到更好。

感谢:)

有帮助吗?

解决方案

要访问你需要使用dwParam1dwParam2数据并调用宏HIWORDLOWORD从他们那里得到的高和低字。分别使用HIBYTELOBYTE获取数据出来的那些话。在MIM_DATA的情况下,不幸的的字节编码MIDI数据,所以你必须找到那些特定的含义 - 这是记录在这里 - 的 MIDI邮件

您的代码但是有一个潜在的问题 - 正如我们在MSDN网页阅读:

  

“应用程序不应调用任何   从内部的多媒体功能   回调函数,因为这样做会   导致死锁。其他系统   功能可以安全地从所谓   回调”。

和你在回调...

调用PlaySound
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top