Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hercules Inpulse 200 (update March 2020) #2542

Merged
merged 9 commits into from
Jun 12, 2020
182 changes: 182 additions & 0 deletions res/controllers/Hercules-DJControl-Inpulse-200-script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
// DJControl_Inpulse_200_script.js
//
// ***************************************************************************
// * Mixxx mapping script file for the Hercules DJControl Inpulse 200.
// * Author: DJ Phatso, contributions by Kerrick Staley
// * Version 1.2 (March 2020)
// * Forum: https://www.mixxx.org/forums/viewtopic.php?f=7&t=12592
// * Wiki: https://mixxx.org/wiki/doku.php/hercules_djcontrol_inpulse_200
//
// Changes to v1.2
// - Code cleanup.
//
// Changes to v1.1
// - Fix seek-to-start and cue-master behavior.
// - Tweak scratch, seek, and bend behavior.
// - Controller knob/slider values are queried on startup, so MIXXX is synced.
// - Fixed vinyl button behavior the first time it's pressed.
//
// v1.0 : Original forum release
//
// TO DO: Functions that could be implemented to the script:
//
// FX:
// - See how to preselect effects for a rack
//
//*************************************************************************

var DJCi200 = {};
///////////////////////////////////////////////////////////////
// USER OPTIONS //
///////////////////////////////////////////////////////////////

// How fast scratching is.
DJCi200.scratchScale = 1.0;

// How much faster seeking (shift+scratch) is than scratching.
DJCi200.scratchShiftMultiplier = 4;

// How fast bending is.
DJCi200.bendScale = 1.0;

// Other scratch related options
DJCi200.kScratchActionNone = 0;
DJCi200.kScratchActionScratch = 1;
DJCi200.kScratchActionSeek = 2;
DJCi200.kScratchActionBend = 3;

DJCi200.init = function() {
// Scratch button state
DJCi200.scratchButtonState = true;
// Scratch Action
DJCi200.scratchAction = {
1: DJCi200.kScratchActionNone,
2: DJCi200.kScratchActionNone
};

//Turn On Vinyl buttons LED(one for each deck).
midi.sendShortMsg(0x91, 0x03, 0x7F);
midi.sendShortMsg(0x92, 0x03, 0x7F);

//Turn On Browser button LED
midi.sendShortMsg(0x90, 0x04, 0x05);

//Softtakeover for Pitch fader
engine.softTakeover("[Channel1]", "rate", true);
engine.softTakeover("[Channel2]", "rate", true);
engine.softTakeoverIgnoreNextValue("[Channel1]", "rate");
engine.softTakeoverIgnoreNextValue("[Channel2]", "rate");

//Set effects Levels - Dry/Wet
engine.setParameter("[EffectRack1_EffectUnit1_Effect1]", "meta", 0.6);
engine.setParameter("[EffectRack1_EffectUnit1_Effect2]", "meta", 0.6);
engine.setParameter("[EffectRack1_EffectUnit1_Effect3]", "meta", 0.6);
engine.setParameter("[EffectRack1_EffectUnit2_Effect1]", "meta", 0.6);
engine.setParameter("[EffectRack1_EffectUnit2_Effect2]", "meta", 0.6);
engine.setParameter("[EffectRack1_EffectUnit2_Effect3]", "meta", 0.6);
engine.setParameter("[EffectRack1_EffectUnit1]", "mix", 1);
engine.setParameter("[EffectRack1_EffectUnit2]", "mix", 1);
DJPhatso marked this conversation as resolved.
Show resolved Hide resolved

// Ask the controller to send all current knob/slider values over MIDI, which will update
// the corresponding GUI controls in MIXXX.
midi.sendShortMsg(0xB0, 0x7F, 0x7F);
};

// The Vinyl button, used to enable or disable scratching on the jog wheels (One per deck).
DJCi200.vinylButton = function(_channel, _control, value, status, _group) {
if (value) {
if (DJCi200.scratchButtonState) {
DJCi200.scratchButtonState = false;
midi.sendShortMsg(status, 0x03, 0x00);
} else {
DJCi200.scratchButtonState = true;
midi.sendShortMsg(status, 0x03, 0x7F);
}
}
};

DJCi200._scratchEnable = function(deck) {
var alpha = 1.0/8;
var beta = alpha/32;
engine.scratchEnable(deck, 248, 33 + 1/3, alpha, beta);
};

DJCi200._convertWheelRotation = function(value) {
// When you rotate the jogwheel, the controller always sends either 0x1
// (clockwise) or 0x7F (counter clockwise). 0x1 should map to 1, 0x7F
// should map to -1 (IOW it's 7-bit signed).
DJPhatso marked this conversation as resolved.
Show resolved Hide resolved
return value < 0x40 ? 1 : -1;
};

// The touch action on the jog wheel's top surface
DJCi200.wheelTouch = function(channel, control, value, _status, _group) {
var deck = channel;
if (value > 0) {
// Touching the wheel.
if (engine.getValue("[Channel" + deck + "]", "play") !== 1 || DJCi200.scratchButtonState) {
DJCi200._scratchEnable(deck);
DJCi200.scratchAction[deck] = DJCi200.kScratchActionScratch;
} else {
DJCi200.scratchAction[deck] = DJCi200.kScratchActionBend;
}
} else {
// Released the wheel.
engine.scratchDisable(deck);
DJCi200.scratchAction[deck] = DJCi200.kScratchActionNone;
}
};

// The touch action on the jog wheel's top surface while holding shift
DJCi200.wheelTouchShift = function(channel, control, value, _status, _group) {
var deck = channel - 3;
// We always enable scratching regardless of button state.
if (value > 0) {
DJCi200._scratchEnable(deck);
DJCi200.scratchAction[deck] = DJCi200.kScratchActionSeek;
} else {
// Released the wheel.
engine.scratchDisable(deck);
DJCi200.scratchAction[deck] = DJCi200.kScratchActionNone;
}
};

// Scratching on the jog wheel (rotating it while pressing the top surface)
DJCi200.scratchWheel = function(channel, control, value, status, _group) {
var deck;
switch (status) {
case 0xB1:
case 0xB4:
deck = 1;
break;
case 0xB2:
case 0xB5:
deck = 2;
break;
default:
return;
}
var interval = DJCi200._convertWheelRotation(value);
var scratchAction = DJCi200.scratchAction[deck];
if (scratchAction === DJCi200.kScratchActionScratch) {
engine.scratchTick(deck, interval * DJCi200.scratchScale);
} else if (scratchAction === DJCi200.kScratchActionSeek) {
engine.scratchTick(deck,
interval * DJCi200.scratchScale *
DJCi200.scratchShiftMultiplier);
} else {
engine.setValue(
"[Channel" + deck + "]", "jog", interval * DJCi200.bendScale);
}
};

// Bending on the jog wheel (rotating using the edge)
DJCi200.bendWheel = function(channel, control, value, _status, _group) {
var interval = DJCi200._convertWheelRotation(value);
engine.setValue(
"[Channel" + channel + "]", "jog", interval * DJCi200.bendScale);
};

DJCi200.shutdown = function() {
midi.sendShortMsg(0xB0, 0x7F, 0x7E);
midi.sendShortMsg(0x90, 0x04, 0x00);
};
Loading