Hallo zusammen,
ich möchte gerne etwas mit MIDI I/O in C++ programmieren. Unter OS X bietet sich da ja CoreMidi an. Leider wünsche ich mir da eigentlich etwas viel einfacheres, intuitiveres als das was CoreMidi bietet. Ich möchte primär ein MIDI-Objekt haben, welches ich einmal initialisiere, dann einen Kanal setzte und welches dann einzelne Methoden besitzt um die Standard MIDI-Nachrichten zu versenden. Empfangen soll es auch können, das soll aber erst in einem zweiten Schritt implementiert werden.
Das Projekt habe ich hier ins GitHub gepackt, da findet sich aktuell der C++ Code für den Wrapper an sich und eine kleine main um das ganze zu testen.
Ich hab mir von hier ein wenig Code geklaut um mein MIDI Gerät grundsätzlich zu finden. Dazu muss ich noch einmal betonen, dass ich keinen großen Plan von Objective C habe - das ist zwar schon ein Zukunftsziel - aber am Ende soll das ganze bestenfalls in reinem C++ münden. Vorerst ist es für die Kompatibilität mit solchen gefundenen Codeschnipseln jedoch erst einmal als Objective C++ Projekt angelegt und ich habe die in Objective C geschriebenen Codezeilen aus dem Link fürs erste grob übernommen.
Zum eigentlichen Senden habe ich wiederum keine Beispiele gefunden und mir deswegen anhand der der Apple MIDI Services API Reference das etwas selbst zusammengedichtet. Mit halbem Erfolg. Wenn ihr in die main im verlinkten git schaut, seht ihr dass ich die bisher implementierten drei Methoden jeweils einmal mit irgendwelchen Dummy-Werten aufrufe:
Jedoch wird nur der erste Aufruf wirklich versendet. Kommentiere ich den ersten aus, geht der zweite raus, der dritte aber nicht, usw.
Grundsätzlich gehe ich in allen drei Methoden gleich vor, hier z.B. die ControlChange:
Alles anzeigen
Ist das grundsätzlich schon mal grob richtig oder mache ich etwas grundlegend falsch? Irgendwas scheine ich ja auf jeden Fall falsch zu machen. Ich freu mich über ein paar Tips, gerne auch Links die ich nicht gefunden habe in denen das vernünftige Vorgehen erklärt wird.
Besten Dank schon mal!
ich möchte gerne etwas mit MIDI I/O in C++ programmieren. Unter OS X bietet sich da ja CoreMidi an. Leider wünsche ich mir da eigentlich etwas viel einfacheres, intuitiveres als das was CoreMidi bietet. Ich möchte primär ein MIDI-Objekt haben, welches ich einmal initialisiere, dann einen Kanal setzte und welches dann einzelne Methoden besitzt um die Standard MIDI-Nachrichten zu versenden. Empfangen soll es auch können, das soll aber erst in einem zweiten Schritt implementiert werden.
Das Projekt habe ich hier ins GitHub gepackt, da findet sich aktuell der C++ Code für den Wrapper an sich und eine kleine main um das ganze zu testen.
Ich hab mir von hier ein wenig Code geklaut um mein MIDI Gerät grundsätzlich zu finden. Dazu muss ich noch einmal betonen, dass ich keinen großen Plan von Objective C habe - das ist zwar schon ein Zukunftsziel - aber am Ende soll das ganze bestenfalls in reinem C++ münden. Vorerst ist es für die Kompatibilität mit solchen gefundenen Codeschnipseln jedoch erst einmal als Objective C++ Projekt angelegt und ich habe die in Objective C geschriebenen Codezeilen aus dem Link fürs erste grob übernommen.
Zum eigentlichen Senden habe ich wiederum keine Beispiele gefunden und mir deswegen anhand der der Apple MIDI Services API Reference das etwas selbst zusammengedichtet. Mit halbem Erfolg. Wenn ihr in die main im verlinkten git schaut, seht ihr dass ich die bisher implementierten drei Methoden jeweils einmal mit irgendwelchen Dummy-Werten aufrufe:
Jedoch wird nur der erste Aufruf wirklich versendet. Kommentiere ich den ersten aus, geht der zweite raus, der dritte aber nicht, usw.
Grundsätzlich gehe ich in allen drei Methoden gleich vor, hier z.B. die ControlChange:
C-Quellcode
- //Paketliste anlegen und Paket hinzufügen
- MIDIPacketList dataToSend;
- dataToSend.numPackets=1;
- dataToSend.packet[0].timeStamp=0;
- dataToSend.packet[0].length=3;
- dataToSend.packet[0].data[0]=0xB0 | sendChannel;
- //Werte anhängen
- dataToSend.packet[0].data[1]=control;
- dataToSend.packet[0].data[2]=value;
- //Daten senden
- MIDISend(outputPort, destination, &dataToSend);
Ist das grundsätzlich schon mal grob richtig oder mache ich etwas grundlegend falsch? Irgendwas scheine ich ja auf jeden Fall falsch zu machen. Ich freu mich über ein paar Tips, gerne auch Links die ich nicht gefunden habe in denen das vernünftige Vorgehen erklärt wird.
Besten Dank schon mal!