Algorithmische Komposition mit Common Lisp
Next: events , Previous: output , Up: Ausgabefunktionen , Home: Allgemeine Einführung

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)))