Skip to content

MIDI VFO Tune Knob jumps with touch-sensitive DJ jog wheels #2421

Description

@s53zo

Problem

Touch-sensitive MIDI DJ controllers such as the Hercules DJControl Starlight can make AetherSDR's VFO Tune Knob mapping feel jumpy or flaky.

In the captured Starlight event stream, the jog wheel emits a touch NoteOn event before the actual rotation CC data. Rotation itself is emitted as relative CC pulses, commonly 1 for one direction and 127 for the other. If Learn captures the touch event or if the relative pulses are treated as absolute values, a small wheel movement can become a large VFO jump.

There is a second timing issue in the command flow: MIDI relative tuning calculated each new target from SliceModel::frequency(), while SliceModel also accepts asynchronous RF_frequency echoes from the radio. During rapid wheel movement, delayed radio echoes can become the base for the next MIDI step, causing apparent backward/forward jumps.

Expected behavior

  • Learning VFO Tune Knob from a touch-sensitive jog wheel should bind to the movement CC/PitchBend, not the touch sensor.
  • Relative encoder pulses should map predictably to selected radio step increments.
  • Rapid wheel movement should tune from the local in-flight target rather than stale radio echo.

Proposed fix

  • Ignore touch-only NoteOn messages while learning slider/knob targets; wait for continuous movement data (CC/PitchBend).
  • Default learned VFO Tune Knob CC bindings to relative mode.
  • Treat common 1/127 VFO CC pulses as relative even for older non-relative saved bindings.
  • Keep a short-lived MIDI VFO target in MainWindow so repeated wheel pulses build from local intent until the wheel goes idle.
  • Keep VFO relative detents exact, without MIDI-side acceleration/halving.

Validation

  • Captured live Starlight MIDI messages with RtMidi on the same backend used by AetherSDR.
  • Built AetherSDR successfully.
  • Ran midi_settings_test successfully.

Notes

The final radio command remains the existing SmartSDR-compatible form:

slice tune <slice-id> <frequency-mhz> autopan=0

The change is limited to how MIDI learn and MIDI relative tuning compute the target frequency before that command is emitted.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingexternal devicesFlexControl, MIDI, serial port, USB peripheralsmaintainer-reviewRequires maintainer review before any action is taken

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions