Startseite>Audio-Programmierung mit Sonic Pi, Teil 1
Aus Raspberry Pi Geek 12/2018

Audio-Programmierung mit Sonic Pi, Teil 1 (Seite 3)

Auch play bietet viele Optionen. Mit release können Sie die Ausklingzeit der Note ändern. Die Dauer geben Sie – wie bei allen zeitabhängigen Aktionen – in Schlägen an. Per Voreinstellung klingt eine Note einen Schlag lang aus. Mit einem sehr viel kleineren Wert für release erzeugen Sie einen perkussiven, klopfenden Klang (Listing 4, erste Zeile). Die Option attack steuert die Einklingzeit. Sie liegt voreingestellt bei 0, der Klang ist sofort da. Ein hoher Wert für attack lässt den Klang langsam anschwellen (zweite Zeile).

Listing 4

 

play 60, release: 0.05
play 60, attack: 2

Der voreingestellte Synthesizer liefert einen reinen Sinusklang. Mit use_synth wählen Sie einen anderen Klangerzeuger aus. Ähnlich wie bei der Funktion sample öffnet sich beim Tippen eine Auswahlliste mit allen verfügbaren Synths. In der eingebauten Hilfe finden Sie unter Synths auch eine Beschreibung der jeweiligen Optionen und deren Voreinstellungen.

In Listing 5 wählt die erste Zeile den Synth :blade aus, einen elektronischen Flächenklang mit Vibrato, also einer periodischen Modulation der Tonhöhe. Die Option vibrato_rate steuert das Vibrato-Intervall. Sie geben es als Wiederholungen pro Schlag an (Voreinstellung *6). Ein vibrato_rate: 1 sorgt für eine hörbar leiernde Tonhöhe. Da die Optionen für Ausklingzeit und Vibrato für jede der vier Noten gelten soll, setzen wir diese in Zeile 2 mit use_synth_defaults.

Listing 5

 

use_synth :blade
use_synth_defaults release: 4, vibrato_rate: 1
play 40
sleep 2
play 44
sleep 2
play 48
sleep 2
play 52

Wie bei allen Funktionen, deren Name mit use_ beginnt, gelten die mit use_synth und use_synth_defaults festgelegten Werte nur im jeweiligen Thread. Sie können also in separaten Live Loops unterschiedliche Synths und Parameter festlegen. Jede Festlegung per use_ gilt so lange, bis ein anderer Befehl gleicher Art sie aufhebt.

Effekte

Mit der Funktion with_fx schicken Sie den in einem Codeblock erzeugten Klang durch einen Effekt wie Echo, Hall, Flanger oder Verzerrer. Wie gehabt liefert beim Tippen eine Auswahlliste alle verfügbaren Effekte; ein eigener Bereich im Hilfefenster gibt Auskunft über die jeweiligen, vom Effekttyp abhängigen Optionen.

Der Code aus den ersten sechs Zeilen von Listing 6 schickt eine aufsteigende Tonfolge durch einen Verzerrer und reichert den etwas langweiligen Sinusklang mit Obertönen an. Die Option distort erwartet Werte von 0 bis 1 und steuert die Intensität der Verzerrung.

Sie sehen hier auch, dass Blöcke wiederum Blöcke enthalten dürfen. Das lässt sich beliebig fortführen, wie ab Zeile 7 zu sehen: Das Ausgangssignal des Verzerrers geht in einen weiteren Effekt, einen Hall. Die Option room steuert mit Werten zwischen 0 und 1 die Größe des simulierten Raums.

Listing 6

 

with_fx :distortion, distort: 0.9 do
  16.times do |i|
    play 30 + i , release: 0.1
    sleep 0.25
  end
end
with_fx :reverb, room: 1 do
  with_fx :distortion, distort: 0.9 do
    16.times do |i|
      play 30 + i , release: 0.1
      sleep 0.25
    end
  end
end

Ringförmige Sequenzen

Zur Beschreibung von Wertefolgen gibt es in Sonic Pi die Klasse RingVektor oder kurz Ring. Sie ordnen Sequenzen beliebiger Werte ringförmig an. Ringe besitzen die Funktion tick, die den jeweils nächsten Wert liefert; ist der letzte Wert erreicht, geht es von vorn los.

Listing 7 erzeugt in der ersten Zeile einen Ring und speichert ihn unter dem Variablennamen trennfrequenzen. Im :loop1 ruft tick dann bei jedem Schleifendurchgang den jeweils nächsten Wert ab, um die Tiefpassfilter-Option von sample zu steuern. Im :loop2 wird in Zeile 8 ein Ring zur Steuerung der Tonhöhe direkt an Ort und Stelle erzeugt. Da jeder Thread eine eigene tick-Variable besitzt, werden die beiden Ringe im Beispiel unabhängig voneinander durchlaufen.

Listing 7

 

trennfrequenzen = ring 120, 110, 100, 90, 80, 70
live_loop :loop1 do
  sample :elec_blip, lpf: trennfrequenzen.tick
  sleep 0.25
end
live_loop :loop2 do
  use_synth :saw
  play (ring 40, 60, 80).tick, release: 0.1
  sleep 0.25
end
leiter = scale :C2, :minor
use_synth :piano
live_loop :leiterspieler do
  play leiter.tick
  sleep 0.5
end

Ringe bilden ein sehr wesentliches und vielseitiges Instrument zur Komposition in Sonic Pi. Eine vollständige Beschreibung aller Möglichkeiten bietet Stoff für einen eigenen Artikel. Neben ring gibt es noch viele weitere sogenannte Ring-Konstruktoren, etwa knit, range, bools und chord. Mehr dazu erfahren Sie jeweils im Hilfefenster unter Sprache sowie im Blog des Autors [3].

Für musikalische Anwendungen ist die Funktion scale besonders interessant. Sie liefert in Ringe verpackte Tonleitern, im Beispiel ab Zeile 11 aus Listing 7 eine C-Moll-Leiter. Dabei erwartet scale zwei Argumente: einen Grundton und eine Angabe wie :major (Dur) oder :minor (Moll). Sonic Pi hat neben Dur und Moll auch exotischere Kandidaten im Gepäck, etwa chromatische oder mixolydische Tonleitern. Auch hier hilft eine Auswahlliste.

Bei Ringen handelt es sich um unveränderliche Objekte. Es gibt aber sogenannte Verkettungsfunktionen, die – auf Ringe angewendet – einen neuen, modifizierten Ring zurückliefern. Die Funktion shuffle liefert eine Kopie des Rings, bei der die Reihenfolge der Elemente per Zufallsfunktion vermischt wurde. take(Anzahl) erzeugt einen Ring mit den ersten Anzahl Elementen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 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