Skip to content

Per-lane transpose: move one instrument without moving the rest #476

Description

@thcp

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions