mixxxdj / mixxx

Mixxx is Free DJ software that gives you everything you need to perform live mixes.
http://mixxx.org
Other
4.39k stars 1.26k forks source link

Add Fader Start feature that allows to start a track from its last cue-point by moving the corresponding line-fader up or the crossfader to the side of the deck #5587

Open mixxxbot opened 2 years ago

mixxxbot commented 2 years ago

Reported by: Pegasus-RPG Date: 2010-10-16T21:44:12Z Status: Confirmed Importance: Wishlist Launchpad Issue: lp661917 Tags: autodj, cue, easy, hackathon


We should add a fader start feature to each deck's volume faders as well as the cross-fader and make it toggleable on each deck individually. (Fader-start is where the deck will start playing when the volume fader is moved up from 0 and will cue when moved to 0. Same on the cross-fader.) But default it to off so we don't surprise anyone.

The SCS.1m script currently does this (and it takes affect for any other controllers connected to the same virtual decks) but it should be program-wide instead of in script.

mixxxbot commented 2 years ago

Commented by: pwhelan Date: 2010-10-17T11:44:26Z


This sound to me like another feature that is very specific to a certain style of mixing. I personally am in favor of making Mixxx the most customizable DJ mixing program on earth, but enabling it by default could be very confusing, especially to DJs who already know how to mix.

A much better idea would be to design a way for scripts to do program wide behaviour and also add a GUI that could easily enable and disable all these behaviours. This same mechanism could handle fader start, quantization, soft takeover and a myriad of other custom behaviours. If we also made it easy and appealing to add, configure, enable and disable these features it could be a real win.

To make it even easier on people, on Window and Mac OS X we could make part of the installation procedure ask the user what such behaviours they would like to enable. On Linux we could do it on the first run. That way we also make sure we don't suprise anybody.

mixxxbot commented 2 years ago

Commented by: marczis Date: 2014-07-17T08:36:49Z


Hello, I'm willing to add this feature. Some questions to clarify:

"Add Fader Start feature that allows to start a track from its last cue-point by moving the corresponding line-fader up or the crossfader to the side of the deck"

I think that it should start from the actual position not from the last cue-point. What do you think ? So if you want to switch deck and back, then it would still proceed in the track by step by step. I don't know if I'm clear so I mean that you set DECK B to a cue point, you pull the crossfader DECK B start to play, then you pull back the crossfader DECK B Stops, and when you repeat DECK B would go from the point it finished last time. Or it could be a parameter too... but I don't know which one is more useful in real life ?

mixxxbot commented 2 years ago

Commented by: daschuer Date: 2014-07-17T09:01:02Z


Yes, a start from the current position is what the user might expect.

How will you issue N-Decks?

Just stopping a deck by Crossfader sound weird, for a manual mixing use case. May be move it back to cue for a Mixing in the same sample again might useful.

It might make sense in combination with https://bugs.launchpad.net/mixxx/+bug/1187258

What are the use cases we have?

mixxxbot commented 2 years ago

Commented by: marczis Date: 2014-07-17T09:14:14Z


I'm okay with re-cue the track you leave with the cross-fader. Both thing will open up some new ways of mixxxing for me :)

mixxxbot commented 2 years ago

Commented by: DJChloe Date: 2015-11-06T13:00:54Z


This is not a good Idea. Some controllers like the Reloop Beatpad have the Fader Start logic implemented : opening the level fader of the controller, sends a play button event to the software when you activate the faderstart with SHIFT+Load button.

More over, it's not so difficult to emulate it in javascript.

mixxxbot commented 2 years ago

Commented by: DJChloe Date: 2015-11-15T13:17:44Z


I am working about the Numrk Mixtrack (pro) 3 mapping, and I have implemented the faderstart in javascript without any problem. http://mixxx.org/forums/viewtopic.php?f=7&t=7286&start=60#p26551

May be we could explain how to implement faderstart in the Mixxx scripting tutorial.

mixxxbot commented 2 years ago

Commented by: daschuer Date: 2015-11-15T15:55:17Z


It would be great, if we could add such features an things like spin down break and spin up start to the mixxx C++ domain. This will allow to access it via skin, an offers the same experience throughout all mappings.

@Chloé: what would be the ideal control interface for this. So that we can enable rlthis feature for skins as well?

mixxxbot commented 2 years ago

Commented by: ywwg Date: 2015-11-15T17:55:03Z


We do have some controller actions in c++: https://github.com/mixxxdj/mixxx/blob/master/src/controllers/controllerengine.cpp

mixxxbot commented 2 years ago

Commented by: DJChloe Date: 2015-11-16T09:33:56Z


The ideal control is not complicated : Faderstart is a toggle function, usually attached on controllers to the "load deck" button. On controllers it is ideally toggled with shift+load. On my beatpad it is hardcoded by the firmware and when it is activated the load button is flashing. Hopefully it is not incompatible with a implementation on the software side. We already have such switches in Mixxx : quantize, slip mode, etc... One more should not be a big deal.

From the code perspective, Faderstart is just one feature added : line fader to zero, stop playing /line fader increasing, start playing if the track was stopped.

mixxxbot commented 2 years ago

Commented by: daschuer Date: 2015-11-16T10:58:09Z


Cool, I have just read in the DDJ-T1 manual and it looks like a nice feature. I think the crossfader should work as well.

So if one has fun to adopt this bug, here some possibles steps.

TODO: 
* add a new class src/engine/faderstartcontrol.cpp similar to cuecontrol.cpp
* cuecontrol.cpp contains some patterns you can reuse. 
* add a  ControlPushButton(ConfigKey(m_group, "fader_start")); 
* add ControlobjectSlaves for volume xfader and orientation and what else is required. 
* connect them to a new slotFaderchanged
* change play and goto_cueandstop as desired.  
mixxxbot commented 2 years ago

Commented by: daschuer Date: 2015-11-16T11:04:35Z


By the way: On a for deck setup it makes sense to start only cued tracks. This will help do accidentally restart already played tracks. So my comment at #⁠3 is outdated.

mixxxbot commented 2 years ago

Commented by: daschuer Date: 2015-11-16T11:05:24Z


@Peter: are you still working on this feature? Do you need additional help?

mixxxbot commented 2 years ago

Commented by: DJChloe Date: 2015-11-16T11:39:11Z


I put here my parts of script mapping implementing the faderstart "emulation", it can help, it is a bit modified in order to make it "algorithm" like :

Init :
_____
decks.D1.faderstart = false;
decks.D2.faderstart = false;

On Load button :
________________
NumarkMixtrack3.LoadButton = function(channel, control, value, status, group) {
    var decknum = script.deckFromGroup(group);
    var deck = NumarkMixtrack3.decks["D" + decknum];
    if (value == DOWN) {
        if (!deck.shifted) {
            //Load the track normally
           deck.faderstart = false;
           engine.setValue(group, 'LoadSelectedTrack', true);
        } else {
            //SHIFT + Load = fader start activated
            if (deck.faderstart) {
                deck.faderstart = false;                
            } else {
                deck.faderstart = true;
                engine.setValue(group, 'LoadSelectedTrack', true);
            }
        }
   }
};

On eject  track button  :
______________________
deck.faderstart = false;
engine.setValue(group, 'eject', true);

On volume change (atached to line fader) :
NumarkMixtrack3.OnVolumeChange = function(value, group, control) {
    var decknum = parseInt(group.substring(8,9));
    var deck = NumarkMixtrack3.decks["D" + decknum];
    var delta = value - deck.lastfadervalue;

    if (deck.faderstart) {
        if (value===0) {
            engine.setValue(group, "play", 0);
        } else {
            if (delta>0) {
                engine.setValue(group, "play", 1);
            }
        }
    }
};
mixxxbot commented 2 years ago

Commented by: daschuer Date: 2016-02-24T12:21:54Z


@Peter: I have just freed this bug up for other contributors. If you are still working on it, please reassign.