2009-12-30 2 views
4

J'ai écrit une simple application de console MIDI en C++. Voici l'ensemble:C++: Obtenir des données à partir d'un message MIDI (DWORD)

#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 existe une fonction de rappel pour gérer les messages MIDI entrants provenant de l'appareil. Here is the description of this function on MSDN. Sur cette page, ils disent que la signification de dwParam1 et dwParam2 sont spécifiées au type de message (wMsg), comme MIM_DATA.

Si je consulte la documentation de MIM_DATA, je peux voir que c'est un double mot (DWORD?) Et qu'il a un «mot haut» et un «mot bas». Comment puis-je obtenir des données comme le nom du contrôle sur le périphérique MIDI qui a envoyé les données et quelle valeur il envoie?

J'apprécierais que quelqu'un puisse corriger mon code si cela peut être mieux fait.

Merci :)

Répondre

5

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. Utilisez respectivement HIBYTE et LOBYTE pour extraire les données de ces mots. Dans le cas de MIM_DATA, il s'agit malheureusement de données MIDI codées en octets, donc vous devrez trouver les significations spécifiques pour celles-ci - elles sont documentées ici - MIDI Messages.

Votre code a cependant un problème potentiel - comme nous le lisons dans les pages MSDN:

« applications ne doivent pas appeler toutes les fonctions multimédia à l'intérieur de la fonction de rappel , car cela peut causer un Les autres fonctions du système peuvent être appelées en toute sécurité depuis le ".

Et vous appelez PlaySound dans le ... Callback

+0

C'est vraiment cool. :) Ca marche, je ne pensais pas que ce serait aussi simple! Et merci de donner une réponse aussi rapide et utile. – Midas

+0

Merci pour votre note à propos de 'PlaySound'. C'était juste un essai pour utiliser cette fonction là-bas, donc je peux encore changer cela. – Midas

Questions connexes