diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index 2f8f1c23..da553a86 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -2529,6 +2529,48 @@ whatever it returns — the same reason a truncated log and a t=0 render both lo fine from inside. Template matching against the exported cue with a bed-only control has no such knob, which is the right fix rather than a better threshold. +## ✅ 2026-08-30 — ask #4 ANSWERED: ship the movie's own 5.1 track **and** the three streams + +**You need both.** `ADV.wmv` carries **one** audio stream and it is **WMA Pro 5.1** +— not XMA at all. The intro's output is that track at a uniform gain of **0.600**, +**plus** the three concurrent streams mixed over it in 5.1. + +Solving `capture = 0.600 × movie + residual` per channel: + +| | LFE | FC | FL/FR | BL/BR | +|---|---|---|---|---| +| residual below capture | **−72 dB** (exact) | **−0.09 dB** (movie explains nothing) | −7 to −9 dB | −10 to −11 dB | + +**LFE reproduces to −115.73 dBFS**, which is what rules out "the leftovers are codec +differences" — the two decoders agree essentially exactly where there is nothing +added. **FC is where the addition lives.** + +✅ **And the residual is three signals, which confirms the 5.1 reading you were told +was unestablished**: a front pair (r 0.918), a rear pair (r 0.929), and a centre +whose partner LFE is empty to −115 dB — exactly the "mono-in-stereo" stream the +corpus had guessed was *"a centre paired with a silent LFE"*. + +| XMA stream | lands in | +|---|---| +| one | FL, FR | +| one | **FC**, LFE silent | +| one | BL, BR | + +**You can move the mapping now**, and thank you for not moving it before. + +🔴 **A correction that affects the page you already read.** My census labelled its +channels with the ALSA permutation `[0,1,4,5,2,3]` from the recipe page. **It does +not apply to this capture** — the measured map is the identity. So the census's +"BR is 82 % silent" was really **LFE**, which reconciles with the movie's own 80.64 % +silent LFE. Measure channel order per capture; a 6×6 matrix that comes out a clean +permutation is its own control. + +⚠️ Reach: one boot, one movie. **Which** of the three XMA contexts is front, centre +or rear is *not* determined — the assignment above is by position. And whether 0.600 +is a fixed mix constant or a volume setting is unknown. +[`intro-audio-decomposed.md`](../re/structures/intro-audio-decomposed.md) · +[numbers](../re/data/intro-audio-decomposition.txt) + ## 🟡 2026-08-30 — your ask #4: the intro IS recorded, and the output is NOT stereo **Groundwork, not the answer.** I have the game's own audio over the boot intro — diff --git a/docs/re/data/intro-audio-decomposition.txt b/docs/re/data/intro-audio-decomposition.txt new file mode 100644 index 00000000..a5177e07 --- /dev/null +++ b/docs/re/data/intro-audio-decomposition.txt @@ -0,0 +1,42 @@ +# What the game emits over the boot intro, decomposed against the movie's own track. +# +# 2026-08-30. Capture: docs/re/structures/intro-audio-output-census.md +# Reference: ffmpeg -i /disc/dat/movie/ADV.wmv -map 0:a:0 -f f32le -ar 48000 -ac 6 +# +# ADV.wmv carries ONE audio stream: wmapro, 48000 Hz, 5.1, 384 kb/s. Not XMA. +# +# ALIGNMENT (energy envelope, 100 Hz, summed over channels = permutation-invariant) +# movie begins +6.63 s into the capture; envelope r = 0.7692 +# control: peak 0.7692, 99.9th pct 0.6241, median -0.0009 +# refined by sample-level correlation to +224 samples, r = 0.900 +# +# CHANNEL MAP -- measured, not assumed. Every row's max is a distinct movie +# channel, i.e. a genuine permutation, and it is the IDENTITY: +# cap ch0->FL +0.899 ch1->FR +0.935 ch2->FC +0.185 +# cap ch3->LFE +1.000 ch4->BL +0.960 ch5->BR +0.971 +# 🔴 The ALSA order [0,1,4,5,2,3] documented in audio-capture-alsa-file-tee.md +# does NOT apply to this capture. See the doc for what that corrected. +# +# DECOMPOSITION capture = 0.600 x movie + residual (80 s from movie t=20 s) +# ch gain r cap rms resid rms resid/cap +# FL 0.600 +0.905 -21.86 -29.28 -7.43 dB +# FR 0.600 +0.935 -20.28 -29.29 -9.02 dB +# FC 0.597 +0.146 -25.18 -25.27 -0.09 dB <- movie explains NOTHING +# LFE 0.600 +1.000 -43.66 -115.73 -72.06 dB <- exact to precision +# BL 0.600 +0.956 -24.89 -35.46 -10.58 dB +# BR 0.600 +0.964 -24.02 -35.49 -11.47 dB +# +# RESIDUAL STRUCTURE -- residual vs residual correlation +# FL FR FC LFE BL BR +# FL +1.000 +0.918 +0.017 +0.001 +0.009 +0.004 +# FR +0.918 +1.000 +0.034 +0.001 +0.015 +0.014 +# FC +0.017 +0.034 +1.000 +0.000 +0.385 +0.378 +# LFE +0.001 +0.001 +0.000 +1.000 +0.000 -0.000 +# BL +0.009 +0.015 +0.385 +0.000 +1.000 +0.929 +# BR +0.004 +0.014 +0.378 -0.000 +0.929 +1.000 +# +# Three coherent groups: a FRONT pair (0.918), a REAR pair (0.929), and a +# CENTRE whose partner LFE is empty. That is three stereo streams in 5.1. +# +# FC residual 100 ms frame levels: median -53.9 dB, p90 -19.9 dB, +# dynamic range 34.0 dB -- bursty, not steady noise. diff --git a/docs/re/structures/intro-audio-decomposed.md b/docs/re/structures/intro-audio-decomposed.md new file mode 100644 index 00000000..bea0a690 --- /dev/null +++ b/docs/re/structures/intro-audio-decomposed.md @@ -0,0 +1,101 @@ +# ✅ The boot intro's audio: the movie's own 5.1 bed at 0.600, **plus** three streams in 5.1 + +**Classification: measured.** Xenia Canary, 2026-08-30, one boot, no input. This +settles the port's ask #4 and **confirms** the corpus's leading hypothesis from the +output side, where it had been recorded as "not established". + +## 🔴 First: `ADV.wmv` is not three XMA streams. It is one WMA Pro 5.1 track. + +``` +ffprobe /disc/dat/movie/ADV.wmv + Stream #0:0(jpn): Audio: wmapro, 48000 Hz, 5.1, fltp, 384 kb/s + Stream #0:1(jpn): Video: wmv3, 1280x720, 30 fps +``` + +One audio stream, **5.1**, decoded by Xenia's WMA path — not the XMA path the three +probe contexts come from. Any framing of the intro's audio as *only* "which of three +voice streams to ship" was missing the bed entirely. + +## The decomposition + +Aligning the [148 s capture](intro-audio-output-census.md) against that track and +solving `capture = g × movie + residual` +([`../data/intro-audio-decomposition.txt`](../data/intro-audio-decomposition.txt)): + +| ch | gain | r | capture rms | residual rms | residual/capture | +|---|---|---|---|---|---| +| FL | 0.600 | +0.905 | −21.86 | −29.28 | −7.43 dB | +| FR | 0.600 | +0.935 | −20.28 | −29.29 | −9.02 dB | +| **FC** | 0.597 | +0.146 | −25.18 | −25.27 | **−0.09 dB** | +| **LFE** | 0.600 | **+1.000** | −43.66 | **−115.73** | **−72.06 dB** | +| BL | 0.600 | +0.956 | −24.89 | −35.46 | −10.58 dB | +| BR | 0.600 | +0.964 | −24.02 | −35.49 | −11.47 dB | + +**The gain is 0.600 on every channel** — a uniform −4.44 dB, which is a mixer +setting, not a fit artefact. **LFE is reproduced to −115.73 dBFS**, 72 dB below the +signal: at that residual the two decoders agree essentially exactly, which is what +rules out "the leftovers are just codec differences". + +🔴 **And `FC` is the exception that carries the answer.** The movie explains +**nothing** of the capture's centre channel — the residual is the whole signal +(−0.09 dB). The movie's own FC is 91.6 % silent; the capture's is not. + +## The residual is three signals, not one + +| | FL | FR | FC | LFE | BL | BR | +|---|---|---|---|---|---|---| +| FL | 1.000 | **0.918** | 0.017 | 0.001 | 0.009 | 0.004 | +| FR | **0.918** | 1.000 | 0.034 | 0.001 | 0.015 | 0.014 | +| FC | 0.017 | 0.034 | 1.000 | 0.000 | 0.385 | 0.378 | +| LFE | 0.001 | 0.001 | 0.000 | 1.000 | 0.000 | −0.000 | +| BL | 0.009 | 0.015 | 0.385 | 0.000 | 1.000 | **0.929** | +| BR | 0.004 | 0.014 | 0.378 | −0.000 | **0.929** | 1.000 | + +Three coherent groups: a **front pair** (0.918), a **rear pair** (0.929), and a +**centre** whose partner LFE is empty. The FC residual's 100 ms frame levels span +**34 dB** (median −53.9, p90 −19.9) — bursty, not steady noise. + +## ✅ This confirms the 5.1 hypothesis, and predicts the silent channel correctly + +[`voice-three-streams-are-concurrent.md`](voice-three-streams-are-concurrent.md) +recorded "three concurrent stereo streams is six channels" as the obvious reading +and marked it **not established**, with a specific piece of supporting detail: that +`ADV` stream 2 is **mono-in-stereo**, *"a centre paired with a silent LFE looks +exactly like that"*. + +That is exactly what the residual shows — a live centre whose paired channel is +empty to −115 dB. Measured from the output, with no access to the stream contents: + +| XMA stream | lands in | +|---|---| +| one | **FL, FR** | +| one | **FC**, LFE silent | +| one | **BL, BR** | + +**So both things are true and the port needs both**: the movie's own 5.1 WMA Pro +track *and* the three streams mixed over it in 5.1. + +## 🔴 Correction to the census page, and to the recipe page's channel order + +[`intro-audio-output-census.md`](intro-audio-output-census.md) labelled its channels +using the permutation `[0,1,4,5,2,3]` that +[`audio-capture-alsa-file-tee.md`](../audio-capture-alsa-file-tee.md) records for +ALSA. **That permutation does not apply to this capture.** The 6×6 correlation +matrix was computed without assuming any order, every row's maximum falls on a +distinct movie channel, and the result is the **identity**. + +So the census's *"BR is 82 % silent"* was really **LFE** — which also reconciles it +with the movie, whose LFE is 80.64 % silent. ⚠️ The recipe page's permutation was +measured on a different chain and is not wrong there; what is wrong is assuming it +travels. **Measure the channel order per capture; a 6×6 matrix that comes out a +clean permutation is its own control.** + +## Reach + +⚠️ **One boot, one movie.** `ADV` only. +⚠️ **The stream→channel assignment is by position, not by content.** Which of the +three XMA contexts is the front, centre or rear stream is *not* determined here — +that needs the streams decoded and correlated individually, which was not done. +⚠️ `--gpu=null`, so no video cross-check. +✅ The 0.600 gain is measured on this run; whether it is a fixed mix constant or a +volume setting is not established.