Add support for Saved loops#2194
Conversation
|
@Holzhaus Thank you very much for working on this. Saved loops is a highly requested feature. There are two approaches to saved loops: Serato style and Traktor style. In Traktor, a saved loop is just a particular kind of cue point. In Serato, saved loops and cue points are two different things and they are numbered independently. For example you can have loop_1 and hotcue_1 set at different track positions. This is the approach you chose for this PR. Each approach has upsides and downsides: Traktor style Pros
Traktor style Pros
Serato style Pros
Serato style Cons
I'm not sure which approach is best. Are there any particular reasons why you chose Serato style? [1] In this video you can see how loops and cues are in different pages, which forces the dj to toggle a modifier: https://www.youtube.com/watch?v=Qh9qqLhOEsM |
|
About controllers: There are controllers more suitable to Traktor style (Behringer CMD studio 4A) and others more suitable to Serato style (like the pioneer range) |
|
@ferranpujolcamins The controller I am using the a Serato-style controller, so that's probably the main reason I chose this approach. Serato controllers are a lot more common (at least in my experience). Also, I have a hunch that Traktor-style loops would require a lot more code changes to integrate them properly, but take that with a grain of salt. If the Traktor way of doing things is desired too, I think someone could step up and implement an extra pointer-like layer on top of this implementation. Maybe something like this:
Metacue might be stupid name, feel free to suggest something better. When |
|
EDIT: Sorry, this was just caused by some signals that didn't fire because I'm stupid. |
|
Without thinking about the Serato/Traktor models to much, I did expect a saved loop is just a special cue point. So we have two main aspects we have to consider:
How about putting cues and loops into the same list? The user will have the ability to arrange the loops with an offset on a "separate page" so this solution may cover both. This way our current hot-cues are already meta-cues. But there is an issue how to enable a saved loop. Pressing the CUE button will jump to the loop start cue. |
Agree, I think this is the model we should go with. Also, separating cue points from loops forces us to change all the skins right away. By having everything on the same list. we don't need to change anything.
I think we need a dedicated CO to enable saved loops without jumping. In case the hotcue is not a loop hotcue this CO will just do nothing. |
|
OK, this would work for me. The tricky thing remains though, how to present this on a controller and in the skins. Another set of buttons is probably to cluttering. |
|
Please merge master instead of cherry-picking ranges of commits. Otherwise the PR becomes unreviewable as is now the case. Since this is stil WiP I would propose rebasing on master. |
|
First of all, sorry that this branch became so messy, I'll clean it up and squash some commits later (and move 455340c to a separate branch). I removed the dedicated saved loop controls and added updated/added the hotcue controls (new stuff is emphasized):
Generally speaking, is this what you had in mind? |
|
Thank you very much for working on this. I have a few comments on the CO you added:
|
|
@ferranpujolcamins
This sounds reasonable, but for Serato-style controllers with dedicated loop buttons it makes sense to be able to switch between normal hotcues and loops manually. How about this:
This way both Traktor- and Serato-controllers the be used as intended (on my Roland DJ-505, I'd use hotcues 1-8 with We could even let the user choose what hot cue style he/she prefers - for Traktor-like hotcues, the LOOP mode on Serato controllers would just provide access to additional hotcues 9-16. (Ideally, controller mappings should be able to publish configuration options that are displayed in the settings window so that users do not need to edit the JS source code, but that is a discussion for another time).
No. If
|
|
@Holzhaus thanks for the explanation. Agree, this should cover all cases 👍 I understand. IMHO, the behaviour of this two CO should be the other way around: |
|
@ferranpujolcamins
I agree that this is somewhat inconsistent and unintuitive for developers. From the user's standpoint however, I'd rather keep the current behaviour, since it's a lot more common that a DJ wants to enable a loop without jumping to it (at least in my experience). In Serato, pressing a pad on my Roland DJ-505 will toggle the loop (current |
|
Ok, I cleaned up the branch a bit. The original commits can be found here. |
|
A merge conflict has developed. |
|
I'll rebase as soon as #2213 has been merged, since that will likely introduce further conflicts. |
Hmm, let's be careful about changing the behavior of the existing hotcue_X_activate Control. Remember we have many existing mappings that already use it. If we change the behavior of old mappings as described, it will give old mappings access to this new feature without any changes, which I think is good. However, it might be a bit odd with Serato style controllers. We'll need to give some guidance on https://mixxx.org/wiki/doku.php/updating_controller_mappings how to modify mappings for Serato style controllers. Should we say that the old hotcue_X_activate mappings should be changed to hotcue_X_activatecue and the loop page should be mapped with hotcue_X_activateloop? |
Yup, I'll update the wiki page when this PR has been merged.
Exactly. Here's how I integrated saved loops on the Roland DJ-505, which is a Serato-Style controller: 163629b |
|
I think we should now introduce the concept of a hotcue type indicated by a new Control, let's say |
Let's be careful to still let the user jump to a hotcue from an active loop. A new loop hotcue should not override jumping to an existing jump cue. |
|
Can you split off the commits for the Roland DJ 505 mapping to a separate branch? I suggest using Git worktrees so you can work on both branches at the same time. |
It doesn't override that. The if-condition only comes into play when the cue is not set yet. |
When I'm djing, I vastly prefer to do things explicitly than some magic auto-behaviour. If we enable the jumping, there will be no way to toggle a saved loop without the jumping. If you want the jump, you can just invoke I trust that the DJ knows whether he/she wants to to jump to loop in or not beforehand and presses the appropriate key. I can be sure that without pressing shift Mixxx won't jump, and with shift it will jump. If we change this to "without shift, it sometimes jumps", it becomes much harder to grasp IMHO. Mixxx tries to be smarter than the DJ. And to be honest, I think the benefit of not having to press SHIFT is small compared to the risk of jumping back by accident. Without a safe way to activate loops, this feature becomes pretty useless for me. I almost never use |
|
It is all a question of consistency. All your arguments apply to the reloop_toogle knob as well. If you want the jump, you can just invoke gotoandloop. That is simply not there on the GUI. I understand your concerns, and I must admit they are valid in some situations. In other, the exiting pattern is the right one, However, I don't want to delay this PR any longer. Can we add the reloop_toogle behaviour, here for a consistence and postpone the jumping issue to a new PR? What do you think? |
I know, that's why I have a patch that makes
Hmm, but if I change the underlying CO to jump if we are behind the loop, it will also jump when activating from the controller. |
Yes exactly. Let's collect opinions and use cases and than decide how we get the best out of it. |
daschuer
left a comment
There was a problem hiding this comment.
LGTM.
Thank you very much for this great feature that improves usability of looping a lot.
A good reason to use Mixxx 2.4 even if it is beta :-)
|
I have started a Zulip thread: |
|
Unfortunately this suffers a nasty bug: |
|
Sorry, This has been slipped trough: mixxx/src/engine/controls/cuecontrol.cpp Line 2402 in ffb541a please use HotcueControl::Status |
CueControl: Fix previewing regression from PR #2194
|
This is a great feature! Thanks for this. |
https://manual.mixxx.org/2.4/en/chapters/appendix.html#keyboard-mapping-table |
Is there any way to delete loops from a track with this PR? |
|
The PR is only in 2.4 alpha, not 2.3 beta. |
|
Thanks for your feedback. |
|
what's the issue with those loops? |
|
Saved Loop as just special types of hotcues, you can delete them just the same. The green loop (in 2.3/2.4) can t be deleted, just disabled using the loop controls. |
|
Yes, since this was first request on the forum I assumed it's about 2.3 |
|
Yes, your are right. I don't use loops at all and would like to have as less things and functions on the screen as possible. |
|
Note that with LateNight in 2.3 you can use compact or even minimal decks to unclutter your view (while having effects and samplers etc.) |
|
Please use the forum at https://mixxx.discourse.group/, this discussion is completely unrelated to this PR. |
This is a first implementation of a "Saved Loops" feature similar to the
one found in Serato.
The basic workflow is as follows:
beatloop_activatecontrol while the song is playing)savedloop_X_sethotcue_X_setloopCO to save the current loop in slotXsavedloop_X_applyhotcue_X_activateCO to restore the loop that you previously saved in slotXEDIT: See here for more info: #2194 (comment)
Related bug report:
https://bugs.launchpad.net/mixxx/+bug/692926https://bugs.launchpad.net/mixxx/+bug/1367159Add CO to lock a loop (protect it from being changed/deleted by accident)(separate PR because this PR is already large enough and becomes unreviewable)Added/Changed COs
See mixxxdj/manual#231.
Proposed Changelog entry