-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Pioneer DDJ-ERGO: added mappings #13003
base: 2.4
Are you sure you want to change the base?
Conversation
manual page is here mixxxdj/manual#602 |
Good to see you picked this up again. Just some thougts, I didn't take a closer look, yet:
|
I changed the base branch here, and indeed your branch is based on main (all commits since branching 2.4 are listed). If you think yo messed up something don't close this PR right away, we can fix it : ) |
Welcome at Mixxx! |
9003744
to
4572dd8
Compare
@jssotomdz already signed for #12456 as Jesús Soto |
ci was broken due to some white spaces, not sure how they got there |
All good now, thanks! Did you consider the proposed (Mixxx deafult) effects mapping? #13003 (comment) I know that implementing that would mean you'd throw away of your own implementation (the script would shrink considerably), but it's the default and it guarantees some kind of consistency when using different controllers with Mixxx. (also it makes 4 effect units available for free ;) |
Yes, took a look at it and makes sense, just haven't had the time to test it with the hardware. Also, will that affect the quick effects? ERGO V has two quick on/off toggles for effects. Or could I leave them as is? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I skimmed through the script, here are some first remarks.
Btw I'm surprised eslint doesn't complain about the missing spaces around * + - etc.
engine.setParameter(group, "reloop_toggle", 1); | ||
} else { | ||
engine.setParameter(group, "beatloop_activate", 1); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
beatloop_activate
does create/activate and deactivate, see the beatloop button in skins.
I suggest to map Shift+Autoloop to reloop_toggle
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
reloop_toggle
is mapped to Shift+Autoloop already, but I was unaware that calling beatloop_activate
with a 1 would deactivate the loop. I was trying with 0 and didn't work so figured I could do it with reloop. Fixed now, thanks for pointing it out!
//this is because the controller never sends a 0x40 message and hence never stops scratching | ||
if (Math.abs(value-0x40)===1) { | ||
value = 0x40; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't quite understand: what dou you need 0x40 for?
Values above/below are used for scratch ticks. No move, no ticks.
} | ||
engine.setValue(group, "rateRange", curr); | ||
} | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not use the ranges available in the preferences?
4, 6, 8, 10, 16, 24, 50, 90
At least I would set the max higher, probably 90%. The pitch sliders show the range so this should be easy to use, regardless how many ranges are provided.
Another example from the TerminalMix, though that applies the range to all decks and doesn't use the 'official' ranges either
TerminalMix.pitchRange = function (channel, control, value, status, group) { |
if (newValue < 0) { | ||
engine.setValue(group, "beats_translate_earlier", 1); | ||
} | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Re loopMove and adjustGrid: what do yo uthink about this set of combos
- AUTOLOOP turn: resize loop
- Shift + AUTOLOOP turn: adjust
beatjump_size
- Shift + In/Out: move loop by
beatjump_size
- idea: hold In+Out + AUTOLOOP turn: move beatgrid
It is certainly nice to have beatgrid controls on the controller (I make massive use of it), but using other beatjump sizes than 1 beat is also very common (IIRC other controllers have a pad mode for this).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mapped this following the virtual dj mapping as close as possible. I'm not sure if this controller supports long press (hold). Will take a look but that's the why of this combo
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mapped this following the virtual dj mapping as close as possible
Understandable, but there's no reason to mimic the (potentially sub-optimal) behaviour another software.
Let's start from zero and try to make it work good with Mixxx and cover as many use cases as possible.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok so unfortunately ERGO doesn't support long press. Should I proceed with the next implementation then?
AUTOLOOP turn: resize loop
Shift + AUTOLOOP turn: adjust beatjump_size
Shift + In/Out: move loop by beatjump_size
This will mean discarding the move beatgrid
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok so unfortunately ERGO doesn't support long press
Hmm, what signals does the AUTOLOOP send on press?
Only press (no release)?
Or press+release immediately?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This will mean discarding the move beatgrid
Well, beatjump is more important for performance than beatgrid move, so I'd rather drop the latter.
Maybe you can squeeze it in elsewhere?
Shift + wheel turn?
Or press Loop_In + LoopOut + touch + turn? With the hand on the platter (not just a finger on the rim) you can move very precisely.
const deck = status-0x90; | ||
if (value === 0x7F) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what about early return? (in general)
if (value !== 0x7F) {
return
}
then get the deck number
if (engine.getParameter(group, "play") === 1) { | ||
engine.setParameter(group, "cue_default", 1); | ||
} else { | ||
engine.setParameter(group, "play", 1); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if (engine.getParameter(group, "play") === 1) { | |
engine.setParameter(group, "cue_default", 1); | |
} else { | |
engine.setParameter(group, "play", 1); | |
} | |
if (engine.getParameter(group, "play") === 1) { | |
engine.setParameter(group, "cue_gotoandstop", 1); | |
} else { | |
engine.setParameter(group, "cue_gotoandplay", 1); | |
} |
cue_gotoandplay
only to make sure you play from cue in case you dropped a track from another deck (clone) and the play pos is not at the cue.
if (selectedSamples[deck] > 7) { | ||
selectedSamples[deck] -= 8; | ||
} | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why 8? Don't you want each Sampler Vol knob to control the samples of the respective side (1-4, 5-8)
Might be useful to know which sample is selected, e.g. turn the respective LED off for .5 sec? (off if a sample is loaded, on if not)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree that some visual feedback is needed. However with the limitations of the controller I find it a bit complicated to provide clear and understandable feedback for the user. I remember using the FLX4 a few days ago and the effect selector drew a cursor over the selected effect. Is it possible somehow to highlight the selected sample on the screen? That'd be my first choice
engine.setValue("[Microphone]", "pregain", value); | ||
engine.setValue("[Auxiliary1]", "pregain", value); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Users might use other inputs besides the Ergo, hence this combo might not be desired.
What about
turn: adjust Aux (first label on the controller)
Shift + turn: adjust Mic
Or, detect if only one mic or one aux is configured ([MicrophoneN], input_configured
) then pick the correct one.
Else, do Shift/unshift adjust mentioned above.
Might be a bit overkill to iterate over 4 mics and 4 aux for every knob turn, you could install callback for each mic and aux pointing to one function that iterates over the devices and stores the value (1 mic | 1 aux | none/multiple) to be used here.
13b6806
to
b23ad28
Compare
Implemented now |
e149289
to
dafdc41
Compare
FYI review conversations are resolved by reviewers only (and when the contributor picks a code suggestion :| ). Otherwise it's tedious for reviewers to check whether all comments have been addressed. |
//this toggles on/off effect 1 or 2 based on FX [1-2] buttons clicks | ||
DDJERGO.quickEffects = function(channel, control, value, status) { | ||
if (value === 0x7F) { | ||
const deck = control % 2; | ||
const effect = (control - deck - 0x4C)/4; | ||
const toggleState = 1 - engine.getParameter(effectsStrings[deck][effect], "enabled"); | ||
engine.setParameter(effectsStrings[deck][effect], "enabled", toggleState); | ||
//LEDs for FX number button and FX [1-2] | ||
midi.sendShortMsg(0x94 + deck, 0x47 + effect, 0x7F*toggleState); | ||
midi.sendShortMsg(status, control, 0x7F*toggleState); | ||
} | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The components Fx mapping now takes care of 1-2-3 knops and button.
What does this do?
Is it for the Fx 1-2 buttons?
If yes, those should toggle the deck -> Fx unit assignment. https://manual.mixxx.org/2.4/en/chapters/appendix/mixxx_controls.html#control-[EffectRack1_EffectUnitN]-group_[ChannelI]_enable
Left deck:
(1) [EffectRack1_EffectUnit1],group_[Channel1]_enable
(2) [EffectRack1_EffectUnit2],group_[Channel1]_enable
Right deck:
same, just with Channel2
Unfortunately pre-commit fails. I will remove it form the 2.4.2 milestone. We can merge it at any time once it is finished. |
FreeBSD 14.1 detects this controller as a HID device.
Although a EDIT: Running |
Regarding long press support, on HID left play button on left cue button on From how it works on my side: Steps to reproduce A:
To unstuck A:
I like this map and would like to contribute, though cannot look into reasons checks are not passing they seem to have been auto-deleted. |
A works fine when specifying //move quickly through the track when shift + jog wheel touch + turn
DDJERGO.searchTrack = [...] This code link. I suppose it is normal behavior of mixxx to seek tracks fast on SHIFT when it is paused, and when playing SHIFT + turn results in adding/removing speed. In my case this code causes issues and blocks interesting mixxx' feature, I would remove it. B possibly is related to device being not initialized properly (no proper drivers) as |
No description provided.