function NANOPAD2RK() {} NANOPAD2RK.debug=true; //set defaults - don't change these NANOPAD2RK.hotcueClear=false;//if true, hitting hotcue button clears it. NANOPAD2RK.loopbuttonDown=false;//if true, special loop functions with knob modifiers are enabled. NANOPAD2RK.loopmove=0.0125;//default loop move distance in seconds NANOPAD2RK.doreloop=true;//don't change this NANOPAD2RK.vol=new Array();//array of volumes to return to after mute - don't change NANOPAD2RK.looptype="beatloop";//default looptype //map hotcue pads NANOPAD2RK.hotcues = new Array(); //initialize //scene 1 //---------(group, cuenum) NANOPAD2RK.hotcues[0x25] = new Array("[Channel1]", 1); NANOPAD2RK.hotcues[0x27] = new Array("[Channel1]", 2); NANOPAD2RK.hotcues[0x29] = new Array("[Channel1]", 3); NANOPAD2RK.hotcues[0x2b] = new Array("[Channel1]", 4); NANOPAD2RK.hotcues[0x2d] = new Array("[Channel1]", 5); NANOPAD2RK.hotcues[0x2f] = new Array("[Channel1]", 6); NANOPAD2RK.hotcues[0x31] = new Array("[Channel1]", 7); NANOPAD2RK.hotcues[0x33] = new Array("[Channel1]", 8); NANOPAD2RK.hotcues[0x24] = new Array("[Channel2]", 1); NANOPAD2RK.hotcues[0x26] = new Array("[Channel2]", 2); NANOPAD2RK.hotcues[0x28] = new Array("[Channel2]", 3); NANOPAD2RK.hotcues[0x2a] = new Array("[Channel2]", 4); NANOPAD2RK.hotcues[0x2c] = new Array("[Channel2]", 5); NANOPAD2RK.hotcues[0x2e] = new Array("[Channel2]", 6); NANOPAD2RK.hotcues[0x30] = new Array("[Channel2]", 7); //scene 2 //---------(group, cuenum) NANOPAD2RK.hotcues[0x35] = new Array("[Channel1]", 9); NANOPAD2RK.hotcues[0x37] = new Array("[Channel1]", 10); NANOPAD2RK.hotcues[0x39] = new Array("[Channel1]", 11); NANOPAD2RK.hotcues[0x3b] = new Array("[Channel1]", 12); NANOPAD2RK.hotcues[0x3d] = new Array("[Channel1]", 13); NANOPAD2RK.hotcues[0x3f] = new Array("[Channel1]", 14); NANOPAD2RK.hotcues[0x41] = new Array("[Channel1]", 15); NANOPAD2RK.hotcues[0x43] = new Array("[Channel1]", 16); NANOPAD2RK.hotcues[0x34] = new Array("[Channel2]", 9); NANOPAD2RK.hotcues[0x36] = new Array("[Channel2]", 10); NANOPAD2RK.hotcues[0x38] = new Array("[Channel2]", 11); NANOPAD2RK.hotcues[0x3a] = new Array("[Channel2]", 12); NANOPAD2RK.hotcues[0x3c] = new Array("[Channel2]", 13); NANOPAD2RK.hotcues[0x3e] = new Array("[Channel2]", 14); NANOPAD2RK.hotcues[0x40] = new Array("[Channel2]", 15); //map loop pads NANOPAD2RK.loops = new Array(); //scene 3 //---------(group, beatloop_len) NANOPAD2RK.loops[0x47] = new Array("[Channel1]", 1); NANOPAD2RK.loops[0x49] = new Array("[Channel1]", 2); NANOPAD2RK.loops[0x4b] = new Array("[Channel1]", 4); NANOPAD2RK.loops[0x46] = new Array("[Channel2]", 1); NANOPAD2RK.loops[0x48] = new Array("[Channel2]", 2); NANOPAD2RK.loops[0x4a] = new Array("[Channel2]", 4); NANOPAD2RK.init = function (id, debug) { // called when the device is opened & set up if (NANOPAD2RK.debug){print("###init##############")}; }; NANOPAD2RK.shutdown = function () { }; NANOPAD2RK.clear = function (){//enables hotcue clearing if (NANOPAD2RK.debug){print("###hotcueclear##############")}; NANOPAD2RK.hotcueClear=true; }; NANOPAD2RK.noclear = function (){//disables hotcue clearing NANOPAD2RK.hotcueClear=false; }; NANOPAD2RK.hotcueButton = function (channel, control, value, status, group) { if (NANOPAD2RK.debug){print("###hotcueButton##############")}; if (NANOPAD2RK.debug){print("status:"+status)}; if (NANOPAD2RK.debug){print("channel:"+channel)}; if (NANOPAD2RK.debug){print("control:"+control)}; if (NANOPAD2RK.debug){print("hotcuebank:"+NANOPAD2RK.hotcueBank)}; if (NANOPAD2RK.debug){print("phrase:#"+status.toString(16).toLowerCase()+control.toString(16).toLowerCase()+"#")}; //activate or clear depending on whether clear button is pressed var thecue = NANOPAD2RK.hotcues[control]; if (NANOPAD2RK.hotcueClear){ engine.setValue(thecue[0], "hotcue_"+thecue[1]+"_clear", 1); if (NANOPAD2RK.debug){print("cleared")}; } else { engine.setValue(thecue[0], "hotcue_"+thecue[1]+"_activate", 1); if (NANOPAD2RK.debug){print("###"+control+"--activated")}; }; }; NANOPAD2RK.loopButton = function (channel, control, value, status, group) { if (NANOPAD2RK.debug){print(NANOPAD2RK.looplen+"len");} if (NANOPAD2RK.debug){print(NANOPAD2RK.looptype+"type");} //activate beatloop var theloop = NANOPAD2RK.loops[control]; NANOPAD2RK.loopbuttonDown=true; print("engine.setValue("+group+", "+NANOPAD2RK.looptype+"_"+theloop[1]+"_activate, 1)"); engine.setValue(group, NANOPAD2RK.looptype+"_"+theloop[1]+"_activate", 1); }; NANOPAD2RK.loopButtonRelease = function (channel, control, value, status, group) {//button was released NANOPAD2RK.loopbuttonDown=false; }; NANOPAD2RK.reloopButton = function (channel, control, value, status, group) { if (NANOPAD2RK.debug){print(NANOPAD2RK.looplen+"len");} if (NANOPAD2RK.debug){print(NANOPAD2RK.looptype+"type");} NANOPAD2RK.loopbuttonDown=true; NANOPAD2RK.doreloop=true; NANOPAD2RK.reloopTimer = engine.beginTimer(500, "NANOPAD2RK.disablereloop()", true); }; NANOPAD2RK.reloopButtonRelease = function (channel, control, value, status, group) {//button was released if (NANOPAD2RK.debug){print("reloop release");} NANOPAD2RK.loopbuttonDown=false; if (NANOPAD2RK.doreloop===true) {engine.setValue(group, "reloop_exit", 1);}; NANOPAD2RK.doreloop=true; }; NANOPAD2RK.disablereloop = function () { //timed function - fires half a second after pressing reloop. Don't do the reloop if you hold down the button (so you can move the loop without exiting) NANOPAD2RK.doreloop=false; }; NANOPAD2RK.loopplus = function (channel, control, value, status, group) { //grows loop or moves loop forward if (NANOPAD2RK.loopbuttonDown !== true){engine.setValue(group, "loop_double", 1); return false;}//shrink loop if no loop button down else if (engine.getValue(group, "loop_start_position")>=0 && engine.getValue(group, "loop_end_position")>=0 ){ //move loop var interval = NANOPAD2RK.loopmove*engine.getValue(group, "track_samples")/engine.getValue(group, "duration"); var start = engine.getValue(group, "loop_start_position"); var end = engine.getValue(group, "loop_end_position"); engine.setValue(group, "loop_start_position", start+interval); engine.setValue(group, "loop_end_position", end+interval); return true; }; }; NANOPAD2RK.loopminus = function (channel, control, value, status, group) { //shrinks loop or moves loop back if (NANOPAD2RK.loopbuttonDown !== true){engine.setValue(group, "loop_halve", 1); return false;}//shrink loop if no loop button down else if (engine.getValue(group, "loop_start_position")>=0 && engine.getValue(group, "loop_end_position")>=0 ){ //move loop var interval = NANOPAD2RK.loopmove*engine.getValue(group, "track_samples")/engine.getValue(group, "duration"); var start = engine.getValue(group, "loop_start_position"); var end = engine.getValue(group, "loop_end_position"); engine.setValue(group, "loop_start_position", start-interval); engine.setValue(group, "loop_end_position", end-interval); return true; }; }; NANOPAD2RK.muteOn = function (channel, control, value, status, group) { //toggles mute, then returns to previous volume storedvol=NANOPAD2RK.vol[group]; curvol=engine.getValue(group, "volume"); engine.softTakeover(group,"volume",false); engine.setValue(group, "volume", 0); NANOPAD2RK.vol[group]=curvol; engine.softTakeover(group,"volume",true); if (NANOPAD2RK.debug){print("MUTE");} }; NANOPAD2RK.muteOff = function (channel, control, value, status, group) { //toggles mute, then returns to previous volume storedvol=NANOPAD2RK.vol[group]; curvol=engine.getValue(group, "volume"); engine.softTakeover(group,"volume",false); engine.setValue(group, "volume", storedvol); engine.softTakeover(group,"volume",true); if (NANOPAD2RK.debug){print("MUTE");} };