4.6.2. 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 midi :time 0)) ;;; Ausgabe 1 Sekunde nach Auswertung: (sprout (new midi :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 midi :time 0) :at (+ 1 (now))) ;;; Kombination von :time und :at ;;; Ausgabe 2 Sekunden nach Evaluation: (sprout (new midi :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 midi :keynum 60 :time 0) (new midi :keynum 64 :time 0) (new midi :keynum 67 :time 0))) ;; Ausgabe eines Arpeggios mit sprout: (sprout (list (new midi :keynum 60 :time 0) (new midi :keynum 71 :time 0.5) (new midi :keynum 66 :time 2)))