Pull to refresh

Принцип цикады в музыке или магия простых чисел (на примере PureData)

Reading time 2 min
Views 4.7K
Прочитав замечательную статью на хабре об использовании простых чисел для создания не повторяющегося фона, я подумал, почему бы не реализовать подобное для генерации музыки? Поразмыслив, я решил реализовать все следующим образом. Будет создано несколько сообщений, содержащих последовательность из нулей и единиц. По сигналу из метронома из каждого сообщения будет извлекаться один единственный элемент, после чего все элементы будут суммированы. Количество элементов в сообщении будет разное, и будет представлять простое число. На выходе будет ожидаться целое число от нуля до %количество_сообщений%, которое замапится на определенную ноту.

Почему PureData?


Объективных причин нет, зато есть две субъективные:

а) у меня под рукой только слабенький нетбук, на который не хотелось бы ставить демо версию макса;
б) кое-кто недавно назвал pattr.ru сайтом о Max/MSP, что не совсем верно, просто Max — наиболее удобный инструмент для меня лично.

По сути, PureData и Max/MSP имеют одинаковые возможности в плане звука, просто Pd, ввиду своей открытости (да-да, Pd open source, и он есть под линукс), сильно сливает максу по юзабилити.

Patch me if you can


Для начала нам нужно собрать алгоритм, который будет последовательно считывать атомы из сообщения (атом — это базовая единица в Pd, наше сообщение состоит из нескольких атомов). Для PureData сделана библиотека Cyclone, в которой портированы многие Max/MSP объекты, так что просто возьмем кусок патча из предыдущей статьи и пересоберем его в Pd (counter-list.pd).

Извлекаем атом из сообщения PureData

В этом патче мы имеем сообщение, содержащее семь атомов, счетчик, который считает от 1 до 7, и объект [zl nth], который извлекает определенный атом из входящего сообщения. Обратите внимание, что число из счетчика направляется в объект [t b i]. Он сначала подает число в правый инлет [zl nth], тем самым говоря объекту номер атома для извлечения, а затем подает BANG в сообщение, заставляя его вывести свое содержимое. В итоге получаем, что при нажатии на кнопку, будет последовательно выводиться один атом за другим.

Теперь продублируем это все несколько раз и соберем следующее:

Готовый генератор мелодий на основе простых чисел PureData

Как видно, извлеченные атомы складываются объектом expr, в нашем случае сумма будет колебаться в диапазоне 0...5. Объект sel в зависимости от результата суммирования триггерит одно из пяти чисел, представляющих собой номера нот, которые далее подаются в синтезатор. Номера нот взяты не с потолка — это пентатонический звукоряд, то есть данном патче играют только «черные» клавиши пианино. На устройстве синта не буду останавливаться, это простой синусоидный синт с четырехголосной полифонией.

Заключение


Этот простой патч был создан ради эксперимента, мне хотелось попробовать применить принцип цикады для генерации паттернов. Как видно, результат получился интересным: чувствуется определенная повторяемость мелодии, но четких границ лупа не слышно (еще бы, у нас получилась секвенция, длиной 3 * 5 * 7 * 11 * 17 = 19635 шагов). В общем, мой арсенал алгоритмических штук пополнился еще одной, спасибо, Хабр. :)

Патчи доступны по ссылке:
pattr.ru/sites/default/files/pattr_cicada-test.zip

Для тех, у кого под рукой нет Pd, я записал результат в файл:
http://pattr.ru/img/cicada-test/cicada.mp3
Tags:
Hubs:
+47
Comments 23
Comments Comments 23

Articles