5.3 Condicionais

# 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:

* A questão a perguntar
* A primeira escolha de código a executar (se a questão à pergunta for sim)
* A segunda escolha de código a executar (se a resposta à questão for não)

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.
