Algorithmische Komposition mit Common Lisp
sprout
Eine allgemeinere Form der Ausgabe stellt die Funktion sprout
bereit. sprout kann sowohl einzelne Ereignisse, als auch eine
Liste von Ereignissen oder einen Prozess (siehe nächstes Kapitel)
ausgeben. Wenn sprout ein einzelnes Ereignis oder eine Liste von
Ereignissen ausgeben soll, ist darauf zu achten, dass der :time
Slot der auszugebenden Ereignisse gesetzt sein muss. Auch der
Wert dieses Slots bezieht sich auf den Moment der Auswertung des
Ausdrucks.
(sprout (new sfz :time 0)) ;;; Ausgabe 1 Sekunde nach Auswertung: (sprout (new sfz :time 1))
Wenn sprout im top-level evaluiert wird, erfolgt die Ausgabe,
wie bei output unmittelbar in Echtzeit. Auch bei sprout ist
es möglich, den Ausführungszeitpunkt durch das Keywort :at zu
beeinflussen. Hier ist allerdings darauf zu achten, dass der Wert
von :at nicht relativ zum Auswertungszeitpunkt, sondern in
absoluter Zeit seit Start der Echtzeitverarbeitung angegeben
werden muss. Den aktuellen Wert der absoluten Zeit kann man mit
der Funktion (now) ermitteln. Auf diese Weise lässt sich eine
relative Verzögerung folgendermaßen darstellen:
;;; Ausgabe 1 Sekunde nach Evaluation: (sprout (new sfz :time 0) :at (+ 1 (now))) ;;; Kombination von :time und :at ;;; Ausgabe 2 Sekunden nach Evaluation: (sprout (new sfz :time 1) :at (+ 1 (now)))
Wenn mehrere Ereignisse ausgegeben werden sollen, können die
Ereignisse in Form einer Liste an sprout übergeben werden:
;; Ausgabe eines simultanen Durdreiklangs mit sprout: (sprout (list (new sfz :keynum 60 :time 0) (new sfz :keynum 64 :time 0) (new sfz :keynum 67 :time 0))) ;; Ausgabe eines Arpeggios mit sprout: (sprout (list (new sfz :keynum 60 :time 0) (new sfz :keynum 71 :time 0.5) (new sfz :keynum 66 :time 2)))