Разработка ритм-игры TERRORHYTHM. "Под капотом", или заметки программиста.

Первый вопрос, который задает себе разработчик, планирующий сделать ритм игру - “А будет ли реально ритм влиять на геймплей?”. Если ответ утвердительный, и разработчику мало простого визуального отклика пары эффектов на сцене, то в самое ближайшее время возникает второй вопрос - “Хочу ли я давать игроку загружать свою собственную музыку?”. Конечно, этот вопрос может возникать, даже если вы делаете просто интерактивную музыкальную сцену, но по-настоящему критичным он становится только для тех, кто привязывает геймплей к музыке. Ведь дать пользователю возможность загружать желаемые трэки - значит вложиться в разработку анализатора и генератора игрового уровня именно по этому трэку, а также проводить объемное тестирование на большом количестве различной музыки, сопровождаемое всесторонней отладкой. А переложить создание уровней на самих игроков и пользователей через Steam Workshop - идея сомнительная, если не имеешь устоявшегося сообщества.

Разработка ритм-игры TERRORHYTHM. "Под капотом", или заметки программиста. Инди игра, Инди-разработка, Terrorhythm, Steam, Ритм-игра, Gamedev, Длиннопост

Работая над игрой TERRORHYTHM, мы понимали, что программный анализ звука - задача хоть и популярная, но все же нетривиальная, и взяться за нее небольшой студией - дело ответственное и в чем-то даже рискованное. И все же мы не решились отказаться от реализации это killer-фичи, дать пользователю кромсать мобов в ритм его любимой композиции.


Ритм - вот центр нашего геймплея. Тот самый пресловутый BPM (beats per minute), с частотой которого вы качаете головой, или барабаните пальцами по столу под драйвовый трэк. Но чтобы строить игру вокруг ритма, его сначала нужно добыть. Музыка для игрового движка - это по сути всего лишь пачка сэмплов, которые этот движок умеет воспроизводить своими силами, плюс немного информации о них.


Задача извлечения из музыки BPM не новая, даже если игнорировать сегмент ритм-игр, производители DJ-оборудования и программных секвенсеров музыки проделали огромную работу в этом направлении. И даже после всех этих исследований производители часто доверяют определение темпа человеку.

Разработка ритм-игры TERRORHYTHM. "Под капотом", или заметки программиста. Инди игра, Инди-разработка, Terrorhythm, Steam, Ритм-игра, Gamedev, Длиннопост

-  стучим по кнопочке CUE в ритм песни, чтобы “вертушка” поймала его


Мы изучили множество публикаций и материалов, прежде чем пришли к какому-то промежуточному решению, которое сработало для нас.


Музыка - сложная звуковая волна, колебания воздуха в вашей комнате, в клубе, или же между мембраной ваших наушников и барабанной перепонкой. Преобразование этих колебаний в нечто мелодичное и ритмичное (то, что наш мозг делает автоматически), требует определенных вычислений. В большинстве своем эти вычисления - быстрое преобразование Фурье, которое представляет комплексный звуковой сигнал в виде суммы синусоид определеных частот и громкостей. Для тех, кому сложно с ходу понять, как кривая связана со звуком, поясним: звуковая волна синусоидальной формы - это простейший музыкальный тембр, знакомый каждому, например, по телефонным гудкам. Частота этой синусоиды - это высота звука, а амплитуда - его громкость. Для наглядности приведем разложение на синусоиды простейших форм звуковой волны:

Разработка ритм-игры TERRORHYTHM. "Под капотом", или заметки программиста. Инди игра, Инди-разработка, Terrorhythm, Steam, Ритм-игра, Gamedev, Длиннопост

Конечно, для музыки спектр получаемых частот выглядит куда сложнее, практически по всему спектру есть частоты разной громкости. Хотя, если вы вспомните любой музыкальный спектроанализатор (люди часто ошибочно называют это “эквалайзер”), объяснения не потребуются - это наглядная картина того, во что превращается звук после быстрого преобразования Фурье :)

Разработка ритм-игры TERRORHYTHM. "Под капотом", или заметки программиста. Инди игра, Инди-разработка, Terrorhythm, Steam, Ритм-игра, Gamedev, Длиннопост

- громкости звучания частот от низких к высоким слева направо


Так вот благодаря игровому движку, который сделал это преобразование за нас, мы можем работать с музыкой, как с массивом сэмплов (количество которых на секунду зависит от качества и сжатия записи), из которых в каждый момент времени мы можем понять - какие частоты сейчас звучат и с какой амплитудой.


Используя эти данные нам нужно решить несколько задач.

Задача первая и главная - определение BPM песни. К ритму композиции привязаны почти все внутриигровые параметры - от скорости движения и спавна монстров до скорости проигрывания отдельных анимаций и роста комбо-счетчика.


Чтобы определить BPM, нужно сначала понять, что такое бит. Обычно под битом мы понимаем начало короткого повторяющегося музыкального отрезка, зацикливание которого (с небольшими изменениями) задает основной темп песни. Классической основой ритм-секции является сочетание ударных и баса (будь то рок, металл, джаз или электронная музыка). Знание об этом дает нам примерное представление, пики громкости каких частоты мы будем искать в нашей музыке. Наша цель основная цель - диапазон до 120Гц, однако помимо него мы проанализируем еще небольшую полосу в районе 1кГц, где часто “сидят”, например, электро-гитары, поддерживающие ритм секцию.


Во-первых нам нужно понять, в каком диапазоне громкости звучат данные чистоты на протяжении песни, чтобы делать какие-то относительные выводы. Получив значения минимальной и максимальной громкостей, можно приступать к анализу. Если говорить коротко, анализ представляет собой последовательный проход по сэмплам от начала песни к ее концу, сравнивая значения частот на выбранном диапазоне с минимальными\максимальными значениями и между собой. Составив своеобразную “карту перепадов громкости низких частот”, мы стараемся выявить периодические последовательности - пики, повторяющиеся через равные промежутки времени (к счастью для меломанов и к сожалению для анализирующих звук, басовые и ударные партии могут быть сложными и разнообразными). Наиболее часто встречающееся значение такого промежутка мы берем в качестве длительности бита, от которого уже вычисляем BPM.

Разработка ритм-игры TERRORHYTHM. "Под капотом", или заметки программиста. Инди игра, Инди-разработка, Terrorhythm, Steam, Ритм-игра, Gamedev, Длиннопост

Анализатор реагирует по-разному на разные песни - разумеется, хаус-музыка, где бас-бочка отбивает четкий постоянный ритм, проще всего поддается анализу. С агрессивными жанрами металла, где барабанщики вытворяют невиданной быстроты и сложности финты, ситуация обратная. Тут как раз нам помогает дополнительная полоса частот, в которой сидят гитары и “рабочий барабан” (самый пронзительный и звонкий из барабанов установки). К тому же не стоит забывать про музыкальные жанры с плавающей размерностью, где музыкальные фразы могут быть разного размера и длины - джаз, матрок и другие.


Еще одним препятствием анализу является компрессия звука. Этот прием пост-обработки музыки сейчас применяется многими продюсерами в различных жанрах. Суть его такова, что разницу между самыми тихими и самыми громкими звуками (т.н. динамический диапазон) в песне намеренно сокращают с целью без потери качества и “перегрузки” оборудования на пиках увеличить конечную громкость записи. Очевидно, что экстремальная компрессия (которой иногда грешат поп и электро продюсеры) может значительно усложнить составление “карты перепадов громкости” и сделать конечный результат анализа слишком неточным.

Разработка ритм-игры TERRORHYTHM. "Под капотом", или заметки программиста. Инди игра, Инди-разработка, Terrorhythm, Steam, Ритм-игра, Gamedev, Длиннопост

Для того, чтобы создать еще одну опору алгоритму определения BPM, нами была добавлена синхронизация в процессе проигрывания музыки. Предварительный анализ трэка давал нам усредненные значения, которые мы брали за основу. В соответствии с этими значениями мы устанавливали время бита и запускали главный таймер игры. В процессе воспроизведения музыки мы периодически синхронизируем этот таймер с составленной ранее “карты перепадов”. Если отклонение большое - следующая синхронизация назначается через короткое время и в геймплей вводятся некоторые послабления, чтобы игрок не получал штрафы из-за технической ошибки анализа, если отклонение небольшое - значит все идет хорошо и следующую синхронизацию можно провести позже.


Добавив к этим основам еще несколько тонкостей анализа и синхронизации, мы получили относительно рабочую версию механизма, улавливающего бит песни. Теперь можно и пошаманить над интерактивностью уровня - спавн более сложных цепочек мобов в наиболее напряженные моменты песни, красивый отклик сцены и т.п.


Но на случай, чтобы у игрока не было неприятных эмоций в игре под старинную пластинку его дедушки, или аритмичный металл-команды его друзей, мы честно говорим при попытке загрузить песню - извините, но у нас не получилось поймать ритм этого трэка, попробуйте что-нибудь попроще.


Ранние посты по разработке игры:

https://pikabu.ru/story/proekt_igryi_terrorhythm_animation_a...

https://pikabu.ru/story/razrabotka_terrorhythm_animatsiya_pr...

https://pikabu.ru/story/razrabotka_igryi_terrorhythm__music_...

https://pikabu.ru/story/komiks_po_igre_terrorhythm_5526003

https://pikabu.ru/story/terrorhythm__vtoraya_igra_ot_evilcog...


Страница игры в Steam: http://store.steampowered.com/app/752380


С уважением,

EvilCoGames Team

evilcogames@gmail.com

Лига Разработчиков Видеоигр

6.7K поста22.2K подписчиков

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

1
Автор поста оценил этот комментарий

От игры веет Тартаковким.

Я про Samurai Jack. Не оттуда ли ли вдохновение пришло?))

Иллюстрация к комментарию
Иллюстрация к комментарию