Algorithmische Komposition mit Common Lisp
Aufgabe 2
Definiert eine Funktion #'time-gen, die als Argument eine Referenzvariable eines bang-object erhält und die eine Funktion zurückgibt, die als Argumente entweder :stop, oder eine Zahl und eine Funktion (dauer envelope) erhalten. Über die Gesamtdauer Dauer werden Werte von 0 bis 1 (streng aufsteigend in linearer Zeit) ausgegeben und gleichzeitig das bang-object getriggert. Dabei werden die Zeitdifferenzen zwischen der Ausgabe von Werten (und dem trigger) durch die Funktion fn ermittelt, die als Argument den Aktuellen Wert zwischen 0 und 1 erhält.
Einen Beispielaufruf enthält der nachstehende Code:
(let ((dur 4)) (funcall (time-gen *bang*) dur (lambda (x) (n-exp (interp x 0 0 0.5 1 1 0) 0.1 0.5))) (funcall (line *out*) 0 1 dur))
Verbindet diese Funktion mit dem untenstehenden Gui, in dem ein Toggle/Bang und ein slider diesen Verlauf veranschaulichen.
Die Referenzvariablen sind \*play\* für den Triggerausgang des Generators und \*out\* für die jeweiligen Werte.
(defun new-window (body) "On-new-window handler." (setf (title (html-document body)) "Gui Test") (let ((collection (create-collection body "1/2")) (ref *play*)) (create-o-bang collection (bind-refs-to-attrs ref "bang" ref "label-off" ref "label-on") :flash-time 50 :background '("#aaa" "orange") :css `(:width "3em")) (create-o-slider collection (bind-refs-to-attrs *out* "value") :direction :right :css `(:width "30em" :height "1em" :background "#aaa")))) ;;; We don't want to restart the server everytime when the new-window ;;; fun is canged thats why this proxy gets defined (defun on-new-window (body) (new-window body)) ;;; The gui can be opened at http://127.0.0.1:54619/example (set-on-new-window #'on-new-window :path "/example")