Algorithmische Komposition mit Common Lisp
Ein Pattern spielen
Der folgende Code spielt das Anfangspattern mit einem Klaviersample 10 mal:
(in-package :clamps) (sprout (loop with pattern = '(64 66 71 73 74 66 64 73 71 66 74 73) with num-repeats = 10 with dtime = 0.139 for i below (* (length pattern) num-repeats) collect (new sfz :time (* i dtime) :keynum (elt pattern (mod i (length pattern))) :duration dtime :amplitude -6 :preset :yamaha-grand-piano)))
Die loop
Form gibt eine Liste mit 10x12 sfz Instanzen zurück,
die von sprout
dann über den Audioausgang ausgegeben
werden. Diese Liste kann man im Lisp Inspector sehen, indem man
den Cursor an das Ende der loop Form bewegt (hinter die
schließende graue Klammer) und die Tastenkombination <C-c I>
drückt.
Um das Pattern zyklisch auszulesen, wird die #'mod
Funktion
verwendet, die den ganzzahligen Rest einer Division
errechnet:
(loop for i below 10 collect i) ; => (0 1 2 3 4 5 6 7 8 9) (loop for i below 10 collect (mod i 3)) ; => (0 1 2 0 1 2 0 1 2 0) (loop for i below 10 collect (mod i 4)) ; => (0 1 2 3 0 1 2 3 0 1)
Dabei ist die Variable i der Index der Tonfolge und die Anzahl der Töne des Patterns (length pattern) der Dividend der mod Funktion . Die Zeit des Tones entspricht dem Produkt aus Tonindex i und dem Rhythmus (hier dtime gennannt). Die elt Funktion gibt die jeweilige Tonhöhe aus der Tonfolge als MIDI Nummer zurück.