11.1 Threads

Threads gibt es in vielen anderen Programmiersprachen auch. Sie dienen dazu, mehrere Aufgaben parallel abzuarbeiten. In Sonic Pi dienen sie dazu, mehrere Instrumente separat zu codieren. Ein Beispiel dazu ist Code 26. Man muss Sonic Pi nur sagen, wo der parallele Teil beginnt (in_thread do) und wo er endet (end). Alles was in den Zeilen dazwischen steht, wird parallelisiert. Beide Befehle sind im Beispiel jeweils fett dargestellt.

Natürlich stellt sich die Frage, ob das Parallelisieren immer notwendig ist, oder wann es eigentlich Sinn mach. Zuerst einmal: notwendig ist es nicht. Es lassen sich auch mehrere Instrumente in einen Song ohne Threads packen. Wenn Töne zeitgleich gespielt werden sollen, dann kann man die <play> Anweisungen direkt untereinander setzen. Die <sleep> Anweisungen muss man dann dementsprechend berechnen. Der Vorteil ist, dass die zeitliche Abfolge der Töne direkt im Code zu sehen ist. Der Nachteil ist das nicht immer einfache Ausrechnen der <sleep> Zeiten und die zunehmende Unübersichtlichkeit.

###############################
# threads
# Hans Gruendel
# 20.08.2015
#
################################

in_thread do
sleep 17
15.times do
sample :bd_zome
sleep 2
end
end

in_thread do
sleep 16
4.times do
use_synth :fm
play :a3, attack: 0.01, release: 1
sleep 0.5
play :a4, attack: 0.01,release: 1
sleep 0.5
play :c5, attack: 0.01,release: 1
sleep 0.5
play :e5, attack: 0.01,release: 1
sleep 0.5
play :g3, attack: 0.01, release: 1
sleep 0.5
play :g4, attack: 0.01, release: 1
sleep 0.5
play :b4, attack: 0.01, release: 1
sleep 0.5
play :d5, attack: 0.01, release: 1
sleep 0.5
play :e3, attack: 0.01, release: 1
sleep 0.5
play :g4, attack: 0.01, release: 1
sleep 0.5
play :a4, attack: 0.01, release: 1
sleep 0.5
play :e5, attack: 0.01, release: 1
sleep 0.5
play :f3, attack: 0.01, release: 1
sleep 0.5
play :f4, attack: 0.01, release: 1
sleep 0.5
play :a4, attack: 0.01, release: 1
sleep 0.5
play :c5, attack: 0.01, release: 1
sleep 0.5
end
end

in_thread do
5.times do |idx3|
with_fx :reverb do

use_synth :fm
play :a3, attack: 0.01, release: 2, amp:1- 0.2*idx3
play :a4, attack: 0.01,release: 2, amp:1 – 0.2*idx3
play :c5, attack: 0.01,release: 2, amp:1 – 0.2*idx3
play :e5, attack: 0.01,release: 2, amp:1 – 0.2*idx3
sleep 2
play :g3, release: 2, amp:1 – 0.2*idx3
play :g4, release: 2, amp:1 – 0.2*idx3
play :b4, release: 2, amp:1 – 0.2*idx3
play :d5, release: 2, amp:1 – 0.2*idx3
sleep 2

play :e3, release: 2, amp:1 – 0.2*idx3
play :g4, release: 2, amp:1 – 0.2*idx3
play :a4, release: 2, amp:1 – 0.2*idx3
play :e5, release: 2, amp:1 – 0.2*idx3
sleep 1.25
play :f3, release: 2, amp:1 – 0.2*idx3
play :f4, release: 2, amp:1 – 0.2*idx3
play :a4, release: 2, amp:1 – 0.2*idx3
play :c5, release: 2, amp:1 – 0.2*idx3
sleep 2.75

end
end
end

in_thread do
sleep 9
5.times do
sample :drum_bass_hard, rate:0.5, amp: 1.3
sleep 2
sample :drum_bass_hard, rate:0.5, amp: 1.3
sleep 2
sample :drum_bass_hard, rate:0.5, amp: 1.3
sleep 1.25
sample :drum_bass_hard, rate:0.5, amp: 1.3
sleep 2.75
end
end

Code 26. in_thread Befehl zum Parallelisieren von Code.