Startseite>Audio-Programmierung mit Sonic Pi, Teil 3
Aus Raspberry Pi Geek 04/2019

Audio-Programmierung mit Sonic Pi, Teil 3

© Olivier Le Moal, 123RF

Im Gleichtakt

Pit Noack

Synchronisierte Live-Loops und selbst erstellte Funktionen helfen dabei, Sonic Pi wie ein Live-Instrument zu spielen.

Die ersten beiden Teile unserer Sonic-Pi-Serie haben die Grundlagen der Sprache vorgestellt und gezeigt, wie Sie eigenes Klangmaterial einbauen und ganze Verzeichnisbäume dynamisch nach Sounds durchsuchen. In Teil 3 geht es darum, wie Sie parallel laufende Live-Loops synchronisieren und eigene Funktionen schreiben.

Teil 1

Einführung: Audio-Programmierung mit Sonic Pi

RPG 11-12/2018

http://www.raspi-geek.de/41258

Teil 2

Samples dynamisch auswählen und zerlegen

RPG 01-02/2019

http://www.raspi-geek.de/41259

Teil 3

Synchrone Live-Loops und eigene Funktionen

RPG 03-04/2019

http://www.raspi-geek.de/41260

Teil 4

MIDI- und OSC-Ereignisse verarbeiten

RPG 05-06/2019

(erscheint am 04.04.2019)

Dreh- und Angelpunkte

Ob live programmiert oder nicht: Live-Loops fungieren als Dreh- und Angelpunkt von Sonic Pi. Listing 1 zeigt zur Erinnerung ein einfaches Beispiel für deren Verwendung. Der Live-Loop :bd wiederholt den Code im zugehörigen Block (Zeilen 2 und 3) in einer Endlosschleife, der Live-Loop :snap wiederholt die Zeilen 6 bis 10. Beide Loops arbeiten in eigenen Threads, andernfalls würden sie nicht gleichzeitig spielen.

Listing 1

live_loop :bd do
  sample :bd_haus
  sleep 1
end
live_loop :snap do
  sleep 0.5
  3.times do
    sample :perc_snap
    sleep 0.5 / 3
  end
end

Wenn Sie den Code in einem der Blöcke ändern und erneut den Run-Knopf oder [Alt]+[R] drücken, führt Sonic Pi beim jeweils nächsten Schleifendurchgang den modifizierten Code aus. In Listing 1 böte es sich an, die Anzahl der Wiederholungen (3.times) oder die Dauer der Pausen zwischen den Schnipsern (sleep 0.5 / 3) im snap-Loop zu variieren. Dabei kann es schnell passieren, dass der Loop aus dem Ruder läuft – etwa wenn Sie zwischen Drittel- und Viertelschlägen wechseln oder schlichtweg die Dauer des Loops kein ganzzahliges Vielfaches eines Schlags beträgt.

Das parallele Ablaufen von Schleifen unterschiedlicher Länge kann interessante musikalische Effekte liefern, wie man sie aus afrikanischen Polyrhythmen oder den Phasenverschiebungen des Komponisten Steve Reich kennt. Hörenswert ist hierzu das Beispiel Reich Phase in der eingebauten Sonic-Pi-Hilfe.

Rädchen im Getriebe

Wenn Sie es aber darauf anlegen, mit Sonic Pi etwa elektronische Tanzmusik zu produzieren, dann benötigen Sie einen Mechanismus zur Loop-Synchronisation. Den liefert das Funktionspaar sync und cue, das ähnlich wie ein Mitnehmer in einem mechanischen Getriebe funktioniert. Wann immer an einer Stelle im Code sync Symbol steht, unterbricht Sonic Pi die Ausführung und wartet auf den Empfang des entsprechenden cue Symbol. Cue bedeutet auf deutsch so viel wie Hinweis oder Einsatzzeichen.

Listing 2 zeigt, wie die Loop-Synchronisation praktisch funktioniert. Zwei Zeilen sind neu: In Zeile 2 schickt cue :einsatz ein Einsatzzeichen. sync :einsatz in Zeile 7 unterbricht die Ausführung des snap-Loops bis zum Empfang des nächsten entsprechenden cue. Im Ergebnis startet der snap-Loop immer synchron mit einem Schlag der Bassdrum. Sie können nun nach Lust und Laune die Anzahl der Wiederholungen des Schnipsers in Zeile 9 und den Teiler in Zeile 11 ändern und erhalten im Ergebnis immer einen rund laufenden Beat.

Listing 2

live_loop :bd do
  cue :einsatz
  sample :bd_haus
  sleep 1
end
live_loop :snap do
  sync :einsatz
  sleep 0.5
  3.times do
    sample :perc_snap
    sleep 0.5 / 3
  end
end

Auch in Fehlersituationen erweist sich der cuesync-Mechanismus als sehr nützlich. Wenn Sie einen Fehler in einen Live-Loop einbauen und ihn ausführen, stoppt Sonic Pi den zugehörigen Thread. Wenn Sie den Fehler korrigieren und den Code dann erneut ausführen, sorgt sync für einen rhythmisch korrekten Einsatz des neuen Threads.

Wollen Sie lediglich zwei Loops miteinander synchronisieren, dann können Sie auf die Verwendung von cue verzichten: Jeder Live-Loop schickt automatisch einen cue mit dem jeweils eigenen Namen. Sie können also das Beispiel in Listing 2 vereinfachen, indem Sie Zeile 2 streichen und Zeile 7 durch sync :bd ersetzen.

Übrigens: Unter Preferences | Editor können Sie einen Cue-Log aktivieren und so alle Cues anzeigen lassen. Die Funktion sync lässt sich auch nutzen, um auf MIDI- und OSC-Ereignisse zu warten und diese zu verarbeiten – das wird das Thema des vierten und letzten Teils unserer Sonic-Pi-Serie in der nächsten Ausgabe sein.

Eigene Funktionen

Bislang haben Sie ausschließlich eingebaute Funktionen verwendet. Der Entwurf eigener Funktionen birgt jedoch wenig Geheimnisse. Sie nutzen dazu die Funktion define. Genauso wie live_loop oder times einen Block erwarten, der den zu wiederholenden Code enthält, braucht define einen Codeblock, den Sonic Pi beim Aufruf der neuen Funktion ausführen soll.

Listing 3 zeigt eine solche Funktionsdefinition. Die Verwendung läuft dann genauso wie bei den eingebauten Funktionen: Sie schreiben den Funktionsnamen einfach hin (letzte Zeile). In unserem Fall heißt die neue Funktion schnipser und macht bei jedem Aufruf exakt dasselbe.

Listing 3

define :schnipser do
  8.times do
    sample :perc_snap
    sleep 1.0 / 8
  end
end
schnipser
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 3 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