A.10 Управление

# Управление вашим звуком

До сих пор в этой серии мы фокусировались на запуске звуков. Мы обнаружили, что можем запускать синтезаторы Sonic Pi с помощью `play` или` synth`, а предварительно записанные сэмплы с помощью `sample`. Мы также рассмотрели, как обернуть эти звуки внутрь FX-контекста студийных эффектов, таких как реверберация и искажение, используя команду `with_fx`. Объединив это с невероятно точной системой синхронизации Sonic Pi, вы сможете создавать огромное количество звуков, битов и риффов. Однако, как только вы тщательно выбрали параметры определенного звука и запустили его, у вас не будет возможности поиграть с ним, пока он воспроизводится, правильно? Неправильно! Сегодня вы узнаете кое-что очень мощное - как управлять работой синтезаторов.

## Основной звук

Давайте создадим простой звук. Запустите Sonic Pi и в свободном буфере наберите следующее:

```
synth :prophet, note: :e1, release: 8, cutoff: 100
```

Теперь нажмите кнопку Выполнить в левом верхнем углу, чтобы услышать чудный грохочущий синтезаторный звук. Давайте, нажмите его еще несколько раз, чтобы хорошенько прочувствовать это. Готово? Теперь давайте поуправляем им!

## Узлы синтезатора

Малоизвестная особенность Sonic Pi заключается в том, что функции `play`,` synth` и `sample` возвращают нечто, называемое SynthNode`, что представляет собой исполняемый звук. Вы можете захватить один из этих `SynthNode`, используя стандартную переменную, а затем ** контролировать ** ее в более поздний момент времени. Например, давайте изменим значение параметр `cutoff:` после 1 такта:

```
sn = synth :prophet, note: :e1, release: 8, cutoff: 100
sleep 1
control sn, cutoff: 130
```

Давайте рассмотрим каждую строку по очереди:

Сначала мы запускаем синтезатор `: prophet`, используя функцию ` synth` как обычно. Кроме того, мы еще фиксируем это в переменной с именем `sn`. Мы могли бы назвать эту переменную как-то иначе, например, «synth_node» или «jane» - имя не имеет значения. Однако полезно выбрать такое имя, которое будет что-то означать для вас и для людей, читающих ваш код. Я выбрал `sn`, так как это мнемонически удобное сокращение для узла синтезатора (synth node).

В строке 2 у нас есть стандартная команда `sleep`. В этом нет ничего особенного - она просто просит компьютер подождать 1 такт, прежде чем перейти к следующей строке.

В строке 3 начинается веселье управления. Здесь мы используем функцию `control`, чтобы указать исполняемому` SynthNode` изменить значение среза фильтра на `130`. Если вы нажмете кнопку ** Выполнить **, вы услышите, как синтезатор `: prophet` начнет воспроизводиться, как было прежде, но после 1 такта он будет звучать намного ярче.

Модулируемые параметры

Большинство параметров синтезаторов и эффектов в Sonic Pi могут быть изменены в процессе исполнения. Но это не относится ко всем из них. Например, параметры огибающей `attack:`, `decay:`, `Sustain:` и `release:` могут быть установлены только при запуске исполнения синтезатора. Выяснить, какие параметры можно, а какие нельзя изменять достаточно просто - перейдите к документации синтезатора или эффекта, а затем прокрутите вниз до спецификаций отдельных параметров, ориентируясь на фразы «Может быть изменено во время игры» или «Не может быть измененным после установки». Например, документация для `: beep` synth's указывает, что параметр 'attack:`изменять нельзя:

* Default: 0
* Должно быть больше или равно нолю
* Не может быть изменено после установки
* Масштабируется относительно текущего значения BPM

## Множественные изменения

Пока синтезатор исполняется, вы не ограничены изменять его только один раз - вы можете менять его столько раз, сколько захотите. Например, мы можем превратить наш `: prophet` в мини-арпеджиатор  следующим образом:

```
notes = (scale :e3, :minor_pentatonic)
sn = synth :prophet, note: :e1, release: 8, cutoff: 100
sleep 1
16.times do
  control sn, note: notes.tick
  sleep 0.125
end
```

В этом фрагменте кода мы только добавили пару дополнительных вещей. Сначала мы определили новую переменную с именем `notes`, которая содержит ноты, которые мы хотели бы циклически перемещать (арпеджиатор - это просто причудливое имя для чего-то, что циклически перебирает список нот по порядку). Во-вторых, мы заменили наш одиночный вызов на `control` итерацией, вызывающей его 16 раз. В каждом вызове `control` мы проходим с помощью ` .tick` наше кольцо `notes`, которое будет автоматически повторяться, как только мы доберемся до конца (благодаря невероятной силе колец Sonic Pi). Для некоторого разнообразия попробуйте заменить `.tick` на` .choose` и посмотрите, можете ли вы услышать разницу.

Обратите внимание, что мы можем изменять несколько параметров одновременно. Попробуйте изменить строку управления на следующую и прислушайтесь к разнице:

```
control sn, note: notes.tick, cutoff: rrand(70, 130)
```

## Плавные изменения

Когда мы контролируем `SynthNode`, он реагирует точно вовремя и мгновенно меняет текущее значение параметра на новое, как если бы вы нажали кнопку или щелкнули переключателем, запрашивая изменение. Это может звучать ритмично и резко - особенно если парамметр контролирует какой-нибудь аспект тембра, как , например, `cutoff:`. Однако иногда вы не хотите, чтобы изменения произошли мгновенно. Вместо этого вы можете плавно перейти от текущего значения к новому, как если бы вы переместили слайдер или валкодер. Конечно, Sonic Pi также может сделать это посредством `_slide:`.

Каждый параметр, который можно изменить, также имеет специальный соответствующий ему параметр `_slide:`, который позволяет указать время скольжения. Например, `amp:` имеет `amp_slide:`, так же как `cutoff:` имеет `cutoff_slide:`. Эти параметры скольжения работают немного иначе, чем все остальные, в том смысле, что они сообщают синтезатору, как себя вести **во время, когда ими управляют **. Давайте взглянем:

```
sn = synth :prophet, note: :e1, release: 8, cutoff: 70, cutoff_slide: 2
sleep 1
control sn, cutoff: 130
```

Обратите внимание, что этот пример точно такой же, как и раньше, за исключением добавления `cutoff_slide:`. Это говорит о том, что во время когда параметр `cutoff:` этого синтезатора будет управляться, потребуется 2 такта на то, чтобы перейти от текущего значения к новому. Поэтому, когда мы используем `control`, вы можете услышать скольжение значения среза фильтра от 70 до 130. Это создает интересное динамическое ощущение звука. Теперь попробуйте изменить время `cutoff_slide:` на более короткое значение, такое как 0,5, или более длинное значение, такое как 4, чтобы увидеть, как это меняет звук. Помните, что вы можете перемещать любые изменяемые параметры точно таким же образом, и каждое значение `_slide:` может быть совершенно разным. Вы можете одновременно медленно скользить по срезу фильтра,  быстро смещать амплитуду и плавно двигаться по панораме со средней между этими значениями скоростью, ища для себя творческие новые возможности ...

## Соединим всё вместе

Давайте рассмотрим короткий пример, который демонстрирует мощь управления синтезаторами после запуска их исполнения. Обратите внимание, что вы также можете плавно изменять параметры эффектов, хотя и с немного другим синтаксисом. Ознакомьтесь с разделом 7.2 встроенного руководства для получения дополнительной информации об управлении эффектами.

Скопируйте код в свободный буфер и прослушайте его. Не останавливайтесь на достигнутом - поиграйте с кодом. Измените время скольжения, измените ноты, синтезатор, эффекты, время сна и посмотрите, сможете ли вы превратить его во что-то совершенно другое!

```
live_loop :moon_rise do
  with_fx :echo, mix: 0, mix_slide: 8 do |fx|
    control fx, mix: 1
    notes = (scale :e3, :minor_pentatonic, num_octaves: 2).shuffle
    sn = synth :prophet , sustain: 8, note: :e1, cutoff: 70, cutoff_slide: 8
    control sn, cutoff: 130
    sleep 2
    32.times do
      control sn, note: notes.tick, pan: rrand(-1, 1)
      sleep 0.125
    end
  end
end
```
