S4MK3 & S3: Performance MOD (qml coding)

12122232426

Comments

  • DJ ALX
    DJ ALX Member Posts: 13 Member

    I found and installed S3 Performance Mod V10.2.0 (on p age 21), it seems to be working fine with TP4 here so I guess there are no issues between TP3 and TP4 mappings. I will report back any issues on my end though.

    @pixel seems that youve done some solid work. I salut you. This mapping makes the S3 alot more powerfull than i thought it could be.

    @Sûlherokhh from what I read the S3 mapping derives from yours, so I salut you too! Im coming from S4mk2 and will be getting S4mk3 in the near future.

    Still, when I load a stem track in any of my decks I lost my stem track on/off buttons. They used to be in the SAMPLES page in the factory mapping, now when you load a stem the SAMPLES page is still Deck C's or D's sample triggers.

    Should I map them myself in the Control Manager ?

    Also I had a few mappings I made myself but were lost when I installed these qml mods.
    So im going to map them again. Maybe I can suggest them here and they can be added to the qml mods?

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

    Since the pad modes are qml coded, it will be difficult to map them with the controller manager. I'll have a look at @pixel 's S3 code to see if the is a problem with prioritizing stem over lower deck remix controls using SAMPLE mode. Can you check if it works when deck C and D are track decks instead of remix decks?

  • DJ ALX
    DJ ALX Member Posts: 13 Member

    I tried what you suggested. I loaded stem tracks on deck C and deck D and only the hot cues appear. The SAMPLES page seems to be deactivated. Then i loaded remix tracks on deck A and deck B and when i select deck C and/or deck D the SAMPLES page is activated and can trigger samples from deck A and deck B.

    Im not at all familiar with this qml code and id most likely mess things up if i attempt to fix this myself.
    I dont have any idea of what factory qml files to compare with the modded ones and try and figure out whats wrong. This is all new to me.

    I also have a few suggestions that could be coded in qml rather than Control Manager mapping.
    But thats for another post.

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

    I just checked the code, both the original of TP3.11.1 and TP4 as well as the mod's code, which is based on 3.11.1.

    TP3 code doesn't have the stem pad mode switch in it at all, although the files to actually control stems are there. I don't know how this came to be (i don't own an S3 or i would have encountered this earlier). But i can see what code in which files needs to get updated.

    I can adjust the code for you (it's only two files as far as i can see), but i can't test, so you will need to do the testing. You up for it?

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

    Anyway, here it is.

    Changes to the code:

    • Inserted Native TP4 'single/double-click' load function (track/stem) with 1 second delay.
    • Inserted Native Stem module, which gets priority over samples controls of the pads using the 'SAMPLE' button.

    Test away. :)

  • DJ ALX
    DJ ALX Member Posts: 13 Member

    This is great news! Yes I tested the update, now I have stem mutes back on all 4 decks. What I lost is the FX Features. By the way the last mod i installed was Traktor_Kontrol_S3_TP3.11.1_PerformanceMod_10.2.0 found on page 21 and not the one found on page 1.

    @pixel : Should I install 9.1 and then install your update? Is 9.1 better than 10.2 ?

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

    Oh, i will update 10.2.0 instead and post it here and in post#1. Good to hear the stems are working again. :)

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

    @DJ ALX

    Take it for a spin. Same changes as before, this time on V10.2.

  • DJ ALX
    DJ ALX Member Posts: 13 Member

    Thank you so much. Yes FX features are back again!

    Before I found this thread I was using a qml mod that gives you FX sends to each of the stems by pressing SHIFT + HOTCUE 5 through HOTCUE 8 for stems 1 to 4 respectively.

    Since this mod leaves file S3Stems.qml untouched, I added this extra mod and looks like it works fine with 10.2.


    replace this from the factory S3Stems.qml

    Wire { from: "%surface%.pads.5"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 1; defaultValue: 0 } }
    Wire { from: "%surface%.pads.6"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 2; defaultValue: 0 } }
    Wire { from: "%surface%.pads.7"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 3; defaultValue: 0 } }
    Wire { from: "%surface%.pads.8"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 4; defaultValue: 0 } }
    

    }

    }

    with this:

    WiresGroup
    {
      enabled: module.shift
      Wire { from: "%surface%.pads.5"; to: "stems.1.fx_send_on" }
      Wire { from: "%surface%.pads.6"; to: "stems.2.fx_send_on" }
      Wire { from: "%surface%.pads.7"; to: "stems.3.fx_send_on" }
      Wire { from: "%surface%.pads.8"; to: "stems.4.fx_send_on" }
    }
    

    WiresGroup
    {
    enabled: !module.shift

      Wire { from: "%surface%.pads.5"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 1; defaultValue: 0 } }
      Wire { from: "%surface%.pads.6"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 2; defaultValue: 0 } }
      Wire { from: "%surface%.pads.7"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 3; defaultValue: 0 } }
      Wire { from: "%surface%.pads.8"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 4; defaultValue: 0 } }
    }
    

    }

    }

    I dont remember where I found this. I can look my history and find the name to credit the person that coded this if you plan to use it in this mod.

    There are a few other ideas that can fit into the S3 TP4 mod. Im mapping them with Controller Manager and I dont know how to write qml code to fit them in the mod:

    To adjust master tempo in steps of 0.5bpm upwards and downwards
    Left Browse Favorite > Set Master Tempo, Interaction Mode: Inc, Resolution: Switch, Autorepeat, Override
    Left Browse Queue > Set Master Tempo, Interaction Mode: Dec, Resolution: Switch, Autorepeat, Override
    (Add out color of choise)

    To browse through the mixer layouts
    Right Browse Favorit > Layout selector, Interaction Mode: Inc, Override
    Right Browse Favorit > Layout selector, Interaction Mode: Inc, Override
    (Add out color of choise)

    I plan not to use the factory ON/OFF of ABCD for the FILTER and other 4 effects so i plan to map a bass kill switch on those 4 ON buttons since its more critical to my mixing. Hope it doesnt mess up any modded functions.

    Will let you know.

    Again thanks for this.


  • Sûlherokhh
    Sûlherokhh Member, Traktor Mapping Mod Posts: 2,544 mod
    edited October 9

    I have the fx sends already in the S4 mod. I was hoping @pixel would do the updates to the S3 mod, since he has one at home. And since your request was something readily accesible (i was working on those codes recently and knew exactly what to do) i picked up the slack. I don't prefer working on controllers i don't own in my free time.

    If you like the fiddling, i can post the code i want to publish after the next traktor release in my next mod update that concerns the stem mute pads (blinking instead of dimming for better feedback) if you like. You can pretty much insert it in the file you just edited for it to work.

    Edit: I can check for code formatting in the qml files for the layout/browser assignments.

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

    'S3Stems.qml'

    At the top add this line so that the blink code works.

    import QtQuick 2.12
    

    If you want to have the encoders be a bit more precise with volume/filter, adjust the value like i did (original code commented out with '//'). I found 0.05 to be too coarse for the filter.

    // StemDeckStreams { name: "stems"; channel: deckIdx; encoderStep: 0.05 }
    StemDeckStreams { name: "stems"; channel: deckIdx; encoderStep: 0.025 }
    

    Right under the MappingPropertyDescriptor add the following lines.

    AppProperty { id: stemColorId_1;  path: "app.traktor.decks." + deckIdx + ".stems.1.color_id" }
    AppProperty { id: stemColorId_2;  path: "app.traktor.decks." + deckIdx + ".stems.2.color_id" }
    AppProperty { id: stemColorId_3;  path: "app.traktor.decks." + deckIdx + ".stems.3.color_id" }
    AppProperty { id: stemColorId_4;  path: "app.traktor.decks." + deckIdx + ".stems.4.color_id" }
    
    AppProperty { id: stemMuted_1;  path: "app.traktor.decks." + deckIdx + ".stems.1.muted" }
    AppProperty { id: stemMuted_2;  path: "app.traktor.decks." + deckIdx + ".stems.2.muted" }
    AppProperty { id: stemMuted_3;  path: "app.traktor.decks." + deckIdx + ".stems.3.muted" }
    AppProperty { id: stemMuted_4;  path: "app.traktor.decks." + deckIdx + ".stems.4.muted" }
    
    //PAD should BLINK when STEM is MUTED
    Timer {
      id: stemMuteBlinkTimer
      property bool  blink: false
      interval: 500
    repeat: true running: stemMuted_1.value || stemMuted_2.value || stemMuted_3.value || stemMuted_4.value onTriggered: { blink = !blink; } }

    The next piece of code is for the pads:

    Right under this …

    WiresGroup
    {
      enabled: active
    
    

    … place the following code that is basically replacing the code you posted above. It will also have a reset button for each stem's volume/mute/filter values at the shifted layer of the top 4 pads (in white). The FX send buttons (shifted layer bottom row) are in orange.

    WiresGroup
    {
      enabled: !module.shift
    
      //----------------------- Top Pads to stem mutes LED -----------------------------
    
      Wire { from: "%surface%.pads.1"; to: ButtonScriptAdapter { brightness: stemMuteBlinkTimer.blink; color: stemColorId_1.value;} enabled: stemMuted_1.value }
      Wire { from: "%surface%.pads.2"; to: ButtonScriptAdapter { brightness: stemMuteBlinkTimer.blink; color: stemColorId_2.value;} enabled: stemMuted_2.value }
      Wire { from: "%surface%.pads.3"; to: ButtonScriptAdapter { brightness: stemMuteBlinkTimer.blink; color: stemColorId_3.value;} enabled: stemMuted_3.value }
      Wire { from: "%surface%.pads.4"; to: ButtonScriptAdapter { brightness: stemMuteBlinkTimer.blink; color: stemColorId_4.value;} enabled: stemMuted_4.value }
    
      //----------------------- Top Pads to stem mutes VALUE -----------------------------
       
      Wire { from: "%surface%.pads.1.value"; to: "stems.1.muted"; enabled: stemMuted_1.value }
      Wire { from: "%surface%.pads.2.value"; to: "stems.2.muted"; enabled: stemMuted_2.value }
      Wire { from: "%surface%.pads.3.value"; to: "stems.3.muted"; enabled: stemMuted_3.value }
      Wire { from: "%surface%.pads.4.value"; to: "stems.4.muted"; enabled: stemMuted_4.value }
    
      Wire { from: "%surface%.pads.1"; to: "stems.1.muted"; enabled: !stemMuted_1.value }
      Wire { from: "%surface%.pads.2"; to: "stems.2.muted"; enabled: !stemMuted_2.value }
      Wire { from: "%surface%.pads.3"; to: "stems.3.muted"; enabled: !stemMuted_3.value }
      Wire { from: "%surface%.pads.4"; to: "stems.4.muted"; enabled: !stemMuted_4.value }
     
    
      //------------------------- Lower pads to stem focus ---------------------------
    
      Wire { from: "%surface%.pads.5"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 1; defaultValue: 0 } }
      Wire { from: "%surface%.pads.6"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 2; defaultValue: 0 } }
      Wire { from: "%surface%.pads.7"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 3; defaultValue: 0 } }
      Wire { from: "%surface%.pads.8"; to: HoldPropertyAdapter { path: deckPropertiesPath + ".stems.active_stem"; value: 4; defaultValue: 0 } }
    }
    
    WiresGroup
    {
      enabled: module.shift
      
      //---------------- Top pads to reset stem mute, volume and filter -------------
    
      Wire { from: "%surface%.pads.1"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.1.muted"; value: false } }
      Wire { from: "%surface%.pads.1"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.1.volume"; value: 1.0; output: false } }
      Wire { from: "%surface%.pads.1"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.1.filter_value"; value: 0.5; output: false } }
      Wire { from: "%surface%.pads.2"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.2.muted"; value: false } }
      Wire { from: "%surface%.pads.2"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.2.volume"; value: 1.0; output: false } }
      Wire { from: "%surface%.pads.2"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.2.filter_value"; value: 0.5; output: false } }
      Wire { from: "%surface%.pads.3"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.3.muted"; value: false } }
      Wire { from: "%surface%.pads.3"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.3.volume"; value: 1.0; output: false } }
      Wire { from: "%surface%.pads.3"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.3.filter_value"; value: 0.5; output: false } }
      Wire { from: "%surface%.pads.4"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.4.muted"; value: false } }
      Wire { from: "%surface%.pads.4"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.4.volume"; value: 1.0; output: false } }
      Wire { from: "%surface%.pads.4"; to: SetPropertyAdapter { path: "app.traktor.decks." + deckIdx + ".stems.4.filter_value"; value: 0.5; output: false } }
    
      //----------------------- Lower Pads to stem FX send -----------------------------
      
      Wire { from: "%surface%.pads.5"; to: "stems.1.fx_send_on" }
      Wire { from: "%surface%.pads.6"; to: "stems.2.fx_send_on" }
      Wire { from: "%surface%.pads.7"; to: "stems.3.fx_send_on" }
      Wire { from: "%surface%.pads.8"; to: "stems.4.fx_send_on" }
    
    }
    

    Have fun! :)

  • DJ ALX
    DJ ALX Member Posts: 13 Member

    Thank you for the code.

    I edited the already edited S3Stems.qml and the S3 was not responsive and was not working with Traktor.

    So went back to the factory S3Stems.qml and placed your code there.
    The Stem FX Sends were working but there was no blinking in the muted stems.
    Also there is no volume/mute/filter reset on the shifted layer.

    Im thinking that i would prefer the muted stem pads to not blink but to be turned completely off. It helps me reach the pads of interest much faster when im performing since my fast glance can be alot faster than a blink on or a blink off. Same with the FX sends on the shifted layer id prefer them full orange and shut off rather than full orange and dimmed orange.

    If you or @pixel can help me on this it would be great. Take your time, no rush.

    Again thank you for your prompt response.

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

    Can you test this file? I am curious what broke. It may be just a syntax error. If this one works you can compare it to your own file to see what's what:

    If you just want to switch off the LED, you have to add this at the beginning of your working file (just in front of the first Wire or WiresGroup, it can't be inside):

    AppProperty { id: stemMuted_1;  path: "app.traktor.decks." + deckIdx + ".stems.1.muted" }
    AppProperty { id: stemMuted_2;  path: "app.traktor.decks." + deckIdx + ".stems.2.muted" }
    AppProperty { id: stemMuted_3;  path: "app.traktor.decks." + deckIdx + ".stems.3.muted" }
    AppProperty { id: stemMuted_4;  path: "app.traktor.decks." + deckIdx + ".stems.4.muted" }
    

    Step two is to replace the four mute wires …

    Wire { from: "%surface%.pads.1"; to: "stems.1.muted" }
    Wire { from: "%surface%.pads.2"; to: "stems.2.muted" }
    Wire { from: "%surface%.pads.3"; to: "stems.3.muted" }
    Wire { from: "%surface%.pads.4"; to: "stems.4.muted" }
    

    …with the following eight mute wires:

    Wire { from: "%surface%.pads.1.value"; to: "stems.1.muted"; enabled: stemMuted_1.value }
    Wire { from: "%surface%.pads.2.value"; to: "stems.2.muted"; enabled: stemMuted_2.value }
    Wire { from: "%surface%.pads.3.value"; to: "stems.3.muted"; enabled: stemMuted_3.value }
    Wire { from: "%surface%.pads.4.value"; to: "stems.4.muted"; enabled: stemMuted_4.value }
    
    Wire { from: "%surface%.pads.1"; to: "stems.1.muted"; enabled: !stemMuted_1.value }
    Wire { from: "%surface%.pads.2"; to: "stems.2.muted"; enabled: !stemMuted_2.value }
    Wire { from: "%surface%.pads.3"; to: "stems.3.muted"; enabled: !stemMuted_3.value }
    Wire { from: "%surface%.pads.4"; to: "stems.4.muted"; enabled: !stemMuted_4.value }
    

    This will have the led output only be there if mute is off.

  • DJ ALX
    DJ ALX Member Posts: 13 Member

    Just tried your last S3Stems.qml file. It works! Thank you!
    Havnt compared it yet with my previous file since I delete and revert so the non working one is gone.

    Maybe I found a bug though. When I reset stems using SHIFT+WHITE top pads, the filter resets to 0 but the stems mute (instread of turning on or remaining on).

    Also, dont know if its a factory bug or a mod bug, but when I hold a white pad (5 to 8) and use the LOOP knob to adjust the filter, I have the loop duration running wild as if im tweaking it. Doesnt affect the song if a loop is not activated but if i adjust the filter on a stem while in a loop the loops gets adjusted along with the filter.

    I will test the extra code for the turning off the pad LEDS tomorrow. I will keep you posted.

Back To Top