In Sonic Pi gibt es eine Reihe von Funktionen, mit denen man Zufallszahlen und zufällig ausgewählte Werte in die Musik einbauen kann.
– rand_i, rand
und dice
erzeugen zufällige Zahlen
– Mit choose
und pick
kann man zufällig Werte aus einer vorgegebenen Menge von Werten auswählen
– one_in
erzeugt zufällig Wahrheitswerte, also true
(wahr) oder false
(falsch)
Ganze Zufallszahlen mit rand_i
In diesem Codebeispiel werden 10 Noten mit einem Notenwert zwischen 50 und 70 gespielt. Genauer gesagt: rand_i
gibt jeweils einen Wert zwischen 50 und 70 zurück, der dann an play
übergeben wird:
use_synth :piano 10.times do play rand_i 50..70 sleep 0.5 end
Wenn man dieses Beispiel mehrmals ausführt, fällt schnell auf: Es erklingen jedes Mal exakt dieselben Noten. Was ist das für ein merkwürdiger „Zufall“, bei dem es keine Überraschungen gibt? Man stelle sich vor, bei der Ziehung der Lottozahlen kämen jede Woche dasselbe heraus!
Den Zufallsgenerator mit use_random_seed initialisieren
Dieses seltsame Verhalten ist beabsichtigt. Der Computer erzeugt die Zufallszahlen intern mit einer Art „Generator“. Diesen Generator kann man mit einem sogenannten „seed“ (Samen) in einen bestimmten Zustand versetzen. Wenn der Generator in einem bestimmten Zustand ist, wird er jedes Mal dieselben Zahlen erzeugen. Und bei Sonic Pi ist es so eingerichtet, daß jedes Mal, wenn wir ein Programm starten, der Generator auf einen bestimmten, immer gleichen Zustand gesetzt wird. Deshalb kommen in dem Beispiel jedes Mal dieselben Zahlen heraus!
Wir können den Generator mit der Funktion use_random_seed
in einen anderen Zustand setzen:
use_synth :piano use_random_seed 12345 10.times do play rand_i 50..70 sleep 0.5 end
Der Zufallsgenerator wird durch use_random_seed 12345
in einen definierten Zustand versetzt, von dem aus er eine andere, ebenfalls jedes Mal gleiche Zahlen- und Tonfolge erzeugt. “Seed” bedeutet Samen. Man kann sich den random_seed als einen Samen für ein Baum von Zufallszahlen vorstellen. Setzen wir für 12345 eine andere Zahl ein, hat der Zufallsgenerator eine anderen Zustand und erzeugt wiederum andere Zahlen.
Die Zahl, die wir an use_random_seed
übergeben, hat keine Bedeutung in dem Sinne, dass hohe Zahlen hohe Zufallszahlen erzeugen oder ähnliches. Es gilt nur: gleiche Seeds erzeugen gleiche Zufallszahlen, nicht mehr und nicht weniger!
Das oben beschriebene Verhalten von Sonic Pi ist sehr durchdacht und hat zwei große Vorteile:
– Ein einmal geschriebenes Programm wird – auch wenn es Zufall verwendet – jedes Mal gleich klingen, unabhängig von der Sonic Pi Version oder dem Betriebssystem. (Wenn dieses Verhalten nicht erwünscht ist, und man bei jede Start andere Zahlen haben will, hilft dieser Trick.)
– Der Zufall lässt sich im engerem Sinne zum Komponieren verwenden, wir folgendes Beispiel zeigt:
use_synth :piano live_loop :zufalls_pattern do 3.times do use_random_seed 10 4.times do play rand_i 40..52 sleep 0.25 end end use_random_seed 66 4.times do play rand_i 40..52 sleep 0.25 end end
Es werden dreimal hintereinander die ersten vier Noten gespielt, die der Zufallsgenerator mit dem seed 10 erzeugt, dann einmal die ersten vier Noten beginnend mit seed 66. Und es klingt schon ein ganz kleines Bisschen wie Musik.
Dezimalzahlen mit rand
Für Dezimalzahlen verwenden wir die Funktion rand
:
live_loop :geigerzaehler do sample :perc_snap sleep rand 0.01..0.4 end
rand 0.01..0.4
erzeugt Zufallszahlen zwischen 0.01 und 0.4, die in diesem Fall die Dauer der Pause zwischen den einzelnen Klängen bestimmt. Es klingt in diesem Fall wie das unregelmäßige Klicken eines Geigerzählers.