Domanda

Ho scritto una semplice applicazione console MIDI in C ++. Ecco il tutto:

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

Si può vedere che c'è una funzione di callback per gestire i messaggi MIDI in arrivo dal dispositivo. Ecco la descrizione di questa funzione su MSDN . In quella pagina si dice che il significato di dwParam1 e dwParam2 sono specificati al MessageType (wMsg), come MIM_DATA.

Se guardo la documentazione di MIM_DATA , posso vedere che si tratta di una doppia parola (DWORD?) e che ha un 'alta parola' e 'bassa parola'. Come posso ora ottenere dati come il nome del controllo sul dispositivo MIDI che inviò i dati e quale valore si invia?

Vi sarei grato se qualcuno può correggere il mio codice, se si può fare di meglio.

Grazie:)

È stato utile?

Soluzione

Per accedere ai dati è necessario utilizzare dwParam1 e dwParam2 e chiamare il HIWORD macro e LOWORD per ottenere la parola alta e bassa da loro. Rispettivamente utilizzare HIBYTE e LOBYTE per ottenere i dati di quelle parole. In caso di MIM_DATA, purtroppo questo è byte codificati i dati MIDI, quindi dovrete trovare i significati specifici per coloro che - questi sono documentati qui - messaggi MIDI .

Il codice ha comunque un potenziale problema - come si legge nelle pagine MSDN:

  

"Le applicazioni non dovrebbero chiamare qualsiasi   funzioni multimediali dall'interno della   funzione di callback, in quanto così facendo può   causare un deadlock. Altro sistema   funzioni possono tranquillamente essere chiamato da   la richiamata".

E si sta chiamando PlaySound nella richiamata ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top