Next: Zwei Patterns mit Verschiebung , Previous: Praktische Beispiele , Up: Steve Reich: Piano Phase , Home: Allgemeine Einführung

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.