Problem
Speaker formant override projection still hardcodes F1 through F10 in the frontend, even though control-score projection was made dynamic. This leaves one remaining fixed-formant-count assumption in the FE signal path.
Evidence
src/tts-frontend.ts defines SPEAKER_FORMANT_KEYS = ["F1" ... "F10"].
src/tts-frontend.ts iterates that list when applying speaker profile formant overrides.
src/control-score.ts no longer has the old index <= 10 loop, so the frontend override path is now the remaining mismatch.
Acceptance criteria
- Derive speaker formant override keys from the active formant-bank/graph registry or another declarative synthesizer capability surface.
- Remove
SPEAKER_FORMANT_KEYS as a fixed F1-F10 list.
- Add a focused test proving an
F11 speaker override is carried when the active synthesizer declares that formant.
- Do not reintroduce a fixed upper bound in TypeScript.
npm.cmd run typecheck:core passes.
Problem
Speaker formant override projection still hardcodes
F1throughF10in the frontend, even though control-score projection was made dynamic. This leaves one remaining fixed-formant-count assumption in the FE signal path.Evidence
src/tts-frontend.tsdefinesSPEAKER_FORMANT_KEYS = ["F1" ... "F10"].src/tts-frontend.tsiterates that list when applying speaker profile formant overrides.src/control-score.tsno longer has the oldindex <= 10loop, so the frontend override path is now the remaining mismatch.Acceptance criteria
SPEAKER_FORMANT_KEYSas a fixed F1-F10 list.F11speaker override is carried when the active synthesizer declares that formant.npm.cmd run typecheck:corepasses.