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

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

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