Адаптивная музыка на примере FMOD

Адаптивная музыка на примере FMOD

Теория

Для начала, как это обычно бывает, немного теории. Как мы знаем любая музыкальная композиция являет собой абсолютно линейное произведение, в котором все события заранее спланированы автором и случаются в определённое время с определённой целью.

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

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

Как нам снова подсказывает русская «Википедия» адаптивная музыка это:

Адаптивная музыка на примере FMOD

В общем, мы лучше обратимся к английской википедии.

«Ноги» у адаптивной музыки растут аж из 1981 года — во Frogger музыка резко менялась, когда игрок достигал безопасной точки. Со временем, адаптивная музыка становилась всё сложнее и были сформированы основные методы: «горизонтальный» и «вертикальный».

«Горизонтальный» метод заключается в переключении между заранее подготовленными музыкальными сегментами в зависимости от игровой ситуации. Классический пример — пока игрок бродит по локации играет спокойная музыка, но как только он вступает в бой, включается боевой сегмент.

«Вертикальный» метод заключается в «переоркестровке» на лету — включении или отключении партий инструментов в зависимости от игровой ситуации. Например, вы хотите менять музыку в зависимости от количества врагов, с которыми сражается игрок. Пока врагов нет, тихонько играет перкуссия, потом подключаются бас и барабаны; а когда врагов становится достаточно много мы слышим полный микс.

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

Процесс создания адаптивной музыки можно условно поделить на три этапа: планирование, написание музыки и имплементация.

Планирование

Адаптивная музыка на примере FMOD

Предположим у нас есть схема уровня: «катсцена — первая локация — вторая локация — третья локация». Здесь идеально подойдет «горизонтальный» метод — нам нужно создать три музыкальных сегмента и переключать их при смене локаций. Катсцену за сегмент не считаем, так как она проигрывается только один раз в начале.

Также у нас на уровне есть враги, и мы хотим менять музыку в зависимости от их количества. Здесь используем «вертикальный» метод — пока врагов нет играет минималистичный эмбиент, а потом постепенно подключаются новые инструменты.

В рамках данной статьи я решил сделать только два изменяемых параметра: локацию и количество врагов — так проще для понимания. Но на деле с помощью «вертикального» метода можно делать очень сложные саундтреки, реагирующие на десятки параметров.

Написание музыки

Адаптивная музыка на примере FMOD

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

Для начала нам нужно определиться, как у нас будут осуществляться переходы между сегментами. Можно использовать обычные кроссфейды или квантизацию (о ней чуть позже). Мы выберем второй вариант, благо в FMOD она есть.

При написании адаптивной музыки нам нужно придерживаться нескольких простых правил.

Во-первых, по возможности избегать ходов, когда инструмент начинает играть «из-за такта», то есть вступать немного раньше своего сегмента. Иначе может получится ситуация, когда инструмент вступил в конце первого сегмента, а во втором его партии нет, и он просто обрывается «на полуслове».

Во-вторых, используя обработки следует помнить о «хвостах» инструментов, особенно длинных дилеях и реверберации — мы будем экспортировать лупы определенной длины и всё лишнее будет обрубаться.

В-третьих, старайтесь создавать различные варианты одного и того же сегмента. Нет ничего хуже, чем статичный луп, который несколько минут играет без каких-либо изменений.

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

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

Имплементация

Адаптивная музыка на примере FMOD

Вот мы и добрались до FMOD. На данном этапе у нас есть хитрый план и целая гора аудиофайлов (в нашем случае 33).

Первым делом создаём (и соответствующее называем) аудиодорожки для каждого трека и закидываем туда наши аудиофайлы.

Первую лепту в интерактивность нашего трека внесет Его Величество Рандом.

Адаптивная музыка на примере FMOD

В FMOD, помимо всего прочего, существует такая штука как Multi Instrument. Его отличие от обычного Single Instrument в том, что в него можно загрузить несколько аудиофайлов и каждый раз будет проигрываться случайно выбранный аудиофайл. Это хорошо подходит для создания разнообразия в рамках одного музыкального сегмента.

Теперь, когда все дорожки наполнены, нам нужно создать логическую структуру нашего трека. Сейчас пройдемся по каждому пункту отдельно.

Адаптивная музыка на примере FMOD
  1. Указываем музыкальный размер и темп — это нужно для корректной работы квантизации
  2. Создаём зацикленные области, каждая из которой будет отвечать за свой музыкальный сегмент
  3. Создаём маркеры перехода для каждого сегмента
  4. Создаём области перехода, которые привязаны к определённым маркерам

Пустая область в начале отведена под катсцену, там будет проигрываться линейный сегмент музыки.

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

Настройка области перехода на вторую локацию
Настройка области перехода на вторую локацию

В настройках области перехода указываем, что срабатывать она должна, когда параметр Phase равен от 2 до 2,9 (такой широкий диапазон нужен для избежания ошибок). А заодно указываем интервал квантизации в четыре такта (1 квадрат) — теперь переход не будет внезапным. После того, как FMOD получит команду на смену сегмента, он сначала доиграет до конца текущий сегмент и только потом переключится. Собственно для этого квантизация и нужна.

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

Для включения или отключения инструментов мы воспользуемся банальной автоматизацией громкости. Для этого создаем ещё один параметр, у нас это будет Parameter 1, и устанавливаем диапазон значений от 1 до 10.

А потом рисуем нашу любимую автоматизацию для каждого инструмента.

По сути, в любой момент времени все инструменты играют, они активны, разница лишь в уровне громкости
По сути, в любой момент времени все инструменты играют, они активны, разница лишь в уровне громкости

На выходе мы получим нечто такое.

Снова извиняюсь за звук в моно, наши специалисты работают над этим

Данный пример очень простой и, чтобы не растягивать статью, я сознательно опустил некоторые моменты, как технические, так и музыкальные. Может быть, в следующий раз расскажу про использование MIDI, Pure Data и прочие хитрые технологии.

Если вы хотите поделиться своим опытом создания игры или рассказать какую-то историю, связанную с геймдевом, то смело нажимайте кнопку «Написать» и делитесь опытом. А мы, отредактировав текст (если это потребуется), перенесём его в раздел Gamedev.

7474
43 комментария

Девелоперам и композиторам порекомендую посмотреть Elias - музыкальный движок, заточенный под реализацию адаптивной музыки. Есть интеграция с Unity, и Unreal, возможно связать также с Wwise, Fmod и Fabric.

https://www.eliassoftware.com/

18
Ответить

Хорошая статья.

Только "затакт", а не "потому что такт"

И перфоманс от такого количества дорог точно будет не радужным.

5
Ответить

Только "затакт", а не "потому что такт"Вот тут не понял, это про что?

И перфоманс от такого количества дорог точно будет не радужным.3% загрузка CPU, только что проверил. И это при том, что аудио не пожатое, после экспорта в саундбанк еще меньше будет.

1
Ответить

Комментарий недоступен

4
Ответить

Хорошая статья!

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

Технический директор на проекте совершенно не обрадуется такому подходу. Лучше всё же чётко обозначить слои на этапе планирования и не перегружать RAM и CPU без явных причин.

2
Ответить

В принципе, до оптимизации и экспорта банка в движок такой подход возможен. Я когда собираю в FMOD трек - иногда перкуссию рендерю "построчно". Потом после экспериментов с автоматизацией - отсекаю лишнее и рендерю по 2-3 дорожки в 1. Группирую в стемы всё, что можно сгруппировать, и решаю простым фильтром те вопросы, которые решала громкостью, например (иногда это звучит интереснее). Т.е. 11 дорожек удобны в прототипе ивента, но не рискую делать так в финальной сборке. RAM и CPU - это ладно. А что с загруженностью диска произойдёт, если стримингом 11 дорог гнать?

2
Ответить

Времена экономии на звуке уже давно канули в лету, нагрузка там мизерная на самом деле, даже по меркам мобильных игр. Конечно, лучше все планировать заранее, но когда разработка игр шла по плану? ;)

Ответить