Zufall in Sonic Pi, Teil 2

Folgende Funktionen in Sonic Pi erzeugen zufällige Werte:
1. rand_i, rand und dice liefern zufällige Zahlen (siehe Teil 1)
2. Mit choose und pick kann man zufällig Werte aus einer vorgegebenen Menge von Werten auswählen
3. one_in erzeugt zufällig Wahrheitswerte, also true (wahr) oder false (falsch)

Werte zufällig auswählen mit choose und pick

Wenn a ein Array oder ein Ring ist, dann liefert a.choose bei jedem Aufruf ein zufälliges Element von a.

Hier wird die Tonhöhe aus fünf Werten gewählt:

use_synth :piano
6.times do
  play [40, 45, 50, 55, 60].choose
  sleep 0.2
end

Wer sich wundert, warum bei jedem Ausführen des Codes dieselben Klänge zu hören sind, sollte unbedingt Teil 1 lesen!

…und hier eines von drei Samples:

16.times do
  sample [:bd_haus, :drum_snare_hard, :drum_cymbal_closed].choose
  sleep 0.125
end

…und hier eine zufällige Tonart:

use_synth :piano
live_loop :zufallsakkord do
  grundton = [:c3, :d3, :e3].choose
  tongeschlecht = [:major, :minor].choose
  akkord = chord grundton, tongeschlecht
  play akkord
  sleep 0.5
end

Im folgenden Beispiel wird in Zeile 2 ein Ring mit dem Namen notenring erzeugt, der 15 Zahlen (in diesem Fall stehen die Zahlen für Notenwerte) enthält. Im Live-Loop wird bei jedem Durchgang in Zeile 4 aus diesem Ring 6 Werte ausgewählt – mehrfache Auswahl eines Wertes ist möglich – und unter dem Namen auswahl gespeichert und per each (Zeile 5-8) abgespielt:

use_synth :saw
notenring = scale :c2, :major, num_octaves: 2
live_loop :pick_beispiel do
  auswahl = notenring.pick 6
  auswahl.each do |note|
    play note, release: 0.1
    sleep 0.15
  end
  sleep 0.3
end

Zufällige Entscheidungen mit one_in

one_in gibt die Wahrheitswerte true oder false zurück. In Kombination mit if kann man one_in nutzen, um bestimmte Codeabschnitte nur manchmal ausführen zu lassen. one_in 3 liefert durchschnittlich jedes dritte mal true, sonst false, one_in 10 jedes zehnte mal true und so weiter.

live_loop :one_in_beispiel do
  if one_in 3
    sample :bd_haus
  end
  sleep 0.1
end