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:)

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top