# Iteracja i Pętle

Do tej pory spędziliśmy sporo czasu, patrząc na różne dźwięki, które możesz zrobić użyciem bloków `play` i `sample`. Nauczyliśmy się również, w jaki sposób je uruchamiać na przestrzeni czasu, używając polecenia `sleep`.

Jak zapewne już zauważyłeś, przy korzystaniu z tych kilku podstawowych bloków możesz mieć całą masę frajdy. Jednakże kiedy zaczniesz wykorzystywać możliwości kodu do porządkowania Twojej muzyki i kompozycji, Twoim oczom ukaże się zupełnie nowy wymiar możliwości i zabawy. W najbliższych kilku sekcjach poznasz kilka z tych potężnych narzędzi. Na początek zaczniemy od iteracji i pętli.

## Powtórzenie

Czy zdarzyło Ci się napisać kawałek kodu, który chciałbyś powtórzyć kilka razy? Przypuśćmy, że napisałeś coś w tym stylu:

    play 50
    sleep 0.5
    sample :elec_blup
    sleep 0.5
    play 62
    sleep 0.25

Co, jeśli chciałeś, aby powyższy kawałek powtórzył się 3 razy? Najprostszą rzeczą, którą mógłbyś zrobić, to po prostu skopiować i wkleić powyższy kawałek kodu trzy razy:

    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

Zobacz, ile kodu! Pomyśl, co trzeba by było zrobić, gdybyś chciał zmienić sampel na `:elec_plip`? Musiałbyś wtedy znaleźć w kodzie wszystkie miejsca, gdzie użyłeś oryginalnego sampla `:elec_blup`, a zmienić je ręcznie. Ale to i tak nic. Pomyśl, co by było, gdybyś chciał powtórzyć oryginalny blok kodu 50 albo 1000 razy? Dopiero teraz byłoby to dużo kodu, bardzo dużo kodu, który musiałbyś zmienić, gdybyś chciał dokonać tak prostej zmiany, jak przełączenie się na inny sampel.

## Iteracja

W rzeczywistości powtórzenie kodu powinno być tak proste, jak powiedzenie zrób to trzy razy. Dobrze, w dużym stopniu tak jest. Pamiętasz naszego starego dobrego znajomego - blok kodu? Możemy użyć go, aby zaznaczyć miejsce początku i końca kodu, który chcielibyśmy powtórzyć 3 razy. Następnie wystarczy, że użyjemy specjalnego kawałka kodu `3.times` (3.razy). Zamiast więc napisać zrób to trzy razy, napiszemy `3.times do` - to nie jest zbyt trudne. Pamiętaj tylko, aby napisać polecenie `end` na końcu bloku kodu, który zamierzać powtórzyć:

    3.times do
      play 50
      sleep 0.5
      sample :elec_blup
      sleep 0.5
      play 62
      sleep 0.25
    end

Przyznasz, że takie podejście jest dużo bardziej eleganckie niż kopiowanie i wklejanie! Możemy użyć tego specjalnego polecenia do tworzenia wielu fajnych powtarzających się struktur:

    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

## Zagnieżdżanie Iteracji

Możemy umieszczać jedne iteracje wewnątrz innych iteracji do utworzenia ciekawych wzorców. Na przykład:

    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

## Zapętlanie

Jeśli chcesz powtórzyć coś wiele razy, możesz złapać się na tym, że będziesz podawał naprawdę bardzo dużych liczb jako parametr iteracji, na przykład `1000.times do`. W takim przypadku zapewne dużo lepiej byłoby poprosić Sonic Pi, aby powtarzać dany wzorzec w nieskończoność (a przynajmniej do momentu, w którym naciśniesz przycisk Stop, żeby zatrzymać odtwarzanie!). Spróbujmy zapętlić w nieskończoność sampel amen break:

    loop do
      sample :loop_amen
      sleep sample_duration :loop_amen
    end

Bardzo ważną rzeczą do zapamiętania o pętlach jest to, że dla kodu mają one takie same zachowanie jak czarne dziury. Jak tylko kod raz już wejdzie w daną pętlę, może już jej nigdy nie opuścić, chyba że naciśniesz przycisk Stop - nasza pętla będzie się kręcić w kółko w nieskończoność. Oznacza to, iż jeśli masz jakiś kod, który jest umieszczony po pętli, to nigdy go nie usłyszysz. Na przykład talerz, który znajduje się poniżej poniższej pętli, nie zostanie zagrany nigdy:

    loop do
      play 50
      sleep 1
    end
    sample :drum_cymbal_open

A teraz spróbuj poprawić strukturę Twojego kodu za pomocą iteracji i pętli!