# 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 novo 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 queres 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.