Работаем со звуком в визуальной новелле
Доброго времени суток, дорогие читатели паблика «Алый вестник». С вами Тотал (Сергей), и в сегодняшнем выпуске «Среды разработки» мы затронем одну интересную тему. А поможет мне Роман.
В начале было слово. Неизвестно, кто и зачем его произнес, однако письменность тогда еще не изобрели, да и с бумагой были проблемы. Так что пришлось его озвучить, громко и с чувством.
В современных играх важность озвучки трудно переоценить - подчас источник звука мы сначала слышим и лишь затем видим. От того, насколько качественно реализовано позиционирование звука, зависит вовлеченность в игровой процесс. Справедливо это и для визуальных новелл: звуки дождя, шаги за стеной, разговоры на фоне - все это способствует большей иммерсивности (эффекту присутствия).
Для грамотного “приготовления” звука стоит понимать, что может движок игры, а что лучше реализовать с помощью сторонних программ. Разберемся на примере RenPy.
Каналы и их разделение
Ren’Py позволяет достаточно гибко настроить аудиомикшер с несколькими независимыми или связанными каналами.
По умолчанию уже объявлены три:
music для фоновой музыки (зацикленный)
sound для звуков (однократное воспроизведение)
voice для озвучки (если новелла с озвучкой)
объявить новые каналы можно в блоке init python:
….renpy.music.register_channel("music1", "music", True)
Разберем, что здесь:
(как и в прошлой статье, все куски кода взяты из реальных проектов, точки обозначают пробелы, т.к. ВК портит оформление кода)
renpy.music.register_channel - функция регистрирует новый канал в микшере. Всегда указывается music даже если использоваться будет для других целей.
"music1" название канала, чтобы потом его использовать play music1 “имя трека.mp3”
"music" - это для регулятора громкости в настройках. Все музыкальные каналы удобно вешать на один регулятор, “шумовые” на другой, можно добавлять свои, ниже будут примеры.
True - указывает на то, что звук в этом канале будет зациклен. Для однократного проигрывания- False
Давайте объявим еще один канал для фоновых шумов и повесим его на регулятор громкости звука:
….renpy.music.register_channel("bgs", "sfx", True)
bgs - название канала
sfx - название регулятора громкости
True - звук зациклен
И еще один канал, пусть будет для оповещений об ачивках (как пример):
….renpy.music.register_channel("ach", "alarm", False)
ach - название канала для использования в коде как play ach “звук оповещения.mp3”
alarm - название регулятора громкости в настройках (микшера)
False - чтобы звук проигрывался только один раз
И в настройки вынесем регулятор громкости для этого нового канала:
.…bar value MixerValue('ach')
Плавное изменение громкости, кроссфейд и перемещение звука по сцене:
Согласитесь, не очень хорошо звучит, когда мелодия в игре резко обрывается и так же резко начинает звучать другая. Для исправления этой ситуации можно применить плавное затухание и нарастание громкости:
play music “theme1.mp3” fadein 2
“...”
stop music fadeout 2
“...”
play music “theme2.mp3” fadein 2
Здесь мы сначала запускаем первую тему, плавно увеличивая громкость от 0 до максимума за две секунды, затем через сцену - плавно глушим музыку в 0, и еще через сцену так же плавно запускаем другую музыкальную тему. Вроде бы неплохо, но можно сделать лучше:
play music1 “theme1.mp3” fadein 2
“Какой-то текст”
stop music1 fadeout 2
play music2 “theme2.mp3” fadein 2
В этом случае мы используем несколько каналов и делаем между ними кроссфейд:
запустим в первом канале первый трек с нарастанием громкости, затем одновременно приглушим его и запустим в другом канале второй трек, также с нарастанием громкости. Таким образом, на сцене один трек плавно заменится другим, без пауз, тишины или резких обрывов. Да, нужно внимательно следить, что в каком канале запущено, но этот метод позволяет добиться лучшего звучания в игре.
Кстати, сами треки можно объявлять по аналогии с изображениями:
define audio.m_trum1 = "sound/trum1.mp3" # Музыка в трюме
и используем в коде:
play music m_trum1
Что еще интересного можно сделать?
$ renpy.music.set_pan(-0.9, 0, channel='bgs') #устанавливаем, что звук в канале bgs будет звучать слева (принимает значение от -1 до 1, центр - 0), второй параметр - это задержка, с которой источник звука “переместится” влево от предыдущего “положения”.
play bgs "sound/fire.mp3" fadein 1 # и запустим в этом канале звук костра. Если играть в наушниках, будет отчетливо слышно, как костер горит слева на сцене.
$ renpy.music.set_pan(-0.9, 0, channel='sound')
$ renpy.music.set_pan(0.9, 5.0, channel='sound')
play sound “car.mp3” #этот код заставит звук машины перемещаться слева направо за 5 сек.
$ renpy.music.set_volume(0.5, delay=2, channel='music') #изменит громкость музыки от текущего значения до половины (приглушение) за 3 секунды.
сложение и дублирование каналов, запуск с задержкой для подобия эхо
Частичное воспроизведение, очередь, пауза и текущий трек:
play sound1 "<from 0 to 2>sound/step.mp3" #Проиграет звук шагов с начала до 2й секунды в канале sound1
queue sound1 ["<from 0 to 2>sound/step.mp3", "sound/door_close.mp3"] # проиграет сначала часть звука шагов, потом сразу звук закрывающейся двери
play sfx2 ["<silence 1.0>","audio/step_slow_in2.ogg"] #Проиграет сначала секунду тишины, затем звук шагов
$ renpy.music.set_pause(True, channel='music') #Поставим музыку на паузу
$ renpy.music.set_pause(False, channel='music') #И продолжим с текущего момента
Это удобно делать, например, при вызове менюшек, а при их закрытии - не перезапускать трек, а продолжать. Но можно и где-нибудь в сюжете применить.
$ now_play = renpy.music.get_playing(channel='music') #Вернет имя файла, который сейчас играет в канале music. Потом можно вывести через $renpy.notify (now_play)
Для демонстрации возможностей движка мы подготовили небольшой тестовый проект-аудиоспектакль.
Аудиоредакторы
С возможностями движка разобрались, чем же нам помогут сторонние программы? Существует множество аудиоредакторов и секвенсоров: платные Adobe Audition, Sound Forge, WaveLab, Sonar и бесплатные Audacity, GoldWave, Ardour. Возможности платных программ гораздо шире, но для наших задач вполне подойдет бесплатный Audacity.
Также, сразу подскажем, откуда брать звуки для вашего проекта. Многие знают такие сайты, как Freesound или wav-library, добавим к ним noisefx, BBC Sound Effects и MusicRadar. Безусловно, это не все сайты с бесплатными сэмплами и звуками, неплохой список есть на CreativeCommons, а через поиск можно найти еще пару десятков.
Нормализация и выравнивание громкости звуков. Удаление тишины.
После того, как мы обзавелись всеми необходимыми звуками и музыкой, стоит выровнять их громкость, чтобы не было слишком громких или тихих моментов, да и написание кода нам это облегчит. Эта процедура называется “Нормализация”.
Слишком высокий уровень выставлять не стоит, избыточная громкость ни к чему. В большинстве случаев будет достаточно -6 дБ, что уже довольно громко. Для музыки рекомендуется вдвое меньшее значение.
В отдельных случаях можем задать громкость для какого-то конкретного звука, если вы хотите выделить или приглушить его на общем фоне:
Как правило, усиления на 3 дБ вполне достаточно, чтобы выделить нужный момент. Также можно задать и отрицательное значение — тогда звук будет соответствующим образом ослаблен.
Также, для корректной работы эффектов кроссфейда, стоит убрать тишину в начале и конце дорожек:
Эти простые действия являются своего рода базой. Дальше начинается та самая “магия”, которая добавит нам атмосферности и реализма.
Глушение, эквалайзер, прочие фильтры.
Допустим, у нас есть сцена, где персонажи разговаривают через препятствие. В зависимости от твердости материала, из которого состоит препятствие, можно сделать соответствующее глушение частот. Более твердые материалы, такие как бетон или камень, лучше отражают высокие частоты, но поглощают низкие. Дерево же, наоборот, поглощает высокие частоты. Металл придает звуку характерный резонанс, к тому же, как довольно твердый материал, склонен к поглощению низких частот.
На помощь нам приходит эквалайзер, которым мы можем слегка приглушить соответствующие частоты.
В общем случае, достаточно слегка приглушить верхние частоты и убавить громкость - нужный эффект будет достигнут.
Также стоит понимать, что звук в помещении и на открытом пространстве различается. Где-нибудь в лесу мы слышим эхо, в бетонном коридоре - реверберацию. Эти эффекты есть и в Audacity.
Как видите, мы можем гибко задать параметры исходя из наших условий. Не бойтесь экспериментировать для достижения лучшего результата.
Помните, что перед применением эффектов всегда можно прослушать предварительный результат, нажав соответствующую кнопку.
Ну и наконец несколько слов о сведении. Как вы можете знать, при создании музыки каждый инструмент записывается отдельно, а затем дорожки с записью поочередно накладываются друг на друга. Для постановки сложных сцен мы можем поступить точно так же, это позволит нам упростить код, но сузит возможность применения получившегося эффекта. Как правило, таких сцен немного, так что вариант со сведением в редакторе имеет полное право на жизнь.
Каждую дорожку в отдельности можно панорамировать, чтобы она воспроизводилась с нужной вам стороны.
Таковы, вкратце, возможности простого аудиоредактора. Вкупе с функционалом RenPy они позволяют ставить весьма неплохие эффекты, которые позволят с головой погрузиться в мир вашей новеллы.
Авторы статьи и оформление: Total, Роман
Обложка: miku_xikka.
