Skip to content

Numark Mixtrack Pro mapping fix and upgrade v.2.5 - 2.6 - #15629

Open
vespadj wants to merge 310 commits into
mixxxdj:2.6from
vespadj:mixtrack-pro-fix
Open

Numark Mixtrack Pro mapping fix and upgrade v.2.5 - 2.6#15629
vespadj wants to merge 310 commits into
mixxxdj:2.6from
vespadj:mixtrack-pro-fix

Conversation

@vespadj

@vespadj vespadj commented Nov 17, 2025

Copy link
Copy Markdown
Contributor

This PR enhances the Numark Mixtrack Pro controller mapping with several improvements and modernizations:

  • Refactoring and fixes: Improved jogWheel, touchWheel, and Loop functionality, with better handling of functions.
  • New features: Added settings controls, brake/soft start options (ready for 2.6+), revamp EQ knobs, selector knob, pitch bend buttons alternative mapping, and updated beat sync to use sync_enabled.
  • Code modernization: Modernized JavaScript functions, removed unused code, and applied ESLint/Prettier formatting.
  • Mapping upgrades: Upgraded XML from v1.2 to v2.5, changed deleteKey to shiftKey, and removed old [Flanger] references.

All changes have been tested and are ready for integration.

acolombier and others added 30 commits May 18, 2025 23:42
…ck-qml-proxy

feat: refactor player proxy and create separated track proxy
…rdware-setting

fix: prevent unnecessary need restart popup
…rm-on-qml

feat: add more renderers on QML
…veform-zoom-exp

QML: Improve waveform zoom exp
Use FindWrapOpenGL.cmake. It allows X11-less system.
Set link_target to OpenGL::OpenGL, GLVND-based. If not found, use
OpenGL:GL.

Furthermore, adding a __X11__ definition so that the screensaver that
requires Xlib is now optional.

Signed-off-by: Nicolas PARLANT <nicolas.parlant@parhuet.fr>
Because X11/XKBlib.h is a part of libX11

Signed-off-by: Nicolas PARLANT <nicolas.parlant@parhuet.fr>
Don't try localeFromXkbSymbol w/o __X11__ defined
…pping_validation_test and controllerscriptenginelegacy_test executable without crash
Don't use asKeyValueRange() when building with Qt 6.2
@vespadj

vespadj commented Dec 3, 2025

Copy link
Copy Markdown
Contributor Author

I look that scratch part can be simplified and I'm working on it.

  1. Fix LedTimers, was with random index --> raise some few errors sometime.
  2. Review, simplified and commented wheel Touch and Turn, still considering inertia in backspin.
  3. Add scratch Sensibility in Mapping settings , default 600.
  4. Update manual
    Done!

Comment thread res/controllers/Numark Mixtrack Pro.midi.xml
Comment thread res/controllers/Numark-Mixtrack-Pro-scripts.js
@github-actions

Copy link
Copy Markdown

This PR is marked as stale because it has been open 90 days with no activity.

@github-actions github-actions Bot added the stale Stale issues that haven't been updated for a long time. label Mar 11, 2026
@ronso0

ronso0 commented Mar 11, 2026

Copy link
Copy Markdown
Member

Okay, this looks good.
Sorry for letting this wait so long!

Please rebase onto 2.6 and try to adjust commit messages to reflect the changes ("reviews 3" is not helpful when looking at the commit history later on). Maybe even squash related commits? But I'll leave that up to you as it might be cumbersome.
Use git rebase -i [target branch], the -i flag means to use the interactive editor view where you can remove unrelated commits from main, reorder commits and reword commit messages.

@github-actions github-actions Bot removed the stale Stale issues that haven't been updated for a long time. label Mar 12, 2026
@vespadj

vespadj commented Apr 14, 2026

Copy link
Copy Markdown
Contributor Author

I done. I'm not sure about the git push command, please give me instructions if it's necessary, for this PR and the relative manual (link above).
Thank you so much for your constant support.

@ronso0
ronso0 changed the base branch from main to 2.6 April 15, 2026 10:02
@ronso0

ronso0 commented Apr 15, 2026

Copy link
Copy Markdown
Member

Thanks. You force-pushed but changing the base here to 2.6 (now 309 commits) indicates you didn't rebase onto 2.6

I've found some nits in the last commit(s), minor requests only, and will leave a review soon.

@ronso0 ronso0 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

another review run..

Btw did you close the previous review convos yourslef or did this happen automatically after you force-pushed?
For the record: convos are closed by reviewers. Else we don't know which have been actually resolved and need to go through all again..

NumarkMixTrackPro.isPflOn = [0, 0];
engine.makeConnection("[Channel1]", "pfl", (value) => {
NumarkMixTrackPro.isPflOn[0] = value;
console.log("NumarkMixTrackPro.isPflOn[0]", NumarkMixTrackPro.isPflOn[0]);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

debug leftover?
if yes, please remove

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok in next commit.

Comment on lines +130 to +135
NumarkMixTrackPro.LedTimer = function(id, led, count, state) {
this.id = id;
this.led = led;
this.count = count;
this.state = state;
};

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

where is LedTimer used?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not used, deleted in next commit.

Comment on lines +308 to +324
NumarkMixTrackPro.setStutterBeat = function(deck, value) {
const secondsBlink = 30;
const secondsToEnd =
engine.getParameter(`[Channel${deck}]`, "duration") *
(1 - engine.getParameter(`[Channel${deck}]`, "playposition"));

if (
secondsToEnd < secondsBlink &&
secondsToEnd > 1 &&
engine.getParameter(`[Channel${deck}]`, "play")
) {
// The song is going to end
NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].Cue, value);
}

NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].stutter, value);
};

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest to connect to end_of_track
That way users can define the threshold in Preferences -> Waveforms

And the LED currently doesn't blink, or does it?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, done. Stutter LED blink at each beat and Cue blink to at the end of the song.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

used makeConnection in the proper way with group. Deleted two callback functions, and renamed the rest.

Comment on lines +326 to +332
NumarkMixTrackPro.Stutter1Beat = function(value) {
NumarkMixTrackPro.setStutterBeat(1, value);
};

NumarkMixTrackPro.Stutter2Beat = function(value) {
NumarkMixTrackPro.setStutterBeat(2, value);
};

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These wrappers are not necessary if you use a lambda (or whatever that is called in js) for the stuterbeat makeConnections like you do for other connections, then just call setStutterBeat (rename to flashStutterLED?)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh, kinda already covered by Nicko's review #15629 (comment)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So will you resolve this conversation?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Niko's review, yes.
his was about the wrappers, I'm saying we only need NumarkMixTrackPro.setStutterBeat(deck, value) and call it from the lambdas

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(ok, see up)

variable="numarkMixTrackPro_brakeEnabled"
type="boolean"
default="false"
label='Play/Pause performs Brake and Soft Start if "SCRATCH LED" is on. [Require Mixxx v.2.6+]'>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The tooltip mentioning 2.6+ is however still in place in the xml

Comment on lines +371 to +377
NumarkMixTrackPro.Channel1Clip = function(value) {
NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[1].sync);
};

NumarkMixTrackPro.Channel2Clip = function(value) {
NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[2].sync);
};

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// cargar el tema con el pitch en 0
engine.softTakeover(group, "rate", false);
engine.setValue(group, "rate", 0);
engine.setParameter(group, "rate", 0.5);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as per Niko's review:
don't do this in the mapping, it's a user setting that can be set in Preferences -> Decks -> Speed / Key options

Comment on lines +502 to +506
if (engine.getValue(group, "play")) {
engine.setValue(group, "play", 0);
} else {
engine.setValue(group, "play", 1);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can be simply
script.toggleControl(group, "play");

Comment on lines +550 to +554
if (engine.getParameter(group, "quantize")) {
engine.setParameter(group, "quantize", 0);
} else {
engine.setParameter(group, "quantize", 1);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

script.toggleControl(group, "quantize");

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.