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