Pattr

Принцип Цикады в Музыке или Магия Простых Чисел

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

Будет создано несколько сообщений, содержащих последовательность из нулей и единиц. По сигналу из метронома из каждого сообщения будет извлекаться один единственный элемент, после чего все элементы будут суммированы. Количество элементов в сообщении будет разное, и будет представлять простое число. На выходе будет ожидаться целое число от нуля до %количество_сообщений%, которое замапится на определенную ноту.

Почему PureData?

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

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

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

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 шагов). Можно сказать, что мой арсенал алгоритмических тулз пополнился еще одной. Спасибо, Хабр!

Для тех, у кого под рукой нет Pd, я записал результат в файл: [del]

06 Nov 2011  OSCII