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.
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.
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
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
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!