Bardzo prawdopodobne jest, że często będziesz chciał zagrać nie tylko losową nutę (patrz poprzednia sekcja dot. losowości), lecz również będziesz miał zamiar podejmować losowe decyzje i na podstawie ich wyniku uruchomić taki lub inny kod. Na przykład mógłbyś chcieć, aby losowo zagrać bęben lub talerz perkusji. Możemy tego dokonać, używając polecenia warunkowego if
(jeśli).
Spróbujmy rzucić monetą: jeśli (if) wypadnie orzeł, zagraj bęben, a jeśli wypadnie reszka (else), zagraj talerz. Proste. Możemy zasymulować rzut monetą, wykorzystując naszą funkcję one_in
(poznaliśmy ją w sekcji dotyczącej losowości), określając prawdopodobieństwo wyboru 1 z 2: one_in(2)
. Następnie możemy użyć tego wyniku, aby wybrać do zagrania jeden z dwóch kawałków kodu - jeden, który zagra bęben i drugi, który zagra talerz:
loop do
if one_in(2)
sample :drum_heavy_kick
else
sample :drum_cymbal_closed
end
sleep 0.5
end
Zauważ, że polecenie warunkowe if
posiada 3 części:
Zazwyczaj w językach programowania pojęcie odpowiedzi “tak” jest reprezentowane przez termin true
(prawda), natomiast pojęcie odpowiedzi “nie” - przez false
(nieprawda, fałsz). Do nas więc należy znalezienie odpowiedniego pytania, którego zadanie zwróci nam odpowiedź true
(prawda) lub false
(fałsz). W tym przypadku naszym pytaniem jest uruchomienie funkcji one_in
.
Zauważ, że pierwszy wybór jest wpasowany pomiędzy polecenia if
(jeśli) a else
(w przeciwnym razie), natomiast drugi wybór mieści się między else
i end
(koniec). Tak samo, jak w przypadku bloków kodu do/end, pomiędzy obiema tymi przestrzeniami możesz napisać wiele linii kodu. Oto przykład:
loop do
if one_in(2)
sample :drum_heavy_kick
sleep 0.5
else
sample :drum_cymbal_closed
sleep 0.25
end
end
Tym razem, w zależności od tego, jaka decyzja została wylosowana, śpimy (sleep
) przez różne długości czasu.
Czasami chciałbyś wykonać opcjonalnie tylko jedną określoną linię kodu. Aby to osiągnąć, wystarczy umieścić polecenie if
wraz z naszym pytaniem (warunkiem) na końcu tej linii. Oto przykład:
use_synth :dsaw
loop do
play 50, amp: 0.3, release: 2
play 53, amp: 0.3, release: 2 if one_in(2)
play 57, amp: 0.3, release: 2 if one_in(3)
play 60, amp: 0.3, release: 2 if one_in(4)
sleep 1.5
end
Powyższy kod zagra akordy złożone z różnych liczb. Szansa na to, że każda z podanych nut zostanie zagrana, jest różna, gdyż wszystkie linijki (oprócz pierwszej) są opatrzone warunkiem o różnym prawdopodobieństwie wystąpienia.