6.2 Efeitos na pratica

# Efeitos na pratica

Apesar de parecerem relativamente simples exteriormente, os efeitos são uma besta realmente complexa internamente. A sua simplicidade faz com que as pessoas os usem demasiado nas suas peças. Isto pode não ter importância se tiverem uma maquina poderosa mas se - tal como eu - usares uma Rasperry Pi para tocar, terás de ter atenção à quantidade de trabalho que pedes para fazer de forma a garantir que a batida continue a correr.

Considera este código:

```
loop do
  with_fx :reverb do
    play 60, release: 0.1
    sleep 0.125
  end
end
```

Neste código estamos a tocar a nota 60 com um muito pequeno tempo de release, é uma nota curta. Também queremos reverb assim embrulhamos num bloco de reverb. Até aqui tudo bem. Excepto...

Vamos ver o que este código faz. Primeiro temos um `loop` que significa que tudo dentro dele é repetido para sempre. A seguir temos um bloco `with_fx`. Isto significa que criamos um efeito de reverb *cada vez que repetimos*. Isto é como ter um pedal de reverb para cada vez que tocamos na corda da guitarra. É muito cool que se possa fazer isso, mas não é sempre o que quer fazer. Por exemplo, este código terá dificuldade em correr bem no Raspberry Pi. Todo o trabalho de criar o reverb e depois esperar até que tenha que ser parado e removido é tratado por `with_fx` por ti, mas isso requer poder de CPU que pode ser precioso.

Como o tornamos mais similar ao setup tradicional em que o guitarrista tem apenas *um* pedal de reverb e todo o som passa por ele? Simples:

```
with_fx :reverb do
  loop do
    play 60, release: 0.1
    sleep 0.125
  end
end
```

Colocamos o nosso loop *dentro* do bloco `with_fx`. Desta forma apenas criamos um simples reverb para todas as notas do nosso loop. Este código é muito mais eficiente e executa bem num Raspberry Pi.

Um compromisso é usar `with_fx`numa iteração dentro do loop:

```
loop do
  with_fx :reverb do
    16.times do
      play 60, release: 0.1
      sleep 0.125
    end
  end
end
```

Desta forma tiramos o `with_fx`fora da parte interior do `loop`e criamos um novo reverb a cada 16 notas.

Este é um padrão muitos comum que o `with_fx` suporta uma opção que faz exactamente isto mas sem ter de escrever o bloco `16.times`.

```
loop do
  with_fx :reverb, reps: 16 do
    play 60, release: 0.1
    sleep 0.125
  end
end
```

Tanto o exemplo `reps: 16` como o `16.times do` irão se comportar de forma idêntica. O `resp: 16` essencialmente repete o código no bloco `do/end` 16 vezes assim podes usar um ou outro conforme preferires.

Lembra-te não existem erros, apenas possibilidades. No entanto, algumas destas abordagens terão diferentes sons e características de performance diferentes. Brinca com isso e usa a abordagem que soa melhor para ti trabalhando na performance dentro dos constrangimentos da tua plataforma.
