-
Notifications
You must be signed in to change notification settings - Fork 0
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
Reloop mixage addition #1
Conversation
After doing some preparation mixing with these bindings I found it annoying that the faders and equalizer nobs did not work when shift was enabled (I use shift lock). I made some changes in the XML mapping so the volume faders, equalizer nobs and rate adjustment also work when shift is enabled. Potentially some of these controls could be bound to other functions when shift is enabled but I have yet to find a control that is useful and intuitive. So for now I bound them to their default function |
Last week I stumbled upon a dj controller that allowed the user to adjust the loop in and loop out positions with the jog wheel. I really liked this functionality so I decided to add it to the reloop mapping as well. To make this work with the reloop I made some small adjustments to how the loop in and loop out buttons work and changed the way the LEDs behave. I added a clear loop functionality to the mapping while I was at it. Loop section
LEDs
Hopefully you haven't started reviewing yet as I think these changes really add to the functionality of the mapping |
I really like your changes! I did not look at the code, but hey, it could only have gotten better ;) I tested with Mixxx 2.3.5. The good - What I like:
The bad - Some functionality I could not get to work:
The ugly - Bugs?:
How do you enable Shift-Lock btw? EDIT: Code looks much better. I also like that you put more functionality into the XML and commented it according to the manual! Please make sure the code conforms to the Mixxx JS style. You need to lint it before we can push it to the PR, else the checks will fail. This is also necessary for the manual, which would also need updating. But let's fix / talk about the supposed bugs before... |
Thank you for taking the time to test the changes. I'm glad to hear you liked most of them and I'm eager to iron out any bugs or improve the mapping based on your suggestions. I cannot reproduce all the issues you have with the mappings so I'll adress them all as best as I can.
First things first let's make sure our controllers are an exact match because I cannot reproduce some of the issues you mentioned. While the controllers in the Reloop Mixage series are very similar there could be some differences in the midi signals that are sent which cause the issues. My current setup is as follows
My controller send the following signals for the functions you mentioned you can easily check this by starting mixxx in controller debug mode
EDIT: I checked chapter 7.2 in the manual which contains the midi signals and did find any difference between the different reloop mixage controllers. So im curious what your output is for these buttons. Can you also double check that you are using the xml file from this repo? As to your other points
This is expected behaviour for now, I removed the syncmaster function you wrote and replaced it with a direct xml mapping to set the sync master. Since the syncmaster functionality is supposed to be fixed in mixxx 2.4 I thought the direct xml mapping would be enough and would also handle the toggeling of the master deck. I will test this with the beta release later to see if this is indeed the case. EDIT: after installing the 2.4.0 beta the sync_master is replaced by sync_leader and is indeed working as expected. A simple xml binding is all that is needed to correctly switch the sync_leader, sync_master still works but is logged as deprecated in the terminal
Right now a flashing timer is started once a track has been loaded or a loop is exited. The flashing will not activate if no loop in or loop out point are found on the track. If working correctly the reloop LED should be blinking with an interval of 1 second. It works on my side by sending an on off signal to
I still unsure what would be a logical binding for the dry/wet press when no effect is selected. I thought about using it to clear the entire effect rack but opted to use it to disable all effects in stead. A toggle could be possible but I'm unsure how this should work. should it only toggle the effects that are currently on? or should it toggle all effects regardless of state? or should it turn all effects off first and then all on again on the second press? If you have any suggestions please let me know. I think it might be interesting to look at loading effect presets that should be added in version 2.4 and bind that to the press or press + turn.
As mentioned earlier there should be a switch on the back of your controller labeled SHIFT LOCK. Can you retest the mapping with it enabled, I'm curious if some functionality (like the loop adjust) works for you with it enabled. Anyway its a good reminder to test the controller with it both enabled and disabled to make sure all controls are intuitive in both modes. Using the loop adjust mode without shift lock requires you to hold the shift button continuously while adjusting the loop start and end points (right now the mode is exited once the shift button is released).
I'm using eslint in my IDE so the code should conform to spec, if not please let me know. I suggest we fix all the issues and make further changes to the mapping before making changes to the manual. Based on you feedback some bindings still need some tweaking. |
MIDI signals are the same:
|
...The Channel 2 beat length/move is still the wrong way 'round though...
Good to hear!
It works now, I have no idea why... :)
Toggle the stuff that has been enabled on/off or just leave it out completely. It makes no sense otherwise imo. You've just set up your effect, accidentally press dry/wet at any point and you have to do it all again. Also there's FX ON which can disable/enable the rack too (well, soft of, but has the same effect).
With shift-lock (and only with shift-lock) the adjust loop functionality seem to do something, but it makes not much sense to me. If you want to set loops you can set the the loop in/out point arbitrarily with IN/OUT or turn on quantizing. I don't like that the controller seemingly behaves differently depending on shift-lock being set. Also now you can't set loop in/out points when inside a loop. Is that normal Mixxx behaviour?
Very good! |
I'm confused, if we have the same midi outputs when turning the loop length the mapping should also work exactly the same regards of model or firmware. I went back and tested your original mapping from the
I rewrote and simplified this code and also removed the inversion since it seemed unnecessary for the controller
So either your controller sends different midi outputs for
I added the functionality after seeing it in youtube video using another controller, I thought it could be useful. You are right that you can set the loop in and out point arbitrarily when quantize is disabled. However, this does not allow you to gradually change the loop in and out points during playback of the loop. the loop adjust with the jog wheel also allows finer adjustments of loop point that you have already set
I bound different actions to the shift press
This is not normal Mixxx behaviour but a limitation caused by adding the loop adjust on double press. Otherwise you would set loop in and out points everytime you enter the loop adjustment mode. they should work normally when outside a loop, alternatively you can always clear the currently loop to set new loop in/out points using T5 Shift press.
This is certainly an option, if you have a good suggestion just let met know |
I think I've solved the riddle. I've replaced the broken encoder on the right LENGTH knob. Its switches must send the open-close sequence in reverse order. probably everything is fine with your JS. Sorry, I had not realized that until now 🙈 |
I'm not an advanced DJ, but I'd rather have intuitive, standard features, than something that might be practical for some, but modifies standard Mixxx behaviour. Also the Mixxx people were quite reluctant to my changes that were not standard, and I understand their reasoning, so I hid them behind a switch in the JS. I'd prefer to do this with the adjust loop feature too, or find a way to make enabling it less intrusive.
Maybe SHIFT + pressing LENGTH to toggle the loop adjustment would be an idea? It feels more intuitive to me. Or SHIFT +pressing both loop IN/OUT buttons at the same time. But that is harder to code and maybe a bit error prone. |
Alright that explains the difference between the behavior of our controllers. I replaced some LEDS on mine to a different colors so my MK2 also isn't standard. But this is good news, it means that there are no apparent differences in the MIDI signals between the Mixage CE, IE and IE MK2 (which is just a simplified IE).
It wasn't clear to me if this issues still persist for you, rotating the Traxx knob with shift enabled allows me to navigate through the sidepane. you should also be able to open and close folders in the sidepane by pressing the shift load buttons to open (right) and close (left) filesystem folders. If so we can start improving the mapping. To do
nice to haves
considerations
Let me know if i missed something |
Works.
I wasn't aware of clearloop. It is also nice to have, but not essential imo. What about the non-shift LENGTH press for clearloop and SHIFT+LENGTH press for adjust?
If that improves scrolling / scratching I'm all for it.
Good feature though.
Great feature. I like the effect preset idea.
I like all the 2.4 functionality, but could we, to finally get this out the door, only do some cleanup and just release this mapping with 2.3 and then work on an improved mapping in the 2.4 branch? Not sure when 2.4 will come out and arrive in distros... |
Yeah that should be easy enough to implement to distinguish between a short press for clear loop and a long press when adjusting the beatjump size. I'll will start working on the implementation
brake and soft start are not related to scrolling and scratching. Instead they are a stylized way to start (soft start) or stop (brake) playback for a track based on record players. A simple example can be found in this video. You can easily test this for yourself by using the
I agree with getting the mapping merged into the main branch as soon as possible. Sadly it seems 2.3 window has already past since the 2.3.6 release is the final maintenance release before 2.4. I'm afraid the 2.4.1 release will be the first release where we can get the mapping included as the 2.4 beta is already available with the stable release around the corner (august was the planned release date. Might as well include the new 2.4 features, unless there is a way to get the mapping added to previous stable releases. |
Well, alright then. I fear we'll have to rebase on 2.4 then. Should we just still merge this in to the 2.3 branch / same PR? |
As far as I have tested thus far this shouldn't be to much work. They have added support for ES6 in 2.4 but its unclear to me if it is expected that new mappings are writting in ES6. If that is the case we may have to refactor some code. If not not we just have to implement the new 2.4 features which are.
I'll leave this up to you but it might be worth asking in the pull request if this makes sense, especially since the code has been completely refactored since then, or if it is just better to create a new pull request for 2.4. In any case your current pull request is over a year old so bumping it with a question might be a good idea. Before we can merge to 2.3 there we still need to fix the following issues
|
I have rewritten the loop adjust slightly and rebound some functionality.
I saw your reply on the pull request on the main branch, I hope we get a reply soon. In the mean time I might start implementing the 2.4 features into the mapping. I was thinking about binding cycling effect presets to press + turn of the dry/wet no matter which effect slot is selected (not sure if this will work intuitively with the current effect_meta control). Pressing the dry/wet when no slot is selected can then toggle all effects in a preset on or off. Lastly we can bind the dry/wet mix mode toggle to a SHIFT + PRESS of the dry/wet button. Anyway I'm curious if the reworked loop adjustment mode makes more sense to you. |
Came back from a vacation today. Will check out the changes in the next days 👍 |
I have added support for the new features in 2.4 and refactored the code in the process. A quick overview of the changes Effects
Other controls
refactoring
These changes make the mapping incompatible with previous mixxx version so you need to compile mixxx 2.4 locally to test these changes. I'm really curious as to what you think of the new changes and additions and if everything makes sense and no bugs are present. I consider the mapping mostly done apart from 2 small considerations
In any case I suggest we do some minor changes and bugfixes and work towards creating a new pull request to get this mapping included in the main branch. We might still be able to get it included in the 2.4 release but I am unsure if they are willing to change to scope of the release at this time. maybe we can open a new topic on the Mixxx forums as you did for the initial version of this mapping to get peoples opinion and find any potential bugs. In any case I'm eager to get this mapping in the hands of other Mixage users and hope we can get it merged soon. |
I failed to build Mixxx 2.4 on Fedora due to missing dependencies. Installing the beta from an RPM package does not work either, again, due to dependencies. I'll wait until a 2.4.0 is released. |
I'll at least check out the changes from #9f76150. Btw did you know that you can:
|
I also had some trouble getting mixxx to build initially on Fedora since the information I could find is not completely up to date. I have already compiled it on two different fedora Installations so I can provide you with the steps I took. Let me know if the following steps work for you. sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install gcc-c++ ccache ninja-build
sudo dnf builddep mixxx --allowerasing
sudo dnf install guidelines-support-library-devel qt5-qtdeclarative-devel qt5-qtquickcontrols qt5-qtquickcontrols2 gtest gtest-devel google-benchmark-devel gmock gmock-devel
$ git clone https://github.com/mixxxdj/mixxx.git
$ cd mixxx
$ git checkout 2.4
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .
No I did accidentally find this mode but didn't know what it did. Not sure if it has any practical use on my MK2 as it doesn't have the jog sensitivty control on the back controller like the MK1. Still nice to know what it is supposed to be doing
Yes I used this when I replaced the yellow LEDs on the play buttons for orange LEDs to test if I had soldered them in correctly. In the meantime I have finished making a numbered svg schematic of the controller which we can include on the manual page to describe what each button does. I will include it in the manual repo somewhere soon. |
These work nicely and do not interfere. Like it! |
Works. Cool. Need to look into how to building them
The problem is that when you've only enable 1 or 2 of the effects in the rack all get disabled, but also all get enabled again. This might not be what you want. Don't you think a better solution (much more effort maybe) would be to store the effects on disabling and enable only the stored effects? When a user enables an effect through the UI in the meantime, pressing dry/wet will disable all again.
Should be enough imo
Works for me and is coherent
Works
After that scratch is enabled. Should that be the case?
Works nicely
For me the buttons are still nudging the deck. Anything like "rate_temp_up" might be bad, because then the speed slider is still sitting where it was before. I find that counter-intuitive. Not sure what else to map them to though...
Do that. Might simplify the code a bit. |
I like it very much as-is. So I have no objections to merging it. Not sure what we should do with the Mixxx PR though. Also we need to update the manual with the new functionality. |
I've also rewired my replacement encoder, so the LENGTH button works the correct way 'round ;) |
Ah so you were able to get 2.4 to compile with the missing dependecies installed.
fair point the current implementation has its limits and drawbacks. We could store the states for each effect unit in an object when the button is pressed and any unit is active. This saved state can then be loaded again when the button is pressed when no unit is active. Still not sure how we combine this with the new effect presents though, by default an effect preset that is loaded has all units disabled. Should the toggle then enable all units in that preset? It wouldn't make sense to load a previous toggle state when a preset is loaded. I'm curious what you think, I'll look into changing the current behaviour.
In the current implementation yes, as I thought it wouldn't matter much. But it might be better to implement a long/short press detection to avoid changing the scratch state. I'll start working on it.
I would suggest merging the changes into the reloop_mixage branch and creating a new pull request where we reference the old pull request when I'm done with the adjustments mentioned above. I opened 2 issues recently and the team is very quick to respond to new items. A new pull request might give us more momentum to get it merged.
I started adding your old manual to the 2.4 branch of your mixxx/manual repo. I created a schematic of the controller aswell and added it to the repo so it is easier to explain what buttons do. Sadly |
Thanks for the detailed instructions!
If the default is that new presets have all effects disabled, keep that behaviour by clearing the saved state when preset are changed or an effect is toggled "by hand" / through the UI.
I think it is better to not change scratch mode when the play button is pressed while the scratch button is pressed aka a soft start is executed.
I'm not sure what you mean by increase/decrease key. I don't know such a control in Mixxx. I would not do anything that changes the speed permanently, because of it breaking the speed controls.
Yeah, nobody is responding to my request. I'm a bit disappointed. They could have integrated the mapping months ago and we could have updated it. I answered to all their request, but nothing came of it. Frustrating.
Yeah RSTs do suck. I can not put it otherwise. I can update the manual when we've opened the new PR. |
I've updated the 2.4 branch in this fork. When you're done you can just merge this PR and copy the files to the 2.4 branch as you did with the manual already. Tell me when you're done. I'll update the manual, create new PRs on mixxx:2.4 and manual:2.4 and close the older two, mentioning the new ones. |
I think we agree on how the toggle should work, let me expand your examples. with when I am think about saving the current unit state. but first lets set the rules
In practice
will do |
I think that way it will work, be useful and mostly intuitive 👍 |
I changed the effect toggle control and changed the After implementing the new effect toggle I discovered I had misremembered the behavior of effect when a new preset is loaded. Instead of all effects in the rack being disabled the meta knobs are set to a saved position. That means that effect slots are not turned on or off when a new preset is loaded. I did already made an implementation to change the save state when a new preset is loaded, so I added them both and let you be the judge of what makes the most sense. The first implementation
The second implementation is the same as the first but has these added effects
You can test both easily with the code I have committed. Currently the loading of new presets does not affect save state or disable any effects, however when you uncomment the code on line 192 you can test the second implementation. Mixage.fxPresetConnection.push(engine.makeConnection("[EffectRack1_EffectUnit"+deck+"]", "loaded_chain_preset", function(_v, g) { Mixage.getLoadedPresetEffects(g); })); I'm curious to what you think |
Great!
Ok. If the default behaviour is to keep the enabled effects when switching preset, I'd keep that (so version 1). We should not tinker with Mixxx defaults too much. For me the effect knob behaviour is unclear btw. I think they get reset to their default value (e.g. balance to center). EDIT: Small bug. When pressing the The FX SEL button and an effect is selected I can't toggle the effect enable buttons anymore. I have to deselect all effects (press FX SEL multiple times) to be able to toggle again. I'd expect pressing DRY/WET will toggle the selected effect? |
yeah lets stick to the defaults I removed the second implementation.
The effect meta position get adjusted to the position that is saved in the preset. The built in presents all have their position saved in the zero or neutral position. You can test this yourself by making a new preset or edit an exisiting one.
good catch I replaced the wrong variable when implementing the toggle. It should be fixed again. I think the code is ready for a new pull request, a forum post might also be a good idea to get some more people testing the mapping |
I added the complete button layout from the figure I created to the manual, I also corrected some minor errors in the process. The context depend controls of the effect unit might need some additional explanation. I might add that in later |
Reformatted code to modern ES6 class structure
General
ON
,OFF
,DOWN
, variables to improve code readabilityinit
so al bindings and engine connections are set in aforeach
loop in preparation for the addition of deck 3 & 4shutdown
so disconnecting all connections is done inforeach
loopsChannel2
to the connectionMap and changed theconnectControlsToFunctions
function to make sure the connections forChannel1
are properly disconnected. PreviouslyChannel2
would overwrite the connections forChannel1
causingChannel1
to never be properly disconnected. There probably is a cleaner way to do this by adding more entries to the function arrays but I took a quick and easy solution.toggleLED
function so it also accepts true to turn on a LEDengine.isScratching
status takes a while to be updated therefor I opted for the use of a customMixage.scratching
parameter.script.deckFromGroup(group)
function were applicable.XML keybinds
<key>
is emptybeats_translate_earlier
andbeats_translate_later
MoveLeft
andMoveRight
sync_master
, it currently doesn’t actually set the sync master but this will probably handle setting and unsetting the master deck in the future. Because of this I also removed the sync_leader function from the JSbeats_translate_earlier
beats_translate_later
rate_temp_up
andrate_temp_down
LEDs
loop
,fx_sel
,vu_meter
)rate_temp_up/down
andadjust_beatgrid_up/down
) in the xmlsync_master
from the ledmap to make room for the fx selectLibrary
MoveLeft
andMoveRight
. This way folders can be opened and closed in the library viewFX
channel1
corresponds toeffectUnit1
). If anyeffectUnits
are active for the deck disable them all.channel1
corresponds toeffectUnit1
)effectUnit
dry/wet mix when noeffectSlot
is selected. Cycles through the effects if aneffectSlot
is selectedeffectSlot
on or off, if no slot is selected turns alleffectSlots
in the unit offsuper1
for the effect unit if noeffectSlot
is selected, if aeffectSlot
is selected controls themeta
of that slotmeta
,super1
andfilter
to prevent sudden level jumps when switching between the modesI'm curious what your thoughts are on these changes. To be honest the list is more extensive than I originally thought. If you have any suggestions or further improvements please let me know. I'll update the manual when the mappings are finalized and merged into the
reloop_mixage
branch.I'm still thinking of adding a binding on the press of the length button. I suppose clearing any existing loop points is in line with the original control scheme but what do you think. Adding a quantize binding somewhere could also be quite handy but I have yet to find a location that makes sense.