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

Этот прием используется в этнической музыке жителей африканского континента, а также многими хорошими барабанщиками. В этой статье будет описываться способ, который я использую для генерации таких ритмов.
Ритмы можно наглядно представить в виде последовательности единиц и нулей, где 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 очень прост. Он принимает список из единиц и нулей, проходится по каждому элементу и для каждой единицы формирует сообщение, создающее событие в seq~. Не буду подробно объяснять его работу, так как это статья о полиритмах, да и кому интересно, тот сможет разобрать что к чему за 15 минут.
Итак, взглянем на следующий патч (polyrhythms01.maxpat):

При нажатии на сообщение, объект rtoseq «забивает» ритм в объекты seq~, сигнал из phasor~ управляет выводом сохраненных в seq~ сообщений. Сообщение (play 1, seq rtoseq) требуется для включения seq~ (за подробностями идем в хелп).
Однако задание ритма напрямую через сообщение не очень удобно, поэтому мы сделаем небольшой интерфейс (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
По просьбам комментаторов записал видео

Этот прием используется в этнической музыке жителей африканского континента, а также многими хорошими барабанщиками. В этой статье будет описываться способ, который я использую для генерации таких ритмов.
Инструментарий
Ритмы можно наглядно представить в виде последовательности единиц и нулей, где 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 очень прост. Он принимает список из единиц и нулей, проходится по каждому элементу и для каждой единицы формирует сообщение, создающее событие в seq~. Не буду подробно объяснять его работу, так как это статья о полиритмах, да и кому интересно, тот сможет разобрать что к чему за 15 минут.
Итак, взглянем на следующий патч (polyrhythms01.maxpat):

При нажатии на сообщение, объект rtoseq «забивает» ритм в объекты seq~, сигнал из phasor~ управляет выводом сохраненных в seq~ сообщений. Сообщение (play 1, seq rtoseq) требуется для включения seq~ (за подробностями идем в хелп).
Однако задание ритма напрямую через сообщение не очень удобно, поэтому мы сделаем небольшой интерфейс (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
По просьбам комментаторов записал видео