2010-02-19 5 views
1

Comment puis-je envoyer des messages MIDI à partir d'un programme C++ et les faire jouer par la banque General MIDI? J'ai regardé autour et il ne semble pas y avoir une réponse simple, et mon cerveau commence à fondre après avoir lu de longs manuels sur CoreMIDI et des choses comme ça. J'ai un simple projet de jeu/synthétiseur C++, et tout ce que je veux faire est, par exemple, lorsque cette balle frappe le sol, déclencher un C4 de la banque Grand Piano. Je suis d'accord avec la majorité du programme, mais la partie MIDI intégrale a jusqu'ici été complètement opaque pour moi. Je voudrais utiliser CoreMIDI, car il semble que ce soit le plus simple, mais quelque chose de multi-plateforme serait un bonus.Lecture de sorties MIDI sous OS X, C++

Merci beaucoup pour toute aide!

Répondre

2

Une autre option serait rtmidi

Il est destiné à être simple et multi-plateforme

Je l'ai utilisé la RTAudio similaire pour l'audio en temps réel i/o, et il est relativement facile à utiliser. Vous devriez pouvoir lister tous les périphériques MIDI avec le code d'exemple, puis sélectionner la banque GM et envoyer le message MIDI approprié (message d'activation/de désactivation de note) après avoir sélectionné le piano avec un message de changement de programme. Wikipedia a un helpful page pour commencer

+0

rtmidi semble parfait, mais il ne sera pas compilé. Je reçois une erreur à propos de vtables. Je n'ai pas creusé très profond mais il semble que ce soit quelque chose à propos des drapeaux du compilateur, alors merci quand même. – BonzaiRob

+0

http://www.music.mcgill.ca/~gary/rtmidi/index.html#compiling devrait expliquer tout ce dont vous avez besoin, j'ai essayé le code d'exemple midiprobe sur win32 et compilé sans problème. Si vous avez besoin de l'aide de son développeur, vous pouvez essayer la liste de diffusion du kit d'outils de synthèse (https://ccrma.stanford.edu/software/stk/) qui inclut cette classe rtmidi et beaucoup d'autres fonctionnalités. Il est également construit par le même développeur. –

+0

J'ai utilisé les drapeaux, et il compilé très bien, mais ne serait pas lié. Si j'ai inclus rtmidi.h dans mon fichier principal, j'étais de retour à l'erreur vtables. J'ai donc fini # ifndef'ing plus ou moins les deux fichiers entiers, qui se compilent maintenant. Je suis sûr qu'il y a beaucoup de raisons pour lesquelles c'est une mauvaise idée. – BonzaiRob

0

J'ai écrit un tutoriel qui pourrait aider quelqu'un qui rencontre le même problème en utilisant CoreMIDI. Il explique comment lire un fichier MIDI et le sortir via un AUGraph en utilisant les effets sonores d'un fichier de police sonore. Il explique également comment utiliser un point de terminaison virtuel pour accéder aux messages MIDI en temps réel. Here.

Pour faire ce que vous cherchez à faire, vous pouvez modifier le projet d'exemple que je fournir les renseignements suivants:

result = MusicDeviceMIDIEvent ([AUSampler], midiStatus, note, velocity, 0); 

Où AUSampler est un pointeur vers le AUSampler dire que le point de départ dans le AUGraph. Plutôt que de lire un fichier, vous pouvez utiliser la commande suivante pour envoyer une note MIDI à lire.