Der folgende Code spielt zunächst viermal den Sound elec_blup ab, danach achtmal elec_flip:
4.times do sample :elec_blup sleep 0.5 end 8.times do sample :elec_flip sleep 0.25 end
Wenn man die beiden Codeabschnitte jeweils in einen Live Loop verpackt, werden sie nicht hintereinander, sondern gleichtzeitig und in Endlosschleife ausgeführt:
live_loop :blup do
4.times do
sample :elec_blup
sleep 0.5
end
end
live_loop :flip do
8.times do
sample :elec_flip
sleep 0.25
end
end
Dieses gleichzeitige Abspielen wird im Hintergrund dadurch erreicht, daß jeder Live Loop automatisch seinen eigenen Thread eröffnet. Thread (zu Deutsch= Faden oder Strang) ist ein Fachbegriff aus der Informatik. Dabei geht es im Kontext von Sonic Pi schlicht gesagt um folgendes: Normalerweise arbeitet Sonic Pi den eingegebenen Code Zeile für Zeile ab, bis die letzte Zeile erreicht ist oder der Nutzer den Stop-Button drückt. Mit Threads kann man erreichen, daß mehrere Codeabschnitte parallel abgearbeitet werden.
Mit der Funktion in_thread kann man Threads eröffnen. Hier noch einmal das erste Codebeispiel, bei dem aber diesmal die beiden Abschnitte in einem eigenen Thread ausgeführt werden:
in_thread do
4.times do
sample :elec_blup
sleep 0.5
end
end
in_thread do
8.times do
sample :elec_flip
sleep 0.25
end
end
Die beiden letzten Codebeispiele zeigen eine konkrete Anwendung von in_thread. Die in Zeile 1-6 definierte Funktion klopfer spielt zufallsgesteuert zwei- bis sechsmal den Sound elec_flip ab, die Pause nach jedem einzelnen flip-Sound dauert – per choose ebenfalls zufällig ausgewählt – manchmal 0.125, manchmal 0.0625 Beats. Im Ergebnis varriiert die Gesamtdauer einer Ausführung von klopfer bei jedem Aufruf. Wenn man die Funktion in einem Live Loop (Zeile 8-13) verwendet, hat der Loop kein definiertes Timing.
define :klopfer do
rand_i(2..6).times do
sample :elec_plip
sleep [0.125, 0.0625].choose
end
end
live_loop :beat do
sample :bd_haus
sleep 0.5
klopfer
sleep 0.5
end
Um ein definiertes Timing zu erreichen wurde in folgender Variante der Code der klopfer-Funktion in einen eigenen Thread verpackt. Das bedeutet: bei jedem Aufruf der Funktion wird ein neuer Thread eröffnet. Nun läuft der Beat rund, jeder Schleifendurchlauf des Live Loop hat exakt dieselbe Dauer:
define :klopfer do
in_thread do
rand_i(2..6).times do
sample :elec_plip
sleep [0.125, 0.0625].choose
end
end
end
live_loop :beat do
sample :bd_haus
sleep 0.5
klopfer
sleep 0.5
end
