Iteração e Loops

Até agora passamos um bom tempo olhando para diferentes sons que podemos fazer com blocos play e sample. Também aprendemos como disparar estes sons através do tempo usando sleep.

Como você provavelmente descobriu, você pode ter muita diversão com estes blocos básicos de construção. Entretanto, uma nova dimensão de diversão se abre quando você começa a usar o poder do código para estruturar suas músicas e composições. Nas próximas seções nós exploraremos algumas destas novas ferramentas poderosas. Primeiro, iteração e loops.

Repetição

Já escreveu algum código que você gostaria de repetir algumas vezes? Por exemplo, você pode ter algo assim:

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

Mas e se nós quisermos repeti-lo 3 vezes? Bem, podemos fazer algo simples e só copiá-lo e colá-lo 3 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 você quiser mudar a amostra para :elec_plip? Você terá que encontrar todos os lugares com a amostra original :elec_blup e trocá-las. Mais importante, e se você quiser repetir o código original 50 ou 1000 vezes? Agora sim, isso será muito código e muitas linhas de código para alterar se você quiser fazer uma mudança.

Iteração

De fato, repetir código deveria ser tão simples quanto dizer faça isso 3 vezes. Bom, basicamente é. Lembra do nosso velho amigo, o bloco de código? Nós podemos usá-lo para marcar o início e o fim do código que queremos repetir três vezes. Então usamos o código especial 3.times. Então, em vez de escrever faça isso três vezes, escrevemos 3.times do - não é tão difícil. Só lembre-se de escrever end no final do código que você quer repetir:

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

Não fica muito mais bonito que copiar e colar? Podemos usar isso para criar muitas estruturas repetitivas elegantes:

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 outras iterações para criarmos 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

Criando Loops

Se você quiser que algo se repita muitas vezes, você se encontrar usando números de repetições realmente grandes como 1000.times do. Neste caso, você provavelmente ficaria melhor que pedisse para o Sonic Pi repetir para sempre (pelo menos até pressionar o botão stop). Vamos repetir o amen break para sempre:

loop do
  sample :loop_amen
  sleep sample_duration :loop_amen
end

O mais importante a se aprender sobre loops é que eles funcionam como buracos negros para o código. Uma vez que o código entre em um loop, nunca mais sairá, até que você pressione Stop - irá só repetir e repetir o loop para sempre. Isto significa que se você tiver código após o Loop, você nunca irá ouvi-lo. Por exemplo, o chimbal após este loop nunca tocará:

loop do
  play 50
  sleep 1
end
sample :drum_cymbal_open

Agora estruture seu código com iterações e loops!