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

Algorithmische Komposition mit Common Lisp

Tempo und Dauer

Es bietet sich eine weitere Vereinfachung an: Der Wert für die Dauer einer 1/16 Note ist mit 0.139 Sekunden ziemlich abstrakt. In der Partitur steht die Tempoangabe 3​/​8=72. Es wäre anschaulicher, mit diesen Tempoangaben zu arbeiten und sich dafür Hilfsfunktionen zu schreiben, statt die Dauernwerte direkt einzugeben.

Dazu dient die folgende Funktion get-duration. Die Funktion erhält als Parameter eine Dauer als ganzzahligen Bruch in musikalischer Notation und ein Tempo in Form einer Liste, die einen Notenwert (auch als ganzzahliger Bruch) und eine Metronomzahl als ganze Zahl der Anzahl der Schläge pro Minute enhält.

Aus diesen Werten errechnet die Funktion die Dauer des übergebenen Dauernwerts in Sekunden.

(defun get-duration (dur &optional (tempo '(1/4 60)))
  "get the duration in seconds for /dur/ at a given tempo.

@Example
 (get-duration 1/16 '(1/4 72)) ; => 5/24 (0.20833333, 125/6%)
"
  (* dur (/ 60 (apply #'* tempo))))

;;; Dauer einer 1/16 Note in Piano Phase:
(get-duration 1/16 '(3/8 72))
 ; => 5/36 (0.1388889, 125/9%)

Der Rückgabewert 5​/​36 ist keine Fließkommazahl, sondern ein ganzzahliger Bruch. Dies ist jedoch kein Nachteil, sondern ein großer Vorteil. Ein ganzzahliger Bruch ist eine genaue Zahl, während z.B. die Fließkommazahl von 1/3 eine gerundete Zahl ist (z.B. 0.333333). Der Unterschied wird erkennbar, wenn man mit diesen Zahlen rechnet:

(+ 1/3 1/3 1/3) ; => 1

(+ 0.333333 0.333333 0.333333) ; => 0.9999989

Durch die Ungenauigkeiten bei Rundungen können im Falle von Rhythmen dadurch beispielsweise verschiedene, gleichzeitige Stimmen mit der Zeit asynchron werden.

Auch wenn das in vielen Situationen keine Rolle spielt, oder nicht wahrnehmbar ist, macht es Sinn, grundsätzlich bei Berechnungen von Rhythmen oder Frequenzen mit ganzzahligen Brüchen zu arbeiten, da sie immer genau sind. Insbesondere bei der automatischen Transformation in Notation ist dies von großer Bedeutung.

Um einen ganzzahligen Bruch in eine Fließkommazahl zu verwandeln, kann man die Funktion float verwenden:

(float 1/3)  ; => 0.33333334 (33.333336%)

In Clamps wird das automatisch gemacht, wenn Töne gespielt oder anderweitig ausgegeben werden sollen.