Pergunta

Escrevi um aplicativo simples de console MIDI no C ++. Aqui está a coisa toda:

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

Você pode ver que há uma função de retorno de chamada para lidar com as mensagens MIDI recebidas do dispositivo. Aqui está a descrição desta função no MSDN. Naquela página, eles dizem que o significado de dwParam1 e dwParam2 são especificados para o MessageType (wMsg), Curti MIM_DATA.

Se eu procurar a documentação de MIM_DATA, Posso ver que é um palavra duplo (DWORD?) E que tem uma 'palavra alta' e uma 'palavra baixa'. Como agora posso obter dados como o nome do controle no dispositivo MIDI que enviou os dados e qual o valor que ele envia?

Eu apreciaria se alguém puder corrigir meu código se puder ser feito melhor.

Obrigado :)

Foi útil?

Solução

Para acessar os dados que você precisa usar dwParam1 e dwParam2 e chame as macros HIWORD e LOWORD para obter a palavra alta e baixa deles. Respectivamente HIBYTE e LOBYTE Para tirar os dados dessas palavras. No caso de MIM_DATA, Infelizmente, esse é o byte codificado MIDI Data, então você terá que encontrar os significados específicos para eles -estes são documentados aqui - Mensagens midi.

Seu código, no entanto, tem um problema em potencial - como lemos nas páginas do MSDN:

"Os aplicativos não devem chamar nenhuma função multimídia de dentro da função de retorno de chamada, pois isso pode causar um impasse. Outras funções do sistema podem ser chamadas com segurança do retorno de chamada".

E você está ligando para o PlaySound no retorno de chamada ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top