S4MK3 & S3: Performance MOD (qml coding)

1131416181933

Comments

  • pixel
    pixel Member Posts: 232 Advisor

    I have finished the S3 FX function😃

  • djvic91
    djvic91 Member Posts: 87 Helper

    Sûlherokhh just tried the new update, works great. the cup feature ( holding the shift and pressing down the move encoder seems to work faster!! great job!!

  • djvic91
    djvic91 Member Posts: 87 Helper
    edited May 1

    here's something and would like your opinion on it . if you press shift and move the loop encoder the key changes up or down depending what side you move the encoder. what if you pressed shift and move the Move encoder to fine tune the key just like on the D2.

  • pixel
    pixel Member Posts: 232 Advisor
    edited May 2

    I'm wondering if I can manage to save the rotation motion and repeat it in a loop. I think that would be awesome😝

    Edit:

    It is possible, I just have to check the position change in the traktor (FX) and save the positions and time, I will experiment this evening😋

    I'm curious how big such a variable (MappingPropertyDescriptor.Boolean) can be😛

    So with a TIME-DISTANCE DIAGRAM it should work😊 https://www.mathi.uni-heidelberg.de/~flemmermeyer/HA/ts-diag2.pdf

  • pixel
    pixel Member Posts: 232 Advisor
    edited May 3

    I was thinking about how I could implement save, I haven't tested it, it's just an idea😜

    EDIT: The forum is annoying because it arbitrarily increases the line spacing in the code block🤐

    MappingPropertyDescriptor { id: fx1knobs_dry_wet_pos_time; path: "mapping.settings.fx1_dry_wet_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx1knobs1_pos_time; path: "mapping.settings.fx1_knobs1_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx1knobs2_pos_time; path: "mapping.settings.fx1_knobs2_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx1knobs3_pos_time; path: "mapping.settings.fx1_knobs3_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; } MappingPropertyDescriptor { id: fx2knobs_dry_wet_pos_time; path: "mapping.settings.fx2_dry_wet_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx2knobs1_pos_time; path: "mapping.settings.fx2_knobs1_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx2knobs2_pos_time; path: "mapping.settings.fx2_knobs2_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx2knobs3_pos_time; path: "mapping.settings.fx2_knobs3_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; } MappingPropertyDescriptor { id: fx3knobs_dry_wet_pos_time; path: "mapping.settings.fx1_dry_wet_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx3knobs1_pos_time; path: "mapping.settings.fx3_knobs1_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx3knobs2_pos_time; path: "mapping.settings.fx3_knobs2_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx3knobs3_pos_time; path: "mapping.settings.fx3_knobs3_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; } MappingPropertyDescriptor { id: fx4knobs_dry_wet_pos_time; path: "mapping.settings.fx4_dry_wet_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx4knobs1_pos_time; path: "mapping.settings.fx4_knobs1_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx4knobs2_pos_time; path: "mapping.settings.fx4_knobs2_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; }
    MappingPropertyDescriptor { id: fx4knobs3_pos_time; path: "mapping.settings.fx4_knobs3_pos_time"; type: MappingPropertyDescriptor.Boolean; value: false; } AppProperty { id: fx1knobs_dry_wet; path: "app.traktor.fx.1.dry_wet" }
    AppProperty { id: fx1knobs_1; path: "app.traktor.fx.1.knobs.1" }
    AppProperty { id: fx1knobs_2; path: "app.traktor.fx.1.knobs.2" }
    AppProperty { id: fx1knobs_3; path: "app.traktor.fx.1.knobs.3" } AppProperty { id: fx2knobs_dry_wet; path: "app.traktor.fx.2.dry_wet" }
    AppProperty { id: fx2knobs_1; path: "app.traktor.fx.2.knobs.1" } AppProperty { id: fx2knobs_2; path: "app.traktor.fx.2.knobs.2" } AppProperty { id: fx2knobs_3; path: "app.traktor.fx.2.knobs.3" } AppProperty { id: fx3knobs_dry_wet; path: "app.traktor.fx.3.dry_wet" } AppProperty { id: fx3knobs_1; path: "app.traktor.fx.3.knobs.1" } AppProperty { id: fx3knobs_2; path: "app.traktor.fx.3.knobs.2" } AppProperty { id: fx3knobs_3; path: "app.traktor.fx.3.knobs.3" } AppProperty { id: fx4knobs_dry_wet; path: "app.traktor.fx.4.dry_wet" } AppProperty { id: fx4knobs_1; path: "app.traktor.fx.4.knobs.1" } AppProperty { id: fx4knobs_2; path: "app.traktor.fx.4.knobs.2" } AppProperty { id: fx4knobs_3; path: "app.traktor.fx.4.knobs.3" } function FxRec(channel, aktion)
    { let fx1_dry_wet_pos_time, fx1_knobs1_pos_time, fx1_knobs2_pos_time, fx1_knobs3_pos_time;
    let fx2_dry_wet_pos_time, fx2_knobs1_pos_time, fx2_knobs2_pos_time, fx2_knobs3_pos_time;
    let fx3_dry_wet_pos_time, fx3_knobs1_pos_time, fx3_knobs2_pos_time, fx3_knobs3_pos_time;
    let fx4_dry_wet_pos_time, fx4_knobs1_pos_time, fx4_knobs2_pos_time, fx4_knobs3_pos_time; let count = 0; let A = new Date();
    let time = A.getTime(); do { count++; if (channel == 1 && aktion) { fx1_dry_wet_pos_time = fx1_dry_wet_pos_time.split('/'); fx1_dry_wet = fx1_dry_wet_pos_time[1].replace(/[^0-9]/g, ""); if (fx1knobs_dry_wet.value != fx1_dry_wet) { fx1_dry_wet_pos_time += '/id:' + count + '/pos:' + fx1knobs_dry_wet.value + '/time:' + time; fx1knobs_dry_wet.value += fx1_dry_wet_pos_time; } fx1_knobs1_pos_time = fx1_knobs1_pos_time.split('/'); fx1_knobs1 = fx1_knobs1_pos_time[1].replace(/[^0-9]/g, ""); if (fx1knobs_1.value != fx1_knobs1) { fx1_knobs1_pos_time += '/id:' + count + '/pos:' + fx1knobs_1.value + '/time:' + time; fx1knobs_1.value += fx1_knobs1_pos_time; } fx1_knobs2_pos_time = fx1_knobs2_pos_time.split('/'); fx1_knobs2 = fx1_knobs2_pos_time[1].replace(/[^0-9]/g, ""); if (fx1knobs_2.value != fx1_knobs2) { fx1_knobs2_pos_time += '/id:' + count + '/pos:' + fx1knobs_2.value + '/time:' + time; fx1knobs_2.value += fx1_knobs2_pos_time; } fx1_knobs3_pos_time = fx1_knobs3_pos_time.split('/'); fx1_knobs3 = fx1_knobs3_pos_time[1].replace(/[^0-9]/g, ""); if (fx1knobs_3.value != fx1_knobs3) { fx1_knobs3_pos_time += '/id:' + count + '/pos:' + +fx1knobs_3.value + '/time:' + time; fx1knobs_3.value += fx1_knobs3_pos_time; } } if (channel == 2 && aktion) { fx2_dry_wet_pos_time = fx2_dry_wet_pos_time.split('/'); fx2_dry_wet = fx2_dry_wet_pos_time[1].replace(/[^0-9]/g, ""); if (fx2knobs_dry_wet.value != fx2_dry_wet) { fx2_dry_wet_pos_time += '/id:' + count + '/pos:' + fx2knobs_dry_wet.value + '/time:' + time; fx2knobs_dry_wet.value += fx2_dry_wet_pos_time; } fx2_knobs1_pos_time = fx2_knobs1_pos_time.split('/'); fx2_knobs1 = fx2_knobs1_pos_time[1].replace(/[^0-9]/g, ""); if (fx2knobs_1.value != fx2_knobs1) { fx2_knobs1_pos_time += '/id:' + count + '/pos:' + fx2knobs_1.value + '/time:' + time; fx2knobs_1.value += fx2_knobs1_pos_time; } fx2_knobs2_pos_time = fx2_knobs2_pos_time.split('/'); fx2_knobs2 = fx2_knobs2_pos_time[1].replace(/[^0-9]/g, ""); if (fx2knobs_2.value != fx2_knobs2) { fx2_knobs2_pos_time += '/id:' + count + '/pos:' + fx2knobs_2.value + '/time:' + time; fx2knobs_2.value += fx2_knobs2_pos_time; } fx2_knobs3_pos_time = fx2_knobs3_pos_time.split('/'); fx2_knobs3 = fx2_knobs3_pos_time[1].replace(/[^0-9]/g, ""); if (fx2knobs_3.value != fx2_knobs3) { fx2_knobs3_pos_time += '/id:' + count + '/pos:' + +fx2knobs_3.value + '/time:' + time; fx2knobs_3.value += fx2_knobs3_pos_time; } } if (channel == 3 && aktion) { fx3_dry_wet_pos_time = fx3_dry_wet_pos_time.split('/'); fx3_dry_wet = fx3_dry_wet_pos_time[1].replace(/[^0-9]/g, ""); if (fx3knobs_dry_wet.value != fx3_dry_wet) { fx3_dry_wet_pos_time += '/id:' + count + '/pos:' + fx3knobs_dry_wet.value + '/time:' + time; fx3knobs_dry_wet.value += fx3_dry_wet_pos_time; } fx3_knobs1_pos_time = fx3_knobs1_pos_time.split('/'); fx3_knobs1 = fx3_knobs1_pos_time[1].replace(/[^0-9]/g, ""); if (fx3knobs_1.value != fx3_knobs1) { fx3_knobs1_pos_time += '/id:' + count + '/pos:' + fx3knobs_1.value + '/time:' + time; fx3knobs_1.value += fx3_knobs1_pos_time; } fx3_knobs2_pos_time = fx3_knobs2_pos_time.split('/'); fx3_knobs2 = fx3_knobs2_pos_time[1].replace(/[^0-9]/g, ""); if (fx3knobs_2.value != fx3_knobs2) { fx3_knobs2_pos_time += '/id:' + count + '/pos:' + fx3knobs_2.value + '/time:' + time; fx3knobs_2.value += fx3_knobs2_pos_time; } fx3_knobs3_pos_time = fx3_knobs3_pos_time.split('/'); fx3_knobs3 = fx3_knobs3_pos_time[1].replace(/[^0-9]/g, ""); if (fx3knobs_3.value != fx3_knobs3) { fx3_knobs3_pos_time += '/id:' + count + '/pos:' + +fx3knobs_3.value + '/time:' + time; fx3knobs_3.value += fx3_knobs3_pos_time; } } if (channel == 4 && aktion) { fx4_dry_wet_pos_time = fx4_dry_wet_pos_time.split('/'); fx4_dry_wet = fx4_dry_wet_pos_time[1].replace(/[^0-9]/g, ""); if (fx4knobs_dry_wet.value != fx4_dry_wet) { fx4_dry_wet_pos_time += '/id:' + count + '/pos:' + fx4knobs_dry_wet.value + '/time:' + time; fx4knobs_dry_wet.value += fx4_dry_wet_pos_time; } fx4_knobs1_pos_time = fx4_knobs1_pos_time.split('/'); fx4_knobs1 = fx4_knobs1_pos_time[1].replace(/[^0-9]/g, ""); if (fx4knobs_1.value != fx4_knobs1) { fx4_knobs1_pos_time += '/id:' + count + '/pos:' + fx4knobs_1.value + '/time:' + time; fx4knobs_1.value += fx4_knobs1_pos_time; } fx4_knobs2_pos_time = fx4_knobs2_pos_time.split('/'); fx4_knobs2 = fx4_knobs2_pos_time[1].replace(/[^0-9]/g, ""); if (fx4knobs_2.value != fx4_knobs2) { fx4_knobs2_pos_time += '/id:' + count + '/pos:' + fx4knobs_2.value + '/time:' + time; fx4knobs_2.value += fx4_knobs2_pos_time; } fx4_knobs3_pos_time = fx4_knobs3_pos_time.split('/'); fx4_knobs3 = fx4_knobs3_pos_time[1].replace(/[^0-9]/g, ""); if (fx4knobs_3.value != fx4_knobs3) { fx4_knobs3_pos_time += '/id:' + count + '/pos:' + +fx4knobs_3.value + '/time:' + time; fx4knobs_3.value += fx4_knobs3_pos_time; } } } while (aktion); } Wire { from: "s3.mixer.channels.1.channel_fx.on"; to: ButtonScriptAdapter { onPress: { FxRec(1, true) } onRelease: { FxRec(1, false) } } Wire { from: "s3.mixer.channels.2.channel_fx.on"; to: ButtonScriptAdapter { onPress: { FxRec(2, true) } onRelease: { FxRec(2, false) } } Wire { from: "s3.mixer.channels.3.channel_fx.on"; to: ButtonScriptAdapter { onPress: { FxRec(3, true) } onRelease: { FxRec(3, false) } } Wire { from: "s3.mixer.channels.4.channel_fx.on"; to: ButtonScriptAdapter { onPress: { FxRec(4, true) } onRelease: { FxRec(4, false) } }

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

    S4MK3 Performance Mod V12:

    New or updated deck features:

    • SHIFT+Play: Activate Vinyl Break, the length of which is calculated using the inverse of the jog wheel haptic tension. Vinyl Break will automatically deactivate Sync to work correctly.
    • Jogwheel: Motor (and LED turning) stops temporarily when the jogwheel is used for loop or Tension adjustment. Turning LED now also active when cuing.
    • Master Hold (>0.2sec): Master Clock AUTO toggle. Also sets internal clock to be master clock.
    • Hold DECK (A, B, C or D) + Move Enc Turn (Push): Cycle through all 17 deck colours. Also cycles through the NI-designed waveform colours at the same time, from Red at the low end to White at the high end. The adjustment hard-stops at the left end (Red) and the right end (White). Push Encoder to reset.
    • Hold DECK (A, B, C or D) + Browse Enc Turn (Push): Adjust Traktor GUI waveform zoom factor. Push Encoder to reset to -0.75.
    • SHIFT+MixerFX (Filter): Toggles CDJ-style Cue & Play button LED blinkers. CDJ-style Cue button LED blinker is in WarmYellow (for the CDJ colour coding).

    New or updated Track/Stem deck features:

    • SHIFT+Move Encoder Push: Triggers Re-Loop. It's mechanically Cue Play (CUP) with an added Loop Active trigger if the targeted active cue is a loop cue. Behaviour depends on your CUP settings. Set in 'Preferences➔Transport➔Cue Play (CUP Mode)'.
    • Hold DECK (A, B, C or D) + Loop Enc Turn (Push): Cycle through waveform colours (only). From white at the high end, the S4 uses my custom designs (and adapted designs), beginning with X-Ray (for White), over Infrared, Ultraviolet, Denon SC5000/SC6000 Prime (Blue/Green), Pioneer CDJ-2000 Nexus 2 (Red/Blue) to Pioneer CDJ-3000 (Blue/Yellow).

    New or updated screen features:

    • Bigger BPM display. Also changed places with Time display.
    • Phase-Meter pop-up: Appears on unsynced slave decks when the tempo phase is changed in any way.
    • SHIFT+MixerFX buttons (1,2,3,4): Manually select pop-up duration (for all pop-ups) from 1 to 4 seconds.
    • SHIFT+Lower Deck (C or D) button: Toggle two alternate Loop Size display types.
    • Screen Output Override: Toggle to turn off the screens with SHIFT + top deck button (A or B).

    Description and link here: Version 12

    Updated future work in progress:

    • FX presets.
    • Display LoopIn-/LoopOut points on the stripe, green colouring of the looping part of the waveform when the loop is active (current work focus).

    🦋

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

    RIght now SHIFT+MoveEnc(Turn) is 1-beat-move. I would rather keep that function, as it has been in use in all S4 iterations and is pretty useful.

    I may put in place smaller steps by grafting that function onto SHIFT+LoopEnc(HoldDown)+LoopEnc(Turn).

    EDIT: The forum is annoying because it arbitrarily increases the line spacing in the code block🤐

    @pixel : I agree.

    There is a command called 'save snapshot'. It saves the values of every knob/button status (for specific FX) in the FX Unit. Have you tried it?

  • pixel
    pixel Member Posts: 232 Advisor

    No, I don't know, I say yes, I'm still a traktor beginner😥It's just an idea that I got

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

    Possibly your idea will turn out even better. You have all the freedom to do with the values, how and when to store them, how and when to recall them. NI's implementation of 'Store' and 'Recall/Reset' are limited; a few useful circumstances are not covered by this.

  • pixel
    pixel Member Posts: 232 Advisor
    edited May 3

    I have to take a look at the (save snapshot) today, which I hadn't seen before.😀
    So maybe I can expand the idea further😊

    edit: Tomorrow I'll try to create a function that runs an animation that moves the knob. I'm not allowed today.

  • VityaT
    VityaT Member Posts: 41 Helper
    edited May 3

    "Save snapshot" is not good function. As i understand it is the same to mapping comand "FX Store Preset".
    With "FX Store Preset" comand in mapping there is one annoying thing - FX are activated on Traktor startup and it needed to turn them off every time you runs Traktor

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

    Exactly. If a specific FX has been activated before saving the snapshot via FX Store Preset, the next time you load that specific FX, it will also load as active. I think this is because in Group mode the command to load the preset/snapshot doesn't exist, unlike in Single mode. You can circumvent this by first deactivating the FX and then saving the snapshot.

    However, it is important that this function works like it does, so that mappings that load/activate different FX using the same FX Unit can load them being active already. Otherwise they don't start at all after loading.

  • pixel
    pixel Member Posts: 232 Advisor

    So far I haven't found a way to change the value of app.traktor.fx.1.knobs.1.
    The strange thing is that I don't get an error when I try to make a change. It seems that Traktor Pro is blocking it.

    Too bad... save would work

    This would be so easy to implement with JavaScript. Processing variables from QML in JS also works great.

    Apparently all functions that work with knobs cause problems.

    Unless you do this directly "Wire { from: to: }", but I can't change the value like that.

    The select elements also cause problems with knobs, but you can at least control them with encoders. The value can also be easily changed

    But thanks to the JS tests I've become smarter now...a mini game like Pong should be possible on the S4^^

  • djvic91
    djvic91 Member Posts: 87 Helper
    edited May 3

    want to know if this would work, pressing the shift button and holding the hot cues button then turn the loop encoder to do the fine tunning on the key adjustment? or just pressing the hot cues button and turning the loop encoder to fine tune the key?

  • djvic91
    djvic91 Member Posts: 87 Helper

    the reason I'm asking is because I'm getting good hip hop/ r&b tracks in house music versions and would like to fine tune when i pitch up or pitch down. plus the club set up will be with a D2 but private gigs i wouldn't have to bring a D2

Back To Top