Files
Sylpheed/docs/re/data/menu-bgm-loop-measured.txt
sylph-decoder b0fe35f7cd re: the menu BGM loops at 61.93 s, and the game never reaches the fade
240 s parked on the main menu, reached by using the XMA probe log as the screen
oracle instead of video -- the route the previous iteration wrote down. Menu in
26.8 s against never-in-378 s for the video rig, guest at 0.92x, capture at
0.08 % silence against the recipe page's own best of 0.31 %. BGM_103's contexts
verify the screen and no ADV context appears afterwards, so the attract loop
never took over.

Three results, two instruments.

NO SEAM: zero runs >= 0.3 s below median-18 dB in 232 s. The port's 3.4 s
near-silence is a property of its authored loop, not of the game.

NOT THE WAVE LENGTH: autocorrelation r at 87.750 s is -0.009 on four independent
windows; the top lag is 61.909 s with a 2x harmonic. Estimator controls recover
87.750 and 60.000 exactly.

61.93 s, INDEPENDENTLY: locating 30 s slices of the capture inside the decoded
summed waves shows playback advancing exactly +5.00 s per 5 s and wrapping at
61.93, from three wraps. Control: slices cut from the wave itself at 10/45/70 s
are found at 10.00/45.00/70.00. Two points mis-lock where the slice straddles a
wrap and they carry the two lowest scores in the table.

Offsets span 0.25..57.18 s of an 87.744 s wave, so the loop is [~0, 61.93) and
the final ~25.8 s is never played -- exactly where bgm-two-stems.md found the
fade-out and trailing silence. The game loops before the fade, which is why
there is no seam.

Also corrects my own '8 of 10 three-chunk regions start mid-stream'. The port
counts 25 three-chunk regions; it is right that both numbers cannot describe the
same set. My audit run was CUT SHORT -- the committed file ends mid-list with no
summary line -- so that was a ratio over an unknown fraction of the population,
and the claim that the defect is specific to multichannel regions is now
unsupported. The ADV verification and the fix's own sweep are unaffected; that
sweep ran to completion and printed its totals.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
2026-08-30 09:34:42 +00:00

84 lines
3.8 KiB
Plaintext

# The menu BGM loop, measured from the running game.
#
# 2026-08-30. 240 s parked on the main menu, log-verified: the XMA probe shows
# BGM_103's two waves (3 876 864 / 3 930 112 B) decoding, and NO ADV context
# appears afterwards, so the attract loop never took over.
#
# Capture: --gpu=null --apu=alsa --mute=false, ALSA file tee -> paced pulse
# slave. 265.4 s, 6ch f32 48 kHz, 0.08 % all-channel silence (the recipe
# page's own clean run is 0.31 %).
#
# REFERENCE: BGM_103's two waves dumped from sound.pak and decoded, then
# summed -- they play together (bgm-two-stems.md). Each is 87.744 s.
#
# INSTRUMENT: locate a 30 s slice of the capture inside the wave by envelope
# cross-correlation. CONTROL -- slices cut from the wave itself at 10/45/70 s
# are found at 10.00/45.00/70.00 s.
#
# RESULT 1 -- there is NO SEAM. Zero runs >= 0.3 s below (median - 18 dB) in
# 232 s of menu audio. The 3.4 s near-silence the port measured on its own
# authored loop does not occur in the game.
#
# RESULT 2 -- the game does NOT loop at the wave length.
# autocorrelation r at lag 87.750 s = -0.009 (four independent windows:
# -0.0090 / -0.0061 / -0.0067 / -0.0055)
# autocorrelation top lag = 61.909 s, r = +0.533, harmonic at 123.819 s
#
# RESULT 3 -- offset tracking gives the same number independently, and the
# playback is exactly 1:1.
#
# capture_t wave_offset score step
40.0 14.07 +0.500
45.0 19.07 +0.499 +5.00
50.0 24.07 +0.497 +5.00
55.0 29.07 +0.454 +5.00
60.0 34.07 +0.408 +5.00
65.0 39.08 +0.420 +5.01
70.0 44.08 +0.414 +5.00
75.0 49.08 +0.356 +5.00
80.0 54.09 +0.347 +5.01
85.0 28.13 +0.266 -25.96 <- LOW SCORE: slice straddles the wrap, mis-locked
90.0 2.16 +0.378 -25.97
95.0 7.16 +0.469 +5.00
100.0 12.16 +0.486 +5.00
105.0 17.16 +0.470 +5.00
110.0 22.16 +0.485 +5.00
115.0 27.16 +0.433 +5.00
120.0 32.17 +0.401 +5.01
125.0 37.17 +0.398 +5.00
130.0 42.17 +0.425 +5.00
135.0 47.17 +0.367 +5.00
140.0 52.18 +0.334 +5.01
145.0 57.18 +0.331 +5.00
150.0 0.25 +0.337 -56.93
155.0 5.25 +0.413 +5.00
160.0 10.25 +0.453 +5.00
165.0 15.25 +0.450 +5.00
170.0 20.25 +0.453 +5.00
175.0 25.25 +0.439 +5.00
180.0 30.26 +0.411 +5.01
185.0 35.26 +0.423 +5.00
190.0 40.26 +0.427 +5.00
195.0 45.26 +0.380 +5.00
200.0 50.27 +0.337 +5.01
205.0 55.27 +0.368 +5.00
210.0 29.31 +0.272 -25.96 <- LOW SCORE: slice straddles the wrap, mis-locked
215.0 3.35 +0.359 -25.96
220.0 8.35 +0.463 +5.00
225.0 13.35 +0.437 +5.00
230.0 18.35 +0.442 +5.00
235.0 23.35 +0.435 +5.00
# Playback is exactly +5.00 s per 5 s of wall clock -- 1:1, no resampling.
# The wraps, taken across the two low-score straddle points:
# t=80 54.09 -> t=90 2.16 : 54.09 + 10 - 61.93 = 2.16
# t=145 57.18 -> t=150 0.25 : 57.18 + 5 - 61.93 = 0.25
# t=205 55.27 -> t=215 3.35 : 55.27 + 10 - 61.93 = 3.34
# => LOOP LENGTH 61.93 s, three independent wraps, agreeing with the
# autocorrelation's 61.909 s from a different instrument.
#
# Offsets span 0.25 .. 57.18 s of an 87.744 s wave, so the loop region is
# [~0, 61.93) and the final ~25.8 s of the wave is NEVER PLAYED -- which is
# where bgm-two-stems.md found the fade-out and trailing silence. The game
# loops before the fade, which is why there is no seam.