Created
January 8, 2023 16:45
-
-
Save samba2/5af83e947297ab99a4745a5be3e13d55 to your computer and use it in GitHub Desktop.
Improved Mapping for Mixxx and Vestax Spin2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Script file for CasioXWJ1 mapping. Also works for Vestax Spin 2. | |
// For Mixxx V2 | |
// Rodgers Akombe, 2019 | |
// Based on prior work by: | |
// Tom Surace, 2013-2017 | |
// Bill Good, Oct 31, 2010 | |
// Anders Gunnarsson ??? | |
// Others..? | |
// Work that is pending: | |
// 1. Functions requiring Shift Key have not been mapped/scripted | |
// 2. LED lights have not been scripted | |
var CasioXWJ1 = {} | |
CasioXWJ1.init = function(id) { // called when the MIDI device is opened & set up | |
CasioXWJ1.id = id; // Store the ID of this device for later use | |
// | |
// **** Configuration | |
// | |
// Scratch alpha/beta. | |
// It's a small wheel, but with quite a bit of momentum and good resolution, | |
// so I like it to be pretty sensitive. | |
// | |
// 0 < alpha < 1 | |
// 0 < beta <= 2 (stable only if beta < 1) | |
var SCRATCH_ALPHA = 0.3; // default = 1/8 = 0.125 | |
var SCRATCH_BETA = 0.005; // default == alpha / 32 == 0.004 | |
var SCRATCH_RAMP = false; // ramp on release? | |
// I honestly can not decide whether I like soft takeover on the | |
// mid and/or filter controls. | |
var MID_SOFT_TAKEOVER = false; | |
var FILTER_SOFT_TAKEOVER = false; | |
// | |
// **** Internal constants | |
// | |
// Lights to kill on both channels 0 and 1 | |
var DECK_LIGHTS = [ | |
0X2E, 0x32, 0x35, 0x33, 0x24, 0x25, 0x46, 0x42, 0x21, 0x20, // lights | |
0x29, 0x2a, 0x2b, 0x2c, 0x2d // VU meters | |
]; | |
// Lights to kill on channel 2 only | |
var MISC_LIGHTS = [ | |
0x26, // automix | |
0x29, | |
0x28, | |
0x2a // wheels | |
]; | |
var BUTTON_RELEASED = 0x00; | |
var BUTTON_PRESSED = 0x7F; | |
var LIGHT_ON = 0x7f; | |
var LIGHT_OFF = 0x00; | |
/** | |
* @constructor | |
* CasioXWJ1 has really simple on/off lights that all work the same. | |
* That's actually a nice change of pace. | |
* | |
* @param channel {number} 0-indexed channel, 0-2 | |
* @param control {number} Midi controller to turn light on/off. | |
* @param | |
*/ | |
function LightController(channel, control) { | |
this.channel = channel; | |
this.control = control; | |
this.state = LIGHT_OFF; | |
} | |
LightController.turnOn = function(channel, control) { | |
midi.sendShortMsg(0x90 + channel, control, LIGHT_ON); | |
} | |
LightController.turnOff = function(channel, control) { | |
midi.sendShortMsg(0x90 + channel, control, LIGHT_OFF); | |
} | |
LightController.prototype.on = function() { | |
LightController.turnOn(this.channel, this.control); | |
this.state = LIGHT_ON; | |
} | |
LightController.prototype.off = function() { | |
LightController.turnOff(this.channel, this.control); | |
this.state = LIGHT_OFF; | |
} | |
/** | |
* @constructor | |
* Only things that are common to both decks | |
* | |
* @param {number} channel 0 or 1, for left or right deck | |
*/ | |
function Deck(channel) { | |
// Channel | |
this.channel = channel; | |
// Deck num and group name variables, cached for performance | |
this.deckNum = this.channel + 1; | |
this.groupName = '[Channel' + this.deckNum + ']'; | |
this.effectRackName = '[QuickEffectRack1_' + this.groupName + ']'; | |
this.effectRackEffect1Name = '[QuickEffectRack1_' + this.groupName + '_Effect1]'; | |
/** @type {boolean} */ | |
this.isFx = false; | |
/** @type {boolean} */ | |
this.isScratchMode = false; | |
this.lights = {} | |
this.lights.fx = new LightController(channel, 0x22); | |
this.lights.Scratch = new LightController(channel, 0x2D); | |
} | |
/** | |
* Handle the FX toggle button. | |
*/ | |
Deck.prototype.handleFx = function(value) { | |
if (value !== BUTTON_PRESSED) { | |
return; | |
} | |
this.isFx = ! this.isFx; | |
if (this.isFx) { | |
if (MID_SOFT_TAKEOVER) { | |
engine.softTakeoverIgnoreNextValue(this.groupName, "filterMid"); | |
} | |
this.lights.fx.on(); | |
} | |
else { | |
// Immediately reset the super control | |
engine.setValue(this.effectRackName, "super1", 0.5); | |
// make sure soft takeover will work when we grab it back from 0 | |
if (FILTER_SOFT_TAKEOVER) { | |
engine.softTakeoverIgnoreNextValue(this.effectRackName, "super1"); | |
} | |
this.lights.fx.off(); // switch to mid control | |
} | |
} | |
/** | |
* Handle mid control. | |
* | |
* @param {number} value incoming MIDI control value | |
*/ | |
Deck.prototype.handleMid = function(value) { | |
// In FX mode, Mid is the filter control (or whatever | |
// the user has mapped to the special "first effect rack") | |
// In non-FX mode, it's just a mid control. | |
if (this.isFx) { | |
var lin = script.absoluteLin(value, 0.0, 1.0); | |
engine.setValue(this.effectRackName, "super1", lin); | |
} | |
else { | |
var nonlin = script.absoluteNonLin(value, 0.0, 1.0, 4.0); | |
engine.setValue(this.groupName, "filterMid", nonlin); | |
} | |
} | |
/** | |
* Button handler for the "toggle Scratch mode" button | |
* | |
* Toggle Scratch mode. That's the "phono needle really doesn't look like this" button. | |
*/ | |
Deck.prototype.toggleScratchMode = function(value) { | |
if (value !== BUTTON_PRESSED) { | |
return; | |
} | |
this.isScratchMode = ! this.isScratchMode; | |
if (this.isScratchMode) { | |
this.lights.Scratch.on(); | |
} else { | |
this.lights.Scratch.off(); | |
engine.scratchDisable(this.deckNum); | |
} | |
} | |
/** | |
* You touched the wheel! Wheee! | |
* | |
* @param value the control value | |
*/ | |
Deck.prototype.handleWheelTouch = function(value) { | |
if (! this.isScratchMode) { | |
return; | |
} | |
if (value === BUTTON_PRESSED) // wheel touched? | |
{ | |
// Ticks per revolution is 375. (or so I'm told.) | |
engine.scratchEnable( this.deckNum, | |
375, // ticks per rev (approximate) | |
33.33333, // rpm | |
SCRATCH_ALPHA, | |
SCRATCH_BETA ); | |
} | |
else { // Wheel untouched | |
engine.scratchDisable(this.deckNum, SCRATCH_RAMP); | |
} | |
} | |
/** | |
* You TURNED the wheel?! ARE YOU MAD?!! | |
* @param {number} value MIDI jog event value, the number of ticks, signed char | |
*/ | |
Deck.prototype.handleJog = function(value) { | |
// Direction = value = + or - 128 ticks | |
if (engine.isScratching(this.deckNum)) { // scratch | |
engine.scratchTick(this.deckNum, value - 0x40); | |
} | |
else { // jog / pitchbend | |
var offset = (value - 0x40) * 0.68; | |
engine.setValue(this.groupName, "jog", offset); | |
} | |
} | |
// | |
// **** Construct the main global CasioXWJ1 entry point objects | |
// | |
CasioXWJ1.deck1 = new Deck(0); // Deck 1 or A | |
CasioXWJ1.deck2 = new Deck(1); // Deck 2 or B | |
CasioXWJ1.libraryFocusStates = { | |
Explorer: 'Explorer', | |
TrackList: 'TrackList' | |
}; | |
/** @type {boolean} */ | |
CasioXWJ1.globalShift = false; | |
CasioXWJ1.libraryFocus = CasioXWJ1.libraryFocusStates.TrackList; | |
CasioXWJ1.init = function(/* id */) { | |
CasioXWJ1.turnOffAllLights(); | |
if (MID_SOFT_TAKEOVER) { | |
engine.softTakeover("[Channel1]", "filterMid", true); | |
engine.softTakeover("[Channel2]", "filterMid", true); | |
} | |
if (FILTER_SOFT_TAKEOVER) { | |
engine.softTakeover("[QuickEffectRack1_[Channel1]]", "super1", true); | |
engine.softTakeover("[QuickEffectRack1_[Channel2]]", "super1", true); | |
} | |
} | |
CasioXWJ1.shutdown = function(/* id */) { | |
CasioXWJ1.turnOffAllLights(); | |
} | |
CasioXWJ1.turnOffAllLights = function() { | |
for (var i = 0; i < DECK_LIGHTS.length; i++) { | |
LightController.turnOff(0, DECK_LIGHTS[i]); | |
LightController.turnOff(1, DECK_LIGHTS[i]); | |
} | |
for (i = 0; i < MISC_LIGHTS.length; i++) { | |
LightController.turnOff(2, MISC_LIGHTS[i]); | |
} | |
} | |
// | |
// **** Midi event handlers | |
// | |
/* | |
* mixxx MIDI command event handler parameter quick reference | |
* | |
* @param channel MIDI channel (0x00 = Channel 1..0x0F = Channel 16,) | |
* @param control Control/note number (byte 2) | |
* @param value Value of the control (byte 3) | |
* @param status MIDI status byte (byte 1) | |
* @param group MixxxControl group (from the <group> value in the XML file) | |
*/ | |
/** | |
* Handle LOOP: IN/OUT button as a smart LOOP-OUT button | |
*/ | |
CasioXWJ1.handleLoopInOut = function(channel, control, value, status, group) { | |
if (value !== BUTTON_PRESSED) { | |
return; | |
} | |
// If loop is currently looping, treat loop-out as loop-disable | |
var is_enabled = engine.getValue(group, "loop_enabled"); | |
if (is_enabled > 0.1) { // binary = 0 or 1? | |
// "reloop_exit" is deprecated and replaced by "reloop_toggle" in mixxx 2.0.0. | |
// But, "reloop_toggle" is not actually in mixxx 2.0.0? Or maybe the group name is special now. | |
// Anyway, I can't find it. | |
// Use deprecated version for now. | |
engine.setValue(group, "reloop_exit", 1); | |
} | |
else { | |
engine.setValue(group, "loop_out", 1); | |
} | |
} | |
CasioXWJ1.handleShift = function(channel, control, value) { | |
// Could do something fancy but TINY CONTROLLER | |
if (value) { // Shifted | |
CasioXWJ1.globalShift = true; | |
} | |
else { | |
// Release any shift-only functions | |
CasioXWJ1.globalShift = false; | |
} | |
} | |
CasioXWJ1.handleUp = function(channel, control, value) { | |
if (value == 127) { | |
if (CasioXWJ1.globalShift) { | |
engine.setValue("[Library]", "ScrollUp", true); | |
} else { | |
engine.setValue("[Library]", "MoveUp", true); | |
} | |
} | |
} | |
CasioXWJ1.handleDown = function(channel, control, value) { | |
if (value === 127) { | |
if (CasioXWJ1.globalShift) { | |
engine.setValue("[Library]", "ScrollDown", true); | |
} else { | |
engine.setValue("[Library]", "MoveDown", true); | |
} | |
} | |
} | |
CasioXWJ1.handleLeft = function(channel, control, value) { | |
if (CasioXWJ1.globalShift) { | |
engine.setValue("[Channel1]", "LoadSelectedTrack", true); | |
} else { | |
engine.setValue("[Library]", "MoveLeft", true); | |
} | |
} | |
CasioXWJ1.handleRight = function(channel, control, value) { | |
if (CasioXWJ1.globalShift) { | |
engine.setValue("[Channel2]", "LoadSelectedTrack", true); | |
} else { | |
engine.setValue("[Library]", "MoveRight", true); | |
} | |
} | |
CasioXWJ1.toggleFocus = function(channel, control, value) { | |
if (value === BUTTON_PRESSED) { | |
if (CasioXWJ1.libraryFocus === CasioXWJ1.libraryFocusStates.TrackList) { | |
engine.setValue("[Library]", "MoveFocusBackward", true); | |
CasioXWJ1.libraryFocus = CasioXWJ1.libraryFocusStates.Explorer; | |
} else { | |
engine.setValue("[Library]", "MoveFocusForward", true); | |
CasioXWJ1.libraryFocus = CasioXWJ1.libraryFocusStates.TrackList; | |
} | |
} | |
} | |
// Yes, these handlers could probably be magically generated | |
// using javascript magic. | |
CasioXWJ1.handleFxDeck1 = function(channel, control, value) { | |
CasioXWJ1.deck1.handleFx(value); | |
} | |
CasioXWJ1.handleFxDeck2 = function(channel, control, value) { | |
CasioXWJ1.deck2.handleFx(value); | |
} | |
CasioXWJ1.handleMidDeck1 = function(channel, control, value) { | |
CasioXWJ1.deck1.handleMid(value); | |
} | |
CasioXWJ1.handleMidDeck2 = function(channel, control, value) { | |
CasioXWJ1.deck2.handleMid(value); | |
} | |
CasioXWJ1.toggleScratchModeDeck1 = function(channel, control, value) { | |
CasioXWJ1.deck1.toggleScratchMode(value); | |
} | |
CasioXWJ1.toggleScratchModeDeck2 = function(channel, control, value) { | |
CasioXWJ1.deck2.toggleScratchMode(value); | |
} | |
CasioXWJ1.handleWheelTouchDeck1 = function(channel, control, value) { | |
CasioXWJ1.deck1.handleWheelTouch(value); | |
} | |
CasioXWJ1.handleWheelTouchDeck2 = function(channel, control, value) { | |
CasioXWJ1.deck2.handleWheelTouch(value); | |
} | |
CasioXWJ1.handleJogDeck1 = function(channel, control, value) { | |
CasioXWJ1.deck1.handleJog(value); | |
} | |
CasioXWJ1.handleJogDeck2 = function(channel, control, value) { | |
CasioXWJ1.deck2.handleJog(value); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version='1.0' encoding='utf-8'?> | |
<MixxxControllerPreset schemaVersion="1" mixxxVersion="1.8.0+"> | |
<info> | |
<name>Casio XW-J1</name> | |
<author>Rodgers Akombe</author> | |
<description>For CasioXWJ1. Will also work with Vestax Spin 2</description> | |
</info> | |
<controller id="Casio"> | |
<scriptfiles> | |
<file filename="Casio-XW-J1-scripts.js" functionprefix="CasioXWJ1"/> | |
</scriptfiles> | |
<controls> | |
<control> | |
<group>[Channel2]</group> | |
<key>sync_enabled</key> | |
<description>MIDI Learned from 4 messages.</description> | |
<status>0x91</status> | |
<midino>0x31</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>CasioXWJ1.handleHotcue1</key> | |
<description>Hot Cue 1 Deck 1 - Shifted</description> | |
<status>0x90</status> | |
<midino>0x2A</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>CasioXWJ1.handleHotcue1</key> | |
<description>Hot Cue 1 Deck 2 - Shifted</description> | |
<status>0x91</status> | |
<midino>0x2A</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>CasioXWJ1.handleWheelTouchDeck1</key> | |
<status>0x90</status> | |
<midino>0x3B</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>CasioXWJ1.handleWheelTouchDeck2</key> | |
<status>0x91</status> | |
<midino>0x3B</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>hotcue_3_activate</key> | |
<description>MIDI Learned from 6 messages.</description> | |
<status>0x90</status> | |
<midino>0x2C</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>hotcue_3_activate</key> | |
<description>MIDI Learned from 12 messages.</description> | |
<status>0x91</status> | |
<midino>0x2C</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>rate_perm_up</key> | |
<description>MIDI Learned from 6 messages.</description> | |
<status>0x90</status> | |
<midino>0x21</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>rate_perm_up</key> | |
<description>MIDI Learned from 10 messages.</description> | |
<status>0x91</status> | |
<midino>0x21</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>playposition</key> | |
<description>MIDI Learned from 38 messages.</description> | |
<status>0xB1</status> | |
<midino>0x17</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>hotcue_2_activate</key> | |
<description>MIDI Learned from 4 messages.</description> | |
<status>0x90</status> | |
<midino>0x2B</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>hotcue_2_activate</key> | |
<description>MIDI Learned from 10 messages.</description> | |
<status>0x91</status> | |
<midino>0x2B</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[EqualizerRack1_[Channel1]_Effect1]</group> | |
<key>parameter3</key> | |
<description>MIDI Learned from 306 messages.</description> | |
<status>0xB0</status> | |
<midino>0x12</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[EqualizerRack1_[Channel2]_Effect1]</group> | |
<key>parameter2</key> | |
<description>MIDI Learned from 42 messages.</description> | |
<status>0xB1</status> | |
<midino>0x12</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>CasioXWJ1.toggleScratchModeDeck1</key> | |
<status>0x90</status> | |
<midino>0x2D</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>CasioXWJ1.toggleScratchModeDeck2</key> | |
<status>0x91</status> | |
<midino>0x2D</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>beatlooproll_0.125_activate</key> | |
<description>MIDI Learned from 2 messages.</description> | |
<status>0x90</status> | |
<midino>0x26</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[EqualizerRack1_[Channel1]_Effect1]</group> | |
<key>parameter1</key> | |
<description>MIDI Learned from 470 messages.</description> | |
<status>0xB0</status> | |
<midino>0x14</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>beatlooproll_0.125_activate</key> | |
<description>MIDI Learned from 8 messages.</description> | |
<status>0x91</status> | |
<midino>0x26</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[EffectRack1_EffectUnit2]</group> | |
<key>super1</key> | |
<description>MIDI Learned from 118 messages.</description> | |
<status>0xB1</status> | |
<midino>0x14</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>beatlooproll_0.5_activate</key> | |
<description>MIDI Learned from 6 messages.</description> | |
<status>0x90</status> | |
<midino>0x28</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>beatlooproll_0.5_activate</key> | |
<description>MIDI Learned from 12 messages.</description> | |
<status>0x91</status> | |
<midino>0x28</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[EqualizerRack1_[Channel1]_Effect1]</group> | |
<key>parameter2</key> | |
<description>MIDI Learned from 432 messages.</description> | |
<status>0xB0</status> | |
<midino>0x13</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[EqualizerRack1_[Channel2]_Effect1]</group> | |
<key>parameter3</key> | |
<description>MIDI Learned from 322 messages.</description> | |
<status>0xB1</status> | |
<midino>0x13</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>pfl</key> | |
<description>MIDI Learned from 24 messages.</description> | |
<status>0x90</status> | |
<midino>0x32</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>pfl</key> | |
<description>MIDI Learned from 2 messages.</description> | |
<status>0x91</status> | |
<midino>0x32</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>beatlooproll_0.25_activate</key> | |
<description>MIDI Learned from 4 messages.</description> | |
<status>0x90</status> | |
<midino>0x27</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>beatlooproll_0.25_activate</key> | |
<description>MIDI Learned from 10 messages.</description> | |
<status>0x91</status> | |
<midino>0x27</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[EqualizerRack1_[Channel2]_Effect1]</group> | |
<key>parameter1</key> | |
<description>MIDI Learned from 1012 messages.</description> | |
<status>0xB1</status> | |
<midino>0x15</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Master]</group> | |
<key>crossfader</key> | |
<description>MIDI Learned from 672 messages.</description> | |
<status>0xB4</status> | |
<midino>0x10</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[EffectRack1_EffectUnit1]</group> | |
<key>group_[Channel1]_enable</key> | |
<description>MIDI Learned from 4 messages.</description> | |
<status>0x90</status> | |
<midino>0x22</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[EffectRack1_EffectUnit1]</group> | |
<key>super1</key> | |
<description>MIDI Learned from 70 messages.</description> | |
<status>0xB0</status> | |
<midino>0x10</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[EffectRack1_EffectUnit1]</group> | |
<key>group_[Channel2]_enable</key> | |
<description>MIDI Learned from 6 messages.</description> | |
<status>0x91</status> | |
<midino>0x22</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>CasioXWJ1.handleJogDeck1</key> | |
<status>0xB2</status> | |
<midino>0x10</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>reloop_toggle</key> | |
<description>MIDI Learned from 6 messages.</description> | |
<status>0x90</status> | |
<midino>0x24</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>reloop_toggle</key> | |
<description>MIDI Learned from 8 messages.</description> | |
<status>0x91</status> | |
<midino>0x24</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[QuickEffectRack1_[Channel1]]</group> | |
<key>super1</key> | |
<description>MIDI Learned from 35 messages.</description> | |
<status>0xB0</status> | |
<midino>0x1A</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Library]</group> | |
<key>CasioXWJ1.handleUp</key> | |
<status>0x92</status> | |
<midino>0x21</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Library]</group> | |
<key>CasioXWJ1.handleDown</key> | |
<status>0x92</status> | |
<midino>0x22</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Library]</group> | |
<key>CasioXWJ1.handleRight</key> | |
<description>Right navigation key</description> | |
<status>0x92</status> | |
<midino>0x24</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>play</key> | |
<description>MIDI Learned from 2 messages.</description> | |
<status>0x90</status> | |
<midino>0x2E</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>volume</key> | |
<description>MIDI Learned from 313 messages.</description> | |
<status>0xB0</status> | |
<midino>0x1C</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>play</key> | |
<description>MIDI Learned from 4 messages.</description> | |
<status>0x91</status> | |
<midino>0x2E</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>pregain</key> | |
<description>MIDI Learned from 66 messages.</description> | |
<status>0xB1</status> | |
<midino>0x1C</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>loop_halve</key> | |
<description>MIDI Learned from 2 messages.</description> | |
<status>0x90</status> | |
<midino>0x23</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>pregain</key> | |
<description>MIDI Learned from 138 messages.</description> | |
<status>0xB0</status> | |
<midino>0x11</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>loop_halve</key> | |
<description>MIDI Learned from 6 messages.</description> | |
<status>0x91</status> | |
<midino>0x23</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>rate</key> | |
<description>MIDI Learned from 266 messages.</description> | |
<status>0xB1</status> | |
<midino>0x11</midino> | |
<options> | |
<invert/> | |
</options> | |
</control> | |
<control> | |
<group>[Library]</group> | |
<key>CasioXWJ1.handleLeft</key> | |
<description>Left navigation key</description> | |
<status>0x92</status> | |
<midino>0x23</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>start_play</key> | |
<description>MIDI Learned from 4 messages.</description> | |
<status>0x90</status> | |
<midino>0x30</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>CasioXWJ1.handleJogDeck2</key> | |
<status>0xB2</status> | |
<midino>0x11</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>start_play</key> | |
<description>MIDI Learned from 4 messages.</description> | |
<status>0x91</status> | |
<midino>0x30</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>loop_double</key> | |
<description>MIDI Learned from 4 messages.</description> | |
<status>0x90</status> | |
<midino>0x25</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>loop_double</key> | |
<description>MIDI Learned from 8 messages.</description> | |
<status>0x91</status> | |
<midino>0x25</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>rate</key> | |
<description>MIDI Learned from 197 messages.</description> | |
<status>0xB0</status> | |
<midino>0x1B</midino> | |
<options> | |
<invert/> | |
</options> | |
</control> | |
<control> | |
<group>[QuickEffectRack1_[Channel2]]</group> | |
<key>super1</key> | |
<description>MIDI Learned from 90 messages.</description> | |
<status>0xB1</status> | |
<midino>0x1B</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>cue_default</key> | |
<description>MIDI Learned from 2 messages.</description> | |
<status>0x90</status> | |
<midino>0x2F</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>playposition</key> | |
<description>MIDI Learned from 18 messages.</description> | |
<status>0xB0</status> | |
<midino>0x1D</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>cue_default</key> | |
<description>MIDI Learned from 4 messages.</description> | |
<status>0x91</status> | |
<midino>0x2F</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>rate_perm_down</key> | |
<description>MIDI Learned from 8 messages.</description> | |
<status>0x90</status> | |
<midino>0x20</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>rate_perm_down</key> | |
<description>MIDI Learned from 12 messages.</description> | |
<status>0x91</status> | |
<midino>0x20</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Modifiers]</group> | |
<key>CasioXWJ1.handleShift</key> | |
<description>Shift Handle</description> | |
<status>0x92</status> | |
<midino>0x20</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Modifiers]</group> | |
<key>CasioXWJ1.toggleFocus</key> | |
<description>Toggle library focus. explorer vs. track list</description> | |
<status>0x92</status> | |
<midino>0x25</midino> | |
<options> | |
<script-binding/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel2]</group> | |
<key>volume</key> | |
<description>MIDI Learned from 488 messages.</description> | |
<status>0xB1</status> | |
<midino>0x16</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
<control> | |
<group>[Channel1]</group> | |
<key>sync_enabled</key> | |
<description>MIDI Learned from 2 messages.</description> | |
<status>0x90</status> | |
<midino>0x31</midino> | |
<options> | |
<normal/> | |
</options> | |
</control> | |
</controls> | |
<outputs> | |
<output> | |
<group>[Channel1]</group> | |
<key>VuMeter</key> | |
<status>0x00</status> | |
<midino>0x2D</midino> | |
<minimum>1</minimum> | |
</output> | |
<output> | |
<group>[Channel1]</group> | |
<key>VuMeter</key> | |
<status>0x00</status> | |
<midino>0x2C</midino> | |
<minimum>0.8</minimum> | |
</output> | |
<output> | |
<group>[Channel1]</group> | |
<key>VuMeter</key> | |
<status>0x00</status> | |
<midino>0x2B</midino> | |
<minimum>0.6</minimum> | |
</output> | |
<output> | |
<group>[Channel1]</group> | |
<key>VuMeter</key> | |
<status>0x00</status> | |
<midino>0x2A</midino> | |
<minimum>0.4</minimum> | |
</output> | |
<output> | |
<group>[Channel1]</group> | |
<key>VuMeter</key> | |
<status>0x00</status> | |
<midino>0x59</midino> | |
<minimum>0.2</minimum> | |
</output> | |
<output> | |
<group>[Channel1]</group> | |
<key>play</key> | |
<status>0x90</status> | |
<midino>0x00</midino> | |
<minimum>0.1</minimum> | |
</output> | |
<output> | |
<group>[Channel2]</group> | |
<key>play</key> | |
<status>0x91</status> | |
<midino>0x00</midino> | |
<minimum>0.1</minimum> | |
</output> | |
</outputs> | |
</controller> | |
</MixxxControllerPreset> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi, thanks for sharing this! Do you possibly have an update of the mapping that also supports the LEDs?