What problem does this solve?
There's no way to change the musical key of a track. This is essential for vocal practice and karaoke:
- Singers need to lower songs with high notes to practice safely before attempting the original key.
- Users want to transpose backing tracks to fit their natural vocal range when it doesn't match the original artist's.
Pairs naturally with the existing stem separation + speed control: separate stems → mute vocals → transpose the backing track to your range → practice at your tempo. Key change is the missing piece that turns the stem separator into a real vocal-practice tool.
Proposed solution
Add a pitch / key transposition control (e.g. a ±6 or ±12 semitone stepper with a key label) alongside the existing playback speed control — pitch shift without changing tempo, the complement to the speed control (tempo without pitch) shipped in #241 / #242.
Implementation notes:
- The audio engine already runs a WSOLA time-stretcher in an AudioWorklet (
static/vendor/soundtouch-processor.js), but it implements the tempo stage only — no resampler / pitch parameter. Pitch shift needs a resampling stage added (the standard SoundTouch time-stretch + resample design).
- Recommended: add a
pitch parameter + interpolating resampler inside the worklet, keeping pitch out of the delicate playback-rate/scheduling math in the audio engines.
- Start real-time, client-side, scoped to backing-track transposition — instrumental artifacts from WSOLA + resampling are far less objectionable than on isolated vocals. Higher-quality, formant-aware vocal shifting can be a later server-side enhancement.
Alternatives considered
- Prior art: the Transpose browser extension, and Moises.ai's key-change feature.
- Compose existing primitives (
playbackRate = 2^(N/12) on the source + SoundTouch tempo = 1/2^(N/12) to restore duration) instead of adding a resampler — quicker, but tangles pitch into the existing scheduling math, which is a likely source of bugs.
- Server-side offline render for maximum quality (formant preservation) — heavier and slower; better as a follow-up if users want to transpose isolated vocals well.
What problem does this solve?
There's no way to change the musical key of a track. This is essential for vocal practice and karaoke:
Pairs naturally with the existing stem separation + speed control: separate stems → mute vocals → transpose the backing track to your range → practice at your tempo. Key change is the missing piece that turns the stem separator into a real vocal-practice tool.
Proposed solution
Add a pitch / key transposition control (e.g. a ±6 or ±12 semitone stepper with a key label) alongside the existing playback speed control — pitch shift without changing tempo, the complement to the speed control (tempo without pitch) shipped in #241 / #242.
Implementation notes:
static/vendor/soundtouch-processor.js), but it implements the tempo stage only — no resampler / pitch parameter. Pitch shift needs a resampling stage added (the standard SoundTouch time-stretch + resample design).pitchparameter + interpolating resampler inside the worklet, keeping pitch out of the delicate playback-rate/scheduling math in the audio engines.Alternatives considered
playbackRate = 2^(N/12)on the source + SoundTouchtempo = 1/2^(N/12)to restore duration) instead of adding a resampler — quicker, but tangles pitch into the existing scheduling math, which is a likely source of bugs.