Wide-path consolidation: offline runs the shipped wide stage, M/S stereo (Stage 14) - #40
Merged
Merged
Conversation
…M/S stereo ROADMAP Stage 14, behavior half: - Offline wide ratios inside the engine rate range render through the live WideKeylockStage via the same host-emulation driver as the keylock branch (profile parameterized; the direct batch PV survives only beyond 4x either way). Streaming-vs-offline determinism now extends to wide rates: sample-identical at 0.5x and 1.5x. - The two-tone sub-bass attenuation pinned at Stage 13 disappears through the live stage (the PV runs at unity with the resampler transposing): balance measures at the ideal (~0.53-0.56 amplitude ratio) at EVERY wide ratio; bands re-pinned accordingly. - The corrected stereo path runs in mid/side: centered content lives in M under one vocoder, so identical channels stay bit-identical and center energy cannot leak into the side by construction. Honest measurement: the per-channel leak this guards against was modest (64.6 -> 70.9 dB center-to-side rejection on a noise-bed fixture) - the gates in tests/wide_stereo_coherence.rs are regression tripwires, and the audible width verdict belongs to the owner listen. Two earlier fixture attempts (identical channels; steady side tones) measured identical pre/post and are documented as non-discriminating. - Peak-magnitude floor unified: fill_spectral_peaks now applies the same MIN_PEAK_MAGNITUDE as the vocoder's own pass, so locking and gradient integration operate on one peak set (noise-floor ripple no longer counts as peaks in quiet passages). A/B matrix, keylock/transient QA gates, pv_null, and both full suites green. Dead-code/doc sweep follows in a separate PR. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ROADMAP Stage 14, behavior half. The dead-code/doc sweep follows in a separate PR.
Offline wide = live wide
stretch()beyond ±20% (within the engine's 0.25–4.0 rate range) now renders through the shippedWideKeylockStage, via the same host-emulation driver as the keylock branch — the profile is simply parameterized. The direct batch PV survives only beyond 4× either way (outside any deck use).streaming_offline_determinism.rs).Mid/side stereo for the wide corrected path
Centered content lives entirely in M under one vocoder: identical channels stay bit-identical, and center-to-side leak is structurally impossible (S = 0 encodes to exact zeros through the whole chain). The raw/toggle arm stays L/R.
Honest measurements, including the fixture archaeology:
tests/wide_stereo_coherence.rsare regression tripwires, and the audible width verdict belongs to the owner listen. Note for that listen: Stage 11 heard ours as "a bit crowded" vs R3's "wider, more open," and M/S touches exactly that quality.Peak-set unification
fill_spectral_peaksnow applies the sameMIN_PEAK_MAGNITUDEfloor as the vocoder's own peak pass (constant moved tophase_locking.rs, shared), so locking, gradient integration, and IF-blend operate on one peak set — noise-floor ripple no longer counts as peaks in quiet passages (review finding).Verification
A/B matrix, keylock/transient QA gates,
pv_null, wide-rate determinism, stereo coherence gates, and both full suites (debug + release) green.Remaining stage items
Dead-code/doc sweep (next PR):
hop_synthesis, the no-op envelope block, theset_stretch_ratioseam-case chain, legacyLR8Crossover, duplicatebessel_i0s, staleMakefile/qa/README.md/RESEARCH.mdreferences. Then the owner ±30/±50 listen vs the pre-consolidation renders.🤖 Generated with Claude Code