Algorithmische Komposition mit Common Lisp
Midi Input und Output in Echtzeit
Echtzeit Ein- Ausgabe von Midiereignissen wird über Streams und Ports abgewickelt1.
In incudine werden dafür die Klassen jackmidi:output-stream
bzw. jackmidi:input-stream
bereitgestellt. Es handelt sich dabei
um direkte Assoziationen eines Streams mit einem in Jack sichtbaren Port.
In common music existieren zwei vordefinierte Symbole,
*midi-out1*
bzw. *midi-in1*
, die als Standardports für die
elementare Midi-Anbindung vorgesehen sind.
Funktionen zum Öffnen und Schließen der Standardports:
;;; Öffnen des Standard Output Streams (gebunden an das Symbol *midi-out1*): (midi-open-default :direction :output) ;;; Öffnen des Standard Input Streams (gebunden an das Symbol *midi-in1*): (midi-open-default :direction :input)
Nach Evaluation dieser Funktionen sollten bei jack unter JACK-MIDI bei input und output jeweils ein Eintrag mit Namen "incudine" erscheinen.
Ein Aufklappen dieser Einträge zeigt, dass der Name der Midi Ports
"midiout-1" bzw. "midiin-1" ist. Wie man erkennen kann, ist
dieser Name nicht identisch mit den Symbolen dieser Ports in
Clamps (*midi-out1*
bzw. *midi-in1*
).
Anschließend muss in jack (mit Hilfe von QjackCtl oder JackPilot) der Midi Output von incudine mit dem Midi input des Softwaresynthesizers verbunden werden, damit man auch etwas hören kann.

Anschließend sollte die Evaluation des folgenden Ausdrucks einen Ton erzeugen:
(output (new midi) :to *midi-out1*)
Neue Streams/Ports werden mit der Funktion jackmidi:open
erzeugt. Der Rückgabewert der Funktion sollte dabei an ein Symbol
gebunden werden, das benötigt wird, wenn man Midiereignisse über
diesen Stream ausgeben möchte:
(defparameter *midi-out2* nil) (setf *midi-out2* (jackmidi:open :direction :output :port-name "midi_out-2"))
Nach der Evaluation sollte in JACK-MIDI ein zweiter Port mit Namen "midiout-2" zu sehen sein.

Wenn dieser Port mit einem Softwaresynthesizer verbunden wird
(wie in der Abildung dargestellt), kann man die Ausgabe auf
diesen Stream/Port in common musics output
Funktion durch das
Keywort :to
spezifizieren:
(output (new midi) :to *midi-out2*)
Fußnoten:
Es ist schwierig, eine genaue Unterscheidung von Stream und Port zu treffen. Konzeptionell versteht man unter einem Port am ehesten etwas, das einem Hardwareanschluss, wie einer Kopfhörerbuchse entspricht, während ein Stream als geöffnete Verbindung betrachtet wird, über die Daten an den Port übertragen werden. Im Zusammenhang von incudine und Clamps kann man beide Begriffe im Grunde synonym verwenden. In diesem Text wird der Ausdruck Port für die in Jack sichtbaren Anschlüsse verwendet, während die softwareseitige Verwendung mit dem Begriff des Streams beschrieben wird.