Рассказываем об инструменте ZzFXM, который пригодится разработчикам инди-игр или веб-приложений, вынужденных оперировать сильно ограниченным объемом памяти.
Также поговорим об аналогах — rFXGen, wafxr.
Фото chuttersnap / Unsplash
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 поддерживает работу с осцилляторами, вибрато и фильтрами низких и высоких частот.
Фото Ohmydearlife / Pixabay
Еще один компактный звукогенератор — wafxr. Он формирует аудио в прямом эфире с помощью WebAudio API и библиотеки wasgen. Wafxr также поддерживает осцилляторы, тремоло/вибрато и различные фильтры. Демо работы есть на GitHub — там вы можете самостоятельно оценить инструмент.
Что у нас есть на Хабре:
Чтение по теме из «Мира Hi-Fi»:
Что такое музыкальное программирование — кто и почему им занимается
Взять и влиться в музыкальное программирование — языки, которые помогут это сделать
Как воспроизвести реалистичный звук в компьютерных играх и VR и почему это сложно
Как устроен Sporth — ЯП для музыкальных live-сессий
Занимательная музыка: Число 5 и немного о том, как «видят» музыку юзабилист и программист
Также поговорим об аналогах — rFXGen, wafxr.
Фото chuttersnap / Unsplash
Подробнее о проекте
ZzFXM представил программист и автор блога о разработке игр Killed By a Pixel — Фрэнк Форс (Frank Force). В своих материалах он уделяет особое внимание вопросам экономии памяти. Однажды он написал симулятор пианино на JavaScript, занимающий всего один килобайт.
Генератор мелодий продолжает эту идею — Фрэнк разработал его специально, чтобы генерировать музыку для ультра-маленьких программ. Такие проекты реализуют в рамках открытых соревнований js13k Games, участники которых пишут игры на HTML5 и JavaScript, используя десятки Кбайт памяти.
ZzFXM можно применять в разработке полноценных инди-игр. Она распространяется по лицензии MIT, поэтому походит для коммерческих проектов.
Исходники и инструкция по настройке лежат в репозитории на GitHub.
Что под «капотом»
Утилита использует движок ZzFX для написания звуковых эффектов, напоминающих восьмибитные. Она позволяет контролировать девятнадцать параметров звучания: от громкости до частоты и формы волны. Примеры звуков, которые способна сгенерировать ZzFX, можно найти на сайте Фрэнка Форса. ZzFXM использует некоторые из них в качестве семплов.
Формат готовых файлов напоминает MOD, применявшийся для хранения и воспроизведения музыкальных композиций на персональном компьютере Amiga, поэтому все семплы со звучанием инструментов хранятся в разных файлах (принцип модульности).
Как это работает
Композитор составляет последовательность из нот с указанием того, какой инструмент и когда должен её сыграть. Эта последовательность называется треком. Несколько параллельно звучащих треков образуют блок (паттерн) со своим номером. Далее, композитор в программном коде указывает, какой паттерн и когда должен прозвучать.
Такой подход позволяет достаточно быстро сформировать желаемую композицию, однако итоговый код достаточно сложно читать без комментариев. В репозитории на GitHub автор генератора приводит следующий пример:
[ // Song
[ // Instruments
[.9, 0, 143, , , .35, 3], // Instrument 0
[1, 0, 216, , , .45, 1, 4, , ,50], // Instrument 1
[.75, 0, 196, , .08, .18, 3] // Instrument 2
],
[ // Patterns
[ // Pattern 0
[ // Channel 0
0, // Using instrument 0
-1, // From the left speaker
1, // play C-1
0, 0, 0, // rest (x3)
3.5, // play E-1 with 50% attenuation
0, 0, 0 // rest (x3)
],
[ // Channel 1
1, // Using instrument 1
1, // From the right speaker
2, // play D-1
2.25, // play D-1 with 25% attenuation
3.5, // Play E-1 with 50% attenuation
4.75, // Play F-1 with 75% attenuation
-1, // Release the note
0, 0, 0 // rest (x3)
]
]
],
[ // Sequence
0, // Play pattern 0
0, // ...and again
],
120, // 120 BPM
{ // Metadata
title: "My Song", // Name of the song
author: "Keith Clark" // Name of the author/composer
}
]
Послушать, как звучат треки, сгенерированные при помощи утилиты, можно на GitHub. Размер композиций не превышает 550 байт.
Какие есть аналоги
Одним из аналогов ZzFXM является rFXGen. Он написан на Си и основан на проекте sfxr — в 2007 году его представил один из участников соревнования LD48. В его рамках каждый разработчик должен за 48 часов представить небольшую игру. Утилита rFXGen поддерживает работу с осцилляторами, вибрато и фильтрами низких и высоких частот.
Фото Ohmydearlife / Pixabay
Еще один компактный звукогенератор — wafxr. Он формирует аудио в прямом эфире с помощью WebAudio API и библиотеки wasgen. Wafxr также поддерживает осцилляторы, тремоло/вибрато и различные фильтры. Демо работы есть на GitHub — там вы можете самостоятельно оценить инструмент.
Что у нас есть на Хабре:
- Как погрузиться в атмосферу офиса, работая из дома
- Как энтузиасты скачивали компьютерные программы с помощью радио
Чтение по теме из «Мира Hi-Fi»:
Что такое музыкальное программирование — кто и почему им занимается
Взять и влиться в музыкальное программирование — языки, которые помогут это сделать
Как воспроизвести реалистичный звук в компьютерных играх и VR и почему это сложно
Как устроен Sporth — ЯП для музыкальных live-сессий
Занимательная музыка: Число 5 и немного о том, как «видят» музыку юзабилист и программист
Alexey2005
К сожалению, звуковые API в браузерах настолько убоги, что ими попросту невозможно пользоваться. Вот к примеру, вы заметили, какая большая задержка возникает при нажатии на кнопку «Play» в приведённых примерах? И она будет ещё больше, если запускать на смартфоне.
А всё потому, что весь трек требуется генерировать целиком — не существует простого и удобного способа сгенерировать скажем 2 секунды, и потом просто обеспечивать ротацию данных в буфере по мере их исчерпания.
Забавно, что самый простой и удобный способ решения проблемы, это… запуск Flash-апплета, в котором и будет идти работа со звуком! Потому что там это решается
BerkutEagle
Чем же Вам Media Source Extensions не угодил? AudioBufferSourceNode позволяет генерировать сигнал любой формы (свойство loop позволит его зациклить). Смешать звук из нескольких источников — тоже не проблема. Писать код конечно придётся, но ведь это же браузер, а не профессиональный софт для работы со звуком. Чем выше уровень API, тем уже круг решаемых им задач. По моему мнению, текущая реализация Media Source Extensions очень даже ничего.
ZvoogHub
— это абсолютно неверное утверждение
Web Audio API поддерживается браузерами почти 10 лет. Он включает в себя всё что нужно.
— вот простой пример. Можно тыкнуть Play и покрутить ручки чтоб убедиться что звук генерируется и меняется в рилтайме. Причём и эквалайзер, и копрессор, и реверберация реализуются стандартными средствами Web Audio API.
printf
Существует же, в я том году на js13k именно так сделал. Ссылки: код, работающая игра.
(Код выглядит как моя жизнь, но это хакатон, весь звук делался за день на коленке.)