Algorithmische Komposition mit Common Lisp
Ereignisse
Eine Midinote ist in Common Music ein Objekt, das der allgemeinen Klasse von Ereignissen (englisch events) angehört.
Um ein Objekt zu erzeugen, verwendet Common Music die Funktion
new 1. Die
Funktion erhält als Argument den Namen der Klasse, von der eine
Instanz erzeugt werden soll. Im Falle einer Midinote ist der Name
der Klasse midi:
(new sfz) ;; -> #i(sfz keynum 60 amplitude -6 duration 1 preset :yamaha-grand-piano oneshot :unprovided pan 0.5 startpos 0 chan 100)
Am Ergebnis des Beispiels kann man erkennen, dass durch die
Evaluation des new Ausdrucks die Instanz einer Midinote
(ausgedrückt durch die Zeichenfolge '#i' vor der Klammer) mit der
keynum 60, der duration 0.5, der amplitude 0.5 und dem channel 0
erzeugt wurde. Die einzelnen Parameter der Midinote bezeichnet man
als Instanzvariablen (bzw. englisch slots).
In der Klassendefinition sind Anzahl, Namen und oft auch die Standardwerte (englisch default values) dieser Instanzvariablen festgelegt 2. Bei Erzeugung einer Instanz können von den Defaultwerten abweichende Werte für die Instanzvariablen mit Hilfe von Keywords3 übergeben werden.
(new sfz :keynum 62 :duration 2) ;; => #i(sfz keynum 62 amplitude -6 duration 2 preset :yamaha-grand-piano oneshot :unprovided pan 0.5 startpos 0 chan 100)
Die Werte der Instanzvariablen lassen sich mit dem Makro sv
(slot-value) ermitteln.
(defparameter *testevent* (new sfz)) ;;; Lesen der Instanzvariablen/Slots mit Hilfe des sv Makros: (sv *testevent* :keynum) ;; -> 60 (sv *testevent* :duration) ;; -> 0.5 (sv *testevent* :amplitude) ;; -> -6 (sv *testevent* :chan) ;; -> 100
Alternativ kann der Slotname auch als Symbol ohne Doppelpunkt verwendet werden.
(sv *testevent* keynum) ;; -> 62 (sv *testevent* duration) ;; -> 2 (sv *testevent* amplitude) ;; -> 0.5 (sv *testevent* chan) ;; -> 0
Wenn man den Wert von Instanzvariablen verändern möchte, kann man die
special form setf in Verbindung mit sv verwenden:
;;; Verändern der Instanzvariablen/Slots mit Hilfe von setf und des sv ;;; Makros: (setf (sv *testevent* :keynum) 62) ;; -> 62 (setf (sv *testevent* :duration) 2) ;; -> 2 *testevent* ;; => #i(sfz keynum 62 amplitude -6 duration 2 preset :yamaha-grand-piano oneshot :unprovided pan 0.5 startpos 0 chan 100)
Alternativ hat das Makro sv auch ein optionales viertes
Argument, mit dem man den Slot ohne Zuhilfenahme von setf
setzen kann:
;;; Verändern der Instanzvariablen/Slots nur mit Hilfe der sv ;;; Funktion: (sv *testevent* :keynum 62) ;; -> 62 (sv *testevent* duration 2) ;; -> 2 *testevent* ;; => #i(sfz keynum 62 amplitude -6 duration 2 preset :yamaha-grand-piano oneshot :unprovided pan 0.5 startpos 0 chan 100)
Zur Veränderung der Instanzvariablen mit setf können alle Formen
der Adressierung von Slots verwendet werden, wie das folgende
Beispiel zeigt:
(sv *testevent* keynum 65) ;; -> 65 (setf (sv *testevent* chan) 3) ;; -> 3 (sv *testevent* :amplitude 0.3) ;; -> 0.3 *testevent* ;; => #i(sfz keynum 65 amplitude 0.3 duration 2 preset :yamaha-grand-piano oneshot :unprovided pan 0.5 startpos 0 chan 3) ;; Ausgabe des Events: (output *testevent*)
Fußnoten:
In der Fachsprache nennt man diesen Vorgang instantiieren und das erzeugte Objekt eine Instanz.
Das Beispiel zeigt, dass bei einer Midinote die Defaultwerte für keynum 60, für duration 0.5, für amplitude 0.5 und für channel 0 sind.
Keywords sind in Common Lisp Symbole, die
mit einem Doppelpunkt beginnen, also beispielsweise :keynum,
:amplitude oder :dur
ation.