Condicionais

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.

Lançar uma moeda

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.

if simples

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.