Zufall in Sonic Pi, Teil 1

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.