Прочитав замечательную статью на хабре об использовании простых чисел для создания не повторяющегося фона, я подумал, почему бы не реализовать подобное для генерации музыки? Поразмыслив, я решил реализовать все следующим образом. Будет создано несколько сообщений, содержащих последовательность из нулей и единиц. По сигналу из метронома из каждого сообщения будет извлекаться один единственный элемент, после чего все элементы будут суммированы. Количество элементов в сообщении будет разное, и будет представлять простое число. На выходе будет ожидаться целое число от нуля до %количество_сообщений%, которое замапится на определенную ноту.
Объективных причин нет, зато есть две субъективные:
а) у меня под рукой только слабенький нетбук, на который не хотелось бы ставить демо версию макса;
б) кое-кто недавно назвал pattr.ru сайтом о Max/MSP, что не совсем верно, просто Max — наиболее удобный инструмент для меня лично.
По сути, PureData и Max/MSP имеют одинаковые возможности в плане звука, просто Pd, ввиду своей открытости (да-да, Pd – open source, и он есть под линукс), сильно сливает максу по юзабилити.
Для начала нам нужно собрать алгоритм, который будет последовательно считывать атомы из сообщения (атом — это базовая единица в Pd, наше сообщение состоит из нескольких атомов). Для PureData сделана библиотека Cyclone, в которой портированы многие Max/MSP объекты, так что просто возьмем кусок патча из предыдущей статьи и пересоберем его в Pd (counter-list.pd).

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

Как видно, извлеченные атомы складываются объектом 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
Почему 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).

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

Как видно, извлеченные атомы складываются объектом 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