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!