4

簡単なMIDIコンソールアプリケーションをC++で作成しました。これが全体です:

#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指定されていると言っています。wMsgMIM_DATA

のドキュメントを調べるMIM_DATAと、それがダブルワード(DWORD?)であり、「ハイワード」と「ローワード」があることがわかります。データを送信したMIDIデバイスのコントロールの名前や送信する値などのデータを取得するにはどうすればよいですか?

誰かが私のコードをもっとうまくできるなら修正してくれれば幸いです。

ありがとう :)

4

1 に答える 1

5

データにアクセスするには、マクロを使用dwParam1dwParam2て呼び出し、マクロHIWORDからLOWORD上位と下位の単語を取得する必要があります。それぞれ、およびそれらの単語からデータを取得するために使用HIBYTELOBYTEます。の場合MIM_DATA、残念ながらそれはバイトエンコードされたMIDIデータなので、それらの特定の意味を見つける必要があります-これらはここに文書化されています-MIDIメッセージ

ただし、MSDNページで読んだように、コードには潜在的な問題があります。

「アプリケーションは、コールバック関数内からマルチメディア関数を呼び出さないでください。デッドロックが発生する可能性があります。他のシステム関数は、コールバックから安全に呼び出すことができます。」

そして、あなたはコールバックでPlaySoundを呼んでいます...

于 2009-12-30T22:01:49.977 に答える