/usr/share/mixxx/midi/midi-mappings-scripts.js is in mixxx-data 1.10.1~dfsg0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 | // Functions common to all controllers go in this file
nop = function () {} // Only here so you don't get a syntax error on load if the file was otherwise empty
// ----------------- Prototype enhancements ---------------------
// Returns an ASCII byte array for the string
String.prototype.toInt = function() {
var a = new Array();
for (var i = 0; i < this.length; i++) {
a[i] = this.charCodeAt(i);
}
return a;
}
// ----------------- Function overloads ---------------------
// Causes script print() calls to appear in the log file as well
print = function(string) {
engine.log(string);
}
// ----------------- Generic functions ---------------------
function secondstominutes(secs)
{
var m = (secs / 60) | 0;
return (m < 10 ? "0" + m : m)
+ ":"
+ ( ( secs %= 60 ) < 10 ? "0" + secs : secs);
}
function msecondstominutes(msecs)
{
var m = (msecs / 60000) | 0;
msecs %= 60000;
var secs = (msecs / 1000) | 0;
msecs %= 1000;
msecs = Math.round(msecs * 100 / 1000);
if (msecs==100) msecs=99;
// print("secs="+secs+", msecs="+msecs);
return (m < 10 ? "0" + m : m)
+ ":"
+ ( secs < 10 ? "0" + secs : secs )
+ "."
+ ( msecs < 10 ? "0" + msecs : msecs);
}
function script() {}
script.debug = function (channel, control, value, status, group) {
print("Script.Debug - channel: 0x" + channel.toString(16) +
" control: 0x" + control.toString(16) + " value: 0x" + value.toString(16) +
" status: 0x" + status.toString(16) + " group: " + group);
}
// Used to control a generic Mixxx control setting (low..high) from an absolute control (0..127)
script.absoluteSlider = function (group, key, value, low, high) {
if (value==127) engine.setValue(group, key, high);
else engine.setValue(group, key, (((high - low) / 127) * value) + low);
}
// Returns a value for a non-linear Mixxx control (like EQs: 0..1..4) from an absolute control (0..127)
script.absoluteNonLin = function (value, low, mid, high) {
if (value<=64) return value/(64/(mid-low));
else return 1+(value-63)/(64/(high-mid));
}
/* -------- ------------------------------------------------------
script.Pitch
Purpose: Takes the value from a little-endian 14-bit MIDI pitch
wheel message and returns the value for a "rate" (pitch
slider) Mixxx control
Input: Least significant byte, most sig. byte, MIDI status byte
Output: Value for a "rate" control, or false if the input MIDI
message was not a Pitch message (0xE#)
-------- ------------------------------------------------------ */
script.pitch = function (LSB, MSB, status) {
if ((status & 0xF0) != 0xE0) { // Mask the upper nybble so we can check the opcode regardless of the channel
print("Script.Pitch: Error, not a MIDI pitch message: "+status);
return false;
}
var value = (MSB << 7) | LSB; // Construct the 14-bit number
// Range is 0x0000..0x3FFF center @ 0x2000, i.e. 0..16383 center @ 8192
var rate = (value-8192)/8191;
// print("Script.Pitch: MSB="+MSB+", LSB="+LSB+", value="+value+", rate="+rate);
return rate;
}
// bpm - Used for tapping the desired BPM for a deck
function bpm() {}
bpm.tapTime = 0.0;
bpm.tap = []; // Tap sample values
/* -------- ------------------------------------------------------
bpm.tapButton
Purpose: Sets the bpm of the track on a deck by tapping the beats.
This only works if the track's original BPM value is correct.
Call this each time the tap button is pressed.
Input: Mixxx deck to adjust
Output: -
-------- ------------------------------------------------------ */
bpm.tapButton = function(deck) {
var now = new Date()/1000; // Current time in seconds
var tapDelta = now - bpm.tapTime;
bpm.tapTime=now;
if (tapDelta>2.0) { // reset if longer than two seconds between taps
bpm.tap=[];
return;
}
bpm.tap.push(60/tapDelta);
if (bpm.tap.length>8) bpm.tap.shift(); // Keep the last 8 samples for averaging
var sum = 0;
for (i=0; i<bpm.tap.length; i++) {
sum += bpm.tap[i];
}
var average = sum/bpm.tap.length;
var fRateScale = average/engine.getValue("[Channel"+deck+"]","bpm");
// Adjust the rate:
fRateScale = (fRateScale-1.)/engine.getValue("[Channel"+deck+"]","rateRange");
engine.setValue("[Channel"+deck+"]","rate",fRateScale * engine.getValue("[Channel"+deck+"]","rate_dir"));
// print("Script: BPM="+average);
}
// ----------------- Object definitions --------------------------
ButtonState = {"released":0x00, "pressed":0x7F};
LedState = {"off": 0x00, "on": 0x7F};
//Controller
function Controller () {
this.group = "[Master]";
this.Controls = [];
this.Buttons = [];
};
Controller.prototype.addButton = function(buttonName, button, eventHandler) {
if(eventHandler) {
var executionEnvironment = this;
function handler(value) {
button.state = value;
executionEnvironment[eventHandler](value);
}
button.handler = handler;
}
this.Buttons[buttonName] = button;
}
Controller.prototype.setControlValue = function(control, value) {
this.Controls[control].setValue(this.group, value);
}
//Button
function Button(controlId) {
this.controlId = controlId;
this.state = ButtonState.released;
}
Button.prototype.handleEvent = function(value) {
this.handler(value);
};
//Control
function Control(mappedFunction, softMode) {
this.minInput = 0;
this.midInput = 0x3F;
this.maxInput = 0x7F;
this.minOutput = -1.0;
this.midOutput = 0.0;
this.maxOutput = 1.0;
this.mappedFunction = mappedFunction;
this.softMode = softMode;
this.maxJump = 10;
}
Control.prototype.setValue = function(group, inputValue){
var outputValue = 0;
if(inputValue <= this.midInput){
outputValue = this.minOutput + ((inputValue - this.minInput) / (this.midInput - this.minInput)) * (this.midOutput - this.minOutput);
} else {
outputValue = this.midOutput + ((inputValue - this.midInput) / (this.maxInput - this.midInput)) * (this.maxOutput - this.midOutput);
}
if(this.softMode){
var currentValue = engine.getValue(group, this.mappedFunction);
var currentRelative = 0.0;
if(currentValue <= this.midOutput){
currentRelative = this.minInput + ((currentValue - this.minOutput) / (this.midOutput - this.minOutput)) * (this.midInput - this.minInput);
} else {
currentRelative = this.midInput + ((currentValue - this.midOutput) / (this.maxOutput - this.midOutput)) * (this.maxInput - this.midInput);
}
if(inputValue > currentRelative - this.maxJump && inputValue < currentRelative + this.maxJump) {
engine.setValue(group, this.mappedFunction, outputValue);
}
} else {
engine.setValue(group, this.mappedFunction, outputValue);
}
}
//Deck
Deck = function (deckNumber, group) {
this.deckNumber = deckNumber;
this.group = group;
this.Buttons = [];
}
Deck.prototype.setControlValue = Controller.prototype.setControlValue;
Deck.prototype.addButton = Controller.prototype.addButton;
// ----------------- END Object definitions ----------------------
|