//Setup Midi MidiIn min; MidiMsg mmsg; //note: data2 contains id#, data3 contains value // try if( !min.open(0)) me.exit(); <<<"midi '" + min.name() + "' ready...","" >>>; //Turntable Setup Hid tt; HidMsg ttdata; // try if( !tt.openMouse(0)) me.exit(); <<< "mouse '" + tt.name() + "' ready...", "" >>>; //////////////////////////////////////////////////////////////////////////////////////// //Path "C:/Users/Public/Documents/School/220C/" => string path; //FX Delay d => HPF f => Gain g => dac; g => d; //feedback delay 4096::samp => d.delay; 600 => f.freq; 0.0 => g.gain; //off gain gcut => dac; //for cuts 1.0 => gcut.gain; //load up samples //Kick SndBuf Kick => gcut; Kick => d; path + "Kick.wav" => Kick.read; 0.0 => Kick.rate; //SoleSide SndBuf SoleSide => gcut; SoleSide => d; path + "SoleSide.wav" => SoleSide.read; 0.0 => SoleSide.rate; //Pepperoni SndBuf Pepperoni => gcut; Pepperoni => d; path + "Pepperoni.wav" => Pepperoni.read; 0.0 => Pepperoni.rate; //Pizza SndBuf Pizza => gcut; Pizza => d; path + "Pizza.wav" => Pizza.read; 0.0 => Pizza.rate; //Biggie SndBuf Biggie => gcut; Biggie => d; path + "NotoriousBig.wav" => Biggie.read; 0.0 => Biggie.rate; //Miley SndBuf Miley => gcut; Miley => d; path + "Miley.wav" => Miley.read; 0.0 => Miley.rate; ////////////////////////////////////////////////////////////////////////////////////////// //Pointers SndBuf @ loop; //current active loop SndBuf @ deck; //current active sound on deck SndBuf empty; //if there is nothing on deck empty @=> deck; //initialize //Analysis 2::ms => dur window; 10.0 => float CtrlRate; 0.0 => float ttrate; //Envelope Envelope env => blackhole; window => env.duration; 0.0 => env.value; ////////////////////////////////////////////////////////////////////////////////////////// //Start analysis spork~ analyze(); //Waiting on MidiMsg while(true) { min => now; while(min.recv(mmsg)) { mmsg.data2 => int id; // [23,31] -> top buttons, [33,41] -> bottom buttons mmsg.data3 => int state; //SoleSide if(id == 23 && state == 127) {Kick @=> deck; oneShot();} if(id == 33 && state == 127) {SoleSide @=> loop; playLoop();} //Pepperoni if(id == 24 && state == 127) {Pepperoni @=> deck; oneShot();} if(id == 34 && state == 127) {Pepperoni @=> loop; playLoop();} //Pizza if(id == 25 && state == 127) {Pizza @=> deck; oneShot();} if(id == 35 && state == 127) {Pizza @=> loop; playLoop();} //Miley if(id == 26 && state == 127) {Miley @=> deck; oneShot();} if(id == 36 && state == 127) {Miley @=> loop; playLoop();} //Biggie if(id == 37 && state == 127) {Biggie @=> loop; playLoop();} //Stop if(id == 46) {stop();} //off //Cut if(id == 45 && state == 127) {cut();}; //FilterDelay if(id == 49 && state == 127) {cut(); filterDelay();} } } //////////////////////////////////////////////////////////////////////////////////////////////// //Helpers //////////////////////////////////////////////////////////////////////////////////////////////// //Loads to deck fun void oneShot() { if(deck == loop) empty @=> loop; 0 => deck.pos; 0 => deck.loop; 1.0 => deck.rate; 1.0 => env.target; } //Loads to loop playback fun void playLoop() { if(deck == loop) empty @=> deck; //if they are pointing to the same thing... 0 => loop.pos; 1 => loop.loop; 1.0 => loop.rate; } //Stops all loops fun void stop() { 0.0 => SoleSide.rate; 0.0 => Pepperoni.rate; 0.0 => Pizza .rate; 0.0 => Biggie.rate; 0.0 => Miley.rate; } //Cuts temporarily fun void cut() { if(gcut.gain() == 0) 1.0 => gcut.gain; else 0.0 => gcut.gain; } //Toggles filter delay fun void filterDelay() { if(g.gain() == 0.0) { 0.8 => g.gain; 4096::samp => d.delay; <<<"delay on:", d.delay()>>>;} else { 0.0 => g.gain; <<<"delay off">>>;} } //Read envelope fun void envRead() { while(true) { env.value() => deck.rate; 1::samp => now; } } //Use mouse-speed to determine playback speed fun void analyze() { spork~ envRead(); while(true) { tt => now; while(tt.recv( ttdata )) { if(ttdata.isMouseMotion()) { if(ttdata.deltaX >= -1 && ttdata.deltaX <= 1 ) 1.0 => ttrate; else ttdata.deltaX / CtrlRate => ttrate; } ttrate => env.target; } } }