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