# Efekty w praktyce

Pomimo, że na pierwszy rzut oka wyglądają one na zwodniczo łatwe, to od środka efekty są tak naprawde bardzo złożonymi bestiami. Ich prostota bardzo często kusi ludzi by naduzywać ich w swoich kawałkach. Może to być w porządku jeśli masz dobry i wydajny komputer, ale jeśli - tak jak ja - korzystasz z Raspberry Pi do jam’owania, musisz być wtedy bardzo ostrożny z tym ile pracy mu zlecisz do wykonania, jeśli chcesz być pewny, że beat zachowa swą płynność.

Rozważ taki kawałek kodu:

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

W powyższym kawałku kodu zagraliśmy nutę 60 z bardzo krótkim czasem zanikania (release), więc jest to bardzo krótka nuta. Chemy również nałożyć na nią efekt reverb, więc opakowaliśmy ją w blok reverb. Jak na razie wszystko w porządku. Z wyjątkiem…

Przyjrzyjmy się co ten kod tak naprawdę robi. Na początku mamy pętlę `loop` co oznacza, że wszystko wewnątrz niej będzie powtarzane w nieskończoność. Następnie mamy blok `with_fx`. Oznacza to, że utworzymy nowych efekt FX dla każdej iteracji pętli `loop`. To tak jakbyśmy chcieli mieć odzielny efekt gitarowowy reverb przy każdym jednym uderzeniu w strunę gitary. Fajnie, że możemy tak zrobić, ale nie zawsze jest to coś co chciałbyś osiągnąć. Na przykład, ten kawałek kodu czeka niezła walka aby został on ładnie uruchomiony na Raspberry Pi. Cała praca potrzebna do stworzenia efektu reverb a potem czekanie do momentu,
w którym będzie wymagał zatrzymania i usunięcia jest obsługiwana za Ciebie przez funkcję `with_fx`, zajmie to jednak sporo mocy
procesora (CPU), która może okazać się bardzo cenna.

A co jeśli sprawimy, by ten kod był bardziej podobny do tradycyjnego zestawu, gdzie nasz gitarzysta posiada tylko jeden efekt reverb i to przez niego przechodzą wszystkie dźwięki? Łatwizna:

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

Umieściliśmy naszą pętęlę wewnątrz bloku `with_fx`. W ten sposób tworzymy tylko jeden efekt reverb dla wszystkich nut, które zostaną zagrane w naszej pętli. Taki kod jest dużo bardziej wydajny i na pewno będzie działał w porządku na Raspberry Pi.

Kompromisem może też być użycie efektu `with_fx` wewnątrz pętli loop, ale powyżej iteracji wewnętrznej:

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

W ten sposób przenieśliśmy efekt `with_fx` na zewnątrz wewnętrznej części pętli `loop` i teraz tworzymy nowy efekt reverb tylko co 16 zagranych nut.

Pamiętaj jedno - błędów nie ma, sa tylko nowe możliwości. Jednakże, każdy z powyższych podejść będzie miał inne brzmienie oraz inną charakterystykę wydajności. Staraj się więc używać takiego podejścia, które będzie brzmiało najlepiej mając jednocześnie na uwadze fakt pracy z ograniczeniami wydajnościowymi twojego komputera/platformy na której pracujesz.