diff --git a/docs/ACOUSTICS.md b/docs/ACOUSTICS.md index f36bfb3..9b4a3ab 100644 --- a/docs/ACOUSTICS.md +++ b/docs/ACOUSTICS.md @@ -55,6 +55,43 @@ GPL-файлы три: `acoustics/spr_occlusion.rs`, (стадия 2) `acoustics выстрел 1.5 с на 60 блоках, стена камня в 2 блока: ниже 300 Гц -5.2 дБ (SPR: gain 0.55), 300-1500 -7.4, 1500-5000 -19.7, выше 5000 -40.0 дБ. Тесты: `cargo test -p horizon-client --lib acoustics` (формулы, неизвестное, щель, кеш, инвалидация, детерминизм, рабочий поток) и `audio`. +### Настоящий MP4 с включённой акустикой (4 ноября, pin `73b9d3070`, API 29) + +Пары настоящих экспортов одного и того же повтора, с акустикой и без: кнопка мода «Акустика +(преграды, эхо)», затем тот же `/airdef replay export` (640×360, 30 fps, crf 20), offscreen Metal, +ffmpeg 9.0.1, scratch `HORIZON_HOME`/мир (не сохранения игрока). `HORIZON_ACOUSTICS=1` без +`HORIZON_NO_AUDIO`. В сохранённом мире значение акустики хранится в состоянии мода, поэтому env +задаёт только начальное значение: в проверке её включали и выключали кнопкой. + +Статусы в игре во время и после экспорта: `Акустика: API=true, включено=true, запрос=true, +подготовлено=true, ready`; `Захват этого мода: запрос=true, подготовлено=true, ready`. Контроль +`HORIZON_ACOUSTICS=1` + `HORIZON_NO_AUDIO=1`: `включено=true, запрос=true, подготовлено=false, +awaiting-backend` — ожидаемое отсутствие offline-микшера, не замена звуковому MP4. + +| Сцена | ON: кадры/с | OFF: кадры/с | RMS ON/OFF | пик ON/OFF | L/R corr ON/OFF | centroid ON/OFF | HF>4k ON/OFF | +|---|---|---|---|---|---|---|---| +| поле, 3 события, `sec=4` | 123/4.100 | 124/4.133 | −23.53/−23.26 | −7.18/−5.60 | 0.675/0.627 | 1089/1382 Гц | 0.071/0.095 | +| поле, 1 событие, весь фильм | 351/11.700 | 352/11.733 | −32.18/−16.19 | −12.41/−2.65 | 0.829/0.963 | 1157/1862 Гц | 0.075/0.138 | +| каменный двор 80×100×30 (стены), весь фильм | 430/14.333 | 430/14.333 | −22.06/−20.09 | −5.97/−5.76 | 0.915/0.985 | 232/652 Гц | 0.005/0.039 | + +Все пары — `h264` + AAC 48 кГц stereo, без обрезки звука; файлы `airdef-films/{ac,one,court}_{on,off}.mp4` +в scratch. Уже это показывает, что акустика реально обрабатывает дорожку фильма: в каменном дворе +OFF почти моно (L/R 0.985–1.000), ON декоррелирован (0.915); centroid и доля >4 кГц падают, как и +ожидается от окклюзии/воздушного поглощения; в поле ON тише OFF до 16 дБ по RMS за рельефом. + +Реверб/эхо: в каменном дворе отрезок 9–14 с (после склейки) описывается ON ≈ g·OFF, g = −2.03 дБ +(лучшее совмещение −32 сэмпла = 0.67 мс). Остаток −25.18 dBFS при сигнале −17.61 dBFS (на 7.6 дБ +ниже), centroid 546 Гц, доля >4 кГц 0.009, L/R corr 0.495: низкочастотный диффузный +декоррелированный компонент — это wet-путь (реверб/эхо), а не масштаб сухого сигнала. В открытом +поле send реверба равен нулю по построению (`acoustics/room.rs`: `a field has no send`), поэтому +поле показывает только окклюзию/поглощение, а реверб — только в замкнутой геометрии. + +Ограничения: чистый хвост/RT60 в настоящем MP4 не выделен — в замкнутом зале ON-дорожка была на +30–40 дБ тише (сильная окклюзия), а в открытом дворе длинный сэмпл взрыва (`blast_big`, 15 с; его +21 Гц тон виден в дорожке) маскирует хвост; камеру в комнате с источником и тишиной после него в +этом проходе получить не удалось. Ранние отражения отдельно не измерены. Субъективного +прослушивания не было; 10-минутный экспорт, Windows/Linux и полный бой не проверялись. + ### Стадия 2: эхо (сделано) Что игрок получает: взрыв в ущелье или между домами отвечает настоящим эхо от тех стен, что там есть, с задержкой по diff --git a/docs/CONTINUATION-2026-11-04.md b/docs/CONTINUATION-2026-11-04.md index 9c2185d..7acc75a 100644 --- a/docs/CONTINUATION-2026-11-04.md +++ b/docs/CONTINUATION-2026-11-04.md @@ -70,7 +70,9 @@ h264 + AAC, отчёт мода совпадает с `ffprobe nb_frames`, от Подробности и проверенные ограничения — [HD-RENDERER](HD-RENDERER.md) (раздел про кинорежиссёра) и [ENGINE](ENGINE.md) (раздел про захват). Очистка временных файлов при ошибке энкодера исправлена в движке `73b9d3070`: лог удаляется, его последние строки входят в текст ошибки, а -готовый MP4 прежнего экспорта с тем же именем сохраняется. 10-минутный экспорт и Windows/Linux +готовый MP4 прежнего экспорта с тем же именем сохраняется. Акустика проверена отдельно в настоящем +MP4 (пары on/off одного повтора, статусы ready, диффузный wet-остаток в каменном дворе); чистый +хвост/RT60 и прослушивание остаются — [ACOUSTICS](ACOUSTICS.md). 10-минутный экспорт и Windows/Linux по-прежнему не проверены. ## Обновление #123 diff --git a/docs/HD-RENDERER.md b/docs/HD-RENDERER.md index 7d34f8f..769c84c 100644 --- a/docs/HD-RENDERER.md +++ b/docs/HD-RENDERER.md @@ -390,6 +390,10 @@ ffmpeg 9.0.1. `/airdef replay export` с записанного налёта (4 пишет `<имя>.video.mp4`; `<имя>.mp4` появляется только после успешного mux/переименования. Контрольный `ctrl` на итоговой сборке `73b9d3070` — h264 + AAC, 33 кадра, временных файлов нет; `keep` (h264 + AAC, 32 кадра) и `keepnone` (только h264, 32 кадра) проверялись на той же правке. +- акустика в MP4: пары on/off одного повтора (кнопка мода) со статусами `Акустика … ready` и + `Захват … ready`; в открытом поле send реверба нулевой по построению, в каменном дворе ON тише и + глуше, а остаток после вычитания масштабированного сухого сигнала низкочастотный и + декоррелированный (wet-путь). Цифры, статусы и ограничения — [ACOUSTICS.md](ACOUSTICS.md). - **выход в заголовок во время экспорта** (до исправления): игра перестаёт тикать на экране заголовка, но продолжает кадры, поэтому захват писал заголовок; запрос `sec=10` дал 3898 кадров (129.9 с), временные `video.mp4`/`audio.raw` и ffmpeg оставались, а после возврата в тот же мир diff --git a/docs/IMPLEMENTATION-STATUS.md b/docs/IMPLEMENTATION-STATUS.md index fe50898..f941f1d 100644 --- a/docs/IMPLEMENTATION-STATUS.md +++ b/docs/IMPLEMENTATION-STATUS.md @@ -18,7 +18,7 @@ | #89 | Session владеет Live/Replay/Export; явные часы/поколения; единый cleanup; задержанный звук следует часам показа; выход в заголовок завершает показ одним cleanup (хук `frame`, `Session::world_left`); движок освобождает temp/лог ошибки энкодера и не трогает готовый MP4 | Реальный короткий MP4 проверен 4 ноября (звук/видео, отмена, ошибка SDK и энкодера, повторный запуск, совпадение кадров и хвоста очереди, сохранность прежнего MP4). Остаётся: 10-минутный экспорт; приёмка Windows/Linux | | #91 | Общий каталог доступности и потребители меню/инвентаря; явный RM48U-профиль; корректные подписи очередей | Единый источник всех чисел, звуков и Python-регистраций; проверка вариантов комплексов | | #92 | Authored overrides, проверка ссылок/PNG/границ, manifest, безопасная транзакционная генерация; registry/texture/icon modules | Дальнейшее ручное улучшение контента относится к #115 | -| #96 | Акустические пути; измеренные синтетические occlusion/echo/reverb fixtures; лицензии и исходные notices в архивах | Прослушивание, игровой массовый звук/CPU, акустика реального MP4; точность RT60 пока по допуску 35%, не 15% | +| #96 | Акустические пути; измеренные синтетические occlusion/echo/reverb fixtures; лицензии и исходные notices в архивах; настоящий MP4 с акустикой: пары on/off, статусы ready, окклюзия/поглощение и диффузный wet-остаток в замкнутой геометрии | Прослушивание, игровой массовый звук/CPU, чистый хвост/RT60 в MP4; точность RT60 пока по допуску 35%, не 15% | | #102 | Pinned engine/API29, packer/build identity; smoke/acoustics/capture-owner/light/source milestones; fallback/владение; WASM27 и flat stress271; измеренный callback fuel; JSON provenance/failure tests; Metal/no-audio smoke; URL/Git-регрессия; owner-scoped camera targets | Старое69-шаговое утверждение о перекрытии отозвано; статус камер, полные query/voice/peak budgets, GPU/готовый MP4 и Windows-приёмка остаются | | #104 | Движок вынесен в `chexit/horizon-airdef`, ветка `airdef`; AirDef использует точный gitlink | Отдельная Windows-проверка миграции старого standalone checkout | | #107 | ПУ оценивается по наблюдениям: обратный курс не выдаёт точную ПУ | Повторная игровая проверка сценариев с маневрирующими целями |