Created
December 1, 2009 05:42
-
-
Save mattly/246098 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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