Im Folgenden demonstrieren Listing 3 und Listing 4 die Verwendung von onset, wiederum anhand des klassischen “Amen Break”. Die einzelnen Onsets liegen intern als Ring vor. Im ersten Teil der Sonic-Pi-Serie haben Sie im Zusammenhang mit Ringen bereits tick kennengelernt: Diese Funktion liefert beginnend mit 0 bei jedem Aufruf einen Wert und erhöht diesen zugleich um 1.
Listing 3 durchläuft die Scheiben per tick in der angestammten Reihenfolge. In Listing 4 hingegen sorgt pick für die zufällige Auswahl eines Ringelements und spielt entsprechend die Scheiben in einer endlos variierenden, zufälligen Reihenfolge ab.
Listing 3
live_loop :onsets_straight do sample :loop_amen, onset: tick sleep 0.2 end
Listing 4
live_loop :onsets_shuffled do sample :loop_amen, onset: pick sleep 0.2 end
Reproduzierbarer Zufall
Bei der Entwicklung von Sonic Pi hat Sam Aaron großen Wert darauf gelegt, dass Codes unabhängig von Betriebssystem und Programmversion vollkommen reproduzierbare Ergebnisse liefern. Das gilt auch für das Verwenden von pseudozufällig arbeitenden Funktionen wie pick oder rand [1]. Bei Sonic-Pi-Anfängern sorgt das oft für Verwirrung: Zufallsgesteuerter Code macht nach jedem Druck auf den Run-Knopf exakt dasselbe [2].
Mittels der Funktion use_random_seed setzen Sie den Zufallsgenerator an einen anderen Startpunkt. Diese Funktion können Sie auch dazu nutzen, zufällige, aber reproduzierbare Variationen in Ihre Beats einzubauen. Das demonstriert Listing 5: Der seed_ring liefert die Werte zum Initialisieren des Zufallsgenerators und wird per tick durchlaufen. Bei jedem vierten Durchgang des Live Loops startet die Erzeugung von Zufallszahlen mit dem Seed 29, sonst mit 3.
Listing 5
live_loop :random_variation do seed_ring = ring 3, 3, 3, 29 use_random_seed seed_ring.tick 8.times do sample :loop_amen, onset: pick sleep 0.2 end end
Zufallsgenerator per Systemzeit initialisieren
Möchten Sie sicherstellen, dass der Zufallsgenerator bei jeder Ausführung des Codes an einem anderen Punkt startet, initialisieren Sie ihn mit dem Ausdruck use_random_seed Time.now.nsec. Time.now.nsec liefert die aktuelle Nanosekunde der Systemzeit Ihres Raspberry Pi, ein mit ziemlicher Sicherheit bei jedem Aufruf unterschiedlicher Wert. Mehr über das Verwenden der Klasse Time und von Zufallsfunktionen finden Sie im Blog des Autors [7].
Der Onset-Ring unter der Lupe
Im Hintergrund sind die Onsets in einem Ring gespeichert, der Elemente des Typs Hash enthält. Bei Hashes handelt es sich um Schlüssel-Wert-Paare. Jeder Hash im Onset-Ring steht für einen Onset und speichert unter den Schlüsseln start, finish und index die zugehörigen Werte. Das Codebeispiel aus Listing 6 zeigt, wie Sie direkten Zugriff auf den Onset-Ring bekommen. Das bietet interessante Möglichkeiten: Oft ist es nützlich, zu wissen, aus wie vielen Onsets ein Sample besteht. Sie können zudem über die Abfrage der jeweiligen Zeiten die rhythmische Struktur eines Beats verzerren oder auf einen anderen Klang übertragen.
Listing 6
onsets = (sample_buffer :loop_amen).onset_slices
puts onsets.size
#=> 8
puts onsets
#=> (ring {:start=>0.0, :finish=> 0.120, :index=>0},
{:start=>0.120, :finish=>0.248, :index=>1},
[...]
puts onsets[1][:start]
#=> 0.120
Externe Samples
Bislang kamen ausschließlich eingebaute Samples zum Einsatz. Der Spaß geht aber erst richtig los, wenn Sie externe Samples einbinden. Das Netz ist voll von hochwertigen und kostenlosen Klangbibliotheken für jeden erdenklichen Zweck und Musikstil.
Für den Einstieg in die Nutzung externer Klänge in Sonic Pi haben wir eine kleine Klangbibliothek zum Herunterladen bereitgestellt (Abbildung 2). Die Klänge stammen von der Website Freesound.org [3] und vom niederländischen Techno-Produzenten Danny Wolfers alias Legowelt [4]. Wenn Sie die folgenden Codebeispiele nachbauen wollen, entpacken Sie die ZIP-Datei bitte in Ihr Heimverzeichnis. Weitere Quellen für Klangmaterial finden Sie im Netz, etwa auf Musicradar.com [5].

Abbildung 2: Unsere Klangbibliothek enthält auch Sounds, die mithilfe des legendären Minimoog-Synthesizers entstanden. (Bild: kpr2, pixabay.com, CC0)
Im einfachsten Fall spielen Sie eine externe Sounddatei ab, indem Sie deren Dateipfad als Zeichenkette an die Funktion sample übergeben (Listing 7). Dabei erweist sich die Möglichkeit als hilfreich, im Raspbian-Dateimanager den Pfad zu einer markierten Datei per rechter Maustaste in die Zwischenablage zu kopieren.
Listing 7
sample "~/samples/shots/synth/BASS-WunderBass.wav" sleep 2 sample "~/samples/shots/drum/FX-ER-Kraftwerkcity2.wav" sleep 2 sample "~/samples/misc/TRUMPET-spukkin_trumpet1.wav"




