// set tuning // originally A2, C#3, E3, F#3, A3, C#4 //[45, 49, 52, 54, 57, 61] @=>int tuning[]; // G6 (Sleepwalk vers 2) // G3, B3, E4, G4, B4, D5] //[55, 59, 64, 67, 71, 74] @=> int tuning[]; //C6/Am7 (Sleepwalk) // C3, E3, G3, A3, C4, E4 [48, 52, 55, 57, 60, 64] @=> int tuning[]; //Open E (I'll fly Away) // E3, B3, E4, G#4, B4, E5 //[52, 59, 64, 68, 71, 76] @=> int tuning[]; //Open D (I'll fly Away) // D3, A3, D4, F#4, A4, D5 //[50, 57, 62, 66, 69, 74] @=> int tuning[]; //E6 (Walk don't run) // E3, G#3, B3, C#4, E4, G#4 //[52, 56, 59, 61, 64, 68] @=> int tuning[]; 0 => int base; //transposition // set adsr (shared amongst strings) 10=>float att; //ms 100=>float del; //ms 0.466=>float sus; //0-1 1800=>float rel; //ms // set modadsr (shared amongst strings) (fm mod env for pluck sound) 1=>float modatt; //ms 7=>float moddel; //ms 0.246=>float modsus; //0-1 1800=>float modrel; //ms //time to hold string 909=>float hold; //ms //set individual gains (shared value) 0.323=>float gains; //set FM gain (index) and freq ratio (integers create melodic notes) 2833.0=>float mgain; 3.0=>float mfrate; //scale amount of trackpad control 0.2333=>float ctrlscale; //Lowest string TriOsc m1 => ADSR modadsr1 =>SinOsc s1 => ADSR adsr1 =>Gain g1 => Gain level=>dac; s1.sync(2); mgain=>m1.gain; s1.freq()*mfrate=>m1.freq; (att::ms, del::ms, sus, rel::ms)=>adsr1.set; (modatt::ms, moddel::ms, modsus, modrel::ms)=>modadsr1.set; gains=>g1.gain; Std.mtof(tuning[0]+base)=>s1.freq; TriOsc m2 => ADSR modadsr2=>SinOsc s2 => ADSR adsr2 =>Gain g2 => level; s2.sync(2); mgain=>m2.gain; s2.freq()*mfrate=>m2.freq; (att::ms, del::ms, sus, rel::ms)=>adsr2.set; (modatt::ms, moddel::ms, modsus, modrel::ms)=>modadsr2.set; gains=>g2.gain; Std.mtof(tuning[1]+base)=>s2.freq; TriOsc m3 => ADSR modadsr3 =>SinOsc s3 => ADSR adsr3 =>Gain g3 => level; s3.sync(2); mgain=>m3.gain; s3.freq()*mfrate=>m3.freq; (att::ms, del::ms, sus, rel::ms)=>adsr3.set; (modatt::ms, moddel::ms, modsus, modrel::ms)=>modadsr3.set; gains=>g3.gain; Std.mtof(tuning[2]+base)=>s3.freq; TriOsc m4 => ADSR modadsr4 =>SinOsc s4 => ADSR adsr4 =>Gain g4 => level; s4.sync(2); mgain=>m4.gain; s4.freq()*mfrate=>m4.freq; (att::ms, del::ms, sus, rel::ms)=>adsr4.set; (modatt::ms, moddel::ms, modsus, modrel::ms)=>modadsr4.set; gains=>g4.gain; Std.mtof(tuning[3]+base)=>s4.freq; TriOsc m5 => ADSR modadsr5 =>SinOsc s5 => ADSR adsr5 =>Gain g5 => level; s5.sync(2); mgain=>m5.gain; s5.freq()*mfrate=>m5.freq; (att::ms, del::ms, sus, rel::ms)=>adsr5.set; (modatt::ms, moddel::ms, modsus, modrel::ms)=>modadsr5.set; gains=>g5.gain; Std.mtof(tuning[4]+base)=>s5.freq; //highest string TriOsc m6 => ADSR modadsr6 =>SinOsc s6 => ADSR adsr6 =>Gain g6 => level; s6.sync(2); mgain=>m6.gain; s6.freq()*mfrate=>m6.freq; (att::ms, del::ms, sus, rel::ms)=>adsr6.set; (modatt::ms, moddel::ms, modsus, modrel::ms)=>modadsr6.set; gains=>g6.gain; Std.mtof(tuning[5]+base)=>s6.freq; //turn off all strings initially adsr1.keyOff(); adsr2.keyOff(); adsr3.keyOff(); adsr4.keyOff(); adsr5.keyOff(); adsr6.keyOff(); //wait for 'pick' and 'slide' spork ~ pick(); spork ~ slide(); //spork ~ fret(); //monitor and display slide position spork ~ monitor(); <<<"Attempting to contact Hank...","">>>; //run for a day 1::day=>now; //play each string fun void play1 () { adsr1.keyOn(); modadsr1.keyOn(); hold::ms=>now; adsr1.keyOff(); modadsr1.keyOff(); 3000::ms=>now; } fun void play2 () { adsr2.keyOn(); modadsr2.keyOn(); hold::ms=>now; adsr2.keyOff(); modadsr2.keyOff(); 3000::ms=>now; } fun void play3 () { adsr3.keyOn(); modadsr3.keyOn(); hold::ms=>now; adsr3.keyOff(); modadsr3.keyOff(); 3000::ms=>now; } fun void play4 () { adsr4.keyOn(); modadsr4.keyOn(); hold::ms=>now; adsr4.keyOff(); modadsr4.keyOff(); 3000::ms=>now; } fun void play5 () { adsr5.keyOn(); modadsr5.keyOn(); hold::ms=>now; adsr5.keyOff(); modadsr5.keyOff(); 3000::ms=>now; } fun void play6 () { adsr6.keyOn(); modadsr6.keyOn(); hold::ms=>now; adsr6.keyOff(); modadsr6.keyOff(); 3000::ms=>now; } //turn off string fun void stop1 () //not currently used but useful if you want infinte sustain { adsr1.keyOff(); 300::ms=>now; } //get mouse input, convert to correct freq values fun void slide() { // the device number to open 0 => int deviceNum; // instantiate a HidIn object Hid hi; // structure to hold HID messages HidMsg msg; // open mouse 0, exit on fail if( !hi.openMouse( deviceNum ) ) me.exit(); // successful! print name of device <<< "mouse '", hi.name(), "' ready" >>>; //INITIALISE (mainly to set fm freq to correct number (ctrlscale*1+s1.freq())/s1.freq()=>float ratio; //init thanks ethan ratio*s1.freq()=>s1.freq; s1.freq()*mfrate=>m1.freq; //init ratio*s2.freq()=>s2.freq; s2.freq()*mfrate=>m2.freq; //init ratio*s3.freq()=>s3.freq; s3.freq()*mfrate=>m3.freq; //init ratio*s4.freq()=>s4.freq; s4.freq()*mfrate=>m4.freq; //init ratio*s5.freq()=>s5.freq; s5.freq()*mfrate=>m5.freq; //init ratio*s6.freq()=>s6.freq; s6.freq()*mfrate=>m6.freq; //init // infinite event loop while( true ) { // wait on HidIn as event hi => now; // messages received while( hi.recv( msg ) ) { // mouse motion if( msg.isMouseMotion() ) { //(msg.deltaX > 0 ? 1 :-1)=>int sign; // axis of motion if( msg.deltaX ) { //<<< "mouse motion:", msg.deltaX, "on x-axis" >>>; //scale mouse movement, get ratio to change freq by (makes each //string change the same NOTE amount). apply change to ALL strings (ctrlscale*msg.deltaX+s1.freq())/s1.freq()=>ratio; //thanks ethan if (ratio*s1.freq() < Std.mtof(tuning[0])) {1=>ratio;} ratio*s1.freq()=>s1.freq; s1.freq()*mfrate=>m1.freq; //low string ratio*s2.freq()=>s2.freq; s2.freq()*mfrate=>m2.freq; ratio*s3.freq()=>s3.freq; s3.freq()*mfrate=>m3.freq; ratio*s4.freq()=>s4.freq; s4.freq()*mfrate=>m4.freq; ratio*s5.freq()=>s5.freq; s5.freq()*mfrate=>m5.freq; ratio*s6.freq()=>s6.freq; s6.freq()*mfrate=>m6.freq; //high string //<<>>; } } } } } // convert keystroke to 'pick' fun void pick() { // the device number to open 0 => int deviceNum; // instantiate a HidIn object Hid hi; // structure to hold HID messages HidMsg msg; // open keyboard if( !hi.openKeyboard( deviceNum ) ) me.exit(); //successful! print name of device <<< "keyboard '", hi.name(), "' ready" >>>; // infinite event loop while( true ) { // wait on event hi => now; // get one or more messages while( hi.recv( msg ) ) { // check for action type if( msg.isButtonDown() ) { // print //<<< "down:", msg.which >>>; if(msg.which==88){spork ~ play1();} //bottom right enter key if(msg.which==55){spork ~ play2();} // . key if(msg.which==51){spork ~ play3();} // ; key if(msg.which==47){spork ~ play4();} // [ key if(msg.which==48){spork ~ play5();} // ] key if(msg.which==49){spork ~ play6();} // \ key if(msg.which==53){spork ~ slidetofret(0,1.01);} // ` key if(msg.which==30){spork ~ slidetofret(1,1.01);} // 1 key if(msg.which==31){spork ~ slidetofret(2,1.01);} // 2 key if(msg.which==32){spork ~ slidetofret(3,1.01);} // 3 key if(msg.which==33){spork ~ slidetofret(4,1.01);} // 4 key if(msg.which==34){spork ~ slidetofret(5,1.01);} // 5 key if(msg.which==35){spork ~ slidetofret(6,1.01);} // 6 key if(msg.which==36){spork ~ slidetofret(7,1.01);} // 7 key if(msg.which==37){spork ~ slidetofret(8,1.01);} // 8 key if(msg.which==38){spork ~ slidetofret(9,1.01);} // 9 key if(msg.which==39){spork ~ slidetofret(10,1.01);} // 0 key if(msg.which==45){spork ~ slidetofret(11,1.01);} // - key if(msg.which==46){spork ~ slidetofret(12,1.01);} // = key if(msg.which==44){spork ~ slidetofret(0,1.19);} // spacebar } else { // print //<<< "up:", msg.which >>>; //if(msg.which==88){spork ~ stop();} } } } } // convert keystroke to fret selection fun void fret() { // the device number to open 0 => int deviceNum; // instantiate a HidIn object Hid hi; // structure to hold HID messages HidMsg msg; // open keyboard if( !hi.openKeyboard( deviceNum ) ) me.exit(); //successful! print name of device <<< "keyboard '", hi.name(), "' ready" >>>; // infinite event loop while( true ) { // wait on event hi => now; // get one or more messages while( hi.recv( msg ) ) { // check for action type if( msg.isButtonDown() ) { //print <<< "down:", msg.which >>>; //if(msg.which==49){spork ~ play6();} // \ key } else { // print //<<< "up:", msg.which >>>; //if(msg.which==88){spork ~ stop();} } } } } //Fret fun void slidetofret(int fret, float slew) { fret+tuning[0]=>float target; if (Std.ftom(s1.freq())s1.freq; s1.freq()*mfrate=>m1.freq; s2.freq()*slew=>s2.freq; s2.freq()*mfrate=>m2.freq; s3.freq()*slew=>s3.freq; s3.freq()*mfrate=>m3.freq; s4.freq()*slew=>s4.freq; s4.freq()*mfrate=>m4.freq; s5.freq()*slew=>s5.freq; s5.freq()*mfrate=>m5.freq; s6.freq()*slew=>s6.freq; s6.freq()*mfrate=>m6.freq; 10::ms=>now; } } else if (Std.ftom(s1.freq())>target) { while(Std.ftom(s1.freq())>target) { s1.freq()*(1-(slew-1))=>s1.freq; s1.freq()*mfrate=>m1.freq; s2.freq()*(1-(slew-1))=>s2.freq; s2.freq()*mfrate=>m2.freq; s3.freq()*(1-(slew-1))=>s3.freq; s3.freq()*mfrate=>m3.freq; s4.freq()*(1-(slew-1))=>s4.freq; s4.freq()*mfrate=>m4.freq; s5.freq()*(1-(slew-1))=>s5.freq; s5.freq()*mfrate=>m5.freq; s6.freq()*(1-(slew-1))=>s6.freq; s6.freq()*mfrate=>m6.freq; 10::ms=>now; } } 10::ms=>now; } //Monitor fun void monitor() { MAUI_View ctrl_view; MAUI_Button off; MAUI_Button tuning1; MAUI_Button tuning2; MAUI_Button tuning3; MAUI_Button tuning4; MAUI_Button tuning5; MAUI_Button tuning6; MAUI_LED led1; MAUI_LED led2; MAUI_LED led3; MAUI_LED led4; MAUI_LED led5; MAUI_LED led6; MAUI_Slider fret; off.position(810,0); off.name("O F F"); tuning1.position(0,70); tuning1.size(150,60); tuning1.name("A6"); tuning2.position(120,70); tuning2.size(150,60); tuning2.name("G6"); tuning3.position(240,70); tuning3.size(150,60); tuning3.name("C6/Am7"); tuning4.position(360,70); tuning4.size(150,60); tuning4.name("Open D"); tuning5.position(480,70); tuning5.size(150,60); tuning5.name("Open E"); tuning6.position(600,70); tuning6.size(150,60); tuning6.name("E6"); led1.position(40,100); led1.color(2); led2.position(160,100); led2.color(2); led3.position(280,100); led3.color(2); led4.position(400,100); led4.color(2); led5.position(520,100); led5.color(2); led6.position(640,100); led6.color(2); "dont F R E T baby" =>fret.name; " | | | | | * | | * | | | | | * * | | | | | * | | * | | | | |"=>fret.name; fret.range(0,24); fret.position(0,0); fret.size(808,100); fret.displayFormat(1); fret.precision(2); ctrl_view.addElement(fret); ctrl_view.addElement(off); ctrl_view.addElement(tuning1); ctrl_view.addElement(tuning2); ctrl_view.addElement(tuning3); ctrl_view.addElement(tuning4); ctrl_view.addElement(tuning5); ctrl_view.addElement(tuning6); ctrl_view.addElement(led1); ctrl_view.addElement(led2); ctrl_view.addElement(led3); ctrl_view.addElement(led4); ctrl_view.addElement(led5); ctrl_view.addElement(led6); ctrl_view.size(909,150); ctrl_view.position(200,70); ctrl_view.display(); while (true) { (Std.ftom(s1.freq())-tuning[0]-.05)=>fret.value; if (off.state() == 1) { ctrl_view.hide(); } if (tuning1.state() == 1) { //A6 (? Thanks Paul) // originally A2, C#3, E3, F#3, A3, C#4 [45, 49, 52, 54, 57, 61] @=>tuning; led1.light(); led2.unlight(); led3.unlight(); led4.unlight(); led5.unlight(); led6.unlight(); } if (tuning2.state() == 1) { //G6 (Sleepwalk (vers2)) // G3, B3, E4, G4, B4, D5] [55, 59, 64, 67, 71, 74] @=> tuning; led1.unlight(); led2.light(); led3.unlight(); led4.unlight(); led5.unlight(); led6.unlight(); } if (tuning3.state() == 1) { //C6/Am7 (Sleepwalk (Good version)) // C3, E3, G3, A3, C4, E4 [48, 52, 55, 57, 60, 64] @=> tuning; led1.unlight(); led2.unlight(); led3.light(); led4.unlight(); led5.unlight(); led6.unlight(); } if (tuning4.state() == 1) { //Open D (I'll fly Away) // D3, A3, D4, F#4, A4, D5 [50, 57, 62, 66, 69, 74] @=> tuning; led1.unlight(); led2.unlight(); led3.unlight(); led4.light(); led5.unlight(); led6.unlight(); } if (tuning5.state() == 1) { //Open E (I'll fly Away) // E3, B3, E4, G#4, B4, E5 [52, 59, 64, 68, 71, 76] @=> tuning; led1.unlight(); led2.unlight(); led3.unlight(); led4.unlight(); led5.light(); led6.unlight(); } if (tuning6.state() == 1) { //E6 (Walk don't run) // E3, G#3, B3, C#4, E4, G#4 [52, 56, 59, 61, 64, 68] @=> tuning; led1.unlight(); led2.unlight(); led3.unlight(); led4.unlight(); led5.unlight(); led6.light(); } 10::ms=>now; } }