Pull to refresh

Секвенсор для полиритмов в Max/MSP

Reading time3 min
Views1.8K
Что я знаю о полиритмах? Не особо много; кажется, это когда одновременно играют два или более ритма разных размеров, причем проигрываются они за одно и то же время. Приведу картинку для наглядности.

Два ритма разных размеров проигрваются за одно время

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

Инструментарий


Ритмы можно наглядно представить в виде последовательности единиц и нулей, где 1 – это удар, а 0 — тишина. Общее количество элементов определяет длину ритма. В максе представить ритм таким способом легче всего с помощью сообщений:

Ритмы представленные в виде набора нулей и единиц

В первом ритме 16 элементов, во втором — 10. Проигрывать их мы будем с помощью объекта seq~. Он работает следующим образом: мы последовательно забиваем события, для каждого из которых определяем условие, при котором оно будет выводиться. seq~ принимает аудио сигнал, сравнивает его значение с внесенными данными и при совпадении выводит сохраненное сообщение. Например, сделаем так, чтобы объект выдавал bang, когда значение входящего сигнала будет равняться 0.5. Для этого надо в seq~ послать сообщение (add my_rythm 0.5 bang). Теперь, когда значение входящего в seq~ сигнала будет равняться 0.5, объект выдаст bang через левый аутлет. Для облегчения понимания работы объекта я создал небольшой патч с комментариями, который по должен помочь разобраться с его работой (seqhowto.maxpat).

Надеюсь, этот патч поможет

Идем далее. На данный момент нам требуется вбить последовательность из единиц и нулей в объект seq~. Для этой цели некоторое время назад я создал небольшую абстракцию под названием rtoseq (rhythm to seq~). Абстракциями в максе называют патчи, созданные для того, чтобы их можно было использовать, как объекты, у программистов это называется reusable code. Абстракции имеют то же расширение .maxpat и могут быть добавлены точно также, как и объекты.

Внутренности rtoseq

Принцип работы rtoseq очень прост. Он принимает список из единиц и нулей, проходится по каждому элементу и для каждой единицы формирует сообщение, создающее событие в seq~. Не буду подробно объяснять его работу, так как это статья о полиритмах, да и кому интересно, тот сможет разобрать что к чему за 15 минут.
Итак, взглянем на следующий патч (polyrhythms01.maxpat):

polyrhythms01.maxpat

При нажатии на сообщение, объект rtoseq «забивает» ритм в объекты seq~, сигнал из phasor~ управляет выводом сохраненных в seq~ сообщений. Сообщение (play 1, seq rtoseq) требуется для включения seq~ (за подробностями идем в хелп).

Однако задание ритма напрямую через сообщение не очень удобно, поэтому мы сделаем небольшой интерфейс (polyrhythms02.maxpat).

polyrhythms02.maxpat

Объект multislider при каждом редактировании посылает через левый аутлет список значений всех слайдеров. Сообщение (size $1) меняет количество слайдеров. В инспекторе объекта сделаны следующие изменения:
Range: 0. 1. – диапазон значений слайдеров;
Slider Style: Bar – внешний вид слайдеров;
Sliders Output Values: Integer – в слайдерах будут целочисленные значения;
Thin Line Thickness: 2 – создаем расстояние между слайдерами.
Таким образом мы превращаем мультислайдер в своего рода редактор паттернов.

Заключение


Данный способ дает нам не только возможность программировать любые полиритмы, но также предоставляет богатые возможности для экспериментов, если мы будем управлять объектами seq~ не с помощью пилы, а с помощью произвольного аудио сигнала: синусоида, треугольник, белый шум, да хоть сигнал с линейного входа – вариантов много.

Кстати, это первая статья на pattr, в которой затрагивается тема алгоритмических секвенсоров.

P.S. Да, на скринах шестой макс :)

Архив с патчами pattr.ru/sites/default/files/pattr_polyrhythms.zip

По просьбам комментаторов записал видео
Tags:
Hubs:
Total votes 15: ↑14 and ↓1+13
Comments14

Articles