Skip to content

Instantly share code, notes, and snippets.

@pwhelan
Created March 21, 2012 00:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pwhelan/2143197 to your computer and use it in GitHub Desktop.
Save pwhelan/2143197 to your computer and use it in GitHub Desktop.
Smoothslider
// ----------------- BEGIN SmoothSlider functions -----------------
SmoothSlider = function() {}
SmoothSlider.Step = 0.7;
SmoothSlider.Steps = 127;
SmoothSlider.generateTable = function(mrange, step)
{
var sliderTable = new Array();
var range = Math.round(mrange * 100);
if (( range % 10 ) && (range != 8))
range += ( range - (range % 10 ));
print("GENERATING TABLE FOR: " + range + " => " + step);
SmoothSlider.Range = range;
// Clear Table with NaN's
for (var i = 0; i <= SmoothSlider.Steps; i++)
sliderTable[i] = NaN;
var stepings = (range / step).toFixed(0);
var pos = ((SmoothSlider.Steps-1)/2-1);
var left = pos % stepings;
var steps = (pos / stepings).toFixed(0);
if ( steps <= 0 ) {
//print('Not Enough MIDI Steps...');
return;
}
else {
//print("Steps = " + SmoothSlider.Steps + " stepings = " + steps + " steps=" + steps + " left=" + left);
}
for (var i = 0; i <= SmoothSlider.Steps; i++) {
var q = (i - pos - 1);
var perc;
if ( Math.abs(q) < (left/2)) {
perc = 0;
}
else {
if ( q > 0)
q = q - (left/2);
else
q = q + (left/2);
perc = (q * (step / steps))
}
if ( perc < -range )
perc = -range;
else if ( perc > range )
perc = range;
sliderTable[i] = perc;
}
return sliderTable;
}
SmoothSlider.init = function(id)
{
}
SmoothSlider.generate = function()
{
SmoothSlider.Decks = new Array();
var decks = engine.getValue("[Master]", "num_decks");
for (var deck = 0; deck < decks; deck++) {
var initDeck = function(deck) {
var channel = "[Channel"+(deck+1)+"]";
var rateRange = engine.getValue(channel, "rateRange");
var bpm = engine.getValue(channel, "bpm");
var step = SmoothSlider.Step
if ( bpm ) {
step = Math.round((100 / bpm)*20)/20;
}
SmoothSlider.Decks[deck] = {
table: SmoothSlider.generateTable(rateRange, step),
step: step,
range: rateRange
};
var refresh = function() {
SmoothSlider.Decks[deck].table =
SmoothSlider.generateTable(
SmoothSlider.Decks[deck].range,
SmoothSlider.Decks[deck].step
);
};
engine.connectControl(channel,"rateRange", function(rateRange) {
SmoothSlider.Decks[deck].range = rateRange;
refresh();
});
engine.connectControl(channel, "file_bpm", function(bpm) {
print("BPM CHANGE=" + bpm + " CHANNEL=" + channel + " DECK=" +deck);
if (bpm) {
SmoothSlider.Decks[deck].step = Math.round((100 / bpm)*20)/20;;
refresh();
}
});
};
initDeck(deck);
}
}
SmoothSlider.shutdown = function()
{
}
SmoothSlider.pitchShift = function(channel, control, value, status, group)
{
var m = group.match(/\[Channel(\d+)\]/);
if (!m) {
print("Group is not a channel: " + group);
}
var deck = parseInt(m[1])-1;
var pitch = SmoothSlider.Decks[deck].table[value];
var rate = 0;
//print("VALUE=" + value + " GROUP=" + group + " DECK=" + deck + " PITCH=" + pitch + " RANGE=" + SmoothSlider.Decks[deck].range);
if ( isNaN(pitch)) {
print("USING DEFAULT VALUE FOR SMOOTH SLIDER !#@");
rate = script.absoluteSlider(group, "rate", value, -2, 1);
}
else {
rate = pitch / (SmoothSlider.Decks[deck].range*100);
print("Value[" + value + "] = " + pitch + " / " + rate);
engine.setValue(group, "rate", rate);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment