port: the game decodes all three voice streams at once, and two baseline rows were comparing blank frames
TWO FINDINGS, one mine and one handed to me, and the second retires a premise I built on twice. THE P1 BASELINE HAD ROWS THAT PROVED NOTHING. `build_12` and `build_15` render pure black in BOTH renderers -- mean 0, max 0 -- so the difference is zero and `verify-screen` scored them `max 0 over3 0 OK`, the strongest verdict it has. Two of sixteen rows were comparing nothing against nothing. Worse than a missing test, because a missing test is visible in the count. Cause isolated by a control, not by reading: `build_00`/`build_01` are the same loading screen minus three elements and render fine (mean 1.913, max 214.5). The dressed variants add `pgloading_eff00`, a 1280x720 primitive resting OPAQUE BLACK at t=38 inside its own opening black hold, with no layer key so paint order puts it last. The rule I was about to write -- "rest.t before the last timed keyframe is the pathology" -- was killed by running the census first: 152 of 212 elements in this export have rest.t earlier than their last timed keyframe. It is the norm. What is actually unusual is the CONTENT, and its reach is one: `pgloading_eff00` is the only element in the export whose resting pose is a fully opaque full-frame quad. One instance is not a rule, so the renderer is unchanged and the HARNESS is fixed: a blank pair now reports BLANK -- both renderers drew nothing; this row proves nothing. `status` is untouched, so an unrelated DIFFERS still fails. THE VOICE EXPORT IS KNOWN INCOMPLETE. The Decoder booted Canary with --xma_param_probe and the game decodes ALL THREE streams CONCURRENTLY, in three XMA contexts whose byte sizes match the disc payloads exactly. So "three presentations of one take, pick one" is refuted by the running game and the question I had been arguing -- WHICH presentation -- has no answer. This one no census could have caught. Every measurement was right: the streams are equal-duration, one is silence, one is 0.60x another with the residual 26.8 dB down. The frame around them was wrong, and the file says ChannelMask 0x0002 on all three. It took the running game -- which is the mission's own sentence arriving in practice. BEHAVIOUR HELD DELIBERATELY. An equal-gain 1/n sum of channel pairs is not a downmix either -- MISSION section 6 pins an explicit matrix for exactly that reason -- and summing cost S00A 6.02 dB when one stream was silence. Swapping one guess for another on a message is what produced this entry twice. What changed is that the wrongness is now LOUD, because this failure sounds like success: one stream is clean audible dialogue. A top-level manifest warning per movie, the console line, and the authored entry all say `1 of 3 streams`. "They are 5.1" is recorded as the Decoder's HYPOTHESIS with its own counter-evidence attached, and nothing builds on it. What settles it is asked: a recording of the game's own output over ADV through the null sink, which turns channel roles into a fit against an oracle. Refutation attempt, survived: the Decoder's loading-screen variant map. Entries 0/1 carry 7 elements and 12/15 carry those seven plus baseeff, eff00 and loop5 -- exact in count and identity, and it is what made build_00 a control. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
@@ -741,22 +741,21 @@ pub fn export_voice<S: DiscSource + ?Sized>(
|
||||
movie -> token -> sound id -> byte region [{start}, {end}) of the continuous \
|
||||
voice stream. NOT matched by filename: RT01A's voice lives inside \
|
||||
VOICE_ADV.slb, so the name is right for this movie by luck and wrong for \
|
||||
others. Of {} region chunk(s), exactly ONE is kept -- not summed. A region \
|
||||
carries THREE PRESENTATIONS OF ONE TAKE, decoded disc-wide by counting stream \
|
||||
starts inside every inter-descriptor span: 258 spans hold one stream and 28 hold \
|
||||
three, and nothing holds two. This exporter read these chunks wrongly twice \
|
||||
before that landed -- first concatenating them (359 s for a 137 s movie), then \
|
||||
summing them as HANDOFF Q10's two stems, which its own measurements refuted: \
|
||||
S00A's second full-length chunk is DIGITAL SILENCE and ADV's is 0.60x the first \
|
||||
with 26.8 dB of residual. Summing a take with a scaled copy of itself adds ~4 dB \
|
||||
and colours it. 🟡 WHICH of the equal-duration survivors is kept is a CHOICE, \
|
||||
not a decoded field -- authored/audio.json voice.presentation = {:?}, with its \
|
||||
why. Nothing on the disc ranks the presentations: wEncodeOptions, channel count \
|
||||
and channel mask are byte-identical across them. One capture of the movie with \
|
||||
dialogue audible deletes that entry.{} Folded to mono from the {} of {channels} declared \
|
||||
channel(s) that carry signal -- channel 2 of both voice streams is digitally \
|
||||
silent, and averaging it in cost 5.94 dB until this was measured rather than \
|
||||
read off the declared count.{against}",
|
||||
others. 🔴 KNOWN INCOMPLETE: of {} region chunk(s) exactly ONE is exported, \
|
||||
and the RUNNING GAME DECODES ALL THREE CONCURRENTLY -- measured with Canary's \
|
||||
--xma_param_probe, three separate XMA contexts whose byte sizes match the three \
|
||||
disc payloads exactly. So this file is MISSING TWO STREAMS, and because a single \
|
||||
stream decodes to clean audible dialogue, nothing in the audio reveals that. The \
|
||||
earlier reading -- three presentations of one take, pick one -- is REFUTED; the \
|
||||
streams are believed to be channels, though 5.1 is a hypothesis and all three \
|
||||
declare ChannelMask 0x0002 identically, which argues against distinct roles. \
|
||||
Held rather than changed: an equal-gain 1/n sum of channel pairs is not a \
|
||||
downmix either (MISSION section 6 pins an explicit matrix for exactly this \
|
||||
reason), and summing cost S00A 6.02 dB when one stream was silence. Which stream \
|
||||
is kept: authored/audio.json voice.presentation = {:?}. What settles it: a \
|
||||
recording of the game's own output over the movie. See docs/port/BLOCKED.md.{} \
|
||||
Folded to mono from the {} of {channels} declared channel(s) that carry signal.\
|
||||
{against}",
|
||||
riffs.len(),
|
||||
match presentation {
|
||||
Presentation::Loudest => "loudest",
|
||||
@@ -766,15 +765,10 @@ pub fn export_voice<S: DiscSource + ?Sized>(
|
||||
String::new()
|
||||
} else {
|
||||
format!(
|
||||
" DROPPED, and NOT as junk -- the leading chunk is DECODED to be this \
|
||||
movie's OWN dialogue, 17 of 17 regions (docs/re/structures/\
|
||||
voice-region-leading-chunk.md; an earlier note here wrongly equated it \
|
||||
with BGM_103's third sub-wave, which a disc-wide census showed is a \
|
||||
different structure). This port then measured it to be the TAIL of the \
|
||||
kept stream -- sliding envelope correlation r=0.998 (ADV) and 0.932 \
|
||||
(S00A), the lag placing it flush against that stream's end, against \
|
||||
controls of 1.000 self and 0.289 for a different movie -- so dropping it \
|
||||
removes a DUPLICATE, not dialogue. Dropped: {}.",
|
||||
" Also dropped, and this one IS understood: the leading chunk, which this \
|
||||
port measured to be the TAIL of the kept stream (sliding envelope \
|
||||
correlation r=0.998 ADV / 0.932 S00A, lag flush against that stream's \
|
||||
end, controls 1.000 self and 0.289 for a different movie): {}.",
|
||||
dropped.join(", ")
|
||||
)
|
||||
},
|
||||
|
||||
@@ -441,12 +441,30 @@ fn run_export(disc: &Path, out: &Path, authored_dir: &Path) -> Result<()> {
|
||||
let want = audio_cfg.as_ref().map(|c| c.voice).unwrap_or_default();
|
||||
match audio::export_voice(&source, out, stem, *len, want)? {
|
||||
Some(a) => {
|
||||
// 🔴 A TOP-LEVEL WARNING, not just a `why` on the entry. The
|
||||
// export is known to be missing audio the game plays, and
|
||||
// the failure sounds like success: one stream decodes to
|
||||
// clean dialogue, so nobody listening finds out.
|
||||
if a.sub_waves > 1 {
|
||||
warnings.push(format!(
|
||||
"{}: KNOWN INCOMPLETE. This region holds {} streams and the RUNNING \
|
||||
GAME DECODES ALL OF THEM CONCURRENTLY (Canary --xma_param_probe: \
|
||||
three XMA contexts, byte sizes matching the disc payloads exactly). \
|
||||
The export carries ONE. Nothing in the audio reveals this -- a \
|
||||
single stream is clean audible dialogue. Held rather than summed \
|
||||
because an equal-gain sum of channel pairs is not a downmix and \
|
||||
would be a second guess, not a fix. See authored/audio.json voice \
|
||||
and docs/port/BLOCKED.md.",
|
||||
a.file, a.sub_waves
|
||||
));
|
||||
}
|
||||
println!(
|
||||
" voice {:<8} -> {} ({}, {} region chunk(s))",
|
||||
" voice {:<8} -> {} ({}, 1 of {} streams{})",
|
||||
a.name,
|
||||
a.file,
|
||||
describe(&a),
|
||||
a.sub_waves
|
||||
a.sub_waves,
|
||||
if a.sub_waves > 1 { " -- KNOWN INCOMPLETE, see warnings" } else { "" }
|
||||
);
|
||||
audio.push(ManifestAudio::from(a));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user