Аудио

Как и в большей части визуальных новелл, в Бесконечном Лете можно проигрывать аудио, будь то музыка или фоновые звуки. Для этого используются стандартные команды play, stop и queue.

Рекомендуемые форматы файлов

Из всех доступных в Ren'Py форматов чаще всего используются:

  • WAV — Высокое качество с минимальными потерями, но большими размерами файлов. Рекомендуется для бесшовного повтора (когда момент повтора не заметен слушателю). РМШ — 5 169 КБ. Имейте в виду: Ren'Py поддерживает только один стандарт формата — несжатый подписанный 16-битный PCM (signed 16-bit PCM)!
  • MP3 — Файлы сжимаются до минимально возможного размера с сохранением качества, но из-за особенности кодировки звука (а именно структуры файла) в начале и конце файла могут появиться паузы, а при повторном воспроизведении — щелчки. Не рекомендуется для бесшовного повтора. РМШ — 2 346 КБ.
  • Ogg Vorbis — Альтернатива MP3 с открытым кодом, настолько же хорошим качеством аудио и меньшим, по сравнению с MP3, размером файла. Этот формат тоже использует блоки, как и MP3, но при этом имеет информацию о настоящих границах аудио, поэтому может использоваться для бесшовного повтора. РМШ — 1 852 КБ.

Также существуют менее популярные форматы:

  • FLAC — Формат, предназначенный для сжатия аудио без потерь, но имеющий самый большой размер файлов по сравнению с другими. РМШ — 7 695 КБ.
  • Opus — Формат с самым эффективным сжатием. С правильными настройками можно добиться очень малых размеров файла без значимых помех в звуке. РМШ — 1 759 КБ.
  • MP2 — Формат, используемый до MP3. Устарел, использование не рекомендуется. РМШ — 2 811 КБ.

Под бесшовным повтором имеется в виду повторное воспроизведение файла с незаметным переходом в начало и ощущением непрерывности с самого начала.

Под РМШ имеется в виду примерный размер (в килобайтах) файла с одной и той же записью белого шума длительностью ровно в одну минуту и с наилучшим возможным качеством. Конвертация в другие форматы производилась в программе Audacity с кодеком LAV Audio Decoder.


По этим данным можно составить таблицу:

Формат Качество Размер РМШ (КБ)
WAV 9/10 3/10 5 169
MP3 6/10 7/10 2 346
OGG Vorbis 8/10 9/10 1 852
FLAC 10/10 2/10 7 695
Opus 6/10 10/10 1 759
MP2 5/10 5/10 2 811

Таким образом, можно сделать вывод, что:

  • Лучшее соотношение качества и размера файла имеет формат OGG Vorbis. Он подходит лучше всего, если вы не хотите тратить место, но хотите иметь адекватное качество аудио.
  • Лучшее качество звука имеет формат FLAC. Он не имеет потерь, но и весит больше всех.
  • Меньше всего места занимает формат Opus. Имея то же качество, что и MP3, весит он почти в полтора раза меньше.
  • Если вам неважно качество, размер файлов и бесшовность, то вы можете использовать формат MP3 с его адекватным качеством звука, размерами файлов и распространённостью.

Аудиоканалы

Ren'Py поддерживает неограниченное количество аудиоканалов. По умолчанию в Ren'Py созданы всего три:

  • music — канал для проигрывания музыки. Аудиофайлы, проигрываемые на этом канале, по умолчанию повторяются.
  • sound — канал для проигрывания звуковых эффектов. Аудиофайлы, проигрываемые на этом канале, по умолчанию не повторяются.
  • voice — канал для проигрывания голоса персонажей. Аудиофайлы, проигрываемые на этом канале, по умолчанию не повторяются.

При разработке Бесконечного Лета были созданы ещё несколько каналов:

  • sound2sound3 — аналогичны каналу sound.
  • sound_loopsound_loop2sound_loop3 — каналы для проигрывания повторяющихся звуков. Аудиофайлы, проигрываемые на этих каналах, по умолчанию повторяются.
  • ambience — канал для проигрывания эмбиента (фонового шума). Аудиофайлы, проигрываемые на этом канале, по умолчанию повторяются.

Помимо обычных аудиоканалов существует один специальный — audio. Этот канал поддерживает одновременное воспроизведение нескольких аудиофайлов, но не поддерживает использование команд queue и stop (несмотря на это, звуки в этом канале всё ещё можно воспроизводить с зацикливанием (аргумент loop), что может сильно испортить игровой процесс). Также этот аудиоканал используют свойства стиля hover_sound и activate_sound.

Команда play

Команда play используется для воспроизведения аудиофайла в повествовании. Если файл в данный момент воспроизводится на обычном канале, он прерывается и заменяется новым файлом. После команды play ожидается название аудиоканала. За ним следует путь к файлу или содержащий его объект.

play <Название канала> <Путь к файлу>

Примеры:

play sound "sfx/achievement.ogg" # Проиграть звук по пути "sfx/achievement.ogg" на канале sound
play mymod_channel_music mymod_sfx_distortedSouls # Проиграть звук по пути из переменной mymod_sfx_distortedSouls на канале mymod_channel_music

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

play music [music_list["everyday_theme"], music_list["pile"], music_list["lets_be_friends"]] # music - канал; music_list["everyday_theme"] и т. д. - переменные

Аргументы fadein, fadeout

Аргумент fadein создаёт эффект нарастания громкости звука, а fadeout — его затухания. Если аргумент fadeout не задан, для затухания используется значение конфигурационной переменной config.fadeout_audio (по умолчанию равна 0.0).

play <Название канала> <Путь к файлу> fadein <Длительность нарастания>
play <Название канала> <Путь к файлу> fadeout <Длительность затухания>
play <Название канала> <Путь к файлу> fadein <Длительность нарастания> fadeout <Длительность затухания>

Примеры:

play sound sfx_alisa_falls fadein 1.0 # Громкость звука будет нарастать ровно одну секунду
play music music_list["orchid"] fadein 5.0 fadeout 2.5 # Громкость звука будет нарастать пять секунд и затухать две с половиной

Аргумент loop

Аргумент loop позволяет зацикливать звук при его проигрывании (допустим, если звук проигрывается на канале без зацикливания и использован аргумент loop, то он будет повторяться).

play <Название канала> <Путь к файлу> loop

Пример:

play sound sfx_achievement loop

Аргумент noloop

Аргумент noloop позволяет проиграть звук один раз без зацикливания. Он не работает на каналах без зацикливания по умолчанию, но не позволит звуку проигрываться снова на каналах вроде music или ambience.

play <Название канала> <Путь к файлу> noloop

Пример:

play music sfx_achievement noloop

Аргумент if_changed

С аргументом if_changed звук на канале начнёт проигрываться, только если до этого он не проигрывался.

play <Название канала> <Путь к файлу> if_changed

Пример:

label start_label:
    play music music_list["forest_maiden"]
    jump next_label
label next_label:
    play music music_list["forest_maiden"] if_changed

Аргумент volume

Аргумент volume позволяет настроить относительную громкость проигрываемого звука в диапазоне от 0.0 до 1.0, где 0.0 — самая низкая громкость, 1.0 — самая высокая громкость. (Можно использовать значения и больше 1.0, но это крайне не рекомендуется. Будет больно.)

play <Название канала> <Путь к файлу> volume <Громкость>

Пример:

play sound sfx_bush_leaves volume 0.1

Внимание! Аргумент не работает на бета-ветке БЛ, поскольку он поддерживается только с версии Ren'Py 7.4.0 и выше, (бета — 7.3.5).

Команда stop

Команда stop используется для остановки воспроизведения аудиофайла. В начале пишется ключевое слово stop, за которым следует имя аудиоканала, на котором необходимо остановить файл. Также эта команда может иметь аргумент fadeout. Если аргумент fadeout не задан, для затухания используется значение конфигурационной переменной config.fadeout_audio.

stop <Название канала>
stop <Название канала> fadeout <Длительность затухания>

Примеры:

stop music
stop ambience fadeout 2.0

Команда queue

Команда queue используется для постановки аудиофайлов в очередь. Они будут воспроизведены, когда канал завершит воспроизведение текущего файла.

queue <Название канала> <Путь к файлу>

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

Пример:

play music "music/intro.ogg" noloop
queue music "music/loop.ogg"

Дополнительные манипуляции с аудио

Частичное воспроизведение

Ren'Py поддерживает частичное воспроизведение аудиофайлов. Это делается путём помещения перед самим файлом заключённого в угловые скобки уточнения, откуда и докуда он должен проигрываться. Значения всегда интерпретируются как секунды от начала файла.

play <Название канала> "<from <Начало отрезка> to <Конец отрезка>>" + <Путь к файлу>
play <Название канала> "<loop <Начало повтора>>" + <Путь к файлу>

Начало отрезка указывает позицию в файле, с которой начинается первое воспроизведение. По умолчанию это значение равно 0.0 секунд.

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

Начало повтора указывает позицию в файле, с которой начинается воспроизведение второго и последующих повторов. По умолчанию это время начала, заданное параметром from, если указано, или 0.0 секунд.

Примеры:

play music "<from 5 to 15.5>mymod/music.ogg"
play music "<loop 6.333>" + mymod_music
play music "<from 0 to 10>" + music_list["smooth_machine"]

Синхронизация позиции старта

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

play <Название канала> "<sync <Название другого канала>>" + <Путь к файлу>

Пример:

play music "layer1.ogg"                 # Проигрываем "layer1.ogg" на канале music
...
play music2 "<sync music>layer2.ogg"    # Синхронизируемся с уже играющим каналом

Внимание! Функция не работает на бета-ветке БЛ, поскольку она поддерживается только с версии Ren'Py 7.4.0 и выше, (бета — 7.3.5).


Проигрывание тишины

В Ren'Py имеется возможность проигрывания тишины. Для этого вместо файла впишите:

"<silence <Длительность тишины>>"

Пример:

play music "<silence 1.5>" noloop   # Проигрываем полторы секунды тишины...
queue music "mymod/music.ogg"       # И после этой паузы включаем музыку

Python-функции, связанные с аудио

Управление воспроизведением

renpy.play(filename, channel=None, **kwargs)

Проигрывает звук filename на канале channel. Если аргумент channel имеет значение None, то будет использовано значение конфигурационной переменной config.play_channel.


renpy.music.play(filenames, channel='music', loop=None, fadeout=None, synchro_start=False, fadein=0, tight=None, if_changed=False, relative_volume=1.0)
  • filenames — файл или список файлов для проигрывания.
  • channel — аудиоканал, на котором проиграется музыка. По умолчанию — music.
  • loop — если значение этого аргумента равно True, то воспроизведённый файл будет повторяться. По умолчанию — None.
  • fadein — если значение не равно None, то время, за которое громкость файла будет нарастать.
  • fadeout — если значение не равно None, то время, за которое громкость файла будет затухать.
  • synchro_start — если значение равно True, то файл будет воспроизведён синхронно с другими файлами, запущенными через эту функцию с этим же аргументом, равным True.
  • tight — если значение равно True, то затухание будет распространяться и на следующий файл в очереди. Если None, то используется значение аргумента loop.
  • if_changed — если True и на этом канале уже воспроизводится файл, то его воспроизведение не будет прервано.
  • relative_volume — устанавливает громкость файла относительно громкости микшера в диапазоне от 0.0 до 1.0, где 0.0 — минимальная громкость, 1.0 — максимальная громкость.

renpy.music.queue(filenames, channel='music', loop=None, clear_queue=True, fadein=0, tight=None, relative_volume=1.0)
  • filenames — файл или список файлов для проигрывания.
  • channel — аудиоканал, на котором проиграется музыка. По умолчанию — music.
  • loop — если значение этого аргумента равно True, то воспроизведённый файл будет повторяться. По умолчанию — None.
  • clear_queue — если True, то очередь будет очищена, и файл сразу начнёт своё воспроизведение. (Внимание! По умолчанию этот аргумент всегда равен True!)
  • fadein — если значение не равно None, то время, за которое громкость файла будет нарастать.
  • tight — если значение равно True, то затухание будет распространяться и на следующий файл в очереди. Если значение равно None, то используется значение аргумента loop.
  • relative_volume — устанавливает громкость файла относительно громкости микшера в диапазоне от 0.0 до 1.0, где 0.0 — минимальная громкость, 1.0 — максимальная громкость.

renpy.music.stop(channel='music', fadeout=None)
  • channel — аудиоканал, на котором будет прекращено воспроизведение файла. По умолчанию — music.
  • fadeout — если значение не равно None, то время, за которое громкость файла будет затухать.

Получение информации

renpy.music.get_duration(channel='music')

Возвращает длительность файла, воспроизводимого на канале channel, в секундах. По умолчанию аргумент channel равен 'music'.


renpy.music.get_pos(channel='music')

Возвращает текущую позицию воспроизведения файла, воспроизводимого на канале channel, в секундах. По умолчанию аргумент channel равен 'music'.


renpy.music.get_loop(channel='music')

Возвращает True, если воспроизведение файла на канале channel зациклено. По умолчанию аргумент channel равен 'music'.

Внимание! Функция не работает на бета-ветке БЛ, поскольку она поддерживается только с версии Ren'Py 7.4.0 и выше, (бета — 7.3.5).


renpy.music.get_pause(channel='music')

Возвращает True, если воспроизведение файла на канале channel приостановлено функцией renpy.music.pause() или экранным действием Pause(). По умолчанию аргумент channel равен 'music'.


renpy.music.is_playing(channel='music')

Возвращает True, если в данный момент на канале channel воспроизводится любой файл. По умолчанию аргумент channel равен 'music'.


renpy.music.get_playing(channel='music')

Возвращает путь к файлу, проигрываемому в данный момент на канале channel. По умолчанию аргумент channel равен 'music'.


renpy.seen_audio(filename)

Возвращает True, если файл filename хоть один раз был воспроизведён в системе или помечен как воспроизведённый функцией renpy.mark_audio_seen(filename).


Прочие

renpy.music.register_channel(name, mixer, loop=None, stop_on_mute=True, tight=False, file_prefix='', file_suffix='')

Создаёт новый аудиоканал с именем name.

  • name — название нового канала.
  • mixer — микшер нового канала. Может быть musicsound или voice.
  • loop — если значение этого аргумента равно True, то воспроизведённые на этом канале файлы будут повторяться. По умолчанию — None.
  • stop_on_mute — если True, то воспроизведение файлов будет остановлено, если громкость микшера будет равна нулю. По умолчанию — True.
  • tight — если True, то затухание будет распространяться и на следующий файл в очереди на этом канале. По умолчанию — False.
  • file_prefix — устанавливает приставку в начале каждого файла, воспроизводимого на этом канале. По умолчанию — ''.
  • file_suffix — устанавливает окончание в конце каждого файла, воспроизводимого на этом канале. По умолчанию — ''.

renpy.music.set_pan(pan, delay, channel='music')

Настраивает панорамирование звука, используя значение аргумента pan, на аудиоканале channel в течение delay секунд. Значение аргумента pan должно находиться в диапазоне от -1.0 до 1.0, где -1.0 — весь звук в левом канале, 1.0 — весь звук в правом канале. По умолчанию значение аргумента channel равно 'music'.


renpy.music.set_pause(value, channel='music')

Если значение аргумента value равно True, то воспроизведение файлов на канале channel будет приостановлено. По умолчанию значение аргумента channel равно 'music'.


renpy.music.set_volume(volume, delay=0, channel='music')

Настраивает громкость звука на канале channel, используя значение аргумента volume, в течение delay секунд. Значение аргумента volume должно находиться в диапазоне от 0.0 до 1.0, где 0.0 — минимальная громкость, 1.0 — максимальная громкость. По умолчанию значение аргумента delay равно 0, значение аргумента channel равно 'music'.


renpy.music.set_queue_empty_callback(callback, channel='music')

Устанавливает функцию callback, которая выполнится, когда в списке воспроизведения канала channel закончатся файлы. По умолчанию значение аргумента channel равно 'music'.


renpy.mark_audio_seen(filename)

Помечает файл filename как уже воспроизведённый в системе.


renpy.mark_audio_unseen(filename)

Помечает файл filename как ни разу не воспроизведённый в системе.