Issues remapping out Remix Deck logic

[Numark Mixtrack] [Traktor] - Help With Making Loop Roll Logic

#edit :: Massive, massive freudian slip with the title. THIS IS LOOP ROLL, NOT REMIX DECK LOGIC. Can an admin change the thread title to reflect this post title…?

I’m finally working on finishing my Mixtrack mapping, found here : DJ TechTools - Aleeway's Mega Mixtrack Mapping **OLD**
I intended on finishing and polishing my loop roller mapping, but for the life of me, I’m having a REALLY hard time figuring out how to do it in Traktor’s limited mapping language. If you want to tackle an interesting mapping problem…read on.

It’s set up so I have a shift button (M1) that engages Flux Mode and causes the loop buttons to command Loop Roll instead of standard loop commands (one of many shift features). Each deck’s loop roller function is implemented in its own separate mapping file, because there’s too many variables that I need to use.
I want it set up so that the loop roll has an adaptive memory function. Here’s how I want it to work.
You engage loop roll mode. You engage a 1 beat loop. You think, this needs more excitement, lemme half it to a 1/2 beat, then release 1/2 beat and bring it back to 1 beat, press, release, press release. Let’s make it more exciting, bring it down to a 1/4 beat, then a 1/8 beat. Too fast! Wait, lemme think, this could be interesting, I’ll let go of 1/4 beat and skip right back to 1/2 beat and do the 1 beat 1/2 beat alternating thing again.
That or whatever you imagination can dream of that Serato can do with its loop roll :laughing: #djlogic
Anyways, I’ve been knocking my head in figuring this out the past 2 days that I’m coming here for advice, if you want to bear with a traditional programmer trying to have some fun :stuck_out_tongue:

Here’s how I have it set up in words.
Mod 1 is the shift mode button. If the shift button is held, sets to 1.
Mod 2 enumerates how many buttons are held at once.

  • If a button is PRESSED while Mod 1 is 1, Mod 2 increases released
  • If a button is RELEASED while Mod 1 is 1, Mod 2 is decreased
    Mods 3 4 5 6 are assigned to each button, and dictates what order priority the buttons have.
  • Button 1 corresponds to Mod 3
  • Button 2 corresponds to Mod 4
  • Button 3 corresponds to Mod 5
  • Button 4 corresponds to Mod 6
  • DIRECT (button pressed) assignments are made based on Mod 2. The value assigned is whatever Mod 2’s value plus one. If Mod 2 is 1 (one button pressed), and a button is pressed, that button’s corresponding modifier is assigned 2, to indicate it is the second button pressed. Now, Traktor doesn’t HAVE AN IF FUNCTION, so the entire table is actually written out in the mapping…
  • INVERSE (button released) assignments are based on every modifier’s value, and Mod 2. If a button is released, ITS SPECIFIC modifier value drops to 0, regardless. When a button is released, however, the values of the other modifiers DEPENDS. If the button released is smaller than the current M2 value, any modifier ABOVE that button’s previous modifier value DROPS by one.
    i.e. here’s a table illustrating one case. Button 1, 2, 3, 4, are pressed in that order. Button 2 is released. Note how the #'s reorder themselves as appropriate.
    M1 M2 M3 M4 M5 M6
    1 0 0 0 0 0
    1 1 1 0 0 0
    1 2 1 2 0 0
    1 3 1 2 3 0
    1 4 1 2 3 4
    1 3 1 0 2 3

Loop length changes (DIRECT) - When a button is pressed, assign the appropriate length.
Button 1 cues a 1/8 loop, 2 cues a 1/4 loop, 3 cues a 1/2 loop, 4 cues a 1 beat loop.
::Loop length changes (INVERSE)::
THE PROBLEM I’m running into is how I call the loop length changes when a button is RELEASED.
I originally just made it match M2 minus 1 and M3/M4/M5/M6 (i.e. pick the value one less), which worked if you pulled the keys out in order. But the problem lies in if you pull the keys out of order. Look at the table again.
M1 M2 M3 M4 M5 M6
1 0 0 0 0 0
1 1 1 0 0 0
1 2 1 2 0 0
1 3 1 2 3 0
1 4 1 2 3 4
(this is with the last line omitted)
If you release a button now, the loop length would call up and look for one less than M2 (value three), which corresponds to button 5 (value three as well), a 1/2 loop. This works if you released button 4. But what if you released button 2? It STILL cues up that 1/2 loop. You can see that this is incorrect, the loop that is active must be button 4 (highest value), not button 3.
M1 M2 M3 M4 M5 M6
1 3 1 0 2 3
(this is the last line of the table)
Basically I just cant, figure out a darn way to defer the loop length call if you release the buttons out of order. I’ve tried swapping around M2 to a new unique state when you release a button out of order, M2 getting states 5 and 6, but that doesn’t stop M2 from being what it is when you release a button and calling loop length incorrectly. What I NEED, is a third condition in traktor…so I can confirm for instance, M2=4=M6, M4=3, and build a giant condition table for WHEN the loop length can specifically call…
If you’ve beared to read thru this…any ideas? I’ve been stuck on this for a few days, heh, another brain would be awesome.

If you want to see the work in progress mapper, with all its truth table glory, I could upload a proto build of it right now.

Without actually opening Traktor, I would guess that you can rework the mods to use three at max… hmmm… Have M1 track Button # And Shift? Combine your M2 and M3-6 functions into one or two trackers?

Maybe only use Two Modifiers for the whole thing? M1=Shift and M2 =Button #Tracker AND Priority Tracker? Can you explain in more detail why you need a separate Mod for each button? Honestly, I would have to look at a video of your problem to make sure I’m understanding it properly, but it just seems like you should be able to track variables in two or three dimensions with fewer than six Mods.

I’m seeing you track 6 shift states between M1 and M2, but that is usually easier to work with in one mod… I would set the NON-shifted commands to M1=0 so they only happen in the non-shift state then B1-B4 would have In>Hold Value>2 IF M1=1 ( and the inverse) In>Direct Value>1 if M1=2>Invert checkbox

Hope that helps :slight_smile:

P.s. This sounds like a cool feature

I ended up using a whole lot of modifiers because functions in Traktor can take a maximum of two modifier inputs, and I need to feed (in those two inputs)

  • Shift State (whether shift/Flux mode is engaged)
  • Loop Length (what to change loop length to, if at all)
    (these are stored into modifiers, the numbers of which I’m always changing every time I try to rewrite the mapping unfortunately)

The Loop Length parameter is controlled by whatever is the last known button pressed, and that needs to dynamically adjust to buttons being released…
Primarily, the Loop Length parameter needs to change if the button released is the button just pressed, AND in the same moment it needs to trigger the actual loop length change. I could do this with a single modifier, which I have done in the past, and that would make my life so much easier xD. But the Loop Length parameter needs to also be able to eliminate a button from its priority list and readjust if a button released is NOT the button just pressed, AND in the same moment the loop length change MAY NOT trigger. I originally tackled this by using M3 thru M6 to make a kind of “table” on the fly of the priorities.

If a button was released that wasn’t the most recent one (The modifier of the button released is NOT holding a value equal to M2), instead of moving all modifiers up a number, it only moves up the modifiers that have a number LESS than M2. The problem I was running into was figuring out how the heck to tell the function to not trigger when that happens. What I REALLY need is a third parameter to tell the function to only trigger if the button released is the most recent button…and that’s what I’ve been having trouble integrating into the code.

I’ll do a rough draft early tomorrow a.m. and see if I can work it out.

P.s. The whole Traktor only accepts two mod conditions thing is kind of a myth. I mean, worst case is we have to set up a separate logic node, but I bet I can throw some cascading modifiers on it or …something… before we need another .tsi

Alright, looking forward to it!

I have been very well acquainted with that, heh, I’ve been trying to combine down multiple “if” statements into single modifiers but I’ve just been having trouble doing it in a way that works for this mapping. I actually extended the table thing out in a later mapping (that I don’t think I uploaded), I used M7 to read the table as buttons were pressed/released and it would hold what loop length to output next, saving a condition. I felt like I was on to something there, but quit for awhile afterwards. Will play around with it too soon.

You could actually use one modifier to simplify instead of doing M1+M2 trick.

Inc
Inc
Inc
Inc
Dec (invert)
Dec (invert)
Dec (invert)
Dec (invert)

each time you press some other button in combo the values increases by one. Releasing the button simply decreases by one.

My loop roll require one modifier. Here’s example if someone want to replicate in to their mappings.

Modifier combo^
Size set
Loop set
Loop active ON / M1=1 / direct=0 / invert

Well, I had some sort of weird revelation yesterday, as I rebuilt it one more time and managed to get it working roughly. It’s uploaded in the mapping page now, but I don’t know if there are any bugs in there that I haven’t caught yet. In the meantime I’m starting on Isolator FX and other parts of the project. DJ TechTools - Aleeway's Mega Mixtrack Mapping

Stewe, great to see you again! I’m a little confused as to how the one modifier setup works, would that allow the loop lengths to “snap back” after a button is released? It seems a lot simpler than what I’ve built up.

hi , i m using all remix decks mapping out i don’t use on my traktor to send to my daw some midi out &in by “traktor virtual midi” ,this is the best way i found to control all my daw on one mapping ,i m using a lot of modifié on multiple mapping in one :wink:

Hey again,

I did this quick demo video of the midifighter Spectra mode combo to give you illustration on how this thing work and hopefully spark some ideas for you.

And yes, you can totally set any of the loop size while release if you track it with a modifier state and off course if you check them come inverted.

^Great work dude!

Think I got what you’re saying now, is it just a counter? I think I may have made something like that already, what I was running into was figuring out how to tell Traktor what loop length to change back to when the buttons were released (i.e. if a b c d were pressed in that order, c was released, and then d was released, it should jump back to the value for b, not c). I was trying to make Traktor keep track of who got pressed first.

Gah, I feel like there are three separate understandings going on, I’ll try and put my finished mapping in words at some point. It works right now, I just wish I could make it less bulky of a mapping.

Here we go, this is an explanation of [Aleeway] Mixtrack Loop Roller Map A, as of June 2, 2014. This works, but I feel like it’s cluttered and has to have a bug in it somewhere. There are four buttons I use for the loop roller, they are, C#7, B5, C5, C6. I’m calling them A, B, C, D, respectively for ease of reading. Also am using variables to make it less impossible to read…anything in italics is a variable and the parentheses following are its values, and I mapped each case individually. The shift button that lets this mode happen is C5.

::

“Loop Buttons” means A, B, C, D, irrespective of order. A, B, C, D, respectively, means respective to the functions. Don’t know if this makes it easier to read or worse.
Short recap, M1 tracks shift.
M2 tracks # of buttons pressed.
M3, M4, M5, M6, track, and correspond to buttons A, B, C, D, respectively.

::

I built Modifier 1 to monitor basic shift states.
1x Modifier 1 - Shift Button - Hold (1)

  • My shift button, this works in tandem with the other mappings in the package. Also turns Flux Mode on in one of the other mapping.

Modifier 2 was built to count the number of buttons pressed at a time.
4x Modifier 2 - Loop Buttons - Inc - M1=1

  • Modifier 2 is a counter. Each of the four loop buttons increase M2 by one.

4x Modifier 2 - Loop Buttons - Dec - Inv - M1=1

  • Each of the four loop buttons decrease M2 by one if released.

1x Modifier 2 - Shift Button - Direct (0) - Inv

  • Auto resets M2 to 0 when shift is disengaged.

Modifier 3, 4, 5, 6 were built to track who was first, and adapt if buttons were released early.
4x Modifier 3,4,5,6 - A, B, C, D (respectively to M3, M4, M5, M6) - Direct (x-1) - M2=x (x=2,3) - M1=1

  • Pressing one of them down initially assigns it one plus whatever M2 is.
    i.e. if M2=0 (no buttons pressed), pressing a button gives it value 1 (first pressed).
    i.e. if M2=3 (three buttons pressed), pressing a button gives it value 4 (fourth pressed).

4x Modifier 3,4,5,6 - A,B,C,D, omitting the button corresponding to modifier - Inv - M7=1,2,3,4 (respective to 3,4,5,6) - M2=4

  • If a button is the most recent one (M7’s value corresponds to it), four buttons are held, and another button is released, drop its tracker modifier down one. Simple.

4x Modifier 3,4,5,6 - A, B, C, D, respectively - Direct (0) - Inv

  • Releasing A, B, C, or D, resets its respective modifier to 0.

24x Modifier x (x=3,4,5,6) - A,B,C,D, but omits the button corresponding to modifier - Direct (y)- Inv - Mx=y (y=3,2) - Mz=(y-1) (z=3,4,5,6 but x not equal to y)

  • If a button is released, find everyone that is 3 or 2, and make them inherit the value of the button that was released. (any button that holds 1 and 4 are trivial, 4 is taken care of above, 1 stays 1 unless it is released, which is also taken care of already).
  • Specifically, if Mn = 3 or 2, and one of the other buttons that is 3 or 2 (respectively) is released (A,B,C,D, but not the button that Mn corresponds to (M3=A,M4=B,M5=C,M6=D), inherit the value of the button released.
  • A lot easier done than said, example:
    Modifier 3 - B - Direct (2) - Inv - M3=3 - M4=2
    Modifier 3 - C - Direct (2) - Inv - M3=3 - M5=2
    Modifier 3 - D - Direct (2) - Inv - M3=3 - M6=2

12x Modifier x (x=3,4,5,6) - A,B,C,D, but omits the button corresponding to modifier - Dec - Inv - Mx=3 - My=1 (y=1,2,3,4, but not x)

  • Fills in a gap with above, if a modifier is 3 and button released has value 1, just decrease the modifier.

Modifier 7 was built to track which button was first, and supply that to the Loop Length Set.
4x Modifier 7 - A, B, C, D - Direct (1,2,3,4, respectively to A, B, C, D)

  • Modifier 7 tracks the most recent button. Pressing A, B, C, or D, will assign Modifier 7 the values 1, 2, 3, or 4, respectively.

4x Modifier 7 - Loop Buttons - Direct (0) - Inv - M2=1

  • If M2=1 (one button left), also auto resets M7 to 0 if A, B, C, or D is let go.

4x Modifier 8 - A,B,C,D - Direct (x) - Inv - M7=y (y=1,2,3,4, respective to A,B,C,D) - M8=z (z=1,2,3,4, but not equal to y)

  • If the most recent button is released (M7 corresponds to button released), sets itself to M8’s last value.

Modifier 8 was developed to give Modifier 7 a fallback once a button was released.
16x Modifier 8 - Loop Buttons - Direct (1,2,3,4 respectively to M7) - M7=1, 2, 3, 4

  • Whenever a button is pressed down, M8 inherits whatever value was just in M7.

24x Modifier 8 - A,B,C,D, but omitting button corresponding to My - Direct (y-2)- Inv - M2=x (x=4,3) - My=(2-x (y=3,4,5,6)

  • If a button is released, memorize the second one in line.

4x Modifier 8 - Loop Buttons - Direct (0) - Inv - M2=2

  • If M2=2 (two button left), auto resets M8 to 0 if A, B, C, or D is let go

4x Modifier 8 - Loop Buttons - Direct (0) - Inv - M2=1

  • If M2=1 (one button left), auto resets M8 to 0 if A, B, C, or D is let go (may be redundant)

Actual loop management (finally)
4x Loop Set - Loop Buttons - Hold - M1=1 - M2=0

  • Loop is set when no buttons are pressed, initiating loop roll.

4x Loop Set - Loop Buttons - Hold - Inv - M1=1 - M2=1

  • Loop is terminated if only one button is held, and that button is released.

4x Loop Size Selector - Loop Buttons - Direct (1/8, 1/4, 1/2, 1) - M1=1

  • This is the easy one, directly sets loop length on button press.

12x Loop Size Selector - A, B, C, D, corresponding to M7 value - Direct (1/8, 1/4, 1/2, 1, respective to 1,2,3,4 values of M8) - M7=1,2,3,4 - M8=1,2,3,4, but not M7 value

  • Final loop select. If a button is released and it is most recent one pressed (M7 corresponds to it), figure out which button was the last one queued (using M8) and trigger size selector based on its value.

Was actually a really good experience writing this, as it was just a mishmash of modifier lines until now, going to dig around this for a bit actually…

Exactly the same method as yours mate! I saw that the modifier mapping from my video only reduces the modifier in your M1+M2 pattern so I thought to share. :slight_smile:

AHHa I got what you mean now, I’m a bit hesitant to incorporate that now since it would involve changing a lot of mappings and it works already, but I WILL keep that in mind for the future! Freeing up a modifier is always helpful in Traktor haha!