/* RakuChord Mobile Source made by ina MIT LICENSE */ #define SCK 13 #define MOSI 11 #define SS 10 byte tones[] = { 140, 132, 124, 117, 111, 105, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59, 55, 52, 49, 47, 44, 42, 39, 37, 35, 33, 31, 29 }; byte tindex[] = {3+0 ,3+2 ,3+4 ,3+5 ,3+7 ,3+9,3+11}; byte tindex2[] = {3+ 0 +1 ,3+ 2 +1,3+ 4 -1,3+ 5 +1,3+ 7 +1,3+ 9 -1,3+ 11 -1}; boolean indSel[] = {0,0,0,0,0,0,0}; boolean trigger[] = {0,0,0,0,0,0,0,0}; byte stable[256]; byte chords[24][3]; byte schords[24][3]; byte mchords[24][3]; boolean types[7] = {0,1,1,0,0,1,1}; byte timerLoadValue = 255; char spi_transfer(volatile char data){ //transfar 1byte=8bit SPDR = data; //start the transmission while(!(SPSR & (1<=acc)osc-=acc; osc2+=dds; if(acc2!=0)while(osc2>=acc2)osc2-=acc2; osc3+=dds; if(acc3!=0)while(osc3>=acc3)osc3-=acc3; osc4+=dds << (sdds + mdds); if(acc4!=0)while(osc4>=acc4)osc4-=acc4; if(fact!=0 || fact2!=0){ out = 0; out2 = 0; oout=0; if(sinFlag==0){ // saw if(acc!=0) { tmp = (osc << 2); ctmp=0; while(tmp>=acc){tmp-=acc;ctmp++;} // tmp/acc out += (ctmp << 5); } if(acc2!=0) { tmp = (osc2 << 2); ctmp=0; while(tmp>=acc2){tmp-=acc2;ctmp++;} // tmp/acc2 out += (ctmp << 5); } if(acc3!=0) { tmp = (osc3 << 2); ctmp=0; while(tmp>=acc3){tmp-=acc3;ctmp++;} // tmp/acc3 out += (ctmp << 5); } if(acc4!=0) { tmp = (osc4 << 2); ctmp=0; while(tmp>=acc4){tmp-=acc4;ctmp++;} // tmp/acc4 out2 += (ctmp << 5); } }else if(sinFlag==1){ // sin mode if(acc!=0) { tmp = (osc << 3); ctmp=0; while(tmp>=acc){tmp-=acc;ctmp++;} out += stable[(ctmp << 5)]; } if(acc2!=0) { tmp = (osc2 << 3); ctmp=0; while(tmp>=acc2){tmp-=acc2;ctmp++;} out += stable[(ctmp << 5)]; } if(acc3!=0) { tmp = (osc3 << 3); ctmp=0; while(tmp>=acc3){tmp-=acc3;ctmp++;} out += stable[(ctmp << 5)]; } if(acc4!=0) { tmp = (osc4 << 3); ctmp=0; while(tmp>=acc4){tmp-=acc4;ctmp++;} out2 += stable[(ctmp << 5)]; } }else{ // square if(acc!=0) out += (osc>(acc>>1))?0:128; if(acc2!=0)out += (osc2>(acc2>>1))?0:128; if(acc3!=0)out += (osc3>(acc3>>1))?0:128; if(acc4!=0)out2 = (osc4>(acc4>>1))?0:128; } out = (fact==0?0:(out *fact>>4)) + (fact2==0?0:(out2*fact2>>4)) + (out>>1); digitalWrite(SS,LOW); spi_transfer(0b00010000 | ((out>>8)&0xf)); // to dac spi_transfer(out&0xff); digitalWrite(SS,HIGH); } } int an3; char s[6]; int t; unsigned int pushedTime = 0; int slider; int slider2; byte settingMode = 0; boolean settingSw = false; int alpeTimer =0; byte alpeData[4]={1,2,3,4}; byte alpeStep=1; byte alpeIndex; byte alpeSdds; byte toneShift; void setTone(int index,boolean tts){ // tts ( is Shift?) if(index>=7){ index = index%7; if(indSel[index]==(tts?1:0))acc4 = tones[tindex[index]]; else acc4 = tones[tindex2[index]]; mdds = 1; }else{ index = index%7; if(indSel[index]==(tts?1:0))acc4 = tones[tindex[index]]; else acc4 = tones[tindex2[index]]; mdds = 0; } } int pushB(int* pre,int now,int* count){ if(*pre != now){ *count = *count + 1; if(*count > 120){ // wait *pre =now; *count = 0; } } return *pre; } int preT = 0; int countT = 0; int preT2 = 0; int countT2 = 0; int preC = 0; int countC=0; boolean trig14=false; boolean check = false; boolean tmpToneShift = false; boolean tmpChordShift = false; boolean chordDelay = true; boolean toneDelay = true; void loop(){ sw = -1; count = (count + 1)&127; // mod 128 timer int an1 =analogRead(2); //chord buttons if(an1<700) sw = pushB(&preC,-1,&countC); else if(an1<810)sw = pushB(&preC,0,&countC); else if(an1<840)sw = pushB(&preC,1,&countC); else if(an1<870)sw = pushB(&preC,2,&countC); else if(an1<910)sw = pushB(&preC,3,&countC); else if(an1<950)sw = pushB(&preC,4,&countC); else if(an1<990)sw = pushB(&preC,5,&countC); else sw = pushB(&preC,6,&countC); slider=analogRead(1); // tone buttons if(slider<700) slider = pushB(&preT,-1,&countT); else if(slider<810)slider = pushB(&preT,0,&countT); else if(slider<840)slider = pushB(&preT,1,&countT); else if(slider<870)slider = pushB(&preT,2,&countT); else if(slider<910)slider = pushB(&preT,3,&countT); else if(slider<950)slider = pushB(&preT,4,&countT); else if(slider<990)slider = pushB(&preT,5,&countT); else slider = pushB(&preT,6,&countT); slider2 = analogRead(3); //Serial.println(slider); if(slider2<700)if(slider==-1){slider = pushB(&preT2,-1,&countT2);}else{} else if(slider2<810)slider = pushB(&preT2,7,&countT2); else if(slider2<840)slider = pushB(&preT2,8,&countT2); else if(slider2<870)slider = pushB(&preT2,9,&countT2); else if(slider2<910)slider = pushB(&preT2,10,&countT2); else if(slider2<950)slider = pushB(&preT2,11,&countT2); else if(slider2<990)slider = pushB(&preT2,12,&countT2); else slider = pushB(&preT2,13,&countT2); if(count==0){ /* //an3 = analogRead(3); itoa(slider2,s,10); strcat(s," "); putStr(s); */ check=!check; digitalWrite(5,check); // heart beat LED } { t = analogRead(0); // m,M,sus4 button if(t<900){ tMode = 0; dToggle = 0; } else if(t<940)tMode = 2; else if(t<990)tMode = 1; else tMode = 3; } if(dMode<=3){ if(slider!=-1){ tmpToneShift = !(digitalRead(7)); setTone(slider+toneShift,tmpToneShift); fact2 = 64; }else{ // volume down if(fact2>16 && count==0)fact2-=4; if(fact2>0 && count==0)if(toneDelay)fact2--;else fact2 = 0; } settingSw = digitalRead(8); // setting sw if(slider!=-1){ //tone pressed? if(settingSw == LOW){ if(trig14==false){ // setting trigger trig14=true; switch(slider){ case 0: // table change sinFlag = (sinFlag+1) % 4; break; case 1: // toneDelay = !toneDelay; break; case 2: // chordDelay = !chordDelay; break; case 3: // base octave dds = (dds + 1) % 4; break; case 4: //alpe dMode = dMode==0?3:0; break; case 5: //alpe step alpeStep = (alpeStep + 1)%4; break; case 6: // Chord <-> Tone octave sdds = (sdds + 1)%4; break; case 7: // alpe pattern alpeData[0] = (alpeData[0]+1)%5; break; case 8: alpeData[1] = (alpeData[1]+1)%5; break; case 9: alpeData[2] = (alpeData[2]+1)%5; break; case 10: alpeData[3] = (alpeData[3]+1)%5; break; } } }else{ trig14=false; } } if(count==0)alpeTimer++; if(alpeTimer>=alpeStep){ alpeIndex=(alpeIndex+1)%4; alpeTimer = 0; } if(sw!=-1){ //chord pressed? cli(); if(settingSw==LOW){ // setting type(sus4,M,m) if(trig14==false){ if(tMode==0){ // not push type button indSel[sw] = (indSel[sw]+1) & 0x1; // sharp or flat }else if(tMode==1)types[sw] = 0; //major else if(tMode==2)types[sw] = 1; //minor trig14=true; } }else{ trig14=false; } tmpChordShift = !(digitalRead(9)); if(indSel[sw]==(tmpChordShift?1:0))tsw = tindex[sw]; else tsw = tindex2[sw]; accS = tones[(tsw+10)%12]; //seventh if((types[sw]==0 && tMode==0) || tMode==1){ //major chord or normal mode acc = chords[tsw][0]; acc2 = chords[tsw][1]; acc3 = chords[tsw][2]; }else if((types[sw]==1 && tMode==0) || tMode==2){ // minor chord or abnormal mode acc = mchords[tsw][0]; acc2 = mchords[tsw][1]; acc3 = mchords[tsw][2]; }else if(tMode==3){ // sus4 chord acc = schords[tsw][0]; acc2 = schords[tsw][1]; acc3 = schords[tsw][2]; } if(dMode==1){ //single tone mode (no use now) acc2 = 0; acc3 = 0; acc4 = 0; switch(tMode){ case 2: acc = tones[0+15]; // up C break; case 1: acc = tones[0+17]; // up D break; case 3: acc = tones[0+19]; // up E break; } } else if(dMode==2){ // not chord (no use now) fact = 0; } else if(dMode==3){ // alpe? (use now) if(pushedTime==0){ // timer alpeTimer = 0; fact2 = 64; } switch(alpeData[alpeIndex]){ case 0: acc = 0; acc2 = 0; acc3 = 0; break; case 1: acc2 = 0; acc3 = 0; break; case 2: acc = 0; acc3 = 0; break; case 3: acc = 0; acc2 = 0; break; case 4: acc = acc << 1; acc2 = 0; acc3 = 0; break; } }else if(dMode==0){ // normal } if(pushedTime==0){ fact = 48; acc4 = 0; } else if(fact>64 && count==0)fact-=4; // volume down if(likeGuitar!=0){ // not use if(pushedTime<100*likeGuitar){acc2=0;acc3=0;} else if(pushedTime<200*likeGuitar){acc3=0;} } pushedTime++; sei(); }else{ if(fact>0 && count==0)if(chordDelay)fact--;else fact = 0; pushedTime = 0; } } }