Обновление (02.08.2014): выложил скрипт, который анимирует досочки паркета и добавляет звук. Скачать этот скрипт можно отсюда.
Это продолжение статьи о генерации звуков в 3ds Max.
Создаём командный файл для SoX.
Чтобы создать командный файл DOS для SoX достаточно создать новый текстовый файл создатель-бздыньков.txt (НЕ word-файл), а потом переименовать его в создатель-бздыньков.bat. Теперь его можно открыть виндовым блокнотом Notepad (хотя я пользуюсь бесплатным, но отличным Notepad++ с подсветкой синтаксиса и другими рюшечками) и начать редактировать, создавая строчки кода.
создатель-бздыньков.bat:
sox бздыньк.wav промежуточный-бздыньк.wav pad %1s
sox -m -v 0.2 промежуточный-бздыньк.wav -v 1 результат.wav промежуточный-результат.wav
del результат.wav
ren промежуточный-результат.wav результат.wav
Итак, полагаем, что у вас уже есть файл результат.wav (это может быть как просто звук тишины, так и какой-то трек для музыкального фона вашей анимации). Также у вас уже есть звук бздыньк.wav, который вы хотите замиксовать с музычкой в фоне, скажем, на второй секунде (что эквивалентно 88200 семплам, при частоте дискретизации звука 44100 Гц). Чтобы это сделать достаточно выполнить в командной строке такую команду:
создатель-бздыньков 88200
Расшифровываю, что значит каждая строчка в командном файле:
- создаётся временная копия звука бздыньк с добавлением тишины в начале. Длина тишины определяется переменной %1, которая представляет собой первый параметр, который находится в командной строке (в примере выше - это 88200);
- получаем микс из двух файлов промежуточный-бздыньк.wav и результат.wav и этот микс записывается в промежуточный-результат.wav. Параметр -v перед каждым исходным файлом определяет их громкость в результирующем миксе;
- удаляется старый результат.wav;
- промежуточный-результат.wav переименовывается в результат.wav.
В результате получаем новую версию файла результат.wav, где в нужном месте наложен звук бздыньк.
Более того, можно вставить множество бздыньков в разных местах музычки, запустив командный файл столько раз, сколько нужно:
создатель-бздыньков
5600создатель-бздыньков
88200создатель-бздыньков
254000
А этот запуск в свою очередь также может быть автоматизирован созданием еще одного командного файла с этими строчками внутри.
Взаимодействие с 3ds Max.
Наиболее простой метод взаимодействия 3ds Max с SoX - это через MAXScript.
Если вы совсем незнакомы с работой скриптов внутри 3ds Max, то ничего страшного. Сначала ознакомьтесь со статьёй, где я доступно рассказываю о написании скриптов в 3ds Max и можете смело продолжать чтение этого урока.
В моём примере с досточками, я просто написал скрипт, который в хаотическом порядке выбирает паркетинку из заданного мной выделения и переворачивает её. Как результат я знаю точное время, когда этот переворот случился и точную координату досочки, которая в данный момент времени переворачивается.
Поэтому я просто добавил две строчки скрипта к коду, который анимирует мои деревянные планочки. Эти строчки запускаются каждый раз, когда происходит анимация одной досочки:
...
stroka = "echo call dobavka_zvuka " + (((myFrameNumber) * (44100/24)) as string) + " >> D:\desktop\fail_zvukov.bat"
DOSCommand stroka
...
Досочка падает на пол в момент времени myFrameNumber. Множитель 44100/24 определяет сколько семплов содержится в одном кадре анимации при скорости 24 кадра в секунду.
После выполнения первой строчки кода, переменная stroka будет содержать такое значение "echo call dobavka_zvuka 42000 >> D:\desktop\fail_zvukov.bat
".
Команда as string сказала Максу, что результат умножения нужно превратить в текст (она преобразовала число в текст).
Вторая строчка кода запускает выполнение команды, содержащейся внутри переменной stroka. Т.е. команда echo говорит Максу "Напечатай текст call dobavka_zvuka 42000
в текстовый файл D:\desktop\fail_zvukov.bat
".
Теперь, каждый раз, когда Макс анимирует досочку, он прибавляет в мой fail_zvukov.bat (который будет создан в папке D:\desktop\) новую строчку кода. После того, как вся анимация досочек, покрывающих пол, готова, я имею на выходе fail_zvukov.bat, который содержит такой список команд:
call
dobavka_zvuka
2310
call dobavka_zvuka
9600
call dobavka_zvuka
42000
call dobavka_zvuka
67500
call dobavka_zvuka
74320
call dobavka_zvuka
83250
...
Всё что теперь осталось - это создать финальный микс, просто запустив командный файл fail_zvukov.bat. Каждая строчка кода в этом файле будет вставлять нужный звук в нужное место на аудио дорожке, чтобы соответствовать анимации. Результат будет такой, как показан на втором видео в первой части статьи. Я его для удобства продублирую тут еще раз:
Добавляем реализма.
В примере выше звук получился абсолютно неживым, монотонным и неприятным слуху. Чтобы добавить реализма, я дописал в скрипт несколько дополнительных строчек кода, которые формируют такой код:
call
dobavka_zvuka
16533 0.636172 0.730065 0.869443 185 129
call dobavka_zvuka
18370 0.991783 0.726184 0.835618 173 129
call dobavka_zvuka
20207 1.04784 0.714123 0.793614 161 129
call dobavka_zvuka
22044 0.82246 0.720484 0.856228 181 127
call dobavka_zvuka
23881 1.30767 0.713917 0.819717 169 127
call dobavka_zvuka
25718 0.959634 0.70992 0.842029 177 124
call dobavka_zvuka
27555 1.32945 0.701057 0.803222 165 124
...
Расшифрую каждое значение по очереди
- время вывода звука;
- число выбранное наугад из диапазона 0.6 - 1.4, которое нужно мне для вариации звучания удара досточки об пол;
- громкость звука в правом канале (это и следующее число учитывает также удалённость планочки от камеры, т.е. чем дальше от камеры, тем тише звук);
- громкость звука в левом канале (чем дальше звук от камеры в левую сторону, тем громче он в левом канале и тише в правом);
- задержка звука в правом канале (в реальной жизни, если звук идёт справа, то он попадает в левое ухо с некоторой задержкой относительного правого уха; именно для этого я ввёл эту и следующую задержи);
- задержка звука в левом канале.
Командный файл dobavka_zvuka теперь будет немного сложнее, чем в примере выше создатель-бздыньков.bat:
rem Модифицируем скорость звука, чтобы он звучал немножко не так как другие:
sox zvuk.wav temp-zvuk-speed.wav speed %2
rem Изменяем громкость левого и правого канала и добавляем нужное количество тишины перед звуком из предыдущего шага:
sox temp-zvuk-speed
.wav temp-zvuk.wav pad %1s remix 1v%4 2v%3
rem Добавляем задержку для левого канала:
sox temp-zvuk.wav leftcomp.wav remix 1v1 1v0 pad %6s
rem Добавляем задержку для правого канала:
sox temp-zvuk.wav rightcomp.wav remix 2v0 2v1 pad %5s
rem Объединяем правый и левый каналы в один файл
newoutput.wav
и миксуем его с output.wav
:
sox -m -v 1 output.wav -v 0.5 leftcomp.wav -v 0.5 rightcomp.wav newoutput.wav
rem Удаляем старый
output.wav
и переименовываем newoutput.wav в output.wav
:
del output.wav
ren newoutput.wav output.wav
Вот и всё!
Обалденная экономия времени! Реалистичный звук, да еще и генерируется автоматически!
Это, конечно же, не все возможности. Можно озвучивать, к примеру, падение осколков вокруг камеры, выводя звуковой эффект на 6 каналов (звук 5.1). Можно привязывать разные звуки к разным объектам, а потом создавать motion graphics сразу с озвучкой. И так далее.
Более того, такое взаимодействие возможно не только между SoX и 3ds Max, но также можно использовать любой другой 3D пакет, который умеет выводить информацию в текстовый файл.
Подпишитесь на обновление блога (вот 3 причины для этого).
Будут вопросы, спрашивайте в комментариях - объясню :).
Вам понравилась статья? Хотите отблагодарить автора? Расскажите о ней друзьям.
Или подпишитесь на обновление блога по E-Mail.
комментариев 8 к статье “Озвучивание событий в 3ds Max с помощью SoX, часть 2”
Извините, в данный момент комметарии закрыты.
Спасибо, классный урок! Давно искал способ автоматического озвучивания как в FoleyStudio от BoomerLabs. А можно поподробнее о коде скрипта? Какой код писать чтобы генерировались параметры для добавления реализма (громкость, задержка)?
И еще вопрос, можно таким способом реализовать, например, перемещающуюся по сцене музыку, т.е. один длинный звуковой трек?
Перемещающуюся по сцене музыку реализовать можно, но, как по мне, то это быстрее можно сделать в обычном звуковом редакторе. Нужно просто указанные промежутки трека (между ключевыми точками, которые связаны с анимацией в 3ds Max) приглушать в одном канале и/или увеличивать громкость другого канала.
По-поводу того какой скрипт писать, чтобы генерировались параметры для изменения громкости, задержки. Это просто зависимость расстояния источника звука от камеры.
Я делал так. Брал координаты самого дальнего объекта от камеры и назначал ему самую тихую громкость (какая мне нужна). Потом брал самый близкий источник звука и назначал этой координате самую большую громкость. А все объекты, расстояние от которых до камеры было между этими экстремальными значениями, озвучивал пропорционально.
А если камера движется в сторону самой дальней точки? тогда получается же, что звук от дальней точке всё равно будет тихим как бы близко мы к ней небыли?
Расстояние до камеры определяется в каждом кадре. Поэтому такой проблемы не будет.
Спасибо за статью!
https://www.dropbox.com/s/ir4x6c2h6bc2m8o/mParticles%20collision%20sounds.7z?dl=0
Если кому то будет интересно, попробовал сделать на основе данной статьи озвучивание столкновений между частицами mParticles в Particle Flow:
Просто распаковать папку Render в корень диска С, открыть файл «mParticles collision sounds.max», отрендерить анимацию. Потом открыть Particle View, включить оператор «mP Collision», включить и выключить оператор Del old collision File (если нужно удалить старую версию), нажать на Play Animation и подождать пока ползунок не достигнет конца анимации, нажать на Go to Start и выключить оператор «mP Collision». Тоже самое сделать с «mP InterCollision».
В папке c:\Render\SoX\ запустить файл !!!RUN.bat, после завершения процесса в этой же папке появиться готовый микс «!mix.wav» который можно наложить на анимацию.
Особо не тестировал, могут быть глюки..
О, спасибо! А есть где на результат посмотреть? (может видео на youtube?)
Видео на YouTube:http://youtu.be/kJ_5EjZ6Lhc
Раскрасил в разные цвета при столкновениях, для наглядности.
Заметил баг: если открыть файл и запустить симуляцию два раза подряд, то вторая симуляция и последующие будут отличаться от первой. Возможно еще в каких то случаях физика может начать просчитываться по другому, так что с этим надо быть осторожней, иначе звуки могут не совпасть с анимацией.