# Iteração e Loops

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.

## Repetição

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_blup`original 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.

## Iteração

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

## Iterações aninhadas

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

## Looping

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!