Next: Vereinfachung des Codes , Previous: Ein Pattern spielen , Up: Steve Reich: Piano Phase , Home: Allgemeine Einführung

Algorithmische Komposition mit Common Lisp

Zwei Patterns mit Verschiebung

Um das Pattern in beiden Pianos zu spielen, kann man die Listen mit den sfz Instanzen für beide Pianos generieren und dann mit Hilfe der Funktion append zu einer Gesamtliste zusammenfassen. Mit Hilfe des :pan Keywords bei der Erzeugung der sfz Instanz werden dabei die Töne von Piano 1 auf dem linken und die Töne von Piano 2 auf dem rechten Kanal ausgegeben.

(in-package :clamps)

(sprout
 (append
  (loop ;;; Piano 1
   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
             :pan 0))
  (loop ;;; Piano 2
    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
              :pan 1))))

Um die allmähliche Verschiebung zu realisieren, wird das zweite Klavier durch Verkleinerung des Rhythmus beschleunigt. Wenn man die Verschiebing um einen Ton nach 10 Wiederholungen des Patterns erreichen möchte, muss man den ursprünglichen Rhythmus mit einem Faktor multiplizieren, der dem Quotienten von Gesamtanzahl der Töne und (1+ Gesamtanzahl der Töne) entspricht:

(in-package :clamps)

(sprout
 (append
  (loop ;;; Piano 1
   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
             :pan 0))
  (loop ;;; Piano 2
    with pattern = '(64 66 71 73 74 66 64 73 71 66 74 73)
    with num-repeats = 10
    with num-notes = (* (length pattern) num-repeats)
    with dtime = (* 0.139 (/ num-notes (1+ num-notes)))
    for i below (1+ num-notes)
    collect (new sfz
              :time (* i dtime)
              :keynum (elt pattern (mod i (length pattern)))
              :duration dtime
              :amplitude -6
              :preset :yamaha-grand-piano
              :pan 1))))