Iteração e Loops

Até agora passamos imenso tempo a olhar para diferentes sons que podemos fazer com blocos play e sample. Também aprendemos como lançar esses sons no tempo usando sleep.

Como provavelmente descobriste, existe muito divertimento que se tem com estes blocos básicos de construção. No entanto, uma dimensão totalmente nova de divertimento abre-se quando começares a usar o poder do código para estruturar a tua musica e composições. Nas próximas secções iremos explorar essas novas poderosas ferramentas. Primeiro iteração e loops.

Repetição

Escreveste algum código e gostarias de o repetir algumas vezes? Por exemplo, podes ter algo como isto:

play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25

Se quiseres repetir isto 3 vezes? O que podemos fazer é copiar e colar três vezes:

play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25

Isso é muito código! O que acontece se quiseres mudar o sample para :elec_plip? Terás de encontrar todos os locais onde aparece o :elec_bluporiginal e os mudar. Mais importante, como repetir o código original 50 ou 1000 vezes? Isso é muito código, e muitas linhas de código para alterar se quiseres fazer uma mudança.

Iteração

De facto, alterar o código deverá ser fácil como dizer faz isto 3 vezes. Na verdade é isso. Lembraste do nosso velho amigo bloco de código? Podemos o usar para marcar o inicio e o fim do código que queremos repetir 3 vezes. Usamos então o código especial 3.times. Assim, em vez de escrever faz isto 3 vezes, escrevemos 3.time do - não é difícil. Não te podes esquecer de escrever end no final do código que queres repetir:

3.times do
  play 50
  sleep 0.5
  sample :elec_blup
  sleep 0.5
  play 62
  sleep 0.25
end

Isto assim é bem mais limpo que cortar e colar. Podemos usar isto para criar elegantes estruturas repetitivas:

4.times do
  play 50
  sleep 0.5
end
8.times do
  play 55, release: 0.2
  sleep 0.25
end
4.times do
  play 50
  sleep 0.5
end

Iterações aninhadas

Podemos colocar iterações dentro de iterações e produzir padrões interessantes. Por exemplo:

4.times do
  sample :drum_heavy_kick
  2.times do
    sample :elec_blip2, rate: 2
    sleep 0.25
  end
  sample :elec_snare
  4.times do
    sample :drum_tom_mid_soft
    sleep 0.125
  end
end

Looping

Se quiseres que algo repita muitas vezes, poderás dar por ti a usar números grandes como 1000.times do. Neste caso é provavelmente melhor pedir ao Sonic Pi para repetir para sempre (pelo menos até premires o botão stop). Vamos repetir o amen break para sempre:

loop do
  sample :loop_amen
  sleep sample_duration :loop_amen
end

a coisa importante a saber sobre loops é que eles actuam como buracos negros para o código. Uma vez que o código entra em loop nunca sairá até premires stop - irá repetir para sempre. Isso significa que se tiveres código após o loop nunca o irás ouvir. Por exemplo, o címbalo depois deste loop nunca será tocado:

loop do
  play 50
  sleep 1
end
sample :drum_cymbal_open

Agora podes estruturar o teu código com iterações e loops!