繁体   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