The problem
Transposition in #245 moves the whole track. That covers singing a song in a
different key, but not the cases where one part needs to move and the rest must
not:
- A backing part recorded a tone away from the version you are learning.
- Practising a harmony line against the original melody.
- A bass part that sits below what a smaller instrument can play.
- Hearing a riff an octave up to pick it out of a dense mix.
Today the only way to do any of these is to transpose everything, which defeats
the point: you lose the reference you were trying to play against.
Who it affects
Anyone using StemDeck to learn or practise a part rather than to perform the
whole song. It is the same audience #245 was opened for, one step further in.
Constraints anyone solving this will hit
Drums must never be transposed, including drums you cannot see. Resampling a
snare does not move it to another key, it makes it a different drum. This is not
only the visible drums lane: when a stem is deselected at import it is folded
into original.wav, so a job with drums deselected has drums inside the
complement lane. Routing only the lane named drums away from the pitch stage
is not enough.
One shared clock, or the mix falls apart. The obvious implementation, one
pitch shifter per lane, does not work. WSOLA latency moves with the shift, so
independently clocked chains put lanes up to 144 ms apart from each other.
Measured on the existing worklet:
pitch 0, tempo 1 0 ms (bypass)
pitch +2, tempo 1 115 ms
pitch -5, tempo 1 144 ms
pitch 0, tempo 0.75 437 ms
Whatever the design, every lane has to come out on one clock.
Changing a lane mid-playback cannot drop out. A pitch chain needs roughly
130 ms of input before it can emit anything. Blocking the mix on a new chain
stalls every other lane for that long; not blocking leaves the changed lane
permanently 130 ms late.
The lane row is out of space. It is about 300px wide and already carries an
icon, name, meter, fader, numeric readout, M, S and a download button. A control
that needs more than about 25px will squeeze the fader to nothing.
What "done" looks like
A per-lane key control that never moves drums, keeps every lane on one clock,
survives a change during playback without a gap, and does not cost the fader its
width.
The problem
Transposition in #245 moves the whole track. That covers singing a song in a
different key, but not the cases where one part needs to move and the rest must
not:
Today the only way to do any of these is to transpose everything, which defeats
the point: you lose the reference you were trying to play against.
Who it affects
Anyone using StemDeck to learn or practise a part rather than to perform the
whole song. It is the same audience #245 was opened for, one step further in.
Constraints anyone solving this will hit
Drums must never be transposed, including drums you cannot see. Resampling a
snare does not move it to another key, it makes it a different drum. This is not
only the visible
drumslane: when a stem is deselected at import it is foldedinto
original.wav, so a job with drums deselected has drums inside thecomplement lane. Routing only the lane named
drumsaway from the pitch stageis not enough.
One shared clock, or the mix falls apart. The obvious implementation, one
pitch shifter per lane, does not work. WSOLA latency moves with the shift, so
independently clocked chains put lanes up to 144 ms apart from each other.
Measured on the existing worklet:
Whatever the design, every lane has to come out on one clock.
Changing a lane mid-playback cannot drop out. A pitch chain needs roughly
130 ms of input before it can emit anything. Blocking the mix on a new chain
stalls every other lane for that long; not blocking leaves the changed lane
permanently 130 ms late.
The lane row is out of space. It is about 300px wide and already carries an
icon, name, meter, fader, numeric readout, M, S and a download button. A control
that needs more than about 25px will squeeze the fader to nothing.
What "done" looks like
A per-lane key control that never moves drums, keeps every lane on one clock,
survives a change during playback without a gap, and does not cost the fader its
width.