MIDI - Programm selbst schreiben (z.B. in C)

  • Ersteller LUKN-134
  • Erstellt am
LUKN-134
LUKN-134
Registrierter Benutzer
Zuletzt hier
15.10.23
Registriert
22.11.04
Beiträge
442
Kekse
518
Hallo,

ich hätte Lust, mal ein kleines Programm zu schreiben (in Linux, vermutlich Sprache C), mit dem ich Program Changes vom PC aus an mein Rack abgeben kann. Dann natürlich auf einzelnen Kanälen, sodass nicht alle auf das gleiche Programm umspringen müssen.

In einem weiteren Schritt könnte man dann überlegen, in einer (formatierten) Textdatei eine Art "Setlist" zu gestalten, die dann eingelesen werden kann vom Hauptprogramm. Dann kann man durch die Setlist im "livebetrieb" durchtaben, also von Song zu Song.
Mal als Beispiel:

#001 #Song1
01<--115;
02<--122;
12<--50;
#002 #Song2
01<--113;
02<--39;
12<--51;
(einfache Programmchanges an drei Geräte bzw. auf drei Kanälen)

Programmierkenntnisse sind zwar vorhanden, aber leider keine MIDI-Programmierung (über Links und Tipps freue ich mich, google aber auch gerade selbst).

Hat jemand mit soetwas Erfahrung oder kann Hilfestellung jeglicher Art geben?

beste Grüße
:)
 
Eigenschaft
 
Eventuell ist Midi-Dings ja genau das richtige für dich? Sonst mal mit JohannesD oder strogon14 kurzschließen, ich denke beide sind im Moment recht aktiv in der Richtung :)

Ich habe die Software Midi-Dings gefunden, das ist ein Midi-Prozessor für Linux, der auch eine Song-Verwaltung hat.

Der Autor von Midi-Dings (fubar) ist übrigens auch im Forum unterwegs :) Mein eigenes Projekt, dem ich gern mehr Zeit widmen würde, ist im Moment auf Windows konzipiert und in Pascal umgesetzt. Ich weiß nicht, wie das prinzipielle Vorgehen unter Linux aussieht, aber zum Vergleich kann ich dir kurz skizzieren wie es bei mir aussieht.

Ich nutze eine fremde Komponente, die sich mit dem Betriebssystem rumschlägt und mir viel Arbeit abnimmt, aktuell diese https://bitbucket.org/h4ndy/midiio-dev/

Mein Programm schaut zuerst, welche Midi Ein- und Ausgänge im System vorhanden sind und öffnet dann die vom Nutzer ausgewählten. Hier sollte nochmal geschaut werden, ob das auch geklappt hat oder ob es einen Fehlercode gab. Danach sind die Midi Ports quasi "offen" und man kann Daten senden / empfangen.

In meinem Fall passiert das Senden durch eine einfache Funktion, der ich die drei Bytes "Midi Nachricht", "Data1" und "Data2" übergebe.

Beim Empfangen wird ein Ereignis erzeugt und eine Funktion von mir aufgerufen, die das Ereignis abarbeitet. Damit muß ich nicht aktiv schauen, ob etwas anliegt oder nicht.

Wenn das Programm beendet wird, müssen die Midi Ports wieder geschlossen werden und mehr passiert da nicht. Natürlich ist das der Idealfall, man sollte in seinem Programm z.B. auch den Fall berücksichtigen, daß die Midi Verbindung abreißen kann z.B. wenn das Midi Interface rausgezogen wird.

Nun bin ich gespannt, ob es unter Linux ähnlich aussieht, mal schauen wer sich dazu meldet :)
 
Zuletzt bearbeitet:
Wenn du unbedingt C oder C++ programmieren willst (finde ich persönlich nicht so prickelnd), dann würde ich die RtMidi-Bibliothek empfehlen. Die abstrahiert die MIDI-Frameworks von Linux (ALSA, JACK), Mac OS X (CoreMIDI, JACK) und Windows (Windows MultiMedia) in einfach zu benutzende, platform-übergreifend funktionierende Klassen.

Ich entwickle seit einiger Zeit dafür ein Python-Binding.: python-rtmidi Damit lassen sich sehr leicht platform-übergreifende Experiment mit MIDI anstellen. Langsam erlangt die Biblliothek auch eine gewissse Reife, sie ist jetzt im Beta-Stadium, aber die API ist stabil, es ändern sich hauptsächlich noch Sachen bei der Installation und bei den Test- und Beispielskripten.

Apropos Beispiele, deren Quellcode kannst du dir im SVN-Repository anschauen. Hier außerdem ein minimales Beispiel, um einen Bank Select und Program Change-Befehl zu senden:

#!/usr/bin/env python
#
# test_bank_program_change.py
#

import rtmidi

from rtmidi.midiconstants import *
from rtmidi.midiutil import open_midiport

# Bank 0 (MSB=0, LSB=0), Program 0, Channel 1
msg_bs_msb = [CONTROLLER_CHANGE, BANK_SELECT, 0]
msg_bs_lsb = [CONTROLLER_CHANGE, BANK_SELECT_LSB, 0]
msg_pc = [PROGRAM_CHANGE, 0]

midiout, port_name = open_midiport(None, "output")

print("Sending Bank Select and Program Change to MIDI port '%s'." % port_name)
midiout.send_message(msg_bs_msb)
midiout.send_message(msg_bs_lsb)
midiout.send_message(msg_pc)

Aufgerufen auf meinem Linux-Laptop (funktioniert unverändert auch unter OS X und Windows XP/Vista/7):

$ python test_bank_program_change.py
Do you want to create a virtual MIDI ouput port? (y/N) n
Available MIDI ouput ports:

[0] Midi Through:0
[1] USB Midi:0

Select MIDI ouput port (Control-C to exit): 1
Sending Bank Select and Program Change to MIDI port 'USB Midi:0'.


Chris
 

Unser weiteres Online-Angebot:
Bassic.de · Deejayforum.de · Sequencer.de · Clavio.de · Guitarworld.de · Recording.de

Musiker-Board Logo
Zurück
Oben