В последнее время было произведено множество экспериментов с очень короткими программами, которые синтезируют нечто, звучащее как музыка. Я хочу поделиться некоторой информацией и своими мыслями на этот счет.
Для начала небольшая предыстория. 26 сентября 2011 года я выложил на YouTube следующее видео, демонстрирующее семь программ и их музыкальные мощности.
Это видео привлекло к себе большое внимание, вдохновив многих программистов на то, чтобы провести собственные опыты и поделиться результатами. В дальнейшем тяга к экспериментам была усилена онлайн Javascript утилитой Бемму, которая обеспечила каждому (думаю даже тем, кто не является программистом) возможность заняться набирающим популярность увлечением. Всего лишь через пару дней люди нашли так много новых формул, что я был вынужден выложить еще одно видео, чтобы похвастаться ими.
А началось все пару месяцев назад, когда я натолкнулся на 23-байтное C-64 демо "Wallflower". Ничего подобного в таком размере я раньше не встречал ни на одной платформе. Глючное, да. Но его музыкальная структура невероятно превосходила его размер. Я сам начал экспериментировать и сделал на Commodore Vic-20 16-байтную программу, музыкальные мощности которой просто поразили меня. В посте, который я опубликовал в блоге чуть ранее, "16-byte frontier", я рассказывал об этой находке и размышлял над тем, почему она работает.
Чуть позже я возобновил опыты с чуть более научным подходом. Для того, чтобы лучше понять, что происходит, мне понадобилась более простая и "чистая" среда. Что-нибудь, что не страдало бы от внезапных глюков и потаенных сложностей 8-битных звуковых чипов и процессоров. Я выбрал короткие программы на базе C, которые выгружают аудио данные в виде необработанного PCM. До этого я уже написал крошечные программки "/dev/dsp softsynths" и одна из них даже стояла в у меня в подписи на e-mail и usenet в начале 1990-х. Однако, программы, с которыми я собирался экспериментировать теперь, должны были быть более короткими и менее планируемыми чем те, с которыми я работал раньше.
Я решил копировать все важнейшие части своих старых 8-битных экспериментов: генератор волн, высота которых регулируется функцией, состоящей из сдвигов и логических операторов. Самая простая волновая форма для программ /dev/dsp – это пилообразная форма. Простая функция for(;;)putchar(t++)
генерирует пилообразную волну с длиной цикла в 256 байт, выдавая в результате частоту в 31.25 Гц, используя установленную по умолчанию частоту дискретизации 8000 Гц. Высота звука может изменяться посредство умножения. t++*2
повышает тон на октаву выше, t++*3
увеличивает высоту на 7 полутонов, t++*(t>>8)
выдает восходящий звук. После пары проб я придумал нечто, чем решил поделиться на IRC:
main(t){for(t=0;;t++)putchar(t*(((t>>12)|(t>>8))&(63&(t>>4))));}
Всего через час Visy и Tejeez выложили на канале еще шесть программ, которые они создали, по большей части просто преобразуя константы и изменяя некоторые части функции. На следующий день Visy поделился своими открытиями на Google+, а я перепостил их. Появилась целая куча заинтересованных комментариев. Некоторые люди захотели послушать MP3, так что я сделал один для примера. Реакции людей в скором времени привели меня к тому, что я выложил MP3 на YouTube, сопроводив его несколькими текстовыми скриншотами. (Если вам интересно, я создал скрины, симулировав несуществующее текстовое устройство, так что все это не такой уж "fakebit", как может показаться)
Когда вышло первое видео, я все еще не был уверен, способен ли однострочный код достичь утонченности моих 8-битных экспериментов. Одновременность, перкуссия, где они? Было бы также неплохо найти толковые басовые линии и прогрессии, ведь все это было бы так полезно для крошечной демосцены.
В какой-то момент кто-то заметил, что просто избавившись от части t*
и применив логические операторы к значениям смещения времени, можно добиться перкуссионных шаблонов и некоторых гармоний. Даже у такой простой формулы как t&t>>8
, представляющей собой звуковое воплощение заставки "munching squares", есть весьма интересные гармонические свойства. Некоторые ее черты можно усилить путем добавления постоянной в выходной сигнал. Простого логического генератора достаточно для объединения двух хорошо звучащих формул вместе (часто с появлением интересных артефактов, которые лишь добавляют звучанию насыщенности). Все это снабдило меня достаточным количеством материала для создания второго видео.
Если эксперименты продолжатся в томе же темпе, пройдет не так много недель, прежде чем мы найдем грааль. Очень короткую программу, которая способная синтезировать все элементы поп песни: ритм, мелодию, басовую партию, гармоническую прогрессию, макроструктуру. Возможно даже что-то, что по звучанию напоминает вокал. Посмотрим.
Не делалось ли это раньше?
У нас были технологии для всего это на протяжении десятилетий. Люди создавали музыкальные схемы, работающие на цифровой логике, создавали короткие программы, выводящие музыку, экспериментировали с хаотичными аудиовизуальными программами и испытывали различные алгоритмы для сочинения музыки. История математической теории музыки насчитывает свыше двух тысяч лет. Поэтому я нахожу удивительным тот факт, что мне раньше не попадалось ничего схожего с нашим открытием, несмотря на то, что я уже очень давно увлекаюсь высчитыванием и алгоритмированием музыкального синтеза. Я поискал на Google Scholar, но не нашел ничего, чтобы как-то соотносилось с нашими экспериментами. Однако я по-прежнему уверен, что многие уже додумывались до таких формул раньше, но их открытия по какой-то причине остались в безвестности.
Может быть, все дело в технологических расхождениях. Для строителей цифровых музыкальных схем, например, вещи вроде LFSR могут быть гораздо важнее, чем секвентальные счетчики. Во времена рассвета микрокомпьютеров, когда оперативной памяти уже было достаточно для хранения какой-нибудь музыкальной структуры, не было нужды симулировать ее с помощью простой логики. А может быть это все проблемы авангардного мышления: если вам нравится эксперементировать со случайными конфигурациями схем и странными формулами, вполне вероятно вы тот, кто научился ценить эстетику неожиданного сбоя и просто не хочет от нее уходить.
Демосцена находится в данном случае в особом положении, поскольку в ней не важны технологические расхождения. В эпоху гигабайтов и терабайтов, программисты демосцены исследуют потенциал все более коротких программ. И не смотря на это, эстетическое чувство здесь более традиционно, чем среди circuit-bender’ов и авангардных артистов. Ценность крошечного софтсинта зависит от того, насколько его звучание похоже на звучание настоящей музыки. Итало-диско, например.
Софтсинты 4-х килобайтного класса по-прежнему неплохо спроектированы. Они часто используют компактный код, способный симулировать аналоговый синтезатор, управляемый сохраненной последовательностью музыкальных событий. Однако, когда 256-байтный класс занял место 4к, все более необходимой стала возможность играть приличную музыку и в этом классе. По-прежнему можно придерживаться конструктивистского подхода. Например, я создал несколько 128-байтовых плееров на VIC-20, когда у меня осталось совсем мало памяти. Однако с тех пор как последние находки показали, что подход со случайным экспериментированием может показать лучший результат, чем детерминистический хакинг, люди стали соревноваться в нахождении все более и более впечатляющих музыкальных формул. Возможно это что-то, чему было предначертано судьбой выйти именно из демосцены, и ниоткуда больше.
То, что мне определенно нравится в этом "движении", так это его немедленная, совместная природа, когда люди делятся исходниками своих находок и основывают свои собственные опыты на результатах чужих усилий. Каждый может поучаствовать и обнаружить что-то новое и потрясающее, даже не имея большого опыта в программировании. Я не знаю, как долго продлится эта фаза исследований, но это может быть полезно для движения "Pan-Hacker Movement", которое пропагандирует продвижение махрового хакинга в массы.
Насколько это все основательно?
Если не считать нескольких детерминистических попыток, которые очень быстро раздувают код до сотен символов, процесс изучения до сих пор основывался на методе проб и ошибок. Несколько таких опытов, однако, быстро помогли выработать интуитивное чутье касательно того, какие виды формул могут послужить как ингредиенты для создания чего-то большего. Может быть, когда-нибудь в будущем кто-то выпустит поучительный математический и музыкально-теоретический анализ, который объяснит, как и почему наши алгоритмы работают.
Правда уже сейчас очевидно, что все это работает далеко за пределами PCM. Предыдущие 8-битные эксперименты, такие как "Wallflower", практически вслепую прописывали значения в регистры аудио и видео процессоров и, тем не менее, умудрялись добиваться интересных результатов. Медиахудожник Кайл Макдональд перевел кучку звуков в черно-белые растровые изображения, которые имеют довольно интересную "глючную" структуру. Обычно музыка выглядит довольно плохо, будучи переведенной в растровые изображения, и это касается даже маленьких чиптюнов, звучание которых схоже с нашими экспериментами, так что было довольно любопытно увидеть еще и визуальный потенциал.
Я представляю себе, как в контексте генеративных аудиовизуальных работ, простые побитовые формулы смогут выработать исходные данные, подходящие не только для музыки, но и для управления различными визуальными параметрами как функцией во времени. В таком случае 256-байтная демосцена, например, получит интересную и разнообразную визуальную структуру с крепкой и неотъемлемой синхронизацией эффектов и музыки. Если формулы, с которыми мы экспериментировали, смогут производить микроструктуру и макроструктуру, то можно предположить, что их можно будет использовать для того, чтобы одинаково хорошо управлять низкоуровневыми и высокоуровневыми параметрами. От амплитуды волн и цвета пикселей до выбора слоя, пути движения камеры и конструкции трехмерной сцены. Но сейчас это просто предположения. До тех пор, пока кто-то не сделает эксперименты с этими параметрамами.
Не могу сказать, есть ли во всем этом что-нибудь такое уж важное. В конце концов, мы знаем о фракталах и у нас есть теория хаоса. Но, по крайней мере, это здорово для того вида искусства, которым я занимаюсь, и для меня это имеет значение. Я, возможно, буду исследовать аудиовизуальные потенциалы формул еще какое-то время, и напишу об этом в блоге.