До этого момента мы потратили немало времени, пробуя разные звуки, которые можно производить внутри блоков play
и sample
. Мы также изучили как разносить эти звуки во времени, используя sleep
.
Как мы уже смогли выяснить, даже с этими простейшими блоками кода можно долго забавляться. Однако, совершенно новое измерение веселья откроется для вас, когда вы начнёте использовать мощь блоков кода для структурирования вашей музыки. В нескольких последующих главах мы рассмотрим некоторые из этих новых инструментов. Вначале идут итерации и циклы.
Доводилось ли вам писать код, который вы бы хотели повторить несколько раз? Например, у вас могло получиться нечто подобное:
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
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
Этот код просто огромен! Как быть, если нам захочется поменять сэмпл на :elec_plip
? Придется найти все места с изначальным :elec_blup
и переписать их. Что ещё важнее, каким образом повторить кусок кода 50 раз или 1000? Это было бы и впрямь целая куча кода. Гигантское число строк пришлось бы изменять для каждой правки.
На самом деле сделать повторение кода должно быть не сложнее, чем сказать сделай это три раза. В общем-то, так оно и есть. Помните ли вы о нашем старом знакомом, блоке кода? Его можно использовать для отметки начала и конца кода, который необходимо повторить три раза. Мы добавим специальную конструкцию 3.times
. Так что, вместо записи делай это три раза, мы напишем 3.times do
. Это не очень сложно. Просто не забывайте указать end
в конце кода, который надо повторить:
3.times do
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
end
Ну, разве это не лучше дублирования? Много красивых структур может быть создано с использованием этой инструкции:
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
Еще можно поместить итерации внутрь других итераций и получить интересный рисунок. Например:
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
Если потребуется повторить что-то много раз, придётся указывать очень большие значения, такие как 1000.times do
. В этом случае, наверное, лучше попросить Sonic Pi повторять код до бесконечности (или, как минимум, до того момента, пока вы не нажмёте кнопку “Остановить”!). Давайте зациклим амен-брейк:
loop do
sample :loop_amen
sleep sample_duration :loop_amen
end
О циклах важно знать то, что они работают как чёрные дыры внутри кода. Как только исполнение кода попадает в цикл, оно не cможет покинуть его до тех пор, пока вы не остановите его. Код просто будет повторяться по кругу снова и снова вечно. Это значит, что вы никогда не услышите код, написанный после цикла. К примеру, тарелка после этого цикла никогда не прозвучит:
loop do
play 50
sleep 1
end
sample :drum_cymbal_open
Теперь, пришла пора создать интересные структуры из вашего кода при помощи итераций и циклов!