Uma coisa comum que certamente quererás fazer é não tocar só notas aleatórias (ver a secção anterior em aleatoriedade) mas também tomar decisões aleatórias baseadas no resultado do código que corre ou nalgum outro código. Por exemplo, poderás querer aleatoriamente tocar uma bateria ou címbalo. Podemos conseguir isso com uma declaração if
.
Então, vamos lançar uma moeda: se for cara, toca a bateria, se for coroa, toca o címbalo. Podemos emular o lançamento da moeda com a nossa função one_in
(introduzida na secção de aleatoriedade), especificando a probabilidade de 1 em 2: one_in(2)
. Podemos usar esse resultado para decidir entre dois pedaços de código, o código que toca a bateria e o código que toca o címbalo.
loop do
if one_in(2)
sample :drum_heavy_kick
else
sample :drum_cymbal_closed
end
sleep 0.5
end
Repara que a declaração if
tem 3 partes:
Tipicamente em linguagens de programação, a noção de sim é representada pelo termo true
e a noção de não é representada pelo termo false
. Assim temos que arranjar uma questão que nos dirá uma resposta true
ou false
o que é exactamente isso que o one_in
faz.
Repara como a primeira escolha está envolvida entre o if
e o else
e a segunda escolha está envolvida entre o else
e o end
. Tal como os blocos do/end poderás colocar múltiplas linhas de código nesses espaços. Por exemplo:
loop do
if one_in(2)
sample :drum_heavy_kick
sleep 0.5
else
sample :drum_cymbal_closed
sleep 0.25
end
end
Desta vez estamos a dormir por um determinado tempo diferente dependendo da escolha que fazemos.
Por vezes queremos opcionalmente executar apenas uma linha de código. Isto é possível colocando o if
e depois a questão no final. Por exemplo:
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
Isto irá tocar o acorde de diferentes números com a possibilidade de cada nota ter uma diferente probabilidade.