-
-
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
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. |
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.
Some more comments.
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:
|
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: |
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. |
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. |
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.
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_activate
control while the song is playing)savedloop_X_set
hotcue_X_setloop
CO to save the current loop in slotX
savedloop_X_apply
hotcue_X_activate
CO to restore the loop that you previously saved in slotX
EDIT: 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