Pregunta

He escrito una sencilla aplicación de consola MIDI en C ++. Aquí está todo el asunto:

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

Se puede ver que hay una llamada de retorno para el manejo de los mensajes MIDI de entrada desde el dispositivo. Aquí está la descripción de esta función en MSDN . En esa página se dice que el significado de dwParam1 y dwParam2 se especifican a la MessageType (wMsg), al igual que MIM_DATA.

Si miro la documentación de MIM_DATA , puedo ver que es una palabra doble (DWORD?) y que tiene una 'palabra alta' y un 'bajo palabra'. ¿Cómo puedo ahora obtener datos como el nombre del control en el dispositivo MIDI que sended los datos y qué valor se envía?

Yo agradecería que si alguien puede corregir mi código si se puede hacer mejor.

Gracias:)

¿Fue útil?

Solución

Para acceder a los datos que necesita para su uso dwParam1 y dwParam2 y llamar a la HIWORD macros y LOWORD para conseguir el alto y bajo palabra de ellos. utilizar respectivamente HIBYTE y LOBYTE para obtener los datos de esas palabras. En caso de MIM_DATA, por desgracia, que de bytes codificados datos MIDI, por lo que tendrá que encontrar los significados específicos para los que - estos se documentan aquí - Mensajes MIDI .

Su código sin embargo, tiene un problema potencial - como se lee en las páginas de MSDN:

  

"Las aplicaciones no deben llamar a cualquier   funciones multimedia desde el interior de la   función de devolución de llamada, ya que pueden   causar un callejón sin salida. otro sistema de   funciones de seguridad se pueden llamar desde   la devolución de llamada".

Y que está llamando PlaySound en la devolución de llamada ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top