Skip to content

Instantly share code, notes, and snippets.

@samba2
Created January 8, 2023 16:45
Show Gist options
  • Save samba2/5af83e947297ab99a4745a5be3e13d55 to your computer and use it in GitHub Desktop.
Save samba2/5af83e947297ab99a4745a5be3e13d55 to your computer and use it in GitHub Desktop.
Improved Mapping for Mixxx and Vestax Spin2
// 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);
}
}
<?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