О звуке простыми словами42Производители Hi-Fi.
Истории и интервью111Репортажи с заводов65Репортажи с Hi-Fi выставок69"Сделай сам"44Готовые проекты Аудиомании42Пресса об Аудиомании50Видео496Фотогалерея100Интересное о звуке805Новости мира Hi-Fi2563Музыкальные и кинообзоры621Глоссарий
Крошечный генератор мелодий на JS — как он устроен
Рассказываем об инструменте ZzFXM, который пригодится разработчикам инди-игр или веб-приложений, вынужденных оперировать сильно ограниченным объемом памяти.
Также поговорим об аналогах — rFXGen, wafxr.
Подробнее о проекте
ZzFXM представил программист и автор блога о разработке игр Killed By a Pixel — Фрэнк Форс (Frank Force). В своих материалах он уделяет особое внимание вопросам экономии памяти. Однажды он написал симулятор пианино на JavaScript, занимающий всего один килобайт.
Генератор мелодий продолжает эту идею — Фрэнк разработал его специально, чтобы генерировать музыку для ультра-маленьких программ. Такие проекты реализуют в рамках открытых соревнований js13k Games, участники которых пишут игры на HTML5 и JavaScript, используя десятки Кбайт памяти.
Исходники и инструкция по настройке лежат в репозитории на GitHub.
Что под «капотом»
Утилита использует движок ZzFX для написания звуковых эффектов, напоминающих восьмибитные. Она позволяет контролировать девятнадцать параметров звучания: от громкости до частоты и формы волны. Примеры звуков, которые способна сгенерировать ZzFX, можно найти на сайте Фрэнка Форса. ZzFXM использует некоторые из них в качестве семплов.
Формат готовых файлов напоминает MOD, применявшийся для хранения и воспроизведения музыкальных композиций на персональном компьютере Amiga, поэтому все семплы со звучанием инструментов хранятся в разных файлах (принцип модульности).
Как это работает
Композитор составляет последовательность из нот с указанием того, какой инструмент и когда должен её сыграть. Эта последовательность называется треком. Несколько параллельно звучащих треков образуют блок (паттерн) со своим номером. Далее, композитор в программном коде указывает, какой паттерн и когда должен прозвучать.
Такой подход позволяет достаточно быстро сформировать желаемую композицию, однако итоговый код достаточно сложно читать без комментариев. В репозитории на GitHub автор генератора приводит следующий пример:
Послушать, как звучат треки, сгенерированные при помощи утилиты, можно на GitHub. Размер композиций не превышает 550 байт.
Какие есть аналоги
Одним из аналогов ZzFXM является rFXGen. Он написан на Си и основан на проекте sfxr — в 2007 году его представил один из участников соревнования LD48. В его рамках каждый разработчик должен за 48 часов представить небольшую игру. Утилита rFXGen поддерживает работу с осцилляторами, вибрато и фильтрами низких и высоких частот.
Еще один компактный звукогенератор — wafxr. Он формирует аудио в прямом эфире с помощью WebAudio API и библиотеки wasgen. Wafxr также поддерживает осцилляторы, тремоло/вибрато и различные фильтры. Демо работы есть на GitHub — там вы можете самостоятельно оценить инструмент.