# Iteratii si bucle

Pana acum am petrecut mare parte din timp analizand diferite sunete pe care le poti crea folosind comenzi ‘play’ si ‘sample’. Am invatat de asemenea cum putem alege momentul cand pornim aceste sunete folosind ‘sleep’.

Dupa cum ai observat probabil, poti face o gramada de chestii interesante folosind aceste blocuri de baza. Folosind puterea programarii pentru a-ti structura muzica si compozitiile ti se vor deschide insa noi perspective. In urmatoarele sectiuni vom explora cateva dintre aceste unelte noi si puternice. Sa incepem cu iteratiile si buclele.

## Repetitia

Ai scris vreo bucata de cod pe care ai vrea sa o repeti de cateva ori? De exemplu, ai putea avea ceva de genul:

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

Cum ar fi daca ai vrea sa se repete de 3 ori? Ei bine, putem face ceva simplu - o copiem si apoi o lipim de 3 ori:

    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

E ceva cod acolo! Ce se intampla daca vrei sa schimbi esantionul cu ‘:elec_plip’? Va trebui sa gasesti toate locurile in care apare cel initial - ‘:elec_blup’ si sa il inlocuiesti peste tot. Mai mult, ce s-ar intampla daca ai vrea sa repeti bucata initiale de 50 de ori sau chiar de 1000? Atunci chiar ar fi o gramada de cod si deci o gramada de linii pe care ar trebui sa le modifici daca ai vrea sa faci o schimbare.

## Iteratia

De fapt, repetarea unei bucati de cod ar trebui sa fie la fel de simpla ca a spune fa asta de trei ori. Cam asa si este. Iti aduci aminte de prietenul nostru - blocul de cod? Putem sa-l folosim pentru a marca inceputul si sfarsitul codului pe care vrem sa-l repetam de trei ori. Apoi vom folosi comanda speciala ‘3.times’. Deci, in loc sa scriem fa asta de trei ori (do this three times), scriem `3.times do` - nu pare prea greu. Tine minte sa scrii ‘end’ la sfarsitul codului care vrei sa se repete:

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

Nu-i asa ca e mult mai curat decat metoda copy/paste? Putem folosi blocurile pentru a crea mai multe structuri repetitive:

    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

## Iteratii in cadrul altor iteratii

Putem pune iteratii inauntrul altor iteratii pentru a crea niste midele interesante. De exemplu:

    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

## Reluarea in bucla

Daca vrei ca o bucata sa se repete de multe ori, ai putea fi nevoit sa folosesti numere foarte mari, de exemplu `1000.times do`. In acest caz, probabil ca e mai bine sa ceri Sonic Pi sa repete la infinit (sau macar pana cand apesi butonul de oprire!). Sa redam amen break in bucla la infinit:

    loop do
      sample :loop_amen
      sleep sample_duration :loop_amen
    end

Un lucru de tinut minte este ca aceste bucle actioneaza ca niste gauri negre pentru cod. Odata ce codul ajunge la bucla (loop), el nu o va parasi niciodata daca nu apesi pe butonul de oprire - pur si simplu va relua la nesfarsit bucla. Asta inseamna ca daca ai cod scris dupa loop, nu il vei auzi niciodata. De exemplu, talerul de dupa loop nu va fi redat niciodata:

    loop do
      play 50
      sleep 1
    end
    sample :drum_cymbal_open

Acum poti incepe sa-ti structurezi codul folosind iteratii si bucle!