Нарезка сэмплов

Еще в третьем эпизоде этой серии Sonic Pi мы рассмотрели, как зациклить, растянуть и отфильтровать один из самых известных барабанных брейков всех времен - Amen Break. В этом уроке мы сделаем еще один шаг вперед и узнаем, как нарезать сэмплы на ломтики, перемешивать их и склеивать их в совершенно новом порядке. Если это звучит немного безумно для вас, не волнуйтесь, вот-вот все станет ясно, и скоро вы освоите новый мощный инструмент для своих лайвкодинг сетов.

Звук как данные

Прежде чем мы начнем, давайте кратко рассмотрим, как работать с сэмплами. К настоящему времени вы все, надеюсь, уже играете с мощным сэмплером Sonic Pi. Если еще нет, то прямо сейчас не самое подходящее время! Загрузите Raspberry Pi, запустите Sonic Pi из меню Программирование, введите следующее в свободный буфер и затем нажмите кнопку Выполнить, чтобы услышать предварительно записанный барабанный ритм:

sample :loop_amen

Запись звука можно представить в виде данных - множество чисел от -1 до 1, которые определяют пики и провалы звуковой волны. Если мы воспроизведем эти числа по порядку, то получим оригинальный звук. Однако что мешает нам воспроизводить их в другом порядке и создавать новый звук?

Как на самом деле записываются сэмплы? Это на самом деле довольно просто, когда вы понимаете основы физики звука. Когда вы издаете звук, например, ударяя по барабану, шум распространяется по воздуху подобно тому, как рябь распространяется по поверхности озера, когда вы бросаете в него гальку. Когда эта рябь достигает ваших ушей, ваша барабанная перепонка соответственным это волне образом движется и преобразует эти движения в звук, который вы слышите. Если мы хотим записать и воспроизвести звук, нам нужен способ захвата, хранения и воспроизведения этих волн. Одним из способов является использование микрофона, который действует как барабанная перепонка и движется туда-сюда, когда с ним встречаются волны. Затем микрофон преобразует свое текущее положение в крошечный электрический сигнал, который измеряется много раз в секунду. Эти измерения далее представляются в виде последовательности чисел от -1 до 1.

Если бы мы отразили на графике звук, это был бы простой график данных со временем по оси x и положением микрофона / динамика в диапазоне от -1 до 1 по оси y. Вы можете увидеть пример такого графика на диаграмме в верхней правой части Sonic Pi.

Проигрывание части сэмпла

Итак, как же мы программируем Sonic Pi, чтобы воспроизвести сэмпл в другом порядке? Чтобы ответить на этот вопрос, нам нужно взглянуть на такие параметры sample, как start: и finish:. Они позволяют нам контролировать начальную и конечную позиции воспроизведения чисел, которые представляют звук. Значения для обоих этих вариантов представлены в виде числа между 0 и 1, где 0 это начало сэмпла, а 1 - конец. Итак, чтобы сыграть первую половину Amen Break, нам просто нужно указать finish: из 0.5:

sample :loop_amen, finish: 0.5

Мы можем добавить значение start:, чтобы воспроизвести еще меньшую часть сэмпла:

sample :loop_amen, start: 0.25, finish: 0.5

Для забавы, вы можете даже задать значение параметра finish: * перед * значением параметраstart:, и тогда указанная часть сэмпла будет воспроизведена в обратном направлении:

sample :loop_amen, start: 0.5, finish: 0.25

Изменение порядка воспроизведения сэмпла

Теперь, когда мы знаем, что сэмпл - это просто список чисел, которые можно воспроизвести в любом порядке, а также то, как воспроизводить определенную часть сэмпла, мы можем теперь начать веселиться, воспроизводя сэмпл в «неправильном» порядке.

Amen Slices

Давайте возьмем наш Amen Break и нарежем его на 8 слайсов одинакового размера, а затем перемешаем кусочки. Посмотрите на диаграмму: в верхней части А) представлен график наших исходных данных. Нарезка его на 8 слайсов дает нам B) - обратите внимание, что мы дали каждому слайсу свой цвет, чтобы легче различить их. Вы можете увидеть начальные и конечные значения каждого слайса в верхней части. Наконец, C) является одним из возможных переупорядочений слайсов. Затем мы можем воспроизвести это, чтобы создать новый ритм. Взгляните на код, чтобы сделать это:

live_loop :beat_slicer do
  slice_idx = rand_i(8)
  slice_size = 0.125
  s = slice_idx * slice_size
  f = s + slice_size
  sample :loop_amen, start: s, finish: f
  sleep sample_duration :loop_amen, start: s, finish: f
end
  1. мы выбираем случайный фрагмент для воспроизведения, который представлен случайным числом от 0 до 7 (помните, что мы начинаем считать с 0). Sonic Pi имеет удобную функцию именно для этого: rand_i (8). Затем мы сохраняем этот случайный индекс слайса в переменной slice_idx.
  2. Мы определяем наш slice_size, который составляет 1/8 или 0,125. Slice_size необходим для того, чтобы мы преобразовали наш slice_idx в значение между 0 и 1, чтобы мы могли использовать его в качестве нашего параметра start: .
  3. Мы вычисляем начальную позицию s путем умножения slice_idx на slice_size.
  4. Мы рассчитываем конечную позицию f, добавляя slice_size к начальной позиции s.
  5. Теперь мы можем воспроизвести слайс сэмпла, вставив значения s и f в параметрыstart: и finish:, принадлежащие sample.
  6. Перед тем, как мы начнем воспроизводить следующий слайс, нам нужно знать, как долго нужно sleep, равно длительности слайса сэмпла. К счастью, у Sonic Pi есть для нас функцияsample_duration, которая принимает все те же параметры, что и sample, и просто возвращает продолжительность. Поэтому, передавая sample_duration нашим параметрам start: и finish: , мы можем узнать длительность одного слайса.
  7. Мы упаковываем весь этот код в live_loop, чтобы циклически продолжать выбирать новые случайные фрагменты для воспроизведения.

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

Давайте собрать в кучу все, что мы прошли к настоящему времени, в заключительный пример, который продемонстрирует, как мы можем использовать аналогичный подход для соединения случайно нарезанных барабанных ритмов с кое-каким басом, чтобы положить начало интересному треку. Теперь ваша очередь - возьмите приведенный ниже код в качестве отправной точки и посмотрите, сможете ли вы, обойдясь с ним по-своему, создать что-то новое …

live_loop :sliced_amen do
  n = 8
  s =  line(0, 1, steps: n).choose
  f = s + (1.0 / n)
  sample :loop_amen, beat_stretch: 2, start: s, finish: f
  sleep 2.0  / n
end
live_loop :acid_bass do
  with_fx :reverb, room: 1, reps: 32, amp: 0.6 do
    tick
    n = (octs :e0, 3).look - (knit 0, 3 * 8, -4, 3 * 8).look
    co = rrand(70, 110)
    synth :beep, note: n + 36, release: 0.1, wave: 0, cutoff: co
    synth :tb303, note: n, release: 0.2, wave: 0, cutoff: co
    sleep (ring 0.125, 0.25).look
  end
end