Pattr

Max/MSP: Обзорная Статья

Max – это визуальный язык программирования для создания приложений, работающих в реальном времени. Изначально он создавался, как инструмент для музыкантов, однако за свою более чем двадцатилетнюю историю превратился в универсальный инструмент, позволяющий решать любые задачи, связанные со звуком, изображением и взаимодействием с человеком или оборудованием. Чаще всего он применяется для создания интерактивных инсталляций, алгоритмической музыки и визуального ряда, хотя, благодаря открытому API и возможности написания собственных объектов, его можно использовать для любых целей, требующих работы в real-time. Вот, к примеру, инсталляция, построенная на одном из зданий в итальянском городе Кальяри. Цвет светодиодных дисплеев меняется в зависимости от шума автомобилей и управляется связкой из Max/MSP и Arduino.

Немного истории

Первая версия макса, о прямом потомке которой говорится в этой статье, была написана Миллером Паккеттом (Miller Puckette) в конце 80-х, когда он работал в IRCAM (Institut de Recherche et Coordination Acoustique/Musique, Институт исследования и координации акустики и музыки). На тот момент там были собраны лучшие умы мира, занимающиеся исследованиями в области компьютерной музыки, среди которых, в частности, был Макс Мэттьюс (Max Mathews), пионер электронной музыки, человек, создавший первую музыкальную программу MUSIC I.

Название Max было дано в его честь, однако это было сделано не за его заслуги, а потому что именно он разработал “real-time scheduling” алгоритм RTSKED, легший в основу программы Миллера. Его суть заключается в следующем: вычисления происходят в нескольких параллельных элементах, которые выполняют что-то некоторое время, затем сообщают системе о завершении, после чего бездействуют до тех пор, пока не будет получен сигнал-триггер. Это и является фундаментальной идеей макса (программы).

Но макс не всегда умел работать с аудио из-за малой вычислительной мощности старых процессоров. Изначально такая возможность появилась в программе PureData, которую написал Миллер после ухода из IRCAM и основанную на идеях, заложенных им ранее. Именно в ней первой появилась возможность синтеза звука в реальном времени (Max/FTS не в счет, так как в нем для синтеза использовалась специальная DSP карта). В скором времени после создания Pd Дэвид Цикарелли (David Zicarelli), основатель компании Cycling’74, решает добавить аудио к оригинальному максу, в результате чего и появился Max/MSP. Для синтеза он использует инфраструктуру PureData, в которую были добавлены фичи, взятые из Max/FTS, но не реализованные в Pd.

Чуть позже в Cycling’74 создали Jitter – набор объектов, позволяющие в реальном времени работать с видео, 3D и OpenGL, основанную, если не ошибаюсь, на GridFlow – аналогичной разработке для jMax, прямого наследника Max/FTS. Подведем итоги. Max – это среда визуального программирования, основа всего; MSP – расширение, делающее возможной работу с аудио, а Jitter – расширение для работы с видео. Отсюда и название – Max/MSP/Jitter.

У макса очень длинная история, кому интересно, лучше прочитайте статью Миллера – кто как не создатель лучше опишет ee? Нам же пора делать первые шаги…

Приступаем к работе

Сначала разберем некоторые основы. Программа в максе называется патч. Для создания патча необходимо с помощью виртуальных проводов соединить различные модули (их принято называть объектами), как правило, выполняющие простейшие функции, типа арифметики, сортировки, обработки MIDI, синтеза волн и так далее. Каждый объект имеет входы и выходы, которые мы будем далее называть инлетами и аутлетами. Более детально обо всем я расскажу в одной из следующих статей, а в этой ограничусь лишь пошаговой инструкцией по созданию небольшого рандомного секвенсора, управляющего простеньким синтезатором.

Итак, для того, чтобы начать работу, необходимо установить программу, скачав последнюю демо-версию с официального сайта cycling74.com. После успешного запуска на экране появится Max window – служебное окно макса, куда выводятся ошибки и другие системные сообщения.

Окно Max, куда выводятся различные сообщения, ошибки и т.д.

Теперь можно создать пустой патчер – окно, в котором вы будете собирать свой первый патч. Это делается из меню File > New Patcher (Ctrl N). Перед нами открылся пустой патчер. Макс подсказывает нам сделать дабл клик на пустом месте. Это действие откроет object palette – небольшое меню, из которого можно выбрать объект. Лично я его считаю неудобным, так как гораздо быстрее добавить объект с помощью клавиатуры. Для этого надо, нажав кнопку “n”, создать пустой объект (object box), в который надо ввести название объекта и нажать enter. Таким способом создадим три объекта: toggle, button и [metro 300] и соединим их, как показано на рисунке.

Метроном — у большиства людей это первый патч в Max/MSP

Объекты toggle и button чудесным образом превратились в симпатичные кнопочки. Их отличие в том, что первая является переключателем, а вторая играет роль триггера. Теперь выйдем из режима редактирования, нажав на замочек в левом нижнем углу экрана, и кликнем на объект toggle. В результате кнопка button должна замигать. Что же происходит? Объект toggle при включении посылает единицу в левый инлет объекта [metro 300], который включается и начинает каждые 300 миллисекунд генерировать специальное сообщение-триггер bang и передавать его в button, заставляя последний мигать. Да кстати, объект [metro 300] – это объект metro с одним аргументом 300. Аргументы задают начальные параметры объектов. Теперь выключим toggle и зайдем опять в режим редактирования. Добавим три объекта: [random 24], [+ 48] и number и соединим, как показано на рисунке:

[random] — генератор случайных чисел. Обычно с него начинают изучение алгоритмической композиции

Теперь опять включим toggle и посмотрим, что происходит. Как было сказано ранее, объект [metro 300] генерирует bang каждые 300 миллисекунд. Этот бэнг поступает в объект [random 24], заставляя который генерировать случайное число в диапазоне 0…23. Затем с помощью объекта [+ 48] прибавляем к выходу рандома 48, тем самым получая на выходе диапазон 48…71. Генерируемые числа отображаются в объекте number (его называют number box), который отображает целочисленные значения. Двигаемся дальше, теперь будем генерить звук. Для этого нам понадобится добавить еще четыре объекта: mtof, cycle~, gain~ и ezdac~. Хочу заметить, во всех случаях в названиях объектов знак тильды обязателен – это соглашение, принятое в максе, позволяющее отличать MSP объекты (которые работают с аудио) от обычных. Да, кстати, изначально объект gain~ имел вертикальный вид, в этом патче я изменил его, просто наведя курсор на правый нижний угол объекта и растянув его до нужных размеров, как это делается с окнами любимой ОС. Обратите внимание на новые полосатые провода – так выглядят провода, по которым передается MSP сигнал.

Очень простой звуково патч. Контролируем частоту синусоиды рандомом

Вновь выйдем из режима редактирования (для тех, кто уже забыл, это делается с помощью иконки замка в левом нижнем углу), включим toggle, перетащим вправо ползунок gain~ и нажмем на ezdac~. Должен появиться звук. Если этого не произошло, идем в настройки Options > DSP Status… и выбираем нужный аудио драйвер и аудио интерфейс. Для нашего примера вполне подойдет драйвер ad_mme, так как asio не нужен для такой простой работы. У меня при выборе звуковухи макс показывает иероглифы, поэтому здесь возможно придется поэкспериментировать, однако практика показывает, что самый первый девайс в списке обычно подходит. После всех манипуляций необходимо опять нажать на ezdac~ для включения MSP.

Небольшая «тонкость» при настройке аудио в Max/MSP

Так, мы немного отклонились, надо еще объяснить, как все работает. В предыдущем патче мы остановились на генерации случайных чисел в диапазоне 48…71. Эти числа мы подаем в объект mtof, он понимает числа 0…127, как MIDI ноты и преобразует их в соответствующую частоту. Например, нота номер 60 имеет частоту 261 Гц, нота 70 466 Гц и так далее. Это значение поступает в объект cycle~ и задает ему частоту генерируемой синусоиды. Затем сигнал поступает в объект gain~, который позволяет изменять амплитуду, после чего выходит на динамики через объект ezdac~ (сокращение easy digital audio converter), который делает две вещи: собственно выводит аудио на колонки и включает/выключает MSP. Идем дальше. Теперь добавим ADSR-огибающую для амплитуды. Для этого нам понадобятся следующие объекты: [trigger f 1], adsr~, *~ (умножение сигналов), три number и один flonum. Теперь соединим все вместе:

ADSR огибающая с помощью объекта [adsr~]

Немного изменилась структура, разберем здесь все. Выход из mtof теперь идет в объект [trigger f 1], который при поступлении в него сообщения сначала из правого аутлета выводит единицу, тем самым заставляя adsr~ генерировать новую огибающую, после чего выводит поступившее в него число через левый аутлет. Из аргументов должно все быть понятно: f – означает float, а 1единицу. Здесь используется одна важная особенность всех объектов – вывод сообщений начинается с правого аутлета и по очереди до левого. Об этом подробнее расскажу в следующий раз, так как это не входит в рамки вводной статьи. Вернемся к патчу. Как уже стало понятно, adsr~ генерирует огибающую, параметры которой задаются с помощью четырех намбер боксов. Важно: параметры attack, decay и release задаются в миллисекундах, поэтому для в их случаях использовались объекты number. Для удобства диапазон этих значений был ограничен до 0…1000 в инспекторе, который вызывается с помощью правого клика на объекте и вызове меню Inspector

Инспектор объекта — здесь можно настроить его параметры

Параметр sustain же задает амплитуду, поэтому диапазон его значений состоит из вещественных чисел 0…1.0. Именно поэтому вместо number используется объект flonum – он полностью идентичен number, только позволяет работать с вещественными числами. Кстати, минимум и максимум его тоже ограничены через инспектор до 0 и 1 соответственно. Наконец, сигнал из adsr~ перемножается с сигналом cycle~ и выводится на колонки. Вот и все, ваш первый патч готов! Легко, не правда ли?

Что дальше?

Я не ставил целью этой статьи расписать все тонкости работы с максом, так как это просто невозможно уместить в десять страниц А4 (именно столько занимает у меня статья в ворде). Я хотел дать лишь общее представление об этой замечательной программе, показав принцип работы в ней, стараясь при этом не скатиться в маразм и никчемность (огромное спасибо всем, кто помогал мне в этом). Если есть интерес, могу написать серию статей, в которых подробно распишу важные вещи макса (типы сообщений, очередность событий и др.), а у кого нет терпения ждать этого, привожу основные направления для самостоятельного изучения.

Во-первых, обязательны для прочтения туториалы, идущие вместе с максом, и доступные из меню Help. В них подробно и последовательно изложены все фундаментальные вещи, необходимые для работы. У макса замечательная документация, честно говоря, я не встречал ничего подобного в других программах. Чего стоят только интерактивные примеры по каждому объекту.

Во-вторых, на официальном сайте cycling74.com есть множество небольших видео уроков, показывающих различные «фишки». Также там находится крупнейший в мире форум, посвященный этой программе; если возникли трудности, лучше воспользоваться поиском по форуму: скорее всего эта ситуация уже возникала у кого-то раньше. Хотя этих двух ресурсов с избытком хватит для изучения, мне в свое время помогла книга Programming Electronic Music in Pd за авторством Johannes Kreidler, хотя она и посвящена PureData (по сути, между Pd и Max больше сходств, чем различий). Книга выложена в открытом доступе, английский перевод можно прочитать по ссылке.

И хотелось бы упомянуть два русскоязычных ресурса:

  • http://maxmsp.ru – сайт, созданный Дмитрием Дубровым и Дмитрием Летаховским, известными по проекту Fizzarum;
  • pattr – блог, который мы с друзьями поддерживаем, созданный для того, чтобы в какой-то мере восполнить нехватку русскоязычного материала по программам Max/MSP и PureData.

Также стоит пролистать переводы туториалов по максу, сделанные товарищем Phoiod, для удобства я их залил на scribd. Они по четвертому максу, но для изучения вполне подойдут, особенно, если с английским туго.

Пока все. Happy Patching! :)

08 Sep 2011  OSCII