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!