How to override X1MK3 Mapping?

2»

Answers

  • Anselm.
    Anselm. Member Posts: 30 Member
    edited October 2023

    Cant stop to stay thank you :D Please let me now if I'm demanding too much help! I really appreciate your support on this and sent a few coffees already which have already been rewarded multiple times, so no expections from my side :)

    I've managed to get my Loop Out working using SYNC+BrowseEncoder:

    Pretty sure the outline is quite boring for you but might be of interest for others

    X1MK3Deck.qml:333 // needed to add ! module.syncModifier to prevent browsing while sync is pressed

      Browser { name: "browser" }
      WiresGroup
      {
        // HACK: Disable browsing while SYNC is pressed
        enabled: module.active && !module.syncModifier
    

    X1MK3Deck.qml:366

    // HACK: Enable Move Out -1 / +Shift Xtrafine 
      WiresGroup
      {
        enabled: module.active && module.syncModifier
        WiresGroup
        {
          enabled: !module.shift
          Wire { from: "%surface%.browse.is_turned"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".move.size"; value: 6 } }
          Wire { from: "%surface%.browse.is_turned"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".move.mode"; value: 3 } }
          Wire { from: "%surface%.browse.turn"; to: RelativePropertyAdapter { path: "app.traktor.decks." + deckIdx + ".move_internal"; step: 1; mode: RelativeMode.Stepped } }
          // TODO: If MoveSize == 1 switch to move.size=1
        }
        WiresGroup
        {
          enabled: module.shift
          Wire { from: "%surface%.browse.is_turned"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".move.size"; value: 0 } }
          Wire { from: "%surface%.browse.is_turned"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".move.mode"; value: 3 } }
          Wire { from: "%surface%.browse.turn"; to: RelativePropertyAdapter { path: "app.traktor.decks." + deckIdx + ".move_internal"; step: 1; mode: RelativeMode.Stepped } }
        }
      }
    

    Thoughts:

    Another idea is I can read the total-MoveSize and create a condition to Xfine when I have reached 1... sounds like a nice conversion too me, not sure if it is practical. Also maybe there is potential to optimize it by using the browse.turn only once yet I want to prevent Traktor hiccups like those I experienced with Loopsize / Beatjump when Traktor is engaged.

    Problems:

    Only bad thing using SYNC instead of my previous idea is that Sync gets enabled / disabled after button release. I have two ideas with that, what do you think of these? I actually guess that option (a) has less potential to have irregular results.

    a) Check if is_turned has been used during Sync and enable/disable sync upon button release, I'll try that with your previously mentioned ButtonScriptAdapter - does it have some onHold-equivalent where I could if BrowseEncoder is pushed?

    I have tried to use my property bool realsync: true plus Wire { from: "%surface%.sync"; to: "sync_inverter.input"; enabled: !module.shift && module.realsync } and find a way to false it when %surface%.browse.is_turned is used but that way I circle a bit because I longer can use module.syncModifier as condition for false-ing module.realsync - maybe that is also only a result of my lack of knowledge :D

    b) Check if the button is toggled or hold. Not a big fan of that... timing is crucial there. It seems to be possible - looking at flux_reverse - somehow but looks like hardcoded to the

  • Sûlherokhh
    Sûlherokhh Member, Traktor Mapping Mod Posts: 2,810 mod

    Try this for b) :

    property bool holdSync: false
    
    AppProperty { id: syncProp; path: "app.traktor.decks." + module.deckIdx + ".sync.enabled" }
    
    Wire {
       from: "%surface%.sync"
       to: ButtonScriptAdapter {
         onPress: {
           holdSync = true;
           holdsync_countdown.restart()
         }
         onRelease: {
           holdSync = false;
           if (holdShift_countdown.running) {
             syncProp.value = !syncProp.value
             holdShift_countdown.stop()
           }
         }
       }
     }
    
     Timer { id: holdsync_countdown; interval: 200 }
    

    A short tap less than 200ms will toggle SYNC, anything longer will simply keep 'holdSync = true' until the button is released.

    There is loads more you can do with ButtonScriptAdapters and Timers, like this:


    Regarding a) :

    Some code (i slightly adjusted) for the X1.

     property bool coarseTempoStep: false
     property bool resetTempoEngaged: false
     AppProperty { id: tempoAdjProp; path: "app.traktor.decks." + module.deckIdx + ".tempo.adjust" }
     AppProperty { id: tempoAbsProp; path: "app.traktor.decks." + module.deckIdx + ".tempo.absolute" }
    
     AppProperty { id: bpmProp; path: "app.traktor.decks." + module.deckIdx + ".tempo.adjust_bpm" }
    
     WiresGroup
     {
       enabled: module.active && !module.shift && module.syncModifier
    
       
      Wire {
         from: "%surface%.loop.turn"
         to: EncoderScriptAdapter {
           onTick: {
             module.resetTempoEngaged = false;
           }
           onIncrement: {
             bpmProp.value = bpmProp.value + (module.coarseTempoStep ? 1 : 0.01)
           }
           onDecrement: {
             bpmProp.value = bpmProp.value - (module.coarseTempoStep ? 1 : 0.01)
           }
         }
       }
    
       Wire {
         from: "%surface%.loop.push"
         to: ButtonScriptAdapter {
           onPress: {
             module.coarseTempoStep = true;
             module.resetTempoEngaged = true;
           }
           onRelease: {
             module.coarseTempoStep = false;
             if (module.resetTempoEngaged)
             {
               // Reset the tempo
               tempoAdjProp.value = 0.0
             }
           }
         }
       }
     }
    

    'resetTempoEngaged' measures if i turn the knob after holding it (or alternatively another button) down. Releasing the knob will trigger an effect ('tempoAdjProp.value = 0.0') only if the knob has not been turned this way ('if (module.resetTempoEngaged)' ... ).

    [from my x1 modding thread:]

    :)

  • nachopenades
    nachopenades Member Posts: 286 Pro

    @Sûlherokhh "A short tap less than 200ms will toggle SYNC, anything longer will simply keep 'holdSync = true' until the button is released."

    This is one of the features I've requested from the NI team! It is very uncomfortable for me to switch the function buttons with the normal shift. It would be great if you shared the file with this deployment.

  • Sûlherokhh
    Sûlherokhh Member, Traktor Mapping Mod Posts: 2,810 mod

    If i understand you correctly, you would like the Tap(Sync)-function to be incorporated into the X1Mk3 qml file. Yes? And you would like to have to use shift less for secondary functions (if so, i agree totally).

    Unless i misunderstood what you asked, then this is what i will do (and share the result). 🍁

    Edit: On second reading, i get the impression that you want to use the secondary functions of the bottom section buttons to be available with 'holdSync' instead of 'holdShift'. Is this what you meant? Please elaborate.

  • nachopenades
    nachopenades Member Posts: 286 Pro

    "If i understand you correctly, you would like the Tap(Sync)-function to be incorporated into the X1Mk3 qml file. Yes? And you would like to have to use shift less for secondary functions (if so, i agree totally)."

    Yes!

    "Unless i misunderstood what you asked, then this is what i will do (and share the result). 🍁"

    Great!

    "Edit: On second reading, i get the impression that you want to use the secondary functions of the bottom section buttons to be available with 'holdSync' instead of 'holdShift'. Is this what you meant? Please elaborate."

    My idea is that finally, there are 3 Shift buttons. The native one, and the 2 shift on the "Sync button" that only acts when you hold it down for more than 200ms.

    I don't know if I'm able to explain myself well.

  • Sûlherokhh
    Sûlherokhh Member, Traktor Mapping Mod Posts: 2,810 mod

    You answered all of the above questions.

    What controls do you want the holdSync function to provide secondary access to in addition to tempo control via Loop knob?

  • nachopenades
    nachopenades Member Posts: 286 Pro
  • Sûlherokhh
    Sûlherokhh Member, Traktor Mapping Mod Posts: 2,810 mod

    I will put that on my list and upload the mod in the other thread. Hopefully i get sent the x1 to test all the modding steps on before the new year has come. ^^

This discussion has been closed.
Back To Top