Zu den Stärken von Sonic Pi gehört es, mit wenigen Zeilen Code Samples dynamisch auszuwählen und zu zerlegen.
Der erste Teil unserer Sonic-Pi-Serie hat Sie in der letzten Ausgabe in die Grundlagen der Sprache eingeführt. In dieser Folge geht es darum, wie Sie eingebaute und externe Samples dynamisch laden, abspielen und auf musikalisch sinnvolle Weise zerlegen. Zudem zeigen wir, wie Sie Pseudozufallszahlen in Ihre Kompositionen einbauen.
Salamitaktik
Zur Erinnerung: Mittels der Funktion sample spielen Sie gespeicherte Klänge ab. Sie erwartet als Argument einen Verweis auf die gewünschte Audiodatei. Sonic Pi bringt nicht weniger als 129 eingebaute Sounds mit, beispielsweise :ambi_choir, :guit_e_fifths und :loop_amen. So bringt etwa die Codezeile sample :bd_haus eine knackige Bassdrum zu Gehör.
Externe Klänge rufen Sie über eine Pfadangabe auf: sample "/Pfad/zur/Datei.wav". Zulässig gelingt das mit den Formaten WAV, AIFF und Flac. Selbst Dateien mit ein oder zwei Audiokanälen oder unterschiedlichen Bit- und Sample-Raten verarbeitet Sonic Pi umstandslos.
Statt ein Sample vollständig abzuspielen, können Sie mit den Optionen start und finish Teilbereiche auswählen. Beachten Sie dabei, dass diese Optionen unabhängig von der tatsächlichen Spieldauer Werte zwischen 0 und 1 erwarten. Entsprechend spielt sample mit der Option finish: 0.5 die Datei lediglich zur Hälfte ab.
Der Live Loop aus Listing 1 spielt den berühmten “Amen Break” im Wechsel einmal zur Hälfte und einmal vollständig ab. Die Funktion sample_duration liefert hier die Dauer des “Amen Break” und sorgt als Argument von sleep für einen rund laufenden Loop.
Listing 1
live_loop :amen_halbiert do sample :loop_amen, finish: 0.5 sleep sample_duration :loop_amen sample :loop_amen sleep sample_duration :loop_amen end
Listing 2 zeigt eine etwas komplexere Anwendung der Optionen start und finish. Es zerlegt das Sample :loop_tabla in 64 Abschnitte gleicher Länge und spielt jeden dieser Abschnitte mit einer zufälligen Geschwindigkeit im Abstand von 0,2 Schlägen ab.
Listing 2
live_loop :tabla_maeander do
64.times do |i|
sample :loop_tabla,
start: i / 64.0,
finish: (i+1) / 64.0,
attack: 0.01,
release: 0.01,
rate: rand(0.8..1.2)
sleep 0.2
end
end
Mit jedem der 64 Schleifendurchgänge des Live Loops wiederholt times den inneren Codeblock (Zeile 3 bis 9) und übergibt ihm die Zählervariable i. Die Optionen start und finish bekommen bei jeder dieser Wiederholungen von i abhängige Werte zugewiesen. Entsprechend hören Sie beim ersten Durchgang das erste Vierundsechzigstel, beim zweiten Durchgang das zweite und so fort. Beachten Sie hier, dass der eigentlich ganzzahlige Teiler 64 als Fließkommazahl 64.0 auftaucht. Andernfalls würden ganzzahlige und damit an dieser Stelle unbrauchbare Ergebnisse geliefert.
Die Zeilen 6 und 7 setzen mittels der Optionen attack und release sehr kurze Ein- und Ausklingphasen, was ein unerwünschtes Knacken verhindert. Zeile 8 setzt die Abspielgeschwindigkeit für jeden Klangschnipsel auf einen zufälligen Wert zwischen 0.8 und 1.2. Auf diese Weise erhalten Sie eine variationsreiche, merkwürdig mäandernde Rhythmusschleife.
Beat Slicing per Onset
Mitte der 1990er-Jahre wurde im Hip-Hop, Techno und Breakbeat die Technik des Beat Slicing populär. Beat Slicing bedeutet, ein rhythmisches Sample in Einzelklänge zu zerlegen, um diese anschließend in variierenden Reihenfolgen und mit unterschiedlichen Abspielgeschwindigkeiten, Filtern oder anderen Effekten manipuliert wiederzugeben (Abbildung 1).

Abbildung 1: Die Visualisierung des Beat-Slicing-Algorithmus in CuBase 6. (Bild: Nrgiza, commons.wikimedia.org, CC-BY-SA-3.0)
Anstatt diese Schneidearbeit mühsam von Hand zu erledigen, boten bereits in den Neunzigern Tools wie ReCycle aus der Software-Schmiede Propellerheads die Möglichkeit, diesen Prozess zu automatisieren. Der Algorithmus funktioniert grob gesagt nach folgendem Prinzip: “Wenn auf einen leiseren Abschnitt ein lauterer Abschnitt folgt, schneide an dieser Stelle.”
Auch die sample-Funktion von Sonic Pi hat einen Beat-Slicing-Algorithmus im Gepäck: Dazu nutzen Sie die Option onset, zu Deutsch Einsatz. Die Anweisung onset: 0 spielt die erste Scheibe ab, onset: 1 die zweite und so fort.






