var XoneK2 = {};
XoneK2.seekRateFast = 3.0;
XoneK2.seekRateSlow = 0.5;
XoneK2.decksInMiddleMidiChannel = 0xE;
XoneK2.effectsInMiddleMidiChannel = 0xD;
XoneK2.decksOnLeftMidiChannel = 0xC;
XoneK2.decksOnRightMidiChannel = 0xB;
XoneK2.fourDecksMidiChannel3124 = 0xA;
XoneK2.fourDecksMidiChannel1234 = 0x9;
XoneK2.fourEffectsMidiChannel3124 = 0x8;
XoneK2.fourEffectsMidiChannel1234 = 0x7;
// The MIDI note offsets for different colors with the layer button is different
// from the rest of the buttons.
XoneK2.layerButtonColors = {
red: 0x0C,
amber: 0x10,
green: 0x14,
}
XoneK2.deckBottomButtonLayers = [
{ name: 'intro_outro', layerButtonNoteNumber: XoneK2.layerButtonColors.amber },
{ name: 'hotcue', layerButtonNoteNumber: XoneK2.layerButtonColors.red },
{ name: 'loop', layerButtonNoteNumber: XoneK2.layerButtonColors.green }, ];
// Multiple K2s/K1s can be connected via X-Link and plugged in with one USB
// cable. The MIDI messages of the controllers can be distinguished by setting
// each one to its own MIDI channel. The XoneK2.controllers array maintains state
// for each controller. This also allows the same mapping to be loaded for
// different use cases as long as the user sets the appropriate MIDI channel for
// the mapping they want.
XoneK2.controllers = [];
for (var ch = 0; ch <= 0xF; ++ch) {
XoneK2.controllers[ch] = [];
XoneK2.controllers[ch].columns = [];
XoneK2.controllers[ch].isShifted = false;
XoneK2.controllers[ch].leftEncoderIsPressed = false;
XoneK2.controllers[ch].rightEncoderIsPressed = false;
XoneK2.controllers[ch].deckPicked = false;
// This gets incremented to 0 by the init function calling XoneK2.decksLayerButton
XoneK2.controllers[ch].deckLayerIndex = -1;
XoneK2.controllers[ch].focusedEffectUnit = 1;
XoneK2.controllers[ch].singleEffectUnitModeActive = false;
}
XoneK2.init = function (id) {
var channel = XoneK2.decksInMiddleMidiChannel;
XoneK2.controllers[channel].columns[1] = new XoneK2.EffectUnit(1, 1, channel, true);
XoneK2.controllers[channel].columns[2] = new XoneK2.Deck(2, 1, channel);
XoneK2.controllers[channel].columns[3] = new XoneK2.Deck(3, 2, channel);
XoneK2.controllers[channel].columns[4] = new XoneK2.EffectUnit(4, 2, channel, true);
XoneK2.decksLayerButton(channel, null, null, 0x90 + channel, null);
channel = XoneK2.effectsInMiddleMidiChannel;
XoneK2.controllers[channel].columns[1] = new XoneK2.Deck(1, 1, channel);
XoneK2.controllers[channel].columns[2] = new XoneK2.EffectUnit(2, 1, channel, true);
XoneK2.controllers[channel].columns[3] = new XoneK2.EffectUnit(3, 2, channel, true);
XoneK2.controllers[channel].columns[4] = new XoneK2.Deck(4, 2, channel);
XoneK2.decksLayerButton(channel, null, null, 0x90 + channel, null);
channel = XoneK2.decksOnLeftMidiChannel;
XoneK2.controllers[channel].columns[1] = new XoneK2.Deck(1, 1, channel);
XoneK2.controllers[channel].columns[2] = new XoneK2.Deck(2, 2, channel);
XoneK2.controllers[channel].columns[3] = new XoneK2.EffectUnit(3, 1, channel, true);
XoneK2.controllers[channel].columns[4] = new XoneK2.EffectUnit(4, 2, channel, true);
XoneK2.decksLayerButton(channel, null, null, 0x90 + channel, null);
channel = XoneK2.decksOnRightMidiChannel;
XoneK2.controllers[channel].columns[1] = new XoneK2.EffectUnit(1, 1, channel, true);
XoneK2.controllers[channel].columns[2] = new XoneK2.EffectUnit(2,