Previous: Seminar , Up: 06.05.25 , Home: Allgemeine Einführung

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