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.
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.
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
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
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!