BGforgeNet / ipsdoc

Interplay sound doctor
https://forums.bgforge.net/viewforum.php?f=22
4 stars 1 forks source link

Как это работает? #1

Closed FakelsHub closed 3 years ago

FakelsHub commented 3 years ago

Питон ужасно сложный язык для понимания простого программиста) Что делает этот скрипт, он конвертирует звук в асм?

burner1024 commented 3 years ago

Это просто обертка над snd2acm, который всю работу и делает внутри. А питоном потом просто битрейт поправляется в заголовке acm получившегося.

egornovivan commented 3 years ago

Что делает этот скрипт, он конвертирует звук в асм?

Тут более детальнее https://github.com/gemrb/gemrb/issues/633

FakelsHub commented 3 years ago

Что делает этот скрипт, он конвертирует звук в асм?

Тут более детальнее gemrb/gemrb#633

Как раз таки там ничего непонятно. Где кодек который кодирует acm в 44кгц??? вы же просто меняете битрейт с 22 на 44. или snd2acm позволяет закодировать acm с частатой 44, вы уверены в этом? исходников то к snd2acm нет.

FakelsHub commented 3 years ago

Если snd2acm честно кодирует в 44 то движок (его DirectSound) можно переделать на 44 Я планировал сделать воспроизведение wav через DirectSound, но для acm вроде как легче будет сделать поддержку формата 44кгц, так как ненужно будет писать код для потокового чтение wav файла.

burner1024 commented 3 years ago

ну если ускоренный в 2 раза играется нормально, значит все сэмплы там, нет?

egornovivan commented 3 years ago

честно кодирует в 44

Да, все честно кодирует. У acm и движка игры только одна проблема, движок просто игнорирует значение сэмплрейта в хедере acm и воспроизводит со скоростью 22 050 сэмпла в секунду в независимости от значения в хедере.

сделать воспроизведение wav

До недавнего времени был сторонником wav, но размер файлов слишком уж большой, особенно у 24bit wav, поэтому и перевел все в wma lossless

FakelsHub commented 3 years ago

честно кодирует в 44

Да, все честно кодирует. У acm и движка игры только одна проблема, движок просто игнорирует значение сэмплрейта в хедере acm и воспроизводит со скоростью 22 050 сэмпла в секунду в независимости от значения в хедере.

У движка нет поддержки для 44, все его звуковые буфера создаются в 22кгц. Wav нужны в первую очередь для sfx звуков, а не для вашей uhd музыки.

У меня что-то большие сомнения что конвертер правильно кодирует.

burner1024 commented 3 years ago

Я не понимаю, что такое "правильно". Частота это количество сэмплов в секунду. Пихаем 2 секунды 22 кГц в одну - получаем 44.

FakelsHub commented 3 years ago

Вы тесты делали?, например взять два файла один в 22 второй в 44 сконвертировать их. и деконвертировать обратно в вав и посмотреть в редакторе на звуковую составлющую у второго она должна быть она лучше. Ну или на слух, чем вы прослушивали 44 асм?

burner1024 commented 3 years ago

Вот упомянутый мод для Baldur's Gate, который использует 44 acm. Его я лично слушал ушами в игре.

FakelsHub commented 3 years ago

Я не понимаю, что такое "правильно". Частота это количество сэмплов в секунду. Пихаем 2 секунды 22 кГц в одну - получаем 44.

Правильно - это значит конвертер не трогает pcm данные wav файла т.е не видоизменяет их к 22кгц а просто конвертирует в формат файла acm. Частота дискретизации это не только скорость воиспроизведения.

burner1024 commented 3 years ago

Но если бы он их видоизменял, то асм/22 полученный из wav/44 проигрывался бы нормально а не замедленно в два раза, разве нет?

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

FakelsHub commented 3 years ago

По идеи да.

Там просто плохо описанный формат.

burner1024 commented 3 years ago

Вот тут код snd2acm, или весьма приближенный к нему. Мне тяжело разобраться, но вроде никакого ресэмплинга нет. Так что я думаю создание буфера на 44 должно позволить нормально проигрывать. Что собственно, в моде для BG и делается, только там тупой патч ехе, поэтому им приходится вообще все acm перекодировать на 44, вместо того чтобы правильно считать заголовок и проиграть звук соответственно.

egornovivan commented 3 years ago

Вы тесты делали?, например взять два файла один в 22 второй в 44 сконвертировать их. и деконвертировать обратно в вав и посмотреть в редакторе на звуковую составлющую у второго она должна быть она лучше.

изображение все как положено быть, только хедер нужно выправлять у 44 wav

а вот оригинал для сравнения. изображение

видно что конвертирование в acm и обратно немного съедает качество

FakelsHub commented 3 years ago

все как положено быть

Почему отличается?

а вот оригинал для сравнения.

нужно брать исходник в 44, а не "оригинал" который уже в 22 был до этого конвертирован. исходник wav 44 > конвертируем snd2acm (с правкой хеадера по видимому) исходник wav 44 > ресемпл в 22 > конвертируем сравниваем.

egornovivan commented 3 years ago

а вот оригинал для сравнения.

нужно брать исходник в 44, а не "оригинал" который уже в 22 был конвертирован.

Оригинал и есть lossless исходник. Взял лосслесс и из него сделал wav 22050 16 bit и 44100 16bit, потом эти wav сконвертировал в acm и обратно. 22050 и 44100 это кстате НЕ khz как ошибчно многие думают, это количество сэмплов в секунду, а у меня на скрине реальные khz на шкале.

burner1024 commented 3 years ago

И то и другое меряется в герцах. Герц это 1/сек, так что все правильно. Отличается потому что шкала на первом скрине половинная. Выше там ничего нет, отрезано.

egornovivan commented 3 years ago

так что все правильно.

Минута цифровой тишины изображение 0 hz/khz, но сэмплов у нас 44100х60. Несколько разные единицы измерения, но связанны друг с другом.

burner1024 commented 3 years ago

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

egornovivan commented 3 years ago

так как ненужно будет писать код для потокового чтение wav файла.

Кстати, а почемубы в sfall не реализовать хак из фаргуса? я так понимаю они не стали возиться с acm и просто поправили exe так чтобы он смог читать wav с хедером acm

FakelsHub commented 3 years ago

они просто тупо заблокировали функцию декодирования для голосовых файлов. как это работает.

  1. движек ищет файл .acm
  2. читает его заголовок.
  3. читаются небольшие кусочки данных из файла, и отправляет их на декодирование, функция декодирования возвращает pcm данные.
  4. pcm данные отправляются в буфер.
  5. проигрывается звук.
  6. перейти к пункту 3

Если честно то это хреновый способ, и он не подходит.

Я даже не знаю, что лучше сделать поддержку .acm 44 или .wav wav уже есть через DirectShow, но это не подходит для sfx-звуков, имеется задержка в ~150ms, и не работает уменьшение громкости при определении удаленности источника звука от ГГ игрока на карте.

burner1024 commented 3 years ago

Лучше, конечно, и то и другое (и еще flac/ogg). А в ближайшей перспективе лучше хоть что-нибудь, чем ничего. Так что для начала я бы брался за то, что проще/быстрее.

FakelsHub commented 3 years ago

проще acm. прикрепите сюда хоть какой-нибудь acm 44 и тот же в 22 для тестов (желательно музыку но не фоллатовскую)

(и еще flac/ogg)

не спасибо. но flac (может и ogg) и так работает через DirectShow если сменить его расширение на wma и установить кодеки [действительно ли это для wine мне неизвестно]

burner1024 commented 3 years ago

bgtheme.zip Вот тема BG. (оба хедера 22)

А flac надо тогда попробовать для HQ/UHQ музыки.

egornovivan commented 3 years ago

flac/ogg

Советую посмотреть в сторону WavPack. Умеет в lossless и lossy(hybrid), есть поддержка pcm s32le/f32le, есть рабочие инсталяторы с фильтрами/кодеками для DirectShow. Единственное что нужно добавить в sfall это обнаружение файлов с расширениями .wv .flac .ogg

FakelsHub commented 3 years ago

Ну и зачем этот хоровод? Я вообще хотел wma убрать, но раз он умеет в лосслесс то пусть живет.

egornovivan commented 3 years ago

Ну и зачем этот хоровод?

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

burner1024 commented 3 years ago

Попробовал только что UHQ flac переименованный в wma - работает без проблем под wine. А чего молчали-то, что так можно? Надо тогда музыку перегнать, раза в два меньше будет занимать. С буфером на 44 вообще конфетка будет. Насчет расширения, ну наверное правильнее сделать, чтобы искал и flac тогда тоже, но это не принципиально, главное что хоть как-то можно получить lossless.

egornovivan commented 3 years ago

хоть как-то можно получить lossless.

Существует wma lossless, но у него сжатие довольно слабое и просто конвертировать недостаточно, нужно еще и уровень громкости выправлять, а это в свою очередь требует 24bit на сэмпл. Вот тут отписался и оставил ссылки http://www.nuclear-city.com/index.php/topic/174-%D0%BC%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D1%86%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BC%D1%83%D0%B7%D1%8B%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%82%D1%80%D0%B5%D0%BA%D0%B8-fallout-1-2/#entry87941

А чего молчали-то, что так можно?

Проблема в том что под виндой flac не работает, точнее он работает если поставить кодеки соотвествующие.

burner1024 commented 3 years ago

Кому надо именно lossless, у того скорей всего уже кодеки есть. Ну а для тех, у кого еще нет, легко ссылку добавить в readme. В любом случае, главное улучшение это поддержка 44 кГц, ждем его.

egornovivan commented 3 years ago

легко ссылку добавить в readme.

У меня не получилось правильно установить эти кодеки https://www.xiph.org/dshow/downloads/ они похоже не совместимы с win10. klite https://codecguide.com/download_kl.htm установились и работают, но эти кодеки гарантируют проблемы со многими играми(вылеты, фризы, хрипения). Уже более 10лет эти проблемы донимают игроков x3 terran conflict, а еще когдато в fallout 3 такое наблюдал. wavpack http://www.wavpack.com/downloads.html установились и работают, только похоже надо ставить сразу обе версии x32 и x64

FakelsHub commented 3 years ago

Реализовал поддержку для 44khz. Взял музыкальный файл с обильными высокими частотами, сконвертировал его в 22 и 44 acm файлы. Протестировал. Разницу сразу заметно даже для глухих, тот который 22 вообще крипит и искажается по сравнению с 44. 44 играет идеально.

FakelsHub commented 3 years ago

В принципе можно пропатчить сам snd2acm.exe на то чтобы он записывал в заголовок всегда 44100. и будет отдельный snd2acmHQ.exe

burner1024 commented 3 years ago

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

FakelsHub commented 3 years ago

сделай чтобы Drag&Drop-пом работало без всякой cmd хрени.

burner1024 commented 3 years ago

Gui ты имеешь ввиду? Так и оригинальный snd2acm только cmd же.

FakelsHub commented 3 years ago

Нет. Кидаешь файл на твой exe, и он там сам должен сделать все. (если конечно умеешь)
а то Drag&Drop работает только если на батник кидать.

FakelsHub commented 3 years ago

Если питон не установлен работает без него? у меня 2.7. на нем тоже работает.

burner1024 commented 3 years ago

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

FakelsHub commented 3 years ago

на .net легко. на пистоне не знаю (не учу его, ибо не перевариваю его синтаксис).

burner1024 commented 3 years ago

Попробуй.

FakelsHub commented 3 years ago

Ну и зачем этот хоровод?

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

Каждый раз когда проигрывается звук всегда будет просматриваться этот хоровод из расширений., что влечет за собой небольшую задержку для [sfx] звуков. В общем добавить можно, но позже когда наведу порядок с sfx звуками.

FakelsHub commented 3 years ago

Попробуй.

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

burner1024 commented 3 years ago

Я не знаю просто как это в windows работает. Так что пробуй, если какие-то проблемы - объясняй, или ссылку какую-нибудь дай, где расписано как windows обрабатывает.

egornovivan commented 3 years ago

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

При запуске игры можно ведь в массив загрузить полные имена файлов и просеять на дублирующиеся имена с приоритетом на расширения wav > wma > flac > wv > mp3 > ogg > acm

Реализовал поддержку для 44khz.

Замечательно, ещебы переписать encoder до acm lossless и можно забить на другие форматы. Думаю вполне реально сделать lossless acm или хотябы свести шакалистость к минимуму.

egornovivan commented 3 years ago

snd2acmHQ.exe

Давайте чтоле договоренность какуюто сделаем по качеству? HQ(high quality) обычные acm с параметром -q0 AHQ(acm high quality/advanced high quality) 44100 acm UHQ(ultra high quality) вариации lossless и lossy

а то у меня уже конвертирована куча acm c HQ в именах каталогов и архивов. Могу и исправить имена, но это займет значительно времени.

FakelsHub commented 3 years ago

Я не знаю просто как это в windows работает. Так что пробуй, если какие-то проблемы - объясняй, или ссылку какую-нибудь дай, где расписано как windows обрабатывает.

На всех системах это одинаково работает, тут главный вопрос как это в питоне сделано, в других я зыках входной параметр args -это массив аргуметов, в даном случае список файлов. Вот в терии на с++ https://coderoad.ru/4659105/%D0%9A%D0%B0%D0%BA-%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C-%D0%BF%D0%B5%D1%80%D0%B5%D1%82%D0%B0%D1%81%D0%BA%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-%D0%BD%D0%B0-exe-%D0%B8-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D0%B5%D0%B3%D0%BE-%D0%B2-%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B0

Ладно если не можешь, то и фиг.

FakelsHub commented 3 years ago

Что-то ты там наделал теперь это не работает просит какую-то dll из windows перекомпилируй по старому а то эта теперь на 2 мб меньше.

FakelsHub commented 3 years ago

HQ(high quality) обычные acm с параметром -q0

это по факту LQ, не знаю где там HQ увидели.