-
-
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
feat: add advanced stem loading COs #13268
base: main
Are you sure you want to change the base?
feat: add advanced stem loading COs #13268
Conversation
30fd666
to
2f2a22a
Compare
b4db8c8
to
fdd8810
Compare
a36c6a0
to
31becb9
Compare
31becb9
to
fab6880
Compare
Please note that UI changes (1st and 3rd commits) will be moved to #13515 once this PR is ready to be merged! |
This allows players such as sampler or preview deck to load a selected stem, instead of the main mix, as those players can only read stereo tracks
fab6880
to
2fc47ba
Compare
2fc47ba
to
868a67e
Compare
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 have some doubts if this is consistent with the other PRs and the overall user experience.
The users sees only the track in the library which has four stems. The use can now load a single stem form a file or load the whole stem file and mute all 3 of them.
In the first case they cannot add a second stem in the second case they suffer the penalty of stem processing. They need a brief understanding of the engine interna to make the right decisions during mixing which could be limiting.
Can we join both? How can we allow to seamlessly switch between these cases.
A typical use case is probably:
- Play/Cue a full track
- Notice unusable part
- Switch to stem mode an silence that part
- Instant double the track in a second deck
- Bring the silenced part in using an effect
How can we allow this using the new single stem mode introduced here behind the scenes?
, | ||
stemIdx | ||
#endif | ||
); |
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.
That looks not right. How about use two lines? We may also consider to reduce the use of __STEM__
where it has no performance impact like here. We already have the default = 0.
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.
Make sense. So would you prefer I update the signature globally?
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.
Yes in general. I made this comment before raising my general concerns regarding this single stem mode. Maybe we need a slightly different signature .. unsure..
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 will wait for the full review before starting refactoring then :)
The first scenario is the only way on non-primary decks (sampler and preview), while second is the default for primary deck. realistically, I only added the second option for primary deck for feature parity and enabled that advanced capability, or workaround for light platform which would struggle with more than one stem deck + rubberband (eg. raspberrypi)
By default, the By the sounds of it, the use case you are describing (clone switching between individually loaded stem vs full deck with muted tracks) are falling under the the |
Ah, OK I forget about the sampler use case. Than let's think about a way to gerearize this topic. Since it is handled by the same engine class anyway. How is the transition from single stereo to stem now done? Is there way to keep the transport going during the switch? A switch from the full track to a stem mix is probably the same as a switch from a stem mix to one of the other stems. Do we need to consider something like "load as karaoke" where we process three of the stems? I am not demanding to implement it here. I just like to brainstorm possible future solution to have the Co interface proved for that. Idea: can we use the mute controls for selecting the loaded stems? |
Currently there is no way transition "live" for a stem deck to a stereo deck with a track. With that current feature, can chose the load a track in an empty deck. If we think of a case where one would want to switch from a stem deck to a stereo deck, they would need to use an empty deck and handle the transport synch.
It would be fairly trivial to implement to some kind of
I think it would be great to even go further an allow loading a set of stem pre-mixed to stereo (eg. Note that in case not all the above feature wouldn't be ready for 2.6 and we would like to wait for completeness before releasing, the
This is already how we were planning to make the |
Let's look again on the use cases for stem loading, and deck clone/splitting out of this PR. Let me list all uses cases I know:
Cases which are technical possible to realize, where I don't see a use case yet:
We should really focus in this PR, on what's provides a real benefit. But as we talk about COs, which we must maintain backward compatible in future, we should check if we can extend them for future use cases. |
I don't have the demand for on the fly switching the STEM channels in this PR. I can confirm that seamless switching will be hard to implement especially when we consider effects and pitch shifting. What we may achieve in future is to introduce a portion of silence, but keep the crowd dancing in beat/the track cued in headphones or such. I like to have the CO interface ready for this, but implement only the engine features already in this PR. The engine can be updated at any time, the CO interface not. |
Thoughts: We just(TM) need to add the information which stem configuration they like to use. So we may add global flags CO to decide which Stems should be loaded. However I am afraid the user will always forget to adjust this field before loading. The (My) natural way would be to decide that after loading. Is it an issue to repeat the action with the right flags set? Yes, if the user had lost library contact in between. Using the mute buttons would be also natural, but the user has no access to all the mute buttons for all samplers. In addition they are also used for quick effect actions like the EQ kill buttons. Idea:
This means:
Does that make sense? |
I just played intensively with stems (it's so mega cool) Cloning a part of the stem to another decjk is not useful, the complete track should be cloned with the stemsetting (wich stem-tracks are muted, effects, volume). It is usefull because I played with loops with the slipmode. And confusing the audience is fun. I do have the impression that playing intensively with stems takes quiet some extra cpu, I am affraid the minimal configuration will have to be strong enough, we'll have to communicate this because else people will be disappointed. In Zulip you can find my first version of MixxxInTouch, though I learned to play around well with my F1's I used my Ipad with it as extra to control the sampler hotcues (2nd page: soundboard = 32 hotcue buttons) + to reset the stem-tracks volume to maxxx /set mute off. One of the coolest parts is the mixing of the drums/bass, it has become a 'piece of cake' but I am not so sure that BPM's are still correct when only playing a bass pr drum stem-track (not together), I could not rely on the computed bpm. Question: why would you load the 5th track (original mixxx) in a deck? When you load this track you could regret while it's playing because you just thought of a nice effect.... I think it can be a user-preference, but I think I'll never use it. You jyst have to get the habbit to reset volume and mute when preparing a track (waveform is great help). PS: My Ipad is a perrfect visual aid to see thet different volumes of the tracks, I updated it to see the fx settings on the same page as well, On a 15inch it becomes all to small. |
It should be possible to map the complete fully qualified action to buttons of a controller. And we should consider race conditions if we need to set multiple COs for executing a single operation, e.g. load buttons are pressed on two CDJs at the same time.
If a user spend the effort to create a stem file, I doubt that playing the stereo mix is what he expects as default. Or do you mean this only for sampler decks? |
Because of performance reason - if you are playing an "instrumental" version of a track, (that is keeping stem track 4 muted all along):
This is what this PR addresses - you load a stem track into the sampler (e.g the vocal). If you now want to also have the drum, you can load it (e.g in another sampler)
AFAIK, this is already supported.
Appreciate you may not benefit it, but I personally would. In any case, we are planning to support both, starting with your use case anyway.
This is one of the reason why cloning a specific stem track to a stereo deck would help! Beside the RubberBand optimisation, running 4 decks of stem remain pretty much impossible!
So you don't like the solution offered in that PR? May I just ask, what is the fundamental problem?
[...] I really appreciate the discussion here, but this has drifted quite far away from what that PR is about! I have managed to achieve the stem project in an iterative manner, and I'm not planning to change the approach on this PR :) So please, let's move the discussion to the epic and keep discussion here related to selective load and load behaviour only ! (cloning, splitting, cueing, ...) |
Above I listed 8 use cases for advanced stem loading COs. Since nobody brought up another use case relevant for loading, I guess it's complete. Of the list, the cases 1,2,3,5 & 6 are handled by the COs implemented in this PR. The uses cases 7 & 8 are also fullfilled, but by using the existing main deck stems constrols instead of loading into a dedicated deck mode. What remains is the "Karaokee" use case 4 for
The drawback would be, that this complex argument can't be mapped easily in the MIDI XML and would require the use of JavaScript. |
Sounds good @JoergAtGithub It might take me some times to work out the UI changes so I might make it |
Yes, I am just in doubt that we need it for every load action we have currently. The user won't have as many buttons he need for all dedicated actions so we also need to allow a way to use two buttons to achieve the action kind of intuitive, ideally.
Not sure if this is s real issue. But I agree that we need to consider it.
I don't think we should do this assumption for some reasons:
My fundamental problem is that I have no idea how to use these controls in a real mapping and how to do a GUI for it. Maybe we need a GUI feedback for that? |
@JoergAtGithub I can confirm your consideration about the use cases. But a plan how to map it on controllers and use it in the GUI unclear. I am also concerned about a future plan of switching the stem mode while a track is playing. Maybe fixing this, instead of dedicated loading controls also covers all use cases. @acolombier I am not demanding a change of the engine implementation. It would be OK to do a first version that loads a track again when changing the stem mode. Does that make sense for you? |
I don't think, that it will sound good to switch from the mixed stereo to the 5th track in a stem file. This is because the later is mastered by the producer and the mixed stems are not. This PR is primary about sampler decks, which have no stem controls. I don't understand, where a usecase for full stem support in sampler decks is. It will just consume so much CPU, that we get buffer underflows. |
That's not including combo - thinking of usecase of the S4 Mk3, one could press the pad 1 and 4 at the same time, before pressing the load encoder, to load pre-mixed 1 and 4 to a stereo track.
GUI feedback is already implemented. (Load action in menu) (Waveform draws drum only, with other track with transparency) Appreciate we may add more, perhaps stem color on context menu, any other suggestion?
Have you considered combo? (e.g press shift+X+1) I know this is not possible on the MIDI engine, but this is specific to it and its limitation, currently being reworked in engine v2
I'm a bit confused.
Yes good point. As far as current stem implementation, it's impossible to load the pre-mixed stereo track. If one request a stereo track, then 1 to 4 are pre-mixed by the audio source. We won't be able to change that till we have DSP support, otherwise analyse like replaygain do not work and provide very poor result. |
Why not? The first track is the original track so it has always the best sound. It is the original! Playing all four stems together is IMHO not recommended. However the transition from 4 stem to original mode will be notable because of the missing mastering info and the additions of the sounds not part of any of the four stems and should be finally users choice.
I acknowledge that the plan was to do this PR only for samplers. But it is now for all decks. Which is welcome. What do we have? The proposed CO interface is currently: I am in doubt that these controls will ever be used in a direct 1:1 mapping. Do you agree, or do you have a special use case in mind? All controllers have already working mappings to load and clone tracks. My assumption is that the user expects that this remains the same for stem tracks.
That's a good start. What do we need for this? For the deck/sampler context menu the new load Actions are IMHO also very useful using the already loaded Track. This covers the use case the track was dropped to the deck and is not longer visible in the library. Can you confirm that? |
Yes, but because of the this difference a DJ needs to use two main decks, adjust pre-gain, effects like limiter until both decks sound similar, and than cross-fade from one to another deck. If you executed this transition automatic in one deck it will sound awful. Note that no other DJ software has such a feature, they always mix the stems. The closesd functionality is in Traktor Pro 4 which loads the orignial track to a main deck, if you hold down Shift at track load.
Why not, there are dozens of controllers with large pad arrays, intended to assign each button to a sampler. For example an F1, where you could select the stem(s) to load by the top row of 4 buttons (toggle on/off), than press the load button and assign the sampler. I can't imagine a more common use case for stems n samplers, than prepare the samplers with beats or volcals that you need in your set. And than run them with a single button press during the set.
The old COs will not change. We can't add arguments there for backward compatibility.
A global setting does not match here, because the decision which stems to load in a sampler will different each time you load a track. A mapping developer would have to call always both COs. Furtherore two COs that depends on each other are prone to race conditions. We have multi-threading here (e.g. 4 threads for 4 Traktor F1 decks), COs should execute stateless implementations only. |
It depends on the way the stem was created and it is IMHO up to the user to make the transition to the original not sounding awfull. I can also imagine a transition from single stem to original. But anyway, my point is that a seamless mode transition in one deck is a desired future feature and we need to consider it now in our CO design.
I think there are many other interesting 1:1 mappings on such controllers instead of using them for four load controls per sampler.
That's exactly a mapping I had in mind. You example is not a 1:1 with the proposed controls. But it would be a perfect 1:1 mapping for a set of load controls. For now the engine does not support to load two stems out of four for example. Not sure if we want to add the karaoke mode in futur or use full stem mode for it, but it cannot hurt to consider it in the CO interface.
I agree
Not really, because the user does it. Even with the current CO solution the mapping needs to implement a state full solution that works the same. I can confirm that the race condition may happen if the mapping does automatic loading in between. But for now I don't see a use case for such a automatic that sets the COs concurrently. I value the benefit more that the any existing mappings can use the feature without mandatory scripting But anyway. I am happy that we have now a common understanding of the issue. We have two ideas on the table. Maybe we can find a optimum third idea? |
Did you miss the proposal in: #13268 (comment) |
No. The issue with this proposal is that it also requires scripting and rewrite of current load mappings. Let's consider the concurrent issue. This can be an issue if the user has selected a load mode on one controller and than an automatic feature resets the decision. This can be a radio script loading a jingle to a sampler or such. Since such a script needs also select the track, it is probably the beast to offer a JS API to do it without COs. The issue is that the selected track itself is also statefull and the load COs cannot be used. So we may consider to select the stems to load like the track itself. This means reset the control to a reasonable default whenever a track is selected. What do you think? |
Currently, this goes with a mix of extending the existing load signal/slot and creating a second one, called subsequently. Is there any preference? Should I change the implementation to use only one? (only extending existing signal or only subsequently emit)