Frage

Ich habe eine einfache MIDI-Konsole-Anwendung in C ++ geschrieben. Hier ist die ganze Sache:

#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) {}
}

Sie sehen, dass es eine Callback-Funktion, die eingehenden MIDI-Meldungen vom Gerät für die Handhabung. Hier ist die Beschreibung dieser Funktion auf MSDN . Auf dieser Seite sagen sie, dass die Bedeutung von dwParam1 und dwParam2 zum Message (wMsg) angegeben werden, wie MIM_DATA.

Wenn ich die Dokumentation von MIM_DATA , kann ich sehen, dass es sich um ein Doppelwort ist (DWORD?), und dass es ein ‚hohes Wort‘ und ein ‚niedriges Wort‘. Wie kann ich nun Daten wie der Name der Steuerung auf dem MIDI-Gerät erhalten, das die Daten gesendet und welcher Wert es sendet?

Ich würde es begrüßen, wenn jemand kann meinen Code korrigieren, wenn es besser gemacht werden kann.

Danke:)

War es hilfreich?

Lösung

Um die Daten, die Sie verwenden müssen, Zugriff auf dwParam1 und dwParam2 und rufen Sie die Makros HIWORD und LOWORD die hohen und niedrigen Wort von ihnen zu bekommen. verwenden Beziehungsweise HIBYTE und LOBYTE die Daten aus diesen Worten zu bekommen. Im Fall von MIM_DATA, codierte leider, dass die Byte-MIDI-Daten, so dass Sie die spezifischen Bedeutungen für diejenigen finden müssen, werden - diese hier dokumentiert ist - MIDI-Meldungen .

Der Code hat jedoch ein potentielles Problem - wie wir in den MSDN-Seiten zu lesen:

  

"Anwendungen sollten alle nicht nennen   Multimedia-Funktionen aus dem Inneren der   Callback-Funktion, wie diese Weise können   führen zu einem Deadlock. Anderes System   Funktionen sicher aus aufgerufen werden   der Rückruf“.

Und Sie anrufen Playsound in dem Rückruf ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top