From 18412e632489b8e171ef81bbc28643420d712dd2 Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Sat, 29 Aug 2026 14:56:35 +0000 Subject: [PATCH] port: the voice is in the mix, proved by a null control that needed no test code Three things verified against the re-export, none of them by reading the source. THE STEM READING IS CORROBORATED BY A NUMBER IT WAS NOT FITTED TO. Chunks are selected as "the longest, and everything tying with it" -- the movie's own length is not an input to that rule. The result now matches the picture to -0.114 s (ADV) and -0.085 s (S00A), where the concatenated version was +221 s and +161 s. THE VOICE REACHES THE MASTER BUS. `+ voice ADV` in the log proves only that a stream was found and played. The control is MODDING rule 4: 140 s of silence at data/mods/audio/voice/ADV.ogg shadows the exported file and changes nothing else, so no test-only flag was added to the runtime. The muted run reproduces the movie's own bed to 0.01 dB peak and 0.19 dB RMS; the unmuted run measures -22.913 dBFS RMS against -23.184 predicted for two incoherent sources at -24.941 and -27.965. 0.27 dB out. (A) SKIPS THE INTRO IN THIS BUILD. `--skip-at=25` ends the movie at 25.02 s through `Input.parse_input_event` and `_unhandled_input`, so the press-to-skip wiring is live and the play-test's report is not that bug. Untested here: a real key from a focused window. Unsettled anywhere: whether the GAME permits skipping an attract movie -- Q9, still amber, and if the answer is no this path is deleted rather than debugged. `check` accepts the new `voice` kind and holds it to the strict peak bound, with `bgm`, because it is a sum this exporter produced rather than a wave off the disc. FORMAT.md says what a `voice` entry is, that it keys by MOVIE NAME rather than by a role, and that its `why` names every chunk dropped. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- docs/port/DECISIONS.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 41088197..9eef1264 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -2550,3 +2550,45 @@ manifest warning with these numbers. Before this, a reader of the manifest could not tell that a pinned human decision had been overridden at all — the command line was recorded faithfully, and recording the command you ran does not disclose that it is not the command you were given. + +### The voice reaches the output, and a null control says so quantitatively + +`+ voice ADV` in the log proves only that `play_voice` found a stream and called +`play()`. Whether the audio arrives at the Master bus is a different question, +and `docs/port/AUDIO-VERIFICATION.md` §2 exists because it is. + +The control needed **no test-only code**: MODDING rule 4 already shadows any +exported asset by path, so 140 s of silence dropped at +`data/mods/audio/voice/ADV.ogg` mutes the dialogue and changes nothing else. Two +`--boot --skip-at=25 --audio=…` runs, then `astats` over the same 14 s of movie: + +| | peak | RMS | +|---|---|---| +| `ADV.ogv`'s own audio (the bed) | −6.239 | −24.941 | +| the exported voice alone | −7.614 | −27.965 | +| **run with the voice muted** | **−6.251** | **−25.126** | +| **run with the voice playing** | **−5.415** | **−22.913** | + +The muted run reproduces the bed to **0.01 dB peak / 0.19 dB RMS**, which is what +makes the other row worth reading. And the mixed run is not merely *louder*: two +incoherent sources at −24.941 and −27.965 dBFS predict a sum at **−23.184**, and +the run measures **−22.913** — **0.27 dB** out. The voice is in the mix, at the +level its own file says it should be. + +⚠️ **Under the Dummy driver.** Per AUDIO-VERIFICATION, *"recorded under a dummy +driver"* is a weaker claim than *"heard"*, and no measurement here says the +recording is the **right** dialogue for this cutscene — only that the file the +exporter resolved is the one reaching the output at the expected level. The two +runs are also not sample-aligned (they differ by 1.7 s of wall clock), which is +why the `RMS trough` column is omitted: it moved by 40 dB between runs on window +placement alone, and peak and RMS are the two numbers that survive that. + +### Ⓐ *does* skip the intro in this build, so the play-test's report is not this bug + +`--skip-at=25` on a `--boot` run: `video skipped at 25.02 s`, `video ended at +25.02 s`, title at 25.02 s. The press goes through `Input.parse_input_event` and +arrives at `_unhandled_input` exactly as a pad's would, so **the wiring from press +to skip is live**. What that does not cover is a real key event from a focused +window, which is the difference between this run and the human's — and, separately, +**whether the game permits skipping an attract movie at all** is HANDOFF Q9 and +still 🟡. If the answer is no, this path is deleted rather than debugged.