Algorithmische Komposition mit Common Lisp
Next: Der Time Slot , Previous: Der erste Ton , Up: Clamps/Common Music , Home: Allgemeine Einführung

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:

1

In der Fachsprache nennt man diesen Vorgang instantiieren und das erzeugte Objekt eine Instanz.

2

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.

3

Keywords sind in Common Lisp Symbole, die mit einem Doppelpunkt beginnen, also beispielsweise :keynum, :amplitude oder :dur ation.