Skip to content

Instantly share code, notes, and snippets.

@mattly
Created December 1, 2009 05:42
Show Gist options
  • Select an option

  • Save mattly/246098 to your computer and use it in GitHub Desktop.

Select an option

Save mattly/246098 to your computer and use it in GitHub Desktop.
// mattly.mantakeys
// transforms manta coordinates into notes based on row/col relations
post("mattly.mantakeys (c) Matt Lyon 2009\n");
autowatch = 1;
// Setup
inlets = 2;
setinletassist(0, "from manta");
setinletassist(1, "from external");
outlets = 3;
setoutletassist(0, "to manta");
setoutletassist(1, "to external (sensor)");
setoutletassist(2, "to external (midi)");
// keys
var mantakeys = function() {
var $manta = {
cols: 8,
rows: 6
};
$manta.sensors = $manta.cols * $manta.rows;
var $settings = {
horizontal: 4,
vertical: 7,
base: 36
};
function noteFor(sensor) {
var row = Math.floor((sensor-1) / $manta.cols);
var col = Math.floor((sensor-1) % $manta.cols);
var offset = Math.floor(row / 2) * $settings.horizontal;
var note = (row * $settings.vertical) + (col * $settings.horizontal) + $settings.base - offset;
return note;
}
function sensorsFor(note) {
var sensors = [];
for (var sensor = 1; sensor <= $manta.sensors; sensor++) {
if (note == noteFor(sensor)) { sensors.push(sensor); }
}
return sensors;
}
var $states = {
sensors: [],
pressedNotes: [],
displayedNotes: [],
enabled: true
};
function reset(panic) {
$states.enabled = false;
for(var i=0; i<128; i++) {
$states.pressedNotes[i] = false;
$states.displayedNotes[i] = 0;
if (panic) {
outlet(1, i, 0);
outlet(2, i, 0);
}
}
for(var i=1; i<=$manta.sensors; i++) {
$states.sensors[i] = 0;
}
if (panic) { outlet(0, "ledsoff"); }
$states.enabled = true;
}
reset();
function flush() {
$settings.enabled = false;
for (var note in $states.pressedNotes) {
if ($states.pressedNotes[note]) {
play(note, 0);
outlet(1, note, 0);
}
if ($states.displayedNotes[note] > 0) {
outlet(0, "setled", false, sensorsFor(note));
}
}
for (var sensor in $states.sensors) { $states.sensors[sensor] = 0; }
$settings.enabled = true;
}
function redraw() {
for (var note in $states.displayedNotes) {
if ($states.displayedNotes[note] > 0) {
outlet(0, "setled", true, sensorsFor(note));
}
}
}
function light(note, state) {
var oldValue = $states.displayedNotes[note];
$states.displayedNotes[note] = Math.max(0, oldValue + (state ? 1 : -1));
var changed = (oldValue == 0 && state) || (oldValue == 1 && !state);
if (changed) { outlet(0, "setled", state, sensorsFor(note)); }
}
function play(note, pressure) {
var on = pressure > 0;
if ($states.pressedNotes[note] != on) {
$states.pressedNotes[note] = on;
var velocity = Math.floor(Math.min(1, Math.sqrt(Math.sqrt(pressure))) * 127);
light(note, on);
outlet(2, note, velocity);
}
}
function press(data) {
var note = noteFor(data.sensor);
if ($states.enabled) {
$states.sensors[data.sensor] = data.pressure;
outlet(1, note, data.pressure / 210);
play(note, data.pressure / 210);
}
}
function display(data) {
if ($states.enabled) { light(data.note, data.velocity > 0); }
}
function settings(data) {
if (! data) { return $settings; }
else {
var settings = ['horizontal', 'vertical', 'base'];
var changed = settings.map(function(setting) {
if (typeof(data[setting]) == 'number') { return data[setting] != $settings[setting]; }
}).some(function(i) { return i; });
if (changed) {
flush();
settings.forEach(function(setting) {
if (typeof(data[setting]) == 'number') { $settings[setting] = data[setting]; }
});
redraw();
}
}
}
return({
press: press,
display: display,
settings: settings
});
}();
// Attribute Setters
function horizontal(val) { mantakeys.settings({horizontal: val}); }
function vertical(val) { mantakeys.settings({vertical: val}); }
function base(val) { mantakeys.settings({base: val}); }
function save() {
var settings = mantakeys.settings();
embedmessage("horizontal", settings.horizontal);
embedmessage("vertical", settings.vertical);
embedmessage("base", settings.base);
}
//
// // Panic Button
// function clear() {
// mantakeys.reset();
// }
// max inputs
function list() {
switch(inlet) {
case 0:
mantakeys.press({sensor: arguments[0], pressure: arguments[1]});
break;
case 1:
mantakeys.display({note: arguments[0], velocity: arguments[1]});
break;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment