Files
BuboQuark/Classes/Controllers/MIDIMix.sc

136 lines
2.8 KiB
Python

ControllerValue {
/*
* A ControllerValue represents a MIDI Controller value.
* It has a minimum and maximum value, and a curve. This
* is used to convert from the MIDI value to a value that
* is considered usable by the user.
*
* The curve is similar to the one used by the Env object.
*/
var <>min = 0;
var <>max = 1;
var <>curve = 0;
var <>currentValue;
var <>bipolar = false;
*new {
arg min, max, curve;
^super.new.init()
}
init {
this.min = min;
this.max = max;
this.curve = curve;
this.currentValue = Bus.control;
this.bipolar = false;
}
set {
arg value;
// If bipolar is true, then the value must go from -1 to 1
var conversion = value.lincurve(
inMin: 0,
inMax: 127,
outMin: this.min.neg,
outMax: this.max,
curve: this.curve
);
this.currentValue.set(conversion);
^this.currentValue;
}
}
MIDIControl {
/*
* This is my personal MIDI controller interface. I am using a
* MIDIMix. It has 8 faders, 24 knobs, and 16 buttons. I am only
* using the knobs and faders. Two buttons are used to change "bank"
* (increments the CC number value).
*/
var <>currentBank = 0;
var <>values;
*new {
^super.new.init()
}
init {
this.values = IdentityDictionary.new();
this.connect(); this.installCallbacks();
}
getInit {
arg number;
if (this.values[number] == nil) {
this.values[number] = ControllerValue.new(
min: 0, max: 127, curve: 0
);
^this.values[number]
} {
^this.values[number]
}
}
setCurve {
arg number, curve;
this.getInit(number).curve = curve;
}
setBounds {
arg number, min, max;
var controller = this.getInit(number);
controller.min = min;
controller.max = max;
}
at {
arg number;
var control = this.getInit(number);
var choices = (
value: this.getInit(number).currentValue.getSynchronous,
bus: this.getInit(number).currentValue,
map: this.getInit(number).currentValue.asMap,
kr: In.kr(this.getInit(number).currentValue),
);
^choices
}
connect {
MIDIClient.init;
MIDIIn.connectAll(verbose: true);
}
installCallbacks {
MIDIIn.addFuncTo(\control, {
arg src, chan, num, val;
("CONTROL:" + (num + (this.currentBank * 24)) + "=>" + val).postln;
this.getInit(num + (this.currentBank * 24)).set(val);
});
MIDIIn.addFuncTo(\noteOn, {
arg src, chan, num, val;
"Changing bank".postln;
if (chan == 8 && num == 22) {
if (this.currentBank > 0) {
this.currentBank = this.currentBank - 1;
};
this.currentBank.postln;
};
if (chan == 8 && num == 24) {
if (this.currentBank < 3) {
this.currentBank = this.currentBank + 1;
};
this.currentBank.postln;
};
});
}
}