Часто, помимо игры произвольных нот (см. предыдущую главу), вы также будете хотеть принимать произвольные решения и выполнять либо одну, либо другую ветку кода, в зависимости от результата. Например, вы можете решить случайным образом сыграть звук барабана или звук тарелки. Мы можем достичь этого при помощи выражения if
.
Итак, давайте подбросим монетку: орел - играем на барабане, решка - бьём по тарелке. Это просто. Можно сымитировать это действие, используя функцию one_in
(представлена в разделе, посвящённом случайности) с вероятностью один к двум: one_in(2)
. Затем, мы можем использовать результат, чтобы выбрать один из двух участков кода: один - для звука барабана, другой - для тарелки:
loop do
if one_in(2)
sample :drum_heavy_kick
else
sample :drum_cymbal_closed
end
sleep 0.5
end
Отметим, что выражение if
состоит из трёх частей:
Обычно, в программных языках ответ “Да” представлен термином true
(истина), а false
(ложь) означает “Нет”. То есть нам нужно задать вопрос, который даёт true
или false
ответ. Это именно то, что делает one_in
.
Обратите внимание, что первый вариант действия размещается между if
и else
, а второй вариант находится между else
и end
. Как и в блоках do/end, допускается многострочный код. Например:
loop do
if one_in(2)
sample :drum_heavy_kick
sleep 0.5
else
sample :drum_cymbal_closed
sleep 0.25
end
end
В этом случае мы добавляем задержку в течение разного количества времени в зависимости от сделанного выбора.
Иногда вам требуется условно выполнить всего лишь одну строчку кода. Это возможно, если написать if
и сразу же ваш вопрос. Например:
use_synth :dsaw
loop do
play 50, amp: 0.3, release: 2
play 53, amp: 0.3, release: 2 if one_in(2)
play 57, amp: 0.3, release: 2 if one_in(3)
play 60, amp: 0.3, release: 2 if one_in(4)
sleep 1.5
end
Если запустить этот код, то каждый раз будут звучать разные аккорды, в которых вероятность появления каждой ноты будет различна.