Условные выражения

Часто, помимо игры произвольных нот (см. предыдущую главу), вы также будете хотеть принимать произвольные решения и выполнять либо одну, либо другую ветку кода, в зависимости от результата. Например, вы можете решить случайным образом сыграть звук барабана или звук тарелки. Мы можем достичь этого при помощи выражения 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

Если запустить этот код, то каждый раз будут звучать разные аккорды, в которых вероятность появления каждой ноты будет различна.