C ++: Obtenir des données de messages MIDI (DWORD)
Question
J'ai écrit une simple application de la console MIDI en C ++. Voici la chose:
#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) {}
}
Vous pouvez voir qu'il ya une fonction de rappel pour traiter les messages MIDI entrants à partir du périphérique. Voici la description de cette fonction sur MSDN . Sur cette page, on dit que le sens de dwParam1
et dwParam2
sont spécifiées au messagetype (wMsg
), comme MIM_DATA
.
Si je regarde la documentation de MIM_DATA
, je peux voir qu'il est un double mot (DWORD
?) et qu'il a un « grand mot » et un « mot faible ». Comment puis-je obtenir maintenant des données comme le nom du contrôle sur l'appareil MIDI sended les données et quelle valeur il envoie?
Je vous serais reconnaissant si quelqu'un peut corriger mon code si on peut le faire mieux.
Merci:)
La solution
Pour accéder aux données, vous devez utiliser dwParam1
et dwParam2
et appeler les macros HIWORD
et LOWORD
pour obtenir le mot haut et bas d'eux. utiliser HIBYTE
et LOBYTE
Respectivement pour obtenir les données de ces mots. En cas de MIM_DATA
, malheureusement que ses données MIDI codées d'octets, de sorte que vous devrez trouver les significations spécifiques pour ceux - ci sont documentées ici - Messages MIDI .
Votre code a cependant un problème potentiel - comme nous le lisons dans les pages MSDN:
"Les demandes doivent pas appeler tout fonctions multimédia à partir de l'intérieur de la fonction de rappel, comme cela peut provoquer une impasse. autre système les fonctions peuvent être appelées à partir en toute sécurité le rappel ».
Et vous appelez PlaySound dans le ... Callback