#include //the eeprom library int motor1=6; //pin assignments for pwm outputs int motor2=9; int motor3=10; int motor4=11; int r1=0; //pin assignments for keyboard rows and columns (digital) int r2=1; int r3=2; int r4=3; int c1=4; int c2=5; int c3=7; int ledPin = 13; //arduino LED pin int plus=12; //tuning buttons int minus=8; int modebutton=0; //mode button--this is an analog input acting like a digital input int sinput1=5; //pin assignments for pot analog inputs int sinput2=4; int sinput3=3; int sinput4=2; int feedback1=0; //variables for feedback values from pot of 0-1024 int feedback2=0; int feedback3=0; int feedback4=0; int keynumber=0; // variable for keyboard input //slide variables int slidemode=0; int delayconstant=80; //40 is about one second int newcommand1=512; int oldcommand1=512; int startpoint1=512; int commandstep1=5; //the ramp step height int rampcount1=1; //ramp step counter int rampdelay1=1; //ramp step duration int newcommand2=512; int oldcommand2=512; int startpoint2=512; int commandstep2=5; //the ramp step height int rampcount2=1; //ramp step counter int rampdelay2=1; //ramp step duration int newcommand3=512; int oldcommand3=512; int startpoint3=512; int commandstep3=5; //the ramp step height int rampcount3=1; //ramp step counter int rampdelay3=1; //ramp step duration int newcommand4=512; int oldcommand4=512; int startpoint4=512; int commandstep4=5; //the ramp step height int rampcount4=1; //ramp step counter int rampdelay4=1; //ramp step duration // integration error variables int keychange=0; // has a new key been struck int oldkeynumber=0; int oldfeedback1=0; int oldfeedback2=0; int oldfeedback3=0; int oldfeedback4=0; int integrate_error1=0; int commandnumber1=512; //servo command 0-1024 int commandnumber2=512; int commandnumber3=512; int commandnumber4=512; int oldcommandnumber1=512; //previous servo command 0-1024 int oldcommandnumber2=512; int oldcommandnumber3=512; int oldcommandnumber4=512; float rawerror1=0; // error between feedback and command float rawerror2=0; float rawerror3=0; float rawerror4=0; int motorout1=0; //output to motor int motorout2=0; int motorout3=0; int motorout4=0; int count1=0; // the servo when error is small int count2=0; int count3=0; int count4=0; int gainfactor1=7; //divisor that implements gain factor (smaller divisor more gain) int gainfactor2=7; int gainfactor3=7; int gainfactor4=7; float integratefactor1=0; float integratefactor2=0; float integratefactor3=0; float integratefactor4=0; byte lsbyte=0; byte msbyte=0; //default array to map key to tension, 13th entry for safety int keymap1[]={ 200, 250, 300, 350, 400, 450, 500, 600, 650, 700, 750, 800, 850}; int keymap2[]={ 200, 250, 300, 350, 400, 450, 500, 600, 650, 700, 750, 800, 850}; int keymap3[]={ 200, 250, 300, 350, 400, 450, 500, 600, 650, 700, 750, 800, 850}; int keymap4[]={ 200, 250, 300, 350, 400, 450, 500, 600, 650, 700, 750, 800, 850}; int norepeat=0; //a flag to prevent repetion of commands in main loop //int norepeat1=0; //a flag for string goose int mode1=0; //mode state first digit int mode2=0; //mode state first digit void keyboardread() //read the keyboard and assign global keynumber with number 0-11 (vertical raster starting @ 0= upper left corner) { digitalWrite(c1, LOW); digitalWrite(c2, HIGH); digitalWrite(c3, HIGH); if (digitalRead(r1)==0) keynumber=0; if (digitalRead(r2)==0) keynumber=1; if (digitalRead(r3)==0) keynumber=2; if (digitalRead(r4)==0) keynumber=3; digitalWrite(c1, HIGH); digitalWrite(c2, LOW); digitalWrite(c3, HIGH); if (digitalRead(r1)==0) keynumber=4; if (digitalRead(r2)==0) keynumber=5; if (digitalRead(r3)==0) keynumber=6; if (digitalRead(r4)==0) keynumber=7; digitalWrite(c1, HIGH); digitalWrite(c2, HIGH); digitalWrite(c3, LOW); if (digitalRead(r1)==0) keynumber=8; if (digitalRead(r2)==0) keynumber=9; if (digitalRead(r3)==0) keynumber=10; if (digitalRead(r4)==0) keynumber=11; if (keynumber!=oldkeynumber) keychange=1; else keychange=0; } void setup() // run once, when the sketch starts { pinMode(motor1, OUTPUT); // sets the LED pin as output pinMode(motor2, OUTPUT); // sets the LED pin as output pinMode(motor3, OUTPUT); // sets the LED pin as output pinMode(motor4, OUTPUT); // sets the LED pin as output pinMode(r1, INPUT); //sets row 1 to input digitalWrite(r1,HIGH); //turns on pull up resistor pinMode(r2, INPUT); //sets row 2 to input digitalWrite(r2,HIGH); //turns on pull up resistor pinMode(r3, INPUT); //sets row 3 to input digitalWrite(r3,HIGH); //turns on pull up resistor pinMode(r4, INPUT); //sets row 4 to input digitalWrite(r4,HIGH); //turns on pull up resistor pinMode(c1, OUTPUT); //sets col 1 to input (these will be pulled down to assert) pinMode(c2, OUTPUT); //sets col 2 to input pinMode(c3, OUTPUT); //sets col 3 to input pinMode(ledPin, OUTPUT); // sets the on-board led pin as output pinMode(plus, INPUT); //sets plus button to input digitalWrite(plus,HIGH); //turns on pull up resistor pinMode(minus, INPUT); //sets minus button to input digitalWrite(minus,HIGH); //turns on pull up resistor } void loop() // run over and over again { //*****CHANGE MODE****first check mode button //when mode button is pressed, the led comes on and the program //waits until two number keys are pressed indicating the mode //mode 0/0-3/3 tunes strings 1-4; mode 10/10 and 11/11 are load and save tunings if (analogRead(modebutton)>500) { delay(250); //bounce elimination keynumber=12; //impossible value norepeat=1; //for modes that should execute once per mode change digitalWrite(ledPin, HIGH); while (keynumber==12) keyboardread(); //wait for number key mode1=keynumber; //set new mode first digit delay(250); //bounce elimination keynumber=12; //impossible value while (keynumber==12) keyboardread(); //wait for number key mode2=keynumber; //set new mode second digit } //****MODE 0/0-3/3=tune string, read the plus or minus buttons, updates last keynumber pressed if ((mode1==mode2)&&( (mode1==0)||(mode1==1)||(mode1==2)||(mode1==3) )) { digitalWrite(ledPin, LOW); keyboardread(); //updates keynumber if ((mode1==0)&&(mode2==0)) commandnumber1=keymap1[keynumber]; ///even if no +/- press will update string tension if ((mode1==1)&&(mode2==1)) commandnumber2=keymap2[keynumber]; if ((mode1==2)&&(mode2==2)) commandnumber3=keymap3[keynumber]; if ((mode1==3)&&(mode2==3)) commandnumber4=keymap4[keynumber]; if (digitalRead(plus)==0 && digitalRead(minus)!=0) //press plus only { delay(250); if ((mode1==0)&&(mode2==0)) { keymap1[keynumber]=keymap1[keynumber]+5; if (keymap1[keynumber]>1015) keymap1[keynumber]=1015; //check/fix overflow commandnumber1=keymap1[keynumber]; //play the new note } if ((mode1==1)&&(mode2==1)) { keymap2[keynumber]=keymap2[keynumber]+5; if (keymap2[keynumber]>1015) keymap2[keynumber]=1015; commandnumber2=keymap2[keynumber]; //play the new note } if ((mode1==2)&&(mode2==2)) { keymap3[keynumber]=keymap3[keynumber]+5; if (keymap3[keynumber]>1015) keymap3[keynumber]=1015; commandnumber3=keymap3[keynumber]; } if ((mode1==3)&&(mode2==3)) { keymap4[keynumber]=keymap4[keynumber]+5; if (keymap4[keynumber]>1015) keymap4[keynumber]=1015; commandnumber4=keymap4[keynumber]; } } if (digitalRead(minus)==0 && digitalRead(plus)!=0) //press minus only { delay(250); if ((mode1==0)&&(mode2==0)) { keymap1[keynumber]=keymap1[keynumber]-5; if (keymap1[keynumber]<15) keymap1[keynumber]=15; commandnumber1=keymap1[keynumber]; } if ((mode1==1)&&(mode2==1)) { keymap2[keynumber]=keymap2[keynumber]-5; if (keymap2[keynumber]<15) keymap2[keynumber]=15; commandnumber2=keymap2[keynumber]; } if ((mode1==2)&&(mode2==2)) { keymap3[keynumber]=keymap3[keynumber]-5; if (keymap3[keynumber]<15) keymap3[keynumber]=15; commandnumber3=keymap3[keynumber]; } if ((mode1==3)&&(mode2==3)) { keymap4[keynumber]=keymap4[keynumber]-5; if (keymap4[keynumber]<15) keymap4[keynumber]=15; commandnumber4=keymap4[keynumber]; } } } //end of modes 1, 2, 3, 4 //****MODE 0/1****power chords if ((mode1==0)&&(mode2==1)) { slidemode=0; digitalWrite(ledPin, LOW); keyboardread(); if (keynumber==0) { commandnumber1=keymap1[10]; commandnumber2=keymap2[9]; commandnumber3=keymap3[5]; commandnumber4=keymap4[4]; //A } if (keynumber==1) { commandnumber1=keymap1[8]; commandnumber2=keymap2[7]; commandnumber3=keymap3[10]; commandnumber4=keymap4[7]; //Bm } if (keynumber==2) { commandnumber1=keymap1[6]; commandnumber2=keymap2[10]; commandnumber3=keymap3[8]; commandnumber4=keymap4[5]; //C } if (keynumber==3) { commandnumber1=keymap1[5]; commandnumber2=keymap2[9]; commandnumber3=keymap3[7]; commandnumber4=keymap4[11]; //D } if (keynumber==4) { commandnumber1=keymap1[7]; commandnumber2=keymap2[4]; commandnumber3=keymap3[2]; commandnumber4=keymap4[11]; //Dm } if (keynumber==5) { commandnumber1=keymap1[8]; commandnumber2=keymap2[5]; commandnumber3=keymap3[3]; commandnumber4=keymap4[0]; //Em } if (keynumber==6) { commandnumber1=keymap1[3]; commandnumber2=keymap2[2]; commandnumber3=keymap3[10]; commandnumber4=keymap4[9]; //F } if (keynumber==7) { commandnumber1=keymap1[7]; commandnumber2=keymap2[6]; commandnumber3=keymap3[9]; commandnumber4=keymap4[6]; //G } if (keynumber==8) { commandnumber1=keymap1[9]; commandnumber2=keymap2[8]; commandnumber3=keymap3[11]; commandnumber4=keymap4[8]; //Am } if (keynumber==9) { commandnumber1=keymap1[11]; commandnumber2=keymap2[8]; commandnumber3=keymap3[11]; commandnumber4=keymap4[10]; //Am7 } if (keynumber==10) { commandnumber1=keymap1[9]; commandnumber2=keymap2[6]; commandnumber3=keymap3[9]; commandnumber4=keymap4[8]; //A7 } if (keynumber==11) { commandnumber1=keymap1[11]; commandnumber2=keymap2[10]; commandnumber3=keymap3[6]; commandnumber4=keymap4[5]; //Bb } } //****MODE 0/2****major chords if ((mode1==0)&&(mode2==2)) { slidemode=0; digitalWrite(ledPin, LOW); keyboardread(); if (keynumber==0) { commandnumber1=keymap1[10]; commandnumber2=keymap2[9]; commandnumber3=keymap3[9]; commandnumber4=keymap4[9]; //A } if (keynumber==1) { commandnumber1=keymap1[0]; commandnumber2=keymap2[10]; commandnumber3=keymap3[10]; commandnumber4=keymap4[11]; //Bm } if (keynumber==2) { commandnumber1=keymap1[1]; commandnumber2=keymap2[9]; commandnumber3=keymap3[8]; commandnumber4=keymap4[7]; //C } if (keynumber==3) { commandnumber1=keymap1[3]; commandnumber2=keymap2[11]; commandnumber3=keymap3[10]; commandnumber4=keymap4[9]; //D } if (keynumber==4) { commandnumber1=keymap1[3]; commandnumber2=keymap2[10]; commandnumber3=keymap3[10]; commandnumber4=keymap4[9]; //Dm } if (keynumber==5) { commandnumber1=keymap1[5]; commandnumber2=keymap2[4]; commandnumber3=keymap3[3]; commandnumber4=keymap4[4]; //Em } if (keynumber==6) { commandnumber1=keymap1[6]; commandnumber2=keymap2[5]; commandnumber3=keymap3[5]; commandnumber4=keymap4[5]; //F } if (keynumber==7) { commandnumber1=keymap1[8]; commandnumber2=keymap2[7]; commandnumber3=keymap3[7]; commandnumber4=keymap4[7]; //G } if (keynumber==8) { commandnumber1=keymap1[10]; commandnumber2=keymap2[9]; commandnumber3=keymap3[8]; commandnumber4=keymap4[9]; //Am } if (keynumber==9) { commandnumber1=keymap1[8]; commandnumber2=keymap2[9]; commandnumber3=keymap3[8]; commandnumber4=keymap4[9]; //Am7 } if (keynumber==10) { commandnumber1=keymap1[8]; commandnumber2=keymap2[9]; commandnumber3=keymap3[9]; commandnumber4=keymap4[9]; //A7 } if (keynumber==11) { commandnumber1=keymap1[11]; commandnumber2=keymap2[11]; commandnumber3=keymap3[11]; commandnumber4=keymap4[11]; //Bb } } //****MODE 0/3**** blues if ((mode1==0)&&(mode2==3)) { slidemode=0; digitalWrite(ledPin, LOW); keyboardread(); if (keynumber==0) { commandnumber1=keymap1[5]; commandnumber2=keymap2[4]; commandnumber3=keymap3[4]; commandnumber4=keymap4[4]; //A } if (keynumber==1) { commandnumber1=keymap1[10]; commandnumber2=keymap2[9]; commandnumber3=keymap3[9]; commandnumber4=keymap4[9]; //Bm } if (keynumber==2) { commandnumber1=keymap1[0]; commandnumber2=keymap2[11]; commandnumber3=keymap3[11]; commandnumber4=keymap4[11]; //C } if (keynumber==3) { commandnumber1=keymap1[10]; commandnumber2=keymap2[1]; commandnumber3=keymap3[0]; commandnumber4=keymap4[4]; //D } if (keynumber==4) { commandnumber1=keymap1[8]; commandnumber2=keymap2[9]; commandnumber3=keymap3[9]; commandnumber4=keymap4[9]; //Dm } if (keynumber==5) { commandnumber1=keymap1[1]; commandnumber2=keymap2[2]; commandnumber3=keymap3[2]; commandnumber4=keymap4[2]; //Em } if (keynumber==6) { commandnumber1=keymap1[3]; commandnumber2=keymap2[4]; commandnumber3=keymap3[4]; commandnumber4=keymap4[4]; //F } if (keynumber==7) { commandnumber1=keymap1[3]; commandnumber2=keymap2[6]; commandnumber3=keymap3[5]; commandnumber4=keymap4[9]; //G } if (keynumber==8) { commandnumber1=keymap1[8]; commandnumber2=keymap2[7]; commandnumber3=keymap3[7]; commandnumber4=keymap4[7]; //Am } if (keynumber==9) { commandnumber1=keymap1[5]; commandnumber2=keymap2[4]; commandnumber3=keymap3[4]; commandnumber4=keymap4[4]; //Am7 } if (keynumber==10) { commandnumber1=keymap1[3]; commandnumber2=keymap2[2]; commandnumber3=keymap3[2]; commandnumber4=keymap4[2]; //A7 } if (keynumber==11) { commandnumber1=keymap1[5]; commandnumber2=keymap2[8]; commandnumber3=keymap3[7]; commandnumber4=keymap4[11]; //Bb } } //****MODE 0/4****universaal i VII VI etc if ((mode1==0)&&(mode2==4)) { digitalWrite(ledPin, LOW); slidemode=0; keyboardread(); if (keynumber==0) { commandnumber1=keymap1[10]; commandnumber2=keymap2[9]; commandnumber3=keymap3[8]; commandnumber4=keymap4[9]; //A } if (keynumber==1) { commandnumber1=keymap1[8]; commandnumber2=keymap2[7]; commandnumber3=keymap3[7]; commandnumber4=keymap4[7]; //Bm } if (keynumber==2) { commandnumber1=keymap1[6]; commandnumber2=keymap2[5]; commandnumber3=keymap3[5]; commandnumber4=keymap4[5]; //C } if (keynumber==3) { commandnumber1=keymap1[8]; commandnumber2=keymap2[7]; commandnumber3=keymap3[6]; commandnumber4=keymap4[7]; //D } if (keynumber==4) { commandnumber1=keymap1[3]; commandnumber2=keymap2[4]; commandnumber3=keymap3[3]; commandnumber4=keymap4[4]; //Dm } if (keynumber==5) { commandnumber1=keymap1[3]; commandnumber2=keymap2[2]; commandnumber3=keymap3[2]; commandnumber4=keymap4[2]; //Em } if (keynumber==6) { commandnumber1=keymap1[5]; commandnumber2=keymap2[4]; commandnumber3=keymap3[4]; commandnumber4=keymap4[4]; //F } if (keynumber==7) { commandnumber1=keymap1[6]; commandnumber2=keymap2[5]; commandnumber3=keymap3[4]; commandnumber4=keymap4[5]; //G } if (keynumber==8) { commandnumber1=keymap1[0]; commandnumber2=keymap2[11]; commandnumber3=keymap3[10]; commandnumber4=keymap4[11]; //Am } if (keynumber==9) { commandnumber1=keymap1[10]; commandnumber2=keymap2[9]; commandnumber3=keymap3[9]; commandnumber4=keymap4[9]; //Am7 } if (keynumber==10) { commandnumber1=keymap1[3]; commandnumber2=keymap2[1]; commandnumber3=keymap3[4]; commandnumber4=keymap4[4]; //A7 } if (keynumber==11) { commandnumber1=keymap1[5]; commandnumber2=keymap2[5]; commandnumber3=keymap3[5]; commandnumber4=keymap4[5]; //Bb } } //****MODE 0/5****hey ya chords if ((mode1==0)&&(mode2==5)) { slidemode=0; digitalWrite(ledPin, LOW); keyboardread(); if (keynumber==0) { commandnumber1=keymap1[9]; commandnumber2=keymap2[9]; commandnumber3=keymap3[7]; commandnumber4=keymap4[11]; //A } if (keynumber==1) { commandnumber1=keymap1[10]; commandnumber2=keymap2[6]; commandnumber3=keymap3[7]; commandnumber4=keymap4[11]; //Bm } if (keynumber==2) { commandnumber1=keymap1[5]; commandnumber2=keymap2[4]; commandnumber3=keymap3[7]; commandnumber4=keymap4[6]; //C } if (keynumber==3) { commandnumber1=keymap1[9]; commandnumber2=keymap2[9]; commandnumber3=keymap3[9]; commandnumber4=keymap4[8]; //D } if (keynumber==4) { commandnumber1=keymap1[5]; commandnumber2=keymap2[4]; commandnumber3=keymap3[4]; commandnumber4=keymap4[8]; //Dm } if (keynumber==5) { commandnumber1=keymap1[5]; commandnumber2=keymap2[6]; commandnumber3=keymap3[7]; commandnumber4=keymap4[9]; //Em } if (keynumber==6) { commandnumber1=keymap1[7]; commandnumber2=keymap2[11]; commandnumber3=keymap3[7]; commandnumber4=keymap4[4]; //F } if (keynumber==7) { commandnumber1=keymap1[5]; commandnumber2=keymap2[6]; commandnumber3=keymap3[4]; commandnumber4=keymap4[1]; //G } if (keynumber==8) { commandnumber1=keymap1[5]; commandnumber2=keymap2[9]; commandnumber3=keymap3[4]; commandnumber4=keymap4[4]; //Am } if (keynumber==9) { commandnumber1=keymap1[5]; commandnumber2=keymap2[6]; commandnumber3=keymap3[5]; commandnumber4=keymap4[11]; //Am7 } if (keynumber==10) { commandnumber1=keymap1[5]; commandnumber2=keymap2[11]; commandnumber3=keymap3[2]; commandnumber4=keymap4[6]; //A7 } if (keynumber==11) { commandnumber1=keymap1[2]; commandnumber2=keymap2[9]; commandnumber3=keymap3[4]; commandnumber4=keymap4[8]; //Bb } } //****MODE 0/6****paid it all chords if ((mode1==0)&&(mode2==6)) { slidemode=0; digitalWrite(ledPin, LOW); keyboardread(); if (keynumber==0) { commandnumber1=keymap1[8]; commandnumber2=keymap2[7]; commandnumber3=keymap3[7]; commandnumber4=keymap4[7]; //A } if (keynumber==1) { commandnumber1=keymap1[3]; commandnumber2=keymap2[2]; commandnumber3=keymap3[2]; commandnumber4=keymap4[2]; //Bm } if (keynumber==2) { commandnumber1=keymap1[3]; commandnumber2=keymap2[4]; commandnumber3=keymap3[3]; commandnumber4=keymap4[4]; //C } if (keynumber==3) { commandnumber1=keymap1[1]; commandnumber2=keymap2[0]; commandnumber3=keymap3[0]; commandnumber4=keymap4[0]; //D } if (keynumber==4) { commandnumber1=keymap1[8]; commandnumber2=keymap2[4]; commandnumber3=keymap3[10]; commandnumber4=keymap4[11]; //Dm } if (keynumber==5) { commandnumber1=keymap1[7]; commandnumber2=keymap2[7]; commandnumber3=keymap3[10]; commandnumber4=keymap4[9]; //Em } if (keynumber==6) { commandnumber1=keymap1[5]; commandnumber2=keymap2[7]; commandnumber3=keymap3[7]; commandnumber4=keymap4[7]; //F } if (keynumber==7) { commandnumber1=keymap1[5]; commandnumber2=keymap2[5]; commandnumber3=keymap3[8]; commandnumber4=keymap4[7]; //G } if (keynumber==8) { commandnumber1=keymap1[10]; commandnumber2=keymap2[5]; commandnumber3=keymap3[10]; commandnumber4=keymap4[7]; //Am } if (keynumber==9) { commandnumber1=keymap1[8]; commandnumber2=keymap2[7]; commandnumber3=keymap3[7]; commandnumber4=keymap4[11]; //Am7 } if (keynumber==10) { commandnumber1=keymap1[5]; commandnumber2=keymap2[0]; commandnumber3=keymap3[8]; commandnumber4=keymap4[0]; //A7 } if (keynumber==11) { commandnumber1=keymap1[3]; commandnumber2=keymap2[5]; commandnumber3=keymap3[5]; commandnumber4=keymap4[7]; //Bb } } //****MODE 0/7****random if ((mode1==0)&&(mode2==7)) { slidemode=0; digitalWrite(ledPin, LOW); keyboardread(); if (keynumber==0) { commandnumber1=keymap1[8]; commandnumber2=keymap2[7]; commandnumber3=keymap3[4]; commandnumber4=keymap4[7]; //A } if (keynumber==1) { commandnumber1=keymap1[7]; commandnumber2=keymap2[9]; commandnumber3=keymap3[6]; commandnumber4=keymap4[6]; //Bm } if (keynumber==2) { commandnumber1=keymap1[5]; commandnumber2=keymap2[4]; commandnumber3=keymap3[7]; commandnumber4=keymap4[10]; //C } if (keynumber==3) { commandnumber1=keymap1[11]; commandnumber2=keymap2[8]; commandnumber3=keymap3[6]; commandnumber4=keymap4[8]; //D } if (keynumber==4) { commandnumber1=keymap1[5]; commandnumber2=keymap2[5]; commandnumber3=keymap3[8]; commandnumber4=keymap4[11]; //Dm } if (keynumber==5) { commandnumber1=keymap1[7]; commandnumber2=keymap2[7]; commandnumber3=keymap3[10]; commandnumber4=keymap4[9]; //Em } if (keynumber==6) { commandnumber1=keymap1[5]; commandnumber2=keymap2[7]; commandnumber3=keymap3[7]; commandnumber4=keymap4[7]; //F } if (keynumber==7) { commandnumber1=keymap1[5]; commandnumber2=keymap2[5]; commandnumber3=keymap3[8]; commandnumber4=keymap4[7]; //G } if (keynumber==8) { commandnumber1=keymap1[10]; commandnumber2=keymap2[5]; commandnumber3=keymap3[10]; commandnumber4=keymap4[7]; //Am } if (keynumber==9) { commandnumber1=keymap1[8]; commandnumber2=keymap2[7]; commandnumber3=keymap3[7]; commandnumber4=keymap4[11]; //Am7 } if (keynumber==10) { commandnumber1=keymap1[5]; commandnumber2=keymap2[0]; commandnumber3=keymap3[8]; commandnumber4=keymap4[0]; //A7 } if (keynumber==11) { commandnumber1=keymap1[3]; commandnumber2=keymap2[5]; commandnumber3=keymap3[5]; commandnumber4=keymap4[7]; //Bb } } //****MODE 10/10***load saved keymaps if ((mode1==10)&&(mode2==10) && norepeat==1) { norepeat=0; digitalWrite(ledPin, LOW); int temptest=0; int i; for (i = 0; i < 12; i = i + 1) //loop through array in EEPROM { lsbyte=EEPROM.read(i*2+48); msbyte=EEPROM.read(i*2+49); temptest=lsbyte+(256*msbyte); if (temptest!=keymap1[i]) { digitalWrite(ledPin, LOW); delay(100); digitalWrite(ledPin, HIGH); delay (100); } keymap1[i]=lsbyte+(256*msbyte); lsbyte=EEPROM.read(i*2+72); msbyte=EEPROM.read(i*2+73); keymap2[i]=lsbyte+(256*msbyte); lsbyte=EEPROM.read(i*2+96); msbyte=EEPROM.read(i*2+97); keymap3[i]=lsbyte+(256*msbyte); lsbyte=EEPROM.read(i*2+120); msbyte=EEPROM.read(i*2+121); keymap4[i]=lsbyte+(256*msbyte); } } //****MODE 11/11***save keymaps if ((mode1==11)&&(mode2==11) && norepeat==1) { norepeat=0; digitalWrite(ledPin, LOW); delay(100); digitalWrite(ledPin, HIGH); delay (100); digitalWrite(ledPin, LOW); delay(100); digitalWrite(ledPin, HIGH); delay (100); digitalWrite(ledPin, LOW); delay(100); int j; for (j = 0; j < 12; j = j + 1) { lsbyte=keymap1[j] & 0x00FF; msbyte=keymap1[j]/256; EEPROM.write(j*2+48, lsbyte); EEPROM.write(j*2+49, msbyte); lsbyte=keymap2[j] & 0x00FF; msbyte=keymap2[j]/256; EEPROM.write(j*2+72, lsbyte); EEPROM.write(j*2+73, msbyte); lsbyte=keymap3[j] & 0x00FF; msbyte=keymap3[j]/256; EEPROM.write(j*2+96, lsbyte); EEPROM.write(j*2+97, msbyte); lsbyte=keymap4[j] & 0x00FF; msbyte=keymap4[j]/256; EEPROM.write(j*2+120, lsbyte); EEPROM.write(j*2+121, msbyte); } } //****MODE 5/5****keyboard test if ((mode1==5)&&(mode2==5)) { digitalWrite(ledPin, LOW); keyboardread(); commandnumber1=keynumber*90; } //************************************************************************* //*******************slide mode********************************* //is slide mode on if (slidemode==1) { if (keychange==1) { newcommand1=commandnumber1; //figure out 1/40 distance between notes commandstep1=(newcommand1-oldcommand1)/40; rampcount1=0; rampdelay1=0; startpoint1=oldcommand1; oldcommand1=newcommand1; newcommand2=commandnumber2; //figure out 1/40 distance between notes commandstep2=(newcommand2-oldcommand2)/40; rampcount2=0; rampdelay2=0; startpoint2=oldcommand2; oldcommand2=newcommand2; newcommand3=commandnumber3; //figure out 1/40 distance between notes commandstep3=(newcommand3-oldcommand3)/40; rampcount3=0; rampdelay3=0; startpoint3=oldcommand3; oldcommand3=newcommand3; newcommand4=commandnumber4; //figure out 1/40 distance between notes commandstep4=(newcommand4-oldcommand4)/40; rampcount4=0; rampdelay4=0; startpoint4=oldcommand4; oldcommand4=newcommand4; } //STRING1 commandnumber1=startpoint1+commandstep1*rampcount1; if (rampcount1>40) { rampcount1=41; commandnumber1=newcommand1; } rampdelay1=rampdelay1+1; if (rampdelay1>delayconstant) //(about on second) { rampdelay1=0; rampcount1=rampcount1+1; } //STRING2 commandnumber2=startpoint2+commandstep2*rampcount2; if (rampcount2>40) { rampcount2=41; commandnumber2=newcommand2; } rampdelay2=rampdelay2+1; if (rampdelay2>delayconstant) //(about on second) { rampdelay2=0; rampcount2=rampcount2+1; } //STRING3 commandnumber3=startpoint3+commandstep3*rampcount3; if (rampcount3>40) { rampcount3=41; commandnumber3=newcommand3; } rampdelay3=rampdelay3+1; if (rampdelay3>delayconstant) //(about on second) { rampdelay3=0; rampcount3=rampcount3+1; } //STRING4 commandnumber4=startpoint4+commandstep4*rampcount4; if (rampcount4>40) { rampcount4=41; commandnumber4=newcommand4; } rampdelay4=rampdelay4+1; if (rampdelay4>delayconstant) //(about on second) { rampdelay4=0; rampcount4=rampcount1+1; } } ///end of slide mode //************************************************************************************* //update servoloop for all modes //read pot values feedback1=analogRead(sinput1); //get pot value feedback2=analogRead(sinput2); feedback3=analogRead(sinput3); feedback4=analogRead(sinput4); // map the rawerror between commandnumber (0-1024) and feedback (0-1024) to (0-2048) (always positive) if (commandnumber1>=feedback1) rawerror1=commandnumber1-feedback1+1024; if (commandnumber1=feedback2) rawerror2=commandnumber2-feedback2+1024; if (commandnumber2=feedback3) rawerror3=commandnumber3-feedback3+1024; if (commandnumber3=feedback4) rawerror4=commandnumber4-feedback4+1024; if (commandnumber41)||((rawerror1-1024)<-1)) //deadzone to stop hunting { integratefactor1=integratefactor1+((rawerror1-1024)/250); } if (abs(feedback1-oldfeedback1)>0) //check for motion to reset integrator { integratefactor1=0; oldfeedback1=feedback1; } // STRING 2 if (((rawerror2-1024)>1)||((rawerror2-1024)<-1)) //deadzone to stop hunting { integratefactor2=integratefactor2+((rawerror2-1024)/250); } if (abs(feedback2-oldfeedback2)>0) //check for motion to reset integrator { integratefactor2=0; oldfeedback2=feedback2; } // STRING 3 if (((rawerror1-1024)>3)||((rawerror3-1024)<-1)) //deadzone to stop hunting { integratefactor3=integratefactor3+((rawerror3-1024)/250); } if (abs(feedback3-oldfeedback3)>0) //check for motion to reset integrator { integratefactor3=0; oldfeedback3=feedback3; } // STRING 4 if (((rawerror4-1024)>1)||((rawerror4-1024)<-1)) //deadzone to stop hunting { integratefactor4=integratefactor4+((rawerror4-1024)/250); } if (abs(feedback4-oldfeedback4)>0) //check for motion to reset integrator { integratefactor4=0; oldfeedback4=feedback4; } //****************************************************************** //disabled all integration motorout1=rawerror1/gainfactor1 +(int)integratefactor1; motorout2=rawerror2/gainfactor2 +(int)integratefactor2; motorout3=rawerror3/gainfactor3 +(int)integratefactor3; motorout4=rawerror4/gainfactor4 +(int)integratefactor4; //note: rawerror varies from 0 to 2048 (1024 is zero error) so gains less //than 8 must have clipping for rawerror if (motorout1>255) motorout1=255; //boost gain in software as you get close if (motorout1<0) motorout1=0; if (motorout2>255) motorout2=255; //boost gain in software if (motorout2<0) motorout2=0; if (motorout3>255) motorout3=255; //boost gain in software if (motorout3<0) motorout3=0; if (motorout4>255) motorout4=255; //boost gain in software if (motorout4<0) motorout4=0; //overshoot control if ((motorout1>192)&&((rawerror1>1280)||(rawerror1<768))) motorout1=192; if ((motorout1<64)&&((rawerror1>1280)||(rawerror1<768))) motorout1=64; if ((motorout2>192)&&((rawerror2>1280)||(rawerror2<768))) motorout2=192; if ((motorout2<64)&&((rawerror2>1280)||(rawerror2<768))) motorout2=64; if ((motorout3>192)&&((rawerror3>1280)||(rawerror3<768))) motorout3=192; if ((motorout3<64)&&((rawerror3>1280)||(rawerror3<768))) motorout3=64; if ((motorout4>192)&&((rawerror4>1280)||(rawerror4<768))) motorout4=192; if ((motorout4<64)&&((rawerror4>1280)||(rawerror4<768))) motorout4=64; analogWrite(motor1,motorout1); //analog input is 1024 max analogWrite(motor2,motorout2); //analog input is 1024 max analogWrite(motor3,motorout3); //analog input is 1024 max analogWrite(motor4,motorout4); //analog input is 1024 max keychange=0; oldkeynumber=keynumber; } //end of loop