5.2 Iteração e Loops

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