The Decoder's sharpest addition: a conclusion with two supports reads as better evidenced than one with a single support, so if one is decorative the appearance of redundancy is itself the misinformation -- a reason to strip a weak second argument rather than leave it as colour. Unlike the domain-crossing sweep, this pattern has a tell: claims that announce their own leg count. Six in my authored data. The load-bearing one is audio.json's 'Static code, disc census and runtime all agree'. Read literally, two of those three could be one comparison. The sentence beneath says BGM_103.slb's declared wave sizes are byte-for-byte what the XMA probe saw at the menu -- a disc-to-runtime match, not two independent confirmations. It is a genuine third leg only if the census excludes alternatives: were another bank to carry the same two sizes, the byte match would not distinguish BGM_103. Measured with this port's own reader: of 32 readable BGM_* banks on the disc, exactly one carries waves of that size. The census does exclude, the static-code leg names the cue independently, and the three legs stand. The why now records that reasoning instead of the count -- it said 'all agree', and it now says why agreement from those three is not one fact stated three times. The audit did not find a defect. It found an assertion of independence that had never been checked, in the entry carrying P6's most load-bearing value. Reach: I checked one of the six. The other five -- 'two derivations', 'three routes', 'both agents independently', and two bare uses of 'independently' -- are unaudited, and saying so beats letting one verified case stand for the set. Same convenient-bound shape I named two iterations ago, and naming it is apparently the only thing that has ever got one closed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
345 lines
22 KiB
JSON
345 lines
22 KiB
JSON
{
|
|
"format": "sylpheed.audio/1",
|
|
"_": [
|
|
"Menu audio. EVERY VALUE IN THIS FILE IS MEASURED OR CHOSEN -- none of it is",
|
|
"in a data file the exporter can read, which is why it is here and not in the",
|
|
"exporter. `measured` and `chosen` are NOT the same thing and this file keeps",
|
|
"them apart: a measurement is deleted when the disc states it, a choice is",
|
|
"deleted when somebody measures it.",
|
|
"",
|
|
"Two different kinds of not-on-the-disc live in this file and they are not",
|
|
"interchangeable:",
|
|
"",
|
|
" * `se` -- MEASURED. `Static.slb` is a delimiter-less run of whole 2048-byte",
|
|
" XMA1 packets: no RIFF, no seek chunk, no XACT container. A wave is defined",
|
|
" ONLY by (offset, packet_count), and both numbers come from the running",
|
|
" game, not from the file. HANDOFF Q8. Delete a row the day a table on the",
|
|
" disc states the same thing.",
|
|
"",
|
|
" * `bgm` -- MEASURED, and only the LOOP POLICY beside it is chosen. HANDOFF",
|
|
" Q10's negative is about the TABLES: `SOUNDS`, `FILES` and the bank headers",
|
|
" name no screen. The executable does -- cue 1103 = `BGM_103`, corroborated",
|
|
" by a byte-for-byte match against what the XMA probe saw at the main menu.",
|
|
" An earlier draft read the negative as unbounded, picked a track at random",
|
|
" and called it authored. See the `bgm._` block for what that cost.",
|
|
"",
|
|
"The exporter reads this file and emits `export/audio/**` from it. It holds no",
|
|
"cue table of its own: a measured offset compiled into a Rust `const` is a",
|
|
"measurement wearing the costume of a decoded field, and MISSION section 3 is",
|
|
"explicit that measured values live here."
|
|
],
|
|
"se": {
|
|
"_": [
|
|
"MEASURED, HANDOFF Q8, and the RE agent retracted an earlier 'cannot be",
|
|
"extracted' to publish these. The waves were located BY PLAYING THEM: Canary",
|
|
"with `--xma_param_probe=true` prints a stream's packet count and first 32",
|
|
"bytes when it is played, and searching those bytes in the bank gives the",
|
|
"offset.",
|
|
"",
|
|
"WARNING, from the same finding: the file order is NOT cue-id order. These",
|
|
"cannot be counted out, and an index here would be a fabrication.",
|
|
"",
|
|
"`name_match` is the authors' own identifier GUESSED BY NAME. It is carried",
|
|
"so the guess is not lost and is never presented as the measurement. Where",
|
|
"the RE agent did not separate two candidates, there is no name at all --",
|
|
"an absent `name_match` means nobody has claimed one, never that the",
|
|
"BINDING is unknown. The binding is the measured part.",
|
|
"",
|
|
"All three are mono 48 kHz; that is the RE agent's statement in",
|
|
"`sylpheed_formats::media::se_wave_riff`, not something re-derived here."
|
|
],
|
|
"move": {
|
|
"bank": "Static.slb",
|
|
"offset": "0x1ec0",
|
|
"packets": 4,
|
|
"channels": 1,
|
|
"rate": 48000,
|
|
"name_match": "SE_UI_CURSOR",
|
|
"why": "HANDOFF Q8, measured: the d-pad move cue, 8 192 B / 0.533 s, reproduced across two boots. Left/right play nothing at all, which is a measurement too and is why there is no `left`/`right` row here rather than a silent file."
|
|
},
|
|
"confirm": {
|
|
"bank": "Static.slb",
|
|
"offset": "0x5d6c0",
|
|
"packets": 6,
|
|
"channels": 1,
|
|
"rate": 48000,
|
|
"why": "HANDOFF Q8, measured: the (A) confirm cue, 12 288 B / 1.016 s. NO `name_match`: Q8 is explicit that (A)'s wave was not separated between `SE_UI_DECIDE` and `SE_UI_SUB_WIN_OPN`, so naming it would invent the one thing the measurement did not settle."
|
|
},
|
|
"back": {
|
|
"bank": "Static.slb",
|
|
"offset": "0x0ec0",
|
|
"packets": 2,
|
|
"channels": 1,
|
|
"rate": 48000,
|
|
"why": "HANDOFF Q8, measured: the (B) back cue, 4 096 B / 0.344 s, reproduced across two boots. No `name_match` for the same reason as `confirm` -- Q8 names no identifier for it."
|
|
}
|
|
},
|
|
"bgm": {
|
|
"_": [
|
|
"MEASURED, NOT CHOSEN -- and the port got this wrong for one iteration.",
|
|
"",
|
|
"`docs/port/BLOCKED.md` carried a row reading 'not on the disc ... the port",
|
|
"is choosing a track, and that choice is authored', and the first draft of",
|
|
"this file duly picked BGM_001 and labelled it arbitrary. That row was not",
|
|
"stale: `BGM_103` is in HANDOFF at `9ca1eb5`, which is the exact commit the",
|
|
"row says it was reconciled against. It was WRONG WHEN WRITTEN.",
|
|
"",
|
|
"What HANDOFF actually says is a negative with a stated reach, and the reach",
|
|
"is what the port dropped: the *tables* cannot say which BGM a screen plays",
|
|
"-- `SOUNDS`, `FILES` and the bank headers name no screen. The EXECUTABLE",
|
|
"can. `GamePart_Title`'s phase handler `sub_821C5580` carries `li r5, 1103`",
|
|
"into a sound call, cue 1103 is `BGM_103`, and `BGM_103.slb`'s two declared",
|
|
"waves (3 876 864 / 3 930 112 B) are byte-for-byte the two streams the XMA",
|
|
"probe saw decoding at the main menu. Static code, disc census and runtime",
|
|
"agree. HANDOFF's own words: 'The port does not have to choose a track.'",
|
|
"",
|
|
"So this section is a CITATION, not a decision. It lives in `authored/`",
|
|
"only because the binding is in the .xex and the exporter reads data files,",
|
|
"not code -- and it must be deleted the day something the exporter can read",
|
|
"states it. The loop policy below IS still a decision."
|
|
],
|
|
"main_menu": {
|
|
"bank": "BGM_103.slb",
|
|
"loop": "restart",
|
|
"kind": "measured",
|
|
"why": "MEASURED, HANDOFF Q10 -- NOT a port choice. `GamePart_Title`'s phase handler `sub_821C5580` plays cue 1103 = `BGM_103`, and `BGM_103.slb`'s two declared waves (3 876 864 / 3 930 112 B) are byte-for-byte the two streams the XMA probe saw decoding at the main menu. Static code, disc census and runtime all agree; see docs/re/menu-audio-cues.md and docs/re/structures/bgm-two-stems.md. The name carries its `.slb` extension because that is what `sound.pak` hashes -- `BGM_103` alone resolves to nothing, which is how the first draft of this file failed. ✅ AUDITED 2026-08-31 -- the THREE legs are three, and that is now measured rather than asserted. Prompted by the Decoder's point that a decorative second support is worse than none, since a conclusion with two supports reads as better evidenced than one and apparent redundancy is itself the misinformation. Read literally, 'disc census' and 'runtime' could be ONE comparison -- declared wave sizes matched byte-for-byte against the probe -- which would make three legs two. It is a real third leg only if the census EXCLUDES alternatives: if another bank carried the same two sizes, the byte match would not distinguish BGM_103. Measured with this port's own reader (`crates/sylpheed-export/examples/bgm_size_census.rs`): of 32 readable BGM_* banks on the disc, EXACTLY ONE carries waves of that size. The census therefore excludes, the static-code leg names the cue independently, and the three legs stand.",
|
|
"loop_why": "MEASURED, and this field's own history is why it says so first. The bed loops; the loop is a RUNTIME field -- `loop_start`/`loop_end` in the XMA decoder context, set by `XMASetLoopData` and logged by Xenia -- and the cycle was watched directly: three wraps, both contexts wrapping at the same instant every time, mean 61.81 s against the 61.93 s authored in `loop_end_s`, 0.2 % apart from instruments sharing nothing. The export is TRIMMED to that window, because Godot loops a whole file and a loop region therefore has to BE the file. ⚠️ The window's START is not measured and is authored as 0, which is known to be wrong -- see `loop_start_why`. 🔴 EVERY SENTENCE THAT PRECEDED THIS ONE WAS REFUTED, and the previous text survived in the manifest for two days after the corrections were written. It said the loop would be `AUDIBLY WRONG AT THE SEAM [refuted]`, that `no loop-point field has been identified [refuted] anywhere`, and that trimming `would INVENT a loop point`. All three are false: the field exists, the 3.4 s of near-silence was the PORT'S loop and not the game's, and the trim is now what the measurement says. The corrections went into `loop_end_why` and `loop_start_why`; this field is the one the exporter concatenates into `manifest.json`, so the export went on telling readers the refuted story. A correction that does not reach the artifact a consumer reads has not been made.",
|
|
"stems": "sum",
|
|
"stems_why": "MEASURED, HANDOFF Q10: a bank is exactly TWO waves of identical duration (32/32 banks on the disc), sample-synchronous -- transient correlation peaks at lag 0.00 s over +/-5 s and both stop at the same millisecond. Concatenating them plays the piece twice, the second time as a bass-less stem; that was the previous reading and it is refuted. Emitting two files would be wrong for a second reason: MODDING rule 1 is one logical asset, one file, and handing a modder two stems to line up by hand is the reassembly the exporter exists to have already done. WHAT IS SUMMED IS SETTLED; WHAT WAVE 1 IS, IS NOT -- HANDOFF calls it quieter, far more L/R-decorrelated and almost bass-free, so it reads as a surround-rear pair OR a second intensity layer, and `ChannelMask` is 0x0002 on both so the file will not say. A unity sum is right under either reading; a weighting would only be justified once that is settled.",
|
|
"loop_start_s": 9.44,
|
|
"loop_start_why": [
|
|
"MEASURED 2026-08-30 -- 9.44 s. The loop region is [9.44 s, 71.31 s] of an",
|
|
"87.744 s wave: the first 9.44 s is an intro played ONCE, and the last 16.4 s",
|
|
"is a fade-out never played at all.",
|
|
"",
|
|
"Two derivations, both stems, and NEITHER converts bits to seconds -- the",
|
|
"conversion that refuted itself earlier by giving two sample-synchronous stems",
|
|
"62.34 and 63.29 s. (a) time to `read_offset` crossing `loop_start`, plus a",
|
|
"1.33 s head correction at a LOCALLY measured rate; (b) first pass minus cycle.",
|
|
"9.44 s on both stems either way.",
|
|
"",
|
|
"⚠️ ONE BOOT, ONE BANK. The decoder reads ahead of playback, but both endpoints",
|
|
"are `read_offset` events so the lead cancels in the difference.",
|
|
"",
|
|
"🔴 THIS FIELD WAS 0.0 AND FLAGGED WRONG FOR ONE ITERATION, deliberately. The",
|
|
"value was not guessable -- linear back-extrapolation said 9-13 s and linearity",
|
|
"is refuted by a 4.4 % rate variation within one stream. What made the wait",
|
|
"cheap was that the field EXISTED and the `-ss`/`-t` ordering had been proved",
|
|
"with a stand-in value, so arriving at 9.44 was a one-value edit."
|
|
],
|
|
"loop_end_s": 61.87,
|
|
"loop_end_why": [
|
|
"MEASURED off the running game 2026-08-30, 240 s parked on the menu",
|
|
"(docs/re/structures/menu-bgm-loop-measured.md). The bed loops at 61.93 s, NOT",
|
|
"at the summed wave's 87.744 s length, and the last ~25.8 s is never played --",
|
|
"exactly the fade-out and trailing silence bgm-two-stems.md found. The game",
|
|
"loops BEFORE the fade.",
|
|
"",
|
|
"🔴 THIS CORRECTS AN AUTHORED VALUE THAT WAS WRONG IN BOTH DIRECTIONS. `restart`",
|
|
"at the wave's end produced a seam of about 3.4 SECONDS of near-silence, and",
|
|
"this port measured that seam off its own Master bus and recorded it as the",
|
|
"cost of a missing loop point. It was not the game's seam; it was OURS. Zero",
|
|
"runs of >=0.3 s below median-18 dB appear in 232 s of the real menu.",
|
|
"",
|
|
"Two instruments agree: correlation gives a top lag of 61.909 s and r = -0.009",
|
|
"at 87.750 s, and locating 30 s slices inside the decoded waves shows playback",
|
|
"advancing exactly +5.00 s per 5 s and wrapping at 61.93 s, three times, with a",
|
|
"control that finds slices cut at 10/45/70 s at 10.00/45.00/70.00.",
|
|
"",
|
|
"⚠️ The loop START is inferred, not measured: [0.0, 61.93) and [0.25, 62.18) are",
|
|
"not separated at their resolution. The port takes 0 because a bank's own start",
|
|
"is where its data begins, and records that the choice was not measured.",
|
|
"",
|
|
"⚠️ Godot loops a WHOLE FILE, so the export is TRIMMED to 61.93 s rather than",
|
|
"carrying a loop point the runtime could not honour. The trimmed tail is",
|
|
"content the game never reaches, so nothing playable is lost -- but a modder",
|
|
"replacing this file is replacing the loop region, not the whole bank.",
|
|
"",
|
|
"🔴 CONFLICT, OPEN AS OF 2026-08-30. The loop IS a runtime field: `loop_start`",
|
|
"and `loop_end` live in the XMA decoder context, set by `XMASetLoopData`, and",
|
|
"the RE agent read 8734 records off the menu. Converted, they imply a cycle of",
|
|
"roughly [10 s, 72 s] against the [0.25, 57.18] their audio tracking reported.",
|
|
"BOTH CANNOT BE RIGHT and neither has been withdrawn.",
|
|
"",
|
|
"They judge the weak link probably theirs: the locator's control matched slices",
|
|
"cut from the wave ITSELF -- exact copies -- which is an easier problem than",
|
|
"matching a capture that differs by decoder, gain and mix. A control easier than",
|
|
"the measurement does not bound the measurement's error, and music with repeated",
|
|
"sections is where a locator aliases.",
|
|
"",
|
|
"⚠️ THE VALUE IS KEPT ON THEIR INSTRUCTION, and because the LENGTH survives",
|
|
"better than the PLACEMENT: 61.93 has an autocorrelation behind it that used no",
|
|
"wave at all, and the trimmed loop has no seam in this port's own output.",
|
|
"",
|
|
"This port added one check neither of their instruments ran: whether the trim",
|
|
"JOINS SMOOTHLY. Over 126.5 s the wrap at 61.93 s and again at 123.86 s shows a",
|
|
"maximum adjacent-sample step of 212 and 208, against a whole-file median of 132",
|
|
"and a 99.9th percentile of 3737. So the join is not a click and nothing is",
|
|
"audibly broken.",
|
|
"",
|
|
"⚠️ THAT DOES NOT DISCRIMINATE THE TWO READINGS. A smooth join says the waveform",
|
|
"does not jump; it does not say the loop is at the musically right point, and a",
|
|
"cut landing near a zero crossing is smooth wherever it falls.",
|
|
"",
|
|
"🔴 What the conflict would COST if their runtime fields win: under [10 s, 72 s]",
|
|
"this export is about 10 SECONDS SHORT -- the content in [61.93, 72] is played",
|
|
"by the game and absent here. That is the number to weigh when it resolves, and",
|
|
"it is why this entry is not being treated as settled.",
|
|
"",
|
|
"✅ CONFIRMED 2026-08-30 BY A SECOND INSTRUMENT SHARING NOTHING WITH THE FIRST.",
|
|
"The RE agent stopped converting the runtime fields and TIMED them instead --",
|
|
"a probe tailing the Apu debug log and stamping `read_offset` on arrival --",
|
|
"and watched THREE wraps, each from its own `loop_end` to its own `loop_start`,",
|
|
"with both contexts wrapping at the SAME INSTANT every time. Cycle 61.56 and",
|
|
"62.06 s, mean 61.81 s: 0.2 % from the 61.93 authored here, measured by wall",
|
|
"clock between decoder events against an autocorrelation that never touched",
|
|
"the wave. Both contexts wrapping together is the sample-synchrony the linear",
|
|
"bit conversion could not produce.",
|
|
"",
|
|
"So the LENGTH is settled and the WINDOW is not. See `loop_start_why`.",
|
|
"",
|
|
"✅ 61.87 ADOPTED 2026-08-30, replacing 61.93. Their wrap timing gives 61.87 --",
|
|
"wraps at 96.46 / 158.33 / 220.21 s, gaps 61.87 and 61.87 -- against the 61.93",
|
|
"this port's autocorrelation gave. 0.1 % apart. The measured value is taken",
|
|
"because it is the one with the loop's own endpoints under it; the",
|
|
"autocorrelation never touched the wave and agreed to a tenth of a percent,",
|
|
"which is what makes both worth having."
|
|
]
|
|
}
|
|
},
|
|
"voice": {
|
|
"_": [
|
|
"🔴 KNOWN WRONG, HELD DELIBERATELY. Which of a voice region's streams to",
|
|
"export. The premise this entry was built on has been REFUTED BY THE RUNNING",
|
|
"GAME and the entry is kept, escalated, rather than swapped for another guess.",
|
|
"",
|
|
"The premise was: a region carries THREE PRESENTATIONS OF ONE TAKE, so the",
|
|
"exporter picks one. The Decoder booted with `--xma_param_probe=true` -- the",
|
|
"cvar that reports which sub-wave the game decodes -- and the game decodes",
|
|
"ALL THREE, CONCURRENTLY, in three separate XMA contexts, with byte sizes",
|
|
"matching the three disc payloads exactly (1294336 / 1118208 / 1171456",
|
|
"against RIFF size - 60 of 1294396 / 1118268 / 1171516).",
|
|
"",
|
|
"SO THERE IS NO 'WHICH ONE' TO ANSWER. `presentation` below discards two of",
|
|
"three streams the game plays. It is not a preference between rules any more;",
|
|
"it is a known-incomplete export.",
|
|
"",
|
|
"WHY IT IS NOT CHANGED TODAY. Reverting to the 1/n sum is not obviously less",
|
|
"wrong: an equal-gain sum of channel pairs is not a downmix -- MISSION",
|
|
"section 6 makes exactly that point when it pins an explicit matrix for the",
|
|
"movies' 5.1 fold rather than letting ffmpeg default -- and the 6.02 dB the",
|
|
"sum cost S00A was a real defect. Swapping one guess for another on a message",
|
|
"is what produced this entry twice already.",
|
|
"",
|
|
"🟡 HYPOTHESIS, NOT A RESULT, and it is the Decoder's: three concurrent stereo",
|
|
"streams is six channels, and N stereo streams is how XMA carries",
|
|
"multichannel on the 360, so 5.1 would explain the differing byte rates, the",
|
|
"near-silent stream and why cues are 1-stream or 3-stream and never 2. AGAINST",
|
|
"IT: all three declare ChannelMask = 0x0002 identically, which is odd for",
|
|
"distinct channel roles. Do not build on it.",
|
|
"",
|
|
"WHAT SETTLES IT: a recording of the game's own output over the intro,",
|
|
"through the PulseAudio null sink (AUDIO-VERIFICATION section 3). Candidate",
|
|
"combinations of the three decoded streams can then be correlated against",
|
|
"what the game actually played. Asked 2026-08-29.",
|
|
"",
|
|
"🔴 REFUTED FROM THE OUTPUT SIDE, 2026-08-30, not merely suspected.",
|
|
"",
|
|
"The RE agent recorded 148 s of the game's own output over the boot intro",
|
|
"(ALSA tee, --gpu=null, 0.15 % silence -- cleaner than the recipe page's own",
|
|
"reference run), with provenance from the XMA probe rather than a screenshot:",
|
|
"`ADV`'s three contexts appear byte-exact, then the `BGM_102` pair.",
|
|
"",
|
|
"FIVE OF SIX CHANNELS CARRY DISTINCT CONTENT. No channel is a copy of another;",
|
|
"the largest pairwise correlation is 0.70, between FL and FR, which is what a",
|
|
"stereo pair looks like. BR is 82 % silent and 11 dB down.",
|
|
"",
|
|
"So `presentation: \"loudest\"` -- keeping ONE stream -- cannot be right. That",
|
|
"was already labelled known-wrong here on the strength of the game decoding",
|
|
"all three concurrently; it is now refuted by what the game PLAYS.",
|
|
"",
|
|
"⚠️ AND IT IS STILL NOT FIXED, DELIBERATELY, on the RE agent's own instruction.",
|
|
"Three limits they state:",
|
|
" * it does not make summing right -- the output is multichannel, which says",
|
|
" nothing about which stream lands where;",
|
|
" * '6 channels' is NOT evidence the game is 5.1 -- that count is Xenia's",
|
|
" hardcoded kFrameChannelsDefault. The evidence is that five of them DIFFER,",
|
|
" which a stereo guest cannot produce;",
|
|
" * 🔴 the stream-to-channel mapping is NOT RUN. Cross-correlating each",
|
|
" captured channel against each decoded `ADV` stream is the step that",
|
|
" answers this, and it is their next iteration.",
|
|
"",
|
|
"Changing the mapping now would swap one authored guess for another, which is",
|
|
"a worse position than a guess that is labelled. The value stays; the label is",
|
|
"upgraded from suspicion to refutation."
|
|
],
|
|
"presentation": "all",
|
|
"presentation_why": [
|
|
"`loudest` = the full-length stream whose peak is nearest full scale.",
|
|
"",
|
|
"🔴 READ THE BLOCK ABOVE FIRST. This selects one of three streams the game",
|
|
"decodes concurrently, so whatever it selects, two are missing. The",
|
|
"paragraphs below are the history of how the value was arrived at, kept",
|
|
"because the reasoning is what makes the error checkable -- NOT because the",
|
|
"choice is defensible on its own terms any more.",
|
|
"",
|
|
"It was `highest_rate`, on a recommendation withdrawn as self-contradictory:",
|
|
"'the highest-rate, highest-gain one is chunk 1' selects different streams --",
|
|
"ADV stream 2 is 1118268 B at 0.0 dBFS, stream 3 is 1171516 B at -8.3.",
|
|
"",
|
|
"A structural argument for `loudest` was offered and withdrawn too: ADV",
|
|
"stream 2 is mono-in-stereo and stream 3 is dual-mono, so the extra bytes",
|
|
"looked like a duplicated channel rather than fidelity. The CHANNEL",
|
|
"MEASUREMENT stands and now reads differently -- these are channel pairs, and",
|
|
"0.60x with the residual 26.8 dB down is what a correlated pair at a lower",
|
|
"level looks like. The GENERALISATION was refuted by census: the stream-3 /",
|
|
"stream-2 size ratio over the 28 three-stream cues runs 0.0778 to 2.9163.",
|
|
"",
|
|
"⚠️ THE FAILURE MODE HERE IS THAT IT SOUNDS FINE. A single stream decodes to",
|
|
"clean audible dialogue, so nothing in the output reveals that two streams",
|
|
"are missing. That is why the manifest says it in words on every voice entry",
|
|
"rather than leaving it to this file."
|
|
],
|
|
"stream_weights": {
|
|
"_": [
|
|
"Declared XMA `byte_size` -> the coefficient that stream's position takes in a",
|
|
"stereo downmix. MEASURED by the RE agent 2026-08-30",
|
|
"(docs/re/structures/intro-audio-decomposed.md): decomposing the game's own",
|
|
"6-channel output as capture = 0.600 x movie + residual puts ctx0 at FL/FR,",
|
|
"ctx1 at FC with LFE silent, and ctx2 at BL/BR.",
|
|
"",
|
|
"🔴 KEYED BY BYTE SIZE ON PURPOSE. The assignment is indexed by the decoder's",
|
|
"own declared size, so the exporter can CHECK that the stream in front of it is",
|
|
"the one the measurement describes rather than assume it. A region whose chunks",
|
|
"do not match falls back to the count divisor and says so. That is not defensive",
|
|
"programming: on 2026-08-30 this table's sizes did NOT fit the region the",
|
|
"resolver returned, which is what exposed `resolve_movie_voice_region` starting",
|
|
"238 packets late. Had the weights been applied positionally they would have",
|
|
"been applied to the wrong streams silently.",
|
|
"",
|
|
"⚠️ ONE BOOT, ONE MOVIE. Only `ADV`'s three streams were measured. `S00A`'s",
|
|
"sizes match nothing here and it keeps the divisor -- extending this by",
|
|
"POSITION would be assuming the ordering generalises, which is exactly the",
|
|
"inference the byte-size key exists to avoid.",
|
|
"",
|
|
"⚠️ The weights are a stereo downmix's, folded to mono. They sum to 1.0, so the",
|
|
"total is the movie's own; what they distribute is the balance between three",
|
|
"positions. Whether the game's 0.600 mixer gain is a constant or a volume",
|
|
"setting is unknown and the port applies no gain of its own."
|
|
],
|
|
"1294336": {
|
|
"position": "FL/FR",
|
|
"weight": 0.4142
|
|
},
|
|
"1118208": {
|
|
"position": "FC (LFE silent)",
|
|
"weight": 0.2929
|
|
},
|
|
"1171456": {
|
|
"position": "BL/BR",
|
|
"weight": 0.2929
|
|
}
|
|
}
|
|
}
|
|
}
|