Skip to content

Wide-path consolidation: offline runs the shipped wide stage, M/S stereo (Stage 14) - #40

Merged
robmorgan merged 1 commit into
mainfrom
feat/wide-path-consolidation
Aug 7, 2026
Merged

Wide-path consolidation: offline runs the shipped wide stage, M/S stereo (Stage 14)#40
robmorgan merged 1 commit into
mainfrom
feat/wide-path-consolidation

Conversation

@robmorgan

Copy link
Copy Markdown
Owner

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 shipped WideKeylockStage, 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).

  • Determinism extends to wide rates: streaming (WideKeylock profile) and offline renders are sample-identical at 0.5× and 1.5× (streaming_offline_determinism.rs).
  • The Stage 13 sub-bass trade dissolves: through the live stage the PV runs at unity with the resampler transposing, and the two-tone balance measures at the ideal (~0.53–0.56 amplitude ratio) at every wide ratio — the rigid sub-bass attenuation band pinned two days ago is gone. Sweep bands re-pinned at ideal-centered values.

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:

  • Identical-channel and steady-side-tone fixtures measured identical pre/post — deterministic pipelines can't diverge on identical input, and a strong center is always its own locked peak. Both are documented as non-discriminating.
  • The discriminating fixture (independent noise beds per channel, shifting peak landscape around a center tone): per-channel leak 64.6 dB rejection → M/S 70.9 dB. Modest — the gates in tests/wide_stereo_coherence.rs are 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_peaks now applies the same MIN_PEAK_MAGNITUDE floor as the vocoder's own peak pass (constant moved to phase_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, the set_stretch_ratio seam-case chain, legacy LR8Crossover, duplicate bessel_i0s, stale Makefile/qa/README.md/RESEARCH.md references. Then the owner ±30/±50 listen vs the pre-consolidation renders.

🤖 Generated with Claude Code

…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>
@robmorgan
robmorgan merged commit 22f047e into main Aug 7, 2026
10 checks passed
@robmorgan
robmorgan deleted the feat/wide-path-consolidation branch August 7, 2026 00:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant