**This project is in progess, and not still finished**
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/P2toAKF.jpg}}
I think the best / easier usage with force is to use prime2 or primeGo.
Below i will explain / provide a template for Prime2.
Prime use QML from QT to do assignments and map functions.
You can write your own javascript / qml code to suit your needs.
Qml below allow to map these functions :
Back , Forward, load Right & Left , Rotary button are mapped like this :
(Load R/L is mapped below)
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/BackForward.jpg}}
### Code Header with Air Imports ###
import airAssignments 1.0
import ControlSurfaceModules 0.1
import InputAssignment 0.1
import OutputAssignment 0.1
import Planck 1.0
import QtQuick 2.12
### Then assignment begin for global parameters ###
MidiAssignment {
objectName: 'PRIME 2 Controller Assignment'
Utility {
id: util
}
GlobalAssignmentConfig {
id: globalConfig
midiChannel: 0
}
GlobalAction {
id: globalAction
}
Back {
note: 67
ledType: LedType.Simple
}
Forward {
//note: 115
shiftAction: Action.Quantize
ledType: LedType.Simple
}
BrowseEncoder {
pushNote: 111
turnCC: 100
ledType: LedType.Simple
}
View {
note: 0
holdAction: Action.ToggleControlCenter
shiftAction: Action.SwitchMainViewLayout
ledType: LedType.Simple
}
Shift {
note: 49
ledType: LedType.Simple
}
Media {
mediaButtonsModel: ListModel {
ListElement {
name: 'Eject'
shiftName: 'Source'
note: 20
hasLed: true
}
}
}
Mixer {
cueMixCC: 12
cueGainCC: 13
crossfaderCC: 32
}
MicSettings {}
Mics {
mic1Note: 36
mic2Note: 37
mic1ShiftAction: Action.ToggleMicTalkover
}
Then we create one repeater bloc for deck1 and further, another for deck2
DeckMidiChannel is 9 on the force when you press the sensitive pads in the middle.
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/AkaiFPadChannel.jpg}}
that's why i use **deckMidiChannel: 9** , which will be assigned to my whole repeater bloc section
### Repeater 1 for Deck Left ###
Repeater {
model: ListModel {
ListElement {
deckName: 'Left'
deckMidiChannel: 9
loadNote: 123
}
}
Item {
DeckAssignmentConfig {
id: deckConfig
name: model.deckName
midiChannel: model.deckMidiChannel
}
DeckAction {
id: deckAction
}
Bank {}
Load {
note: model.loadNote
ledType: LedType.Simple
}
PerformanceModes {
ledType: LedType.RGB
modesModel: ListModel {
ListElement {
note: 78
view: 'CUES'
}
ListElement {
note: 79
view: 'LOOPS'
altView: 'AUTO'
}
ListElement {
note: 80
view: 'ROLL'
}
ListElement {
note: 81
view: "SLICER"
altView: "FIXED"
}
}
}
Here In **PerformanceModes** section , we define where we want the function pad assignment.
I've done it on note **78,79,80,81** for deck 1
By using **LedType.RGB** option, I suspect Engine send a sendcolor function through the Device Assignement file .
However this property is not assignable to each functions.
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/AKF_FuncktionPadDeck1.jpg}}
The we defined **ActionPads** , they are for the pads when you will press one of the pad upper :
- Press 78 you'll have CUES mode
- Press 79 you'll have LOOPS mode
- Press 80 you'll have AUTOLOOPS mode
- Press 81 you'll have SLICER mode
ActionPads {
firstPadNote: 70
ledType: LedType.RGB
}
As prime 2 has 8 pads, when putting 70, it will assign pads from 70 to 77 ( 70, 70+1 , 70+2 ,70+3, etc... to 70+7)
(0 to 7 = 8 pads )
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/AKF_FunctionPads2_deck1.jpg}}
As an exemple, when you'll press the pad for the cue ( pad number 78 ) .
it will send a Sysex message to the pad via sendcolor function, defined in the Device Assignment File.
And then you'll have all the cue for this track
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/AKF_Deck1_CueMapping.jpg}}
You can trigger you cue, by pushing the colored pad , create new on the no colored one or remove them by press shift of the AKF + your colored pad.
Shift button has been mapped upper with **Shift** keyword ( see upper ) to note 49, which is the midi note that shift button send on AKF.
It will work the same for loops (press key 79 ) , quick auto loops (key 80) , and slicer (key 81 )
Below some pics of these functions.
** Cues **
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/AKF_Cues.jpg}}
** Loops **
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/AKF_Loops.jpg}}
** Slicer
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/AKF_Slice1.jpg}}
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/AKF_Slice2.jpg}}
Sync {
syncNote: 83
syncHoldAction: Action.KeySync
}
PlayCue {
cueNote: 37
cueShiftAction: Action.SetCuePoint
playNote: 82
}
PitchBend {
minusNote: 29
plusNote: 30
}
JogWheel {
touchNote: 33
ccUpper: 0x37
ccLower: 0x4D
jogSensitivity: 1638.7 * 10.08
hasTrackSearch: true
}
Vinyl {
note: 35
holdAction: Action.GridCueEdit
}
AutoLoop {
pushNote: 116
turnCC: 16
loopInactiveShiftTurnAction: Action.BeatJump
ledType: LedType.Simple
}
SpeedSlider {
ccUpper: 0x1F
ccLower: 0x4B
invert: true
}
}
}
Same thing for deck Right
### Repeater 2 for Deck Right ###
Repeater {
model: ListModel {
ListElement {
deckName: 'Right'
deckMidiChannel: 9
loadNote: 124
}
}
Item {
DeckAssignmentConfig {
id: deckConfig
name: model.deckName
midiChannel: model.deckMidiChannel
}
DeckAction {
id: deckAction
}
Bank {}
Load {
note: model.loadNote
ledType: LedType.Simple
}
PerformanceModes {
ledType: LedType.RGB
modesModel: ListModel {
ListElement {
note: 110
view: 'CUES'
}
ListElement {
note: 111
view: 'LOOPS'
altView: 'AUTO'
}
ListElement {
note: 112
view: 'ROLL'
}
ListElement {
note: 113
view: "SLICER"
altView: "FIXED"
}
}
}
ActionPads {
firstPadNote: 102
ledType: LedType.RGB
}
Sync {
syncNote: 115
syncHoldAction: Action.KeySync
}
PlayCue {
cueNote: 9
cueShiftAction: Action.SetCuePoint
playNote: 114
}
PitchBend {
minusNote: 29
plusNote: 30
}
JogWheel {
touchNote: 33
ccUpper: 0x37
ccLower: 0x4D
jogSensitivity: 1638.7 * 10.08
hasTrackSearch: true
}
Vinyl {
note: 35
holdAction: Action.GridCueEdit
}
AutoLoop {
pushNote: 56
turnCC: 23
loopInactiveShiftTurnAction: Action.BeatJump
ledType: LedType.Simple
}
SpeedSlider {
ccUpper: 0x1F
ccLower: 0x4B
invert: true
}
}
}
Code below allow to map functions on the pic below
{{http://dnttalo.cluster029.hosting.ovh.net/Pictures/Prime2Layout.jpg}}
Repeater {
model: ListModel {
ListElement {
deckName: "Left"
deckMidiChannel: 0
}
ListElement {
deckName: "Right"
deckMidiChannel: 0
}
}
Item {
id: deckmixer
// Internal properties for Deck 1
readonly property QObjProperty padsView1: Planck.getProperty("/Engine/Deck%1/Pads/View".arg(1))
property string padsMode1: padsView1.translator.string
readonly property bool padsModeIsAutoLoop1: padsMode1 === "AUTO"
readonly property bool padsModeIsLoop1: padsMode1 === "LOOPS"
readonly property bool padsModeIsLoopRoll1: padsMode1 === "ROLL"
readonly property bool padsModeIsSlicerContinuous1: padsMode1 === "SLICER"
readonly property bool padsModeIsSlicer1: padsModeIsSlicerContinuous1 || padsMode1 === "FIXED"
readonly property bool loopEnabled1: Planck.getProperty("/Engine/Deck%1/Track/LoopEnableState".arg(1)).translator.state
readonly property bool loopEditable1: Planck.getProperty("/Engine/Deck%1/Track/LoopEnableState".arg(1)).translator.editable
// Internal properties for Deck 2
readonly property QObjProperty padsView2: Planck.getProperty("/Engine/Deck%1/Pads/View".arg(2))
property string padsMode2: padsView2.translator.string
readonly property bool padsModeIsAutoLoop2: padsMode2 === "AUTO"
readonly property bool padsModeIsLoop2: padsMode2 === "LOOPS"
readonly property bool padsModeIsLoopRoll2: padsMode2 === "ROLL"
readonly property bool padsModeIsSlicerContinuous2: padsMode2 === "SLICER"
readonly property bool padsModeIsSlicer2: padsModeIsSlicerContinuous2 || padsMode2 === "FIXED"
readonly property bool loopEnabled2: Planck.getProperty("/Engine/Deck%1/Track/LoopEnableState".arg(2)).translator.state
readonly property bool loopEditable2: Planck.getProperty("/Engine/Deck%1/Track/LoopEnableState".arg(2)).translator.editable
// Sweep Filter for Deck 1
ValueCCAssignment {
objectName: "Dual Filter Cutoff Deck%1".arg(1)
cc: 16
channel: deckMidiChannel
output: JogOutput {
jogAcceleration: 1.5;
jogSensitivity: 0.5;
type: 0
target: PropertyTarget { path: "/Engine/Mixer/Channel%1/SweepFx/Value".arg(1) }
}
}
// Sweep Filter for deck 2
ValueCCAssignment {
objectName: "Dual Filter Cutoff Deck%1".arg(2)
cc: 23
channel: deckMidiChannel
output: JogOutput {
jogAcceleration: 1.5;
jogSensitivity: 0.5;
type: 0
target: PropertyTarget { path: "/Engine/Mixer/Channel%1/SweepFx/Value".arg(2) }
}
}
Then we will map Parameters buttons, used when you are in slice or loop modes
//
// PARAMETERS DECK RIGHT & LEFT
//
ValueNoteAssignment {
objectName: "Parameter Left Deck%1".arg(1)
note: 58
channel: 0
output: QtObject {
readonly property QObjProperty pHalveLoop1: Planck.getProperty("/Engine/Deck%1/Track/HalveLoop".arg(1))
readonly property QObjProperty pShiftLoopLeft1: Planck.getProperty("/Engine/Deck%1/Track/ShiftLoopLeft".arg(1))
readonly property QObjProperty pHalve1: Planck.getProperty("/Engine/Deck%1/Track/Slicer/Halve".arg(1))
function setValue(channel, value, assignmentEnabled) {
console.log("SVVal:",value)
console.log("SVChan:",assignmentEnabled)
if(assignmentEnabled && value) {
if(padsModeIsSlicer1) {
pHalve1.translator.state = true
}
else if(loopEnabled1) {
if(device.shift) {
pShiftLoopLeft1.translator.state = true
}
else {
pHalveLoop1.translator.state = true
}
}
}
}
}
}
ValueNoteAssignment {
objectName: "Parameter Right Deck%1".arg(1)
note: 59
channel: 0
output: QtObject {
readonly property QObjProperty pDoubleLoop1: Planck.getProperty("/Engine/Deck%1/Track/DoubleLoop".arg(1))
readonly property QObjProperty pShiftLoopRight1: Planck.getProperty("/Engine/Deck%1/Track/ShiftLoopRight".arg(1))
readonly property QObjProperty pDouble1: Planck.getProperty("/Engine/Deck%1/Track/Slicer/Double".arg(1))
function setValue(channel, value, assignmentEnabled) {
if(assignmentEnabled && value) {
if(padsModeIsSlicer1) {
pDouble1.translator.state = true
}
else if(loopEnabled) {
if(device.shift) {
pShiftLoopRight1.translator.state = true
}
else {
pDoubleLoop1.translator.state = true
}
}
}
}
}
}
ValueNoteAssignment {
objectName: "Parameter Left Deck%1".arg(2)
note: 62
channel: 0
output: QtObject {
readonly property QObjProperty pHalveLoop2: Planck.getProperty("/Engine/Deck%1/Track/HalveLoop".arg(2))
readonly property QObjProperty pShiftLoopLeft2: Planck.getProperty("/Engine/Deck%1/Track/ShiftLoopLeft".arg(2))
readonly property QObjProperty pHalve2: Planck.getProperty("/Engine/Deck%1/Track/Slicer/Halve".arg(2))
function setValue(channel, value, assignmentEnabled) {
//console.log("SVVal:",value)
//console.log("SVChan:",assignmentEnabled)
//device.sendColorButton(1,59)
if(assignmentEnabled && value) {
if(padsModeIsSlicer2) {
pHalve2.translator.state = true
}
else if(loopEnabled2) {
if(device.shift) {
pShiftLoopLeft2.translator.state = true
}
else {
pHalveLoop2.translator.state = true
}
}
}
}
}
}
ValueNoteAssignment {
objectName: "Parameter Right Deck%1".arg(2)
note: 63
channel: 0
output: QtObject {
readonly property QObjProperty pDoubleLoop2: Planck.getProperty("/Engine/Deck%1/Track/DoubleLoop".arg(2))
readonly property QObjProperty pShiftLoopRight2: Planck.getProperty("/Engine/Deck%1/Track/ShiftLoopRight".arg(2))
readonly property QObjProperty pDouble2: Planck.getProperty("/Engine/Deck%1/Track/Slicer/Double".arg(2))
function setValue(channel, value, assignmentEnabled) {
if(assignmentEnabled && value) {
if(padsModeIsSlicer2) {
pDouble2.translator.state = true
}
else if(loopEnabled2) {
if(device.shift) {
pShiftLoopRight2.translator.state = true
}
else {
pDoubleLoop2.translator.state = true
}
}
}
}
}
}
/*
ValueCCAssignment {
objectName: "Volume Deck%1".arg(deckName)
cc: 14
normalizeValue: false
channel: deckMidiChannel
output: ValueOutput {
useSoftTakeover: false
target: PropertyTarget { path: "/Engine/Mixer/Channel%1/Volume/Level".arg(index + 1)}
}
}
*/
ValueNoteAssignment {
objectName: "Cue Deck%1".arg(deckName)
note: 13
channel: deckMidiChannel
output: ActionOutput {
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/PFL".arg(index + 1)
}
}
}
ValueOutputAssignment {
objectName: "Channnel Cue LED %1".arg(deckName)
enabled: !device.isInitializing
messageType: type.note
midiIndex: 13
channel: deckMidiChannel
minimum: 1
path: "/Engine/Mixer/Channel%1/PFL".arg(index + 1)
}
ValueNoteAssignment {
objectName: "CrossfaderSendleft" + index
note: 15
channel: deckMidiChannel
valueTransform: QtObject {
function transformValue(in_val) {
var leftVal = 0.0
if (in_val === leftVal) {
return 1.0
}
else {
return 0.0
}
}
}
output: ActionOutput {
behaviour: force.hold
target: PropertyTarget { path: "/Engine/Mixer/Channel%1/Crossfader/SendLeft".arg(index + 1); }
}
}
ValueNoteAssignment {
objectName: "CrossfaderSendRight" + index
note: 15
channel: deckMidiChannel
valueTransform: QtObject {
function transformValue(in_val) {
var rightVal = 0.0156 // A little bit less than 2/127 to make comparing easier
if (in_val >= rightVal) {
return 1.0
}
else {
return 0.0
}
}
}
output: ActionOutput {
behaviour: force.hold
target: PropertyTarget { path: "/Engine/Mixer/Channel%1/Crossfader/SendRight".arg(index + 1); }
}
}
}
}
Repeater {
model: ListModel {
ListElement {
mixerChannelName: '2'
mixerChannelMidiChannel: 0
}
}
Item {
objectName: 'Mixer Channel %1'.arg(model.mixerChannelName)
MixerChannelAssignmentConfig {
id: mixerChannelConfig
name: model.mixerChannelName
midiChannel: model.mixerChannelMidiChannel
}
MixerChannelCore {
pflNote: 116
trimCC: 117
trebleCC:31
midCC: 6
bassCC: 30
faderCC: 230
}
//SweepFxKnob {
// cc: 23
//}
SweepFxSelect {
channelNames: [model.mixerChannelName]
buttonsModel: ListModel {
ListElement {
note: 58
fxIndex: SweepEffect.DualFilter
}
ListElement {
note: 590
fxIndex: SweepEffect.Wash
}
}
}
}
}
///////////////////////////////////////////////////////////////////////////
// Effect Controls
Repeater {
model: ListModel {
ListElement {
deckName: "Left"
deckMidiChannel: 0
}
ListElement {
deckName: "Right"
deckMidiChannel: 1
}
}
Item {
id: deckFx
readonly property string activeDeckIndex:
Planck.getProperty("/GUI/Decks/Decks").translator.entries[index]
onActiveDeckIndexChanged: {
pGridEdit.translator.state = false
pShowCueEdit.translator.state = false
}
readonly property bool cueLEDState1: Planck.getProperty("/Engine/Deck%1/Track/CueLEDState".arg(1)).translator.state
readonly property bool cueLEDFlashing1: Planck.getProperty("/Engine/Deck%1/Track/CueLEDState".arg(1)).translator.flashing
readonly property QObjProperty pTempoSyncedFlashState1: Planck.getProperty("/Engine/Deck%1/TempoSyncedFlashState".arg(1))
readonly property bool tempoSyncedFlashState1: pTempoSyncedFlashState1.translator.state
readonly property string syncMode1: Planck.getProperty("/Engine/Deck%1/SyncMode".arg(1)).translator.string
readonly property string syncMode2: Planck.getProperty("/Engine/Deck%1/SyncMode".arg(2)).translator.string
// Fx Activation Deck1
ValueNoteAssignment {
objectName: "FX%1 Active Button".arg(1)
note: 93
channel: deckMidiChannel
enabled: !device.shift
output: ActionOutput {
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Active".arg(1)
function setValue(deckMidiChannel)
{
console.log("chan",deckMidiChannel)
}
}
}
}
// Fx Selection Deck1
ValueCCAssignment {
objectName: "FX%1 Selection".arg(1)
cc: 17
channel: deckMidiChannel
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)).translator.state
output: QtObject {
readonly property QObjProperty pSelectionIndex: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/PreselectIndex".arg(1))
function setValue(channel, value, assignmentEnabled) {
if(assignmentEnabled) {
if(value > 0.5) { // turn counter clockwise, value normalized
pSelectionIndex.translator.unnormalized = pSelectionIndex.translator.unnormalized - 1
}
else {
pSelectionIndex.translator.unnormalized = pSelectionIndex.translator.unnormalized + 1
}
}
}
}
}
// Fx Selecting Deck1
ValueCCAssignment {
objectName: "FX%1 Selecting".arg(1)
cc: 17
channel: deckMidiChannel
enabled: !Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)).translator.state
output: ActionOutput {
behaviour: force.action
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)
}
}
}
// FxAmount Deck1
ValueCCAssignment {
objectName: "FX%1 Amount".arg(1)
cc: 18
channel: deckMidiChannel
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Knob2Target".arg(1)).translator.string === "Amount"
output: JogOutput {
jogAcceleration: 1.5;
jogSensitivity: 0.5;
type: 0
target: PropertyTarget { path: "/Engine/Mixer/Channel%1/DJFx/Amount".arg(1) }
property bool debug:true
// You can comment below, i let it as an example. Its documented in Engine binary.
// Open Engine Binary with 7zip, extract .rodata , open with np++ and search for "MidiAssignment".
function setValue(channel, value, assignmentEnabled, timestamp) {
if(!assignmentEnabled) {
privateData.oldJogValue = -1.0
return;
}
//console.log("out",value)
var t = target.get(channel, value);
// result[0]: bool indicating whether the value needs decreasing
// result[1]: float amount by which to decrease / increase
var result = [false, 0.0];
switch(type)
{
case 0:
case 3:
calcValueTypeA(value, result);
break;
case 1:
calcValueTypeB(value, result);
break;
case 2:
calcValueTypeC(value, result);
break;
default:
console.warn("Incorrect output type.")
break;
}
if(!t || (t.editable !== undefined && !t.editable))
return;
if(invert === result[0])
{
t.incValue(result[1], rangeMax, rangeMin, roundRobin, false, timestamp);
}
else
{
t.decValue(result[1], rangeMin, rangeMax, roundRobin, false, timestamp);
}
}
function calcValueTypeA(value, result) {
var v = value * 127.0
//console.log("val:",v)
result[0] = v >= 64.0
if(result[0]) {
v = 128 - v
}
// Now v is in [0...63]
v /= 63.0;
result[1] = jogSensitivity * v;
}
}
}
// FxMix Deck1
ValueCCAssignment {
objectName: "FX%1 Mix".arg(1)
cc: 19
channel: deckMidiChannel
output: JogOutput {
jogAcceleration: 1.5;
jogSensitivity: 0.5;
type: 0
target: PropertyTarget { path: "/Engine/Mixer/Channel%1/DJFx/Mix".arg(1) }
}
}
// Fx Rate Deck1 ( mapped to Inexistant CC)
ValueCCAssignment {
objectName: "FX%1 Rate".arg(1)
cc: 1001
channel: deckMidiChannel
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Knob2Target".arg(1)).translator.string === "Rate"
output: QtObject {
readonly property QObjProperty pTarget: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Rate".arg(1))
function setValue(channel, value, assignmentEnabled) {
if(assignmentEnabled) {
var counterClock = value > 0.5
var changeIndex = counterClock ? -1 : 1
pTarget.translator.index = pTarget.translator.index + changeIndex
}
}
}
}
/////////////// DECK 2 ( RIGHT )
// Fx Activation Deck2
ValueNoteAssignment {
objectName: "FX%1 Active Button".arg(2)
note: 05
channel: deckMidiChannel
enabled: !device.shift
output: ActionOutput {
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Active".arg(2)
}
}
}
// Fx Selection Deck2
ValueCCAssignment {
objectName: "FX%1 Selection".arg(2)
cc: 20
channel: deckMidiChannel
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)).translator.state
output: QtObject {
readonly property QObjProperty pSelectionIndex: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/PreselectIndex".arg(2))
function setValue(channel, value, assignmentEnabled) {
if(assignmentEnabled) {
if(value > 0.5) { // turn counter clockwise, value normalized
pSelectionIndex.translator.unnormalized = pSelectionIndex.translator.unnormalized - 1
}
else {
pSelectionIndex.translator.unnormalized = pSelectionIndex.translator.unnormalized + 1
}
}
}
}
}
// Fx Selecting Deck2
ValueCCAssignment {
objectName: "FX%1 Selecting".arg(2)
cc: 20
channel: deckMidiChannel
enabled: !Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)).translator.state
output: ActionOutput {
behaviour: force.action
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)
}
}
}
// Fx Rate Deck2 ( mapped to Inexistant CC)
ValueCCAssignment {
objectName: "FX%1 Rate".arg(2)
cc: 1000
channel: deckMidiChannel
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Knob2Target".arg(2)).translator.string === "Rate"
output: QtObject {
readonly property QObjProperty pTarget: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Rate".arg(2))
function setValue(channel, value, assignmentEnabled) {
if(assignmentEnabled) {
var counterClock = value > 0.5
var changeIndex = counterClock ? -1 : 1
pTarget.translator.index = pTarget.translator.index + changeIndex
}
}
}
}
// FxAmount Deck2
ValueCCAssignment {
objectName: "FX%1 Amount".arg(2)
cc: 21
channel: deckMidiChannel
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Knob2Target".arg(2)).translator.string === "Amount"
output: EndlessKnobOutput {
smallestIncrement: 0.01
biggestIncrement: 0.1
target: PropertyTarget { path: "/Engine/Mixer/Channel%1/DJFx/Amount".arg(2) }
}
}
// FxMix Deck2
ValueCCAssignment {
objectName: "FX%1 Mix".arg(2)
cc: 22
channel: deckMidiChannel
output: ValueOutput {
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Mix".arg(2)
}
}
}
// In test
ValueNoteAssignment {
objectName: "Cue-Split"
channel: 0
note: 59
output: ActionOutput {
behaviour: force.hold
target: PropertyTarget { path: "/Engine/Mixer/Cue/CueMix/Split"; }
}
}
// SyncLed Deck1
OutputAssignment {
objectName: "Sync LED Deck%1".arg(1)
properties: { 'ledValue': '' }
readonly property int ledValue: {
if(syncMode1 === "TempoSync") {
globalSyncMode === "Tempo" || tempoSyncedFlashState ? 127 : 0
}
else if(syncMode1 === "BeatOrBarSync") {
127
}
else {
1
}
}
function send() {
//device.sendSimpleColor(deckMidiChannel, 8, ledValue)
device.sendColorSyncd1(ledValue,"Deck1Sync")
//console.log("simpecolor",ledValue)
}
Component.onCompleted: send()
}
// SyncLed Deck2
OutputAssignment {
objectName: "Sync LED Deck%1".arg(2)
properties: { 'ledValue': '' }
readonly property int ledValue: {
if(syncMode2 === "TempoSync") {
globalSyncMode === "Tempo" || tempoSyncedFlashState ? 127 : 0
}
else if(syncMode2 === "BeatOrBarSync") {
127
}
else {
1
}
}
function send() {
//device.sendSimpleColor(deckMidiChannel, 8, ledValue)
device.sendColorSyncd2(ledValue,"Deck2Sync")
//console.log("simpecolor",ledValue)
}
Component.onCompleted: send()
}
// Cue Led Deck1
OutputAssignment {
objectName: "Cue LED Deck%1".arg(1)
properties: { 'ledValue': '' }
readonly property int ledValue: {
if(cueLEDState1) {
127
}
else if(cueLEDFlashing1) {
tempoSyncedFlashState1 ? 127 : 0
}
else {
1
}
}
function send() {
device.sendColorLedd1(ledValue,"led")
}
Component.onCompleted: send()
}
//////////// FX ASSIGNMENTS TO RED PADS NOTE 54 to 57
//////////// Fx index goes from (0) to (12) in order below
//////////// Echo (0), Delayn Hall, PingPong, AutoGate, Flanger, LFO Filter, Phaser, Crush, Roll, RevRoll, Scratch, Reverb (12)
// RED PAD 1
ValueNoteAssignment {
objectName: "FX%1 Selection".arg(1)
note: 54
channel: 9
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)).translator.state
output: QtObject {
readonly property QObjProperty pSelectionIndex: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/PreselectIndex".arg(1))
function setValue(channel, value, assignmentEnabled) {
if(value > 0) { // turn counter clockwise, value normalized
pSelectionIndex.translator.unnormalized = 3
//console.log("idx:",pSelectionIndex.translator.unnormalized )
// Send to device - look at device file
device.sendFxColorbutton(0)
}
}
}
}
ValueNoteAssignment {
objectName: "FX%1 Selecting".arg(1)
note: 54
channel: 9
enabled: !Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)).translator.state
output: ActionOutput {
behaviour: force.action
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)
}
}
}
// RED PAD 2
ValueNoteAssignment {
objectName: "FX%1 Selection".arg(1)
note: 55
channel: 9
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)).translator.state
output: QtObject {
readonly property QObjProperty pSelectionIndex: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/PreselectIndex".arg(1))
readonly property QObjProperty pFx1Active: Planck.getProperty("/Engine/Mixer/Channel1/DJFx/Active")
function setValue(channel, value, assignmentEnabled) {
if(value > 0) { // turn counter clockwise, value normalized
pSelectionIndex.translator.unnormalized = 4
//console.log("idx:",pSelectionIndex.translator.unnormalized )
//console.log("pFx1Active:",pFx1Active.translator.state)
device.sendFxColorbutton(1)
}
}
}
}
ValueNoteAssignment {
objectName: "FX%1 Selecting".arg(1)
note: 55
channel: 9
enabled: !Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)).translator.state
output: ActionOutput {
behaviour: force.action
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)
}
}
}
// RED PAD 3
ValueNoteAssignment {
objectName: "FX%1 Selection".arg(1)
note: 56
channel: 9
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)).translator.state
output: QtObject {
readonly property QObjProperty pSelectionIndex: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/PreselectIndex".arg(1))
function setValue(channel, value, assignmentEnabled) {
if(value > 0) { // turn counter clockwise, value normalized
pSelectionIndex.translator.unnormalized = 6
console.log("idx:",pSelectionIndex.translator.unnormalized )
device.sendFxColorbutton(2)
}
}
}
}
ValueNoteAssignment {
objectName: "FX%1 Selecting".arg(1)
note: 56
channel: 9
enabled: !Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)).translator.state
output: ActionOutput {
behaviour: force.action
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)
}
}
}
// RED PAD 4
ValueNoteAssignment {
objectName: "FX%1 Selecting".arg(1)
note: 57
channel: 9
enabled: !Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)).translator.state
output: ActionOutput {
behaviour: force.action
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)
}
}
}
ValueNoteAssignment {
objectName: "FX%1 Selection".arg(1)
note: 57
channel: 9
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(1)).translator.state
output: QtObject {
readonly property QObjProperty pSelectionIndex: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/PreselectIndex".arg(1))
function setValue(channel, value, assignmentEnabled) {
if(value > 0) { // turn counter clockwise, value normalized
pSelectionIndex.translator.unnormalized = 8
console.log("idx:",pSelectionIndex.translator.unnormalized )
device.sendFxColorbutton(3)
}
}
}
}
//////////// END FX ASSIGNMENTS TO RED PADS
//////////// FX ASSIGNMENTS TO GREEN PADS NOTE 58 to 61
//////////// Fx index goes from (0) to (12) in order below
//////////// Echo (0), Delayn Hall, PingPong, AutoGate, Flanger, LFO Filter, Phaser, Crush, Roll, RevRoll, Scratch, Reverb (12)
// GREEN PAD 1
ValueNoteAssignment {
objectName: "FX%1 Selection".arg(2)
note: 58
channel: 9
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)).translator.state
output: QtObject {
readonly property QObjProperty pSelectionIndex: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/PreselectIndex".arg(2))
function setValue(channel, value, assignmentEnabled) {
if(value > 0) { // turn counter clockwise, value normalized
pSelectionIndex.translator.unnormalized = 3
//console.log("idx:",pSelectionIndex.translator.unnormalized )
// Send to device - look at device file
device.sendFxColorbuttonD2(4)
}
}
}
}
ValueNoteAssignment {
objectName: "FX%1 Selecting".arg(2)
note: 58
channel: 9
enabled: !Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)).translator.state
output: ActionOutput {
behaviour: force.action
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)
}
}
}
// GREEN PAD 2
ValueNoteAssignment {
objectName: "FX%1 Selection".arg(2)
note: 59
channel: 9
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)).translator.state
output: QtObject {
readonly property QObjProperty pSelectionIndex: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/PreselectIndex".arg(2))
readonly property QObjProperty pFx1Active: Planck.getProperty("/Engine/Mixer/Channel1/DJFx/Active")
function setValue(channel, value, assignmentEnabled) {
if(value > 0) { // turn counter clockwise, value normalized
pSelectionIndex.translator.unnormalized = 4
//console.log("idx:",pSelectionIndex.translator.unnormalized )
//console.log("pFx1Active:",pFx1Active.translator.state)
device.sendFxColorbuttonD2(5)
}
}
}
}
ValueNoteAssignment {
objectName: "FX%1 Selecting".arg(2)
note: 59
channel: 9
enabled: !Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)).translator.state
output: ActionOutput {
behaviour: force.action
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)
}
}
}
// GREEN PAD 3
ValueNoteAssignment {
objectName: "FX%1 Selection".arg(2)
note: 60
channel: 9
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)).translator.state
output: QtObject {
readonly property QObjProperty pSelectionIndex: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/PreselectIndex".arg(2))
function setValue(channel, value, assignmentEnabled) {
if(value > 0) { // turn counter clockwise, value normalized
pSelectionIndex.translator.unnormalized = 6
console.log("idx:",pSelectionIndex.translator.unnormalized )
device.sendFxColorbuttonD2(6)
}
}
}
}
ValueNoteAssignment {
objectName: "FX%1 Selecting".arg(1)
note: 60
channel: 9
enabled: !Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)).translator.state
output: ActionOutput {
behaviour: force.action
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)
}
}
}
// GREEN PAD 4
ValueNoteAssignment {
objectName: "FX%1 Selection".arg(2)
note: 61
channel: 9
enabled: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)).translator.state
output: QtObject {
readonly property QObjProperty pSelectionIndex: Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/PreselectIndex".arg(2))
function setValue(channel, value, assignmentEnabled) {
if(value > 0) { // turn counter clockwise, value normalized
pSelectionIndex.translator.unnormalized = 8
console.log("idx:",pSelectionIndex.translator.unnormalized )
device.sendFxColorbuttonD2(7)
}
}
}
}
ValueNoteAssignment {
objectName: "FX%1 Selecting".arg(2)
note: 61
channel: 9
enabled: !Planck.getProperty("/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)).translator.state
output: ActionOutput {
behaviour: force.action
target: PropertyTarget {
path: "/Engine/Mixer/Channel%1/DJFx/Selecting".arg(2)
}
}
}
//////////// END FX ASSIGNMENTS TO RED PADS
} //Closing Item
} // Closing Repeater
} // Closing assignment
Files for this project are available there :
[[http://dnttalo.cluster029.hosting.ovh.net/Akai/|Akai Prime2 Files]]