Startseite>Audio-Programmierung mit Sonic Pi (Teil 2)
Aus Raspberry Pi Geek 02/2019

Audio-Programmierung mit Sonic Pi (Teil 2)

© Anna Liebiedieva, 123RF

Scheibchenweise

Pit Noack

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)

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.

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.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland