diff --git a/Soft/Rp2040/Rp2040.ino b/Soft/Rp2040/Rp2040.ino index 412061c7137a9b3c29701def45c0799b75e73e18..805b717e3193ab6022c8fc2559bcfbaf33281bbf 100644 --- a/Soft/Rp2040/Rp2040.ino +++ b/Soft/Rp2040/Rp2040.ino @@ -1,47 +1,58 @@ #include <hardware/pwm.h> - -float osc_progress[6];//0~4=chord osc , 5=bass osc , 6=arpeggio osc +#define MODESWITCH_PIN_A 0 +#define MODESWITCH_PIN_B 1 +#define PUSHBUTTON_PIN 6 +#define VOCT_PIN 26 +#define FREQ_POT_PIN 27 +#define INVERSION_PIN 28 +#define CHORD_POT_PIN 29 + +// 0-4=chord osc , 5=bass osc , 6=arpeggio osc +float osc_progress[6]; int osc_inverse[4]; -float osc_scale_rate[5];//0~3=chord osc , 6=arpeggio osc +float osc_scale_rate[5]; // 0~3=chord osc , 6=arpeggio osc int slice_num = 0; float osc_freq = 0; -int wavetable[256];//1024 resolution , 256 rate -float calb = 1.11;//calibration for reduce resistance error +int wavetable[256]; // 1024 resolution , 256 rate +float calb = 1.11; // calibration for reduce resistance error int adc, freq_pot; -int waveform = 0; -int f0 = 35;//base osc frequency - -int j=0; -int select_mode=0;//0=chord without root , 1=chord with root,2=arpeggio -int inversion=0;//0-7 -int old_invAD=0;//countermeasure of input ADC noise -int new_invAD=0;//countermeasure of input ADC noise +int waveform_selection = 0; +int f0 = 35; // base osc frequency + +int j = 0; +int select_mode = 0; // 0=chord without root , 1=chord with root,2=arpeggio +int inversion = 0; // 0-7 +int old_invAD = 0; // countermeasure of input ADC noise +int new_invAD = 0; // countermeasure of input ADC noise bool push_sw, old_push_sw;//push sw int qnt[32]; -int thr=0;//threshold number -const static int majqnt[32]={// major scale quantize value -0, 34, 68, 85, 119, 153, 205, 239, 273, 290, 324, 358, 409, 443, 477, 494, 529, 563, 614, 648, 682, 699, 733, 767, 818, 853, 887, 904, 938, 972, 1023 -}; +int thr=0; // threshold number -const static int majthr[32]={// major scale quantize threshold - 0, 17, 51, 85, 102, 136, 171, 222, 256, 290, 307, 341, 375, 426, 460, 494, 512, 546, 580, 631, 665, 699, 716, 750, 784, 835, 870, 904, 921, 955, 989,1024 +// Quantization values for the Major Scale +const static int majqnt[32]={ +0, 34, 68, 85, 119, 153, 205, 239, 273, 290, 324, 358, 409, 443, 477, 494, 529, 563, 614, 648, 682, 699, 733, 767, 818, 853, 887, 904, 938, 972, 1023 }; - -const static int minqnt[32]={// minor scale quantize value -0, 34, 51, 85, 119, 136, 205, 239, 256, 290, 324, 341, 409, 443, 460, 494, 529, 546, 614, 648, 665, 699, 733, 750, 818, 853, 870, 904, 938, 955, 1023 +// Quantizer Threshold values for the Major Scale +const static int majthr[32]={ + 0, 17, 51, 85, 102, 136, 171, 222, 256, 290, 307, 341, 375, 426, 460, 494, 512, 546, 580, 631, 665, 699, 716, 750, 784, 835, 870, 904, 921, 955, 989,1024 }; -const static int minthr[32]={// minor scale quantize threshold - 17, 43, 68, 102, 128, 171, 222, 248, 273, 307, 333, 375, 426, 452, 477, 512, 538, 580, 631, 657, 682, 716, 742, 784, 836, 862, 887, 921, 947, 989, 1024 +// Quantization values for the Minor Scale +const static int minqnt[32]={ +0, 34, 51, 85, 119, 136, 205, 239, 256, 290, 324, 341, 409, 443, 460, 494, 529, 546, 614, 648, 665, 699, 733, 750, 818, 853, 870, 904, 938, 955, 1023 +}; +// Quantizer Threshold values for the Minor Scale +const static int minthr[32]={ + 17, 43, 68, 102, 128, 171, 222, 248, 273, 307, 333, 375, 426, 452, 477, 512, 538, 580, 631, 657, 682, 716, 742, 784, 836, 862, 887, 921, 947, 989, 1024 }; //------------chord------------ float freq_rate[61]={ -1, 1.059, 1.122, 1.189, 1.26, 1.335, 1.414, 1.498, 1.587, 1.682, 1.782, 1.888, 2, 2.059, 2.122, 2.189, 2.26, 2.335, 2.414, 2.498, 2.587, 2.682, 2.782, 2.888, 3, 3.059, 3.122, 3.189, 3.26, 3.335, 3.414, 3.498, 3.587, 3.682, 3.782, 3.888, 4, 4.059, 4.122, 4.189, 4.26, 4.335, 4.414, 4.498, 4.587, 4.682, 4.782, 4.888, 5, 5.059, 5.122, 5.189, 5.26, 5.335, 5.414, 5.498, 5.587, 5.682, 5.782, 5.888, 6 +1, 1.059, 1.122, 1.189, 1.26, 1.335, 1.414, 1.498, 1.587, 1.682, 1.782, 1.888, 2, 2.059, 2.122, 2.189, 2.26, 2.335, 2.414, 2.498, 2.587, 2.682, 2.782, 2.888, 3, 3.059, 3.122, 3.189, 3.26, 3.335, 3.414, 3.498, 3.587, 3.682, 3.782, 3.888, 4, 4.059, 4.122, 4.189, 4.26, 4.335, 4.414, 4.498, 4.587, 4.682, 4.782, 4.888, 5, 5.059, 5.122, 5.189, 5.26, 5.335, 5.414, 5.498, 5.587, 5.682, 5.782, 5.888, 6 }; -int chord_mode=2;//0=maj 3chord,1=min 3chord,2=tension maj 4chord,3=maj 4chord,4=min 4chord,5=tension min 4chord +int chord_mode = 2;//0=maj 3chord,1=min 3chord,2=tension maj 4chord,3=maj 4chord,4=min 4chord,5=tension min 4chord int chord_3[3][3]={ {0,4,7},//maj @@ -81,15 +92,18 @@ float freq_table[2048]; void setup1() { } -void setup() -{ - //Serial.begin(9600);//for development - pinMode(0, INPUT_PULLUP);//mode select - pinMode(1, INPUT_PULLUP);//mode select - pinMode(6, INPUT_PULLUP);//push sw +void setup() { + // Mode select switch is a On-Off-On switch with the outer pins connected + // to the pins 0 and 1. + pinMode(MODESWITCH_PIN_A, INPUT_PULLUP); + pinMode(MODESWITCH_PIN_B, INPUT_PULLUP); + + // Push Button + pinMode(PUSHBUTTON_PIN, INPUT_PULLUP);//push sw - table_set();//set wavetable - qnt_set(); + // Create the waveform and put it into the wavetable + wavetable_populate(); + quantizer_select(); //-------------------octave select------------------------------- for (int i = 0; i < 1230; i++) {//Covers 6(=1230) octaves. If it is 1230 or more, the operation becomes unstable. freq_table[i] = f0 * pow(2, (voctpow[i])); @@ -107,350 +121,363 @@ void setup() irq_set_exclusive_handler(PWM_IRQ_WRAP, on_pwm_wrap); irq_set_enabled(PWM_IRQ_WRAP, true); - //set PWM frequency - pwm_set_clkdiv(slice_num, 4);//=sysclock/((resolution+1)*frequency) - pwm_set_wrap(slice_num, 1023);//resolutio - pwm_set_enabled(slice_num, true);//PWM output enable + // Set PWM frequency + pwm_set_clkdiv(slice_num, 4); + pwm_set_wrap(slice_num, 1023); // Resolution + pwm_set_enabled(slice_num, true); // PWM output enable } +// Timer that pushes out the actual audio. void on_pwm_wrap() { pwm_clear_irq(slice_num); -// if(select_mode!=2){ - if(chord_mode==2 ||chord_mode==3 ||chord_mode==4){ - osc_progress[0]=osc_progress[0]+ osc_freq*osc_scale_rate[0]; - osc_progress[1]=osc_progress[1]+ osc_freq*osc_scale_rate[1]; - osc_progress[2]=osc_progress[2]+ osc_freq*osc_scale_rate[2]; - osc_progress[4]=osc_progress[4]+ osc_freq*osc_scale_rate[0]/2;//bass - osc_progress[5]=osc_progress[5]+ osc_freq*osc_scale_rate[4];//arpeggio - } - else if(chord_mode==0 ||chord_mode==1||chord_mode==5){ - osc_progress[0]=osc_progress[0]+ osc_freq*osc_scale_rate[0]; - osc_progress[1]=osc_progress[1]+ osc_freq*osc_scale_rate[1]; - osc_progress[2]=osc_progress[2]+ osc_freq*osc_scale_rate[2]; - osc_progress[3]=osc_progress[3]+ osc_freq*osc_scale_rate[3]; - osc_progress[4]=osc_progress[4]+ osc_freq*osc_scale_rate[0]/2;//bass - osc_progress[5]=osc_progress[5]+ osc_freq*osc_scale_rate[4];//arpeggio + if (chord_mode == 2 || chord_mode == 3 || chord_mode == 4) { + osc_progress[0] = osc_progress[0] + osc_freq * osc_scale_rate[0]; + osc_progress[1] = osc_progress[1] + osc_freq * osc_scale_rate[1]; + osc_progress[2] = osc_progress[2] + osc_freq * osc_scale_rate[2]; + osc_progress[4] = osc_progress[4] + osc_freq * osc_scale_rate[0] / 2; // bass + osc_progress[5] = osc_progress[5] + osc_freq * osc_scale_rate[4]; // arpeggio } - -for(byte i = 0; i < 6; i++){ - if (osc_progress[i] > 255) { - osc_progress[i] = 0; + else if (chord_mode == 0 || chord_mode == 1|| chord_mode == 5) { + osc_progress[0] = osc_progress[0] + osc_freq * osc_scale_rate[0]; + osc_progress[1] = osc_progress[1] + osc_freq * osc_scale_rate[1]; + osc_progress[2] = osc_progress[2] + osc_freq * osc_scale_rate[2]; + osc_progress[3] = osc_progress[3] + osc_freq * osc_scale_rate[3]; + osc_progress[4] = osc_progress[4] + osc_freq * osc_scale_rate[0] / 2; // bass + osc_progress[5] = osc_progress[5] + osc_freq * osc_scale_rate[4]; // arpeggio } -} - if(select_mode!=2){ - if((chord_mode==2 ||chord_mode==3 ||chord_mode==4)&& select_mode==0){ - pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/4+wavetable[(int)osc_progress[1]]/4+wavetable[(int)osc_progress[3]]/4+511); - } - else if((chord_mode==2 ||chord_mode==3 ||chord_mode==4)&& select_mode==1){ - pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/4+wavetable[(int)osc_progress[1]]/4+wavetable[(int)osc_progress[2]]/4+wavetable[(int)osc_progress[4]]/4+511); - } - else if((chord_mode==0 ||chord_mode==1||chord_mode==5) && select_mode==0){ - pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/5+wavetable[(int)osc_progress[1]]/5+wavetable[(int)osc_progress[2]]/5+wavetable[(int)osc_progress[3]]/5+511); - } - else if((chord_mode==0 ||chord_mode==1||chord_mode==5) && select_mode==1){ - pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/5+wavetable[(int)osc_progress[1]]/5+wavetable[(int)osc_progress[2]]/5+wavetable[(int)osc_progress[3]]/5+wavetable[(int)osc_progress[4]]/5+511); - } + for(byte i = 0; i < 6; i++){ + if (osc_progress[i] > 255) { + osc_progress[i] = 0; + } } - else if(select_mode==2){ + if (select_mode != 2){ + if ((chord_mode==2 || chord_mode==3 || chord_mode==4) && select_mode == 0) { + pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/4+wavetable[(int)osc_progress[1]]/4+wavetable[(int)osc_progress[3]]/4+511); + } else if ((chord_mode == 2 ||chord_mode == 3 ||chord_mode == 4) && select_mode == 1) { + pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/4+wavetable[(int)osc_progress[1]]/4+wavetable[(int)osc_progress[2]]/4+wavetable[(int)osc_progress[4]]/4+511); + } else if ((chord_mode == 0 || chord_mode == 1|| chord_mode == 5) && select_mode == 0) { + pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/5+wavetable[(int)osc_progress[1]]/5+wavetable[(int)osc_progress[2]]/5+wavetable[(int)osc_progress[3]]/5+511); + } else if ((chord_mode == 0 || chord_mode == 1|| chord_mode == 5) && select_mode == 1) { + pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/5+wavetable[(int)osc_progress[1]]/5+wavetable[(int)osc_progress[2]]/5+wavetable[(int)osc_progress[3]]/5+wavetable[(int)osc_progress[4]]/5+511); + } + } else if (select_mode == 2){ pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[5]]/2+511); } } -void loop() -{ +void loop() { old_push_sw = push_sw; - // -------------------frequeny calculation------------------------------- - adc = analogRead(26) * calb;//Correct resistance errors - qnt_set(); - freq_pot = map(analogRead(27), 0, 1023, 0, 127); + // -------------------frequeny calculation------------------------------- + adc = analogRead(VOCT_PIN) * calb; // Correct resistance errors + quantizer_select(); + freq_pot = map(analogRead(FREQ_POT_PIN), 0, 1023, 0, 127); osc_freq = freq_table[qnt[thr] + freq_pot]; // V/oct apply osc_freq = 256 * osc_freq / 122070 * 8;//7 is base octave - Serial.print(analogRead(26));//for development - Serial.print(",");//for development - Serial.print(adc);//for development - Serial.println("");//for development + Serial.print(analogRead(VOCT_PIN)); + Serial.print(","); + Serial.print(adc); + Serial.println(""); - // -------------------chord mode select------------------------------- - chord_mode = analogRead(29)/171;//171=1023/6 , 6 is amount of chord mode + // -------------------chord mode select------------------------------- + chord_mode = analogRead(CHORD_POT_PIN)/171; //171=1023/6 , 6 is amount of chord mode - //---------------------inversion--------------------- - old_invAD=new_invAD;//countermeasure of noise - new_invAD=analogRead(28); - if(abs(old_invAD-new_invAD)<4){//countermeasure of noise - new_invAD=old_invAD; + // ---------------------inversion--------------------- + old_invAD = new_invAD; // countermeasure of noise + new_invAD = analogRead(INVERSION_PIN); + if (abs(old_invAD-new_invAD)<4){//countermeasure of noise + new_invAD = old_invAD; } - inversion=new_invAD/125; - - if(chord_mode==2 ||chord_mode==3 ||chord_mode==4){//3 chord - switch(inversion){ - case 0: - osc_inverse[0]=1; - osc_inverse[1]=1; - osc_inverse[2]=1; - osc_scale_rate[4]=osc_scale_rate[0]; - break; - - case 1: - osc_inverse[0]=2; - osc_inverse[1]=1; - osc_inverse[2]=1; - osc_scale_rate[4]=osc_scale_rate[1]; - break; + inversion = new_invAD/125; + + if (chord_mode == 2 || chord_mode == 3 || chord_mode == 4){//3 chord + switch(inversion){ + case 0: + osc_inverse[0] = 1; + osc_inverse[1] = 1; + osc_inverse[2] = 1; + osc_scale_rate[4] = osc_scale_rate[0]; + break; + + case 1: + osc_inverse[0] = 2; + osc_inverse[1] = 1; + osc_inverse[2] = 1; + osc_scale_rate[4] = osc_scale_rate[1]; + break; - case 2: - osc_inverse[0]=2; - osc_inverse[1]=2; - osc_inverse[2]=1; - osc_scale_rate[4]=osc_scale_rate[2]; - break; + case 2: + osc_inverse[0] = 2; + osc_inverse[1] = 2; + osc_inverse[2] = 1; + osc_scale_rate[4] = osc_scale_rate[2]; + break; - case 3: - osc_inverse[0]=2; - osc_inverse[1]=2; - osc_inverse[2]=2; - osc_scale_rate[4]=osc_scale_rate[0]; - break; + case 3: + osc_inverse[0] = 2; + osc_inverse[1] = 2; + osc_inverse[2] = 2; + osc_scale_rate[4] = osc_scale_rate[0]; + break; - case 4: - osc_inverse[0]=4; - osc_inverse[1]=2; - osc_inverse[2]=2; - osc_scale_rate[4]=osc_scale_rate[1]; - break; + case 4: + osc_inverse[0] = 4; + osc_inverse[1] = 2; + osc_inverse[2] = 2; + osc_scale_rate[4] = osc_scale_rate[1]; + break; - case 5: - osc_inverse[0]=4; - osc_inverse[1]=4; - osc_inverse[2]=2; - osc_scale_rate[4]=osc_scale_rate[2]; - break; + case 5: + osc_inverse[0] = 4; + osc_inverse[1] = 4; + osc_inverse[2] = 2; + osc_scale_rate[4] = osc_scale_rate[2]; + break; - case 6: - osc_inverse[0]=4; - osc_inverse[1]=4; - osc_inverse[2]=4; - osc_scale_rate[4]=osc_scale_rate[0]; - break; + case 6: + osc_inverse[0] = 4; + osc_inverse[1] = 4; + osc_inverse[2] = 4; + osc_scale_rate[4] = osc_scale_rate[0]; + break; - case 7: - osc_inverse[0]=8; - osc_inverse[1]=4; - osc_inverse[2]=4; - osc_scale_rate[4]=osc_scale_rate[1]; - break; - } + case 7: + osc_inverse[0] = 8; + osc_inverse[1] = 4; + osc_inverse[2] = 4; + osc_scale_rate[4] = osc_scale_rate[1]; + break; + } } - if(chord_mode==0 ||chord_mode==1||chord_mode==5){//4 chord - switch(inversion){ - case 0: - osc_inverse[0]=1; - osc_inverse[1]=1; - osc_inverse[2]=1; - osc_inverse[3]=1; - osc_scale_rate[4]=osc_scale_rate[0]; - break; - - case 1: - osc_inverse[0]=2; - osc_inverse[1]=1; - osc_inverse[2]=1; - osc_inverse[3]=1; - osc_scale_rate[4]=osc_scale_rate[1]; - break; + if (chord_mode == 0 || chord_mode == 1 || chord_mode == 5) {//4 chord + switch(inversion){ + case 0: + osc_inverse[0] = 1; + osc_inverse[1] = 1; + osc_inverse[2] = 1; + osc_inverse[3] = 1; + osc_scale_rate[4] = osc_scale_rate[0]; + break; + + case 1: + osc_inverse[0] = 2; + osc_inverse[1] = 1; + osc_inverse[2] = 1; + osc_inverse[3] = 1; + osc_scale_rate[4] = osc_scale_rate[1]; + break; - case 2: - osc_inverse[0]=2; - osc_inverse[1]=2; - osc_inverse[2]=1; - osc_inverse[3]=1; - osc_scale_rate[4]=osc_scale_rate[2]; - break; + case 2: + osc_inverse[0] = 2; + osc_inverse[1] = 2; + osc_inverse[2] = 1; + osc_inverse[3] = 1; + osc_scale_rate[4] = osc_scale_rate[2]; + break; - case 3: - osc_inverse[0]=2; - osc_inverse[1]=2; - osc_inverse[2]=2; - osc_inverse[3]=1; - osc_scale_rate[4]=osc_scale_rate[3]; - break; + case 3: + osc_inverse[0] = 2; + osc_inverse[1] = 2; + osc_inverse[2] = 2; + osc_inverse[3] = 1; + osc_scale_rate[4] = osc_scale_rate[3]; + break; - case 4: - osc_inverse[0]=2; - osc_inverse[1]=2; - osc_inverse[2]=2; - osc_inverse[3]=2; - osc_scale_rate[4]=osc_scale_rate[0]; - break; + case 4: + osc_inverse[0] = 2; + osc_inverse[1] = 2; + osc_inverse[2] = 2; + osc_inverse[3] = 2; + osc_scale_rate[4] = osc_scale_rate[0]; + break; - case 5: - osc_inverse[0]=4; - osc_inverse[1]=2; - osc_inverse[2]=2; - osc_inverse[3]=2; - osc_scale_rate[4]=osc_scale_rate[1]; - break; + case 5: + osc_inverse[0] = 4; + osc_inverse[1] = 2; + osc_inverse[2] = 2; + osc_inverse[3] = 2; + osc_scale_rate[4] = osc_scale_rate[1]; + break; - case 6: - osc_inverse[0]=4; - osc_inverse[1]=4; - osc_inverse[2]=2; - osc_inverse[3]=2; - osc_scale_rate[4]=osc_scale_rate[2]; - break; + case 6: + osc_inverse[0] = 4; + osc_inverse[1] = 4; + osc_inverse[2] = 2; + osc_inverse[3] = 2; + osc_scale_rate[4] = osc_scale_rate[2]; + break; - case 7: - osc_inverse[0]=4; - osc_inverse[1]=4; - osc_inverse[2]=4; - osc_inverse[3]=2; - osc_scale_rate[4]=osc_scale_rate[3]; - break; - } + case 7: + osc_inverse[0] = 4; + osc_inverse[1] = 4; + osc_inverse[2] = 4; + osc_inverse[3] = 2; + osc_scale_rate[4] = osc_scale_rate[3]; + break; + } } //----------------------select chord table----------------- -switch(chord_mode){ - case 0: - select_table=0;//4 chord - break; - - case 1: - select_table=1;//4 chord - break; + switch(chord_mode){ + case 0: + select_table = 0;//4 chord + break; - case 2: - select_table=0;//3 chord - break; + case 1: + select_table = 1;//4 chord + break; - case 3: - select_table=1;//3 chord - break; + case 2: + select_table = 0;//3 chord + break; - case 4: - select_table=2;//3 chord - break; + case 3: + select_table = 1;//3 chord + break; - case 5: - select_table=2;//4 chord - break; + case 4: + select_table = 2;//3 chord + break; -} + case 5: + select_table = 2;//4 chord + break; + } //----------------------mode select----------------- -if (digitalRead(0) == 1 && digitalRead(1) == 1) { - select_mode = 1;//chord with bass -} -else if (digitalRead(0) == 0 && digitalRead(1) == 1) { - select_mode = 2;//arpeggio -} -else if (digitalRead(0) == 1 && digitalRead(1) == 0) { - select_mode = 0;//chord without bass -} - - -if(chord_mode==2 ||chord_mode==3 ||chord_mode==4){//set each oscillator frequency - osc_scale_rate[0]=freq_rate[chord_3[select_chord3[select_table][thr%6]][0]]*osc_inverse[0]; - osc_scale_rate[1]=freq_rate[chord_3[select_chord3[select_table][thr%6]][1]]*osc_inverse[1]; - osc_scale_rate[2]=freq_rate[chord_3[select_chord3[select_table][thr%6]][2]]*osc_inverse[2]; -}; -if(chord_mode==0 ||chord_mode==1||chord_mode==5){ - osc_scale_rate[0]=freq_rate[chord_4[select_chord4[select_table][thr%6]][0]]*osc_inverse[0]; - osc_scale_rate[1]=freq_rate[chord_4[select_chord4[select_table][thr%6]][1]]*osc_inverse[1]; - osc_scale_rate[2]=freq_rate[chord_4[select_chord4[select_table][thr%6]][2]]*osc_inverse[2]; - osc_scale_rate[3]=freq_rate[chord_4[select_chord4[select_table][thr%6]][3]]*osc_inverse[3]; -}; + readModeSwitch(); + + // Set each oscillator frequency + if (chord_mode == 2 || chord_mode == 3 || chord_mode == 4) { + osc_scale_rate[0] = freq_rate[chord_3[select_chord3[select_table][thr%6]][0]] * osc_inverse[0]; + osc_scale_rate[1] = freq_rate[chord_3[select_chord3[select_table][thr%6]][1]] * osc_inverse[1]; + osc_scale_rate[2] = freq_rate[chord_3[select_chord3[select_table][thr%6]][2]] * osc_inverse[2]; + }; + if (chord_mode == 0 || chord_mode == 1 || chord_mode == 5) { + osc_scale_rate[0] = freq_rate[chord_4[select_chord4[select_table][thr%6]][0]] * osc_inverse[0]; + osc_scale_rate[1] = freq_rate[chord_4[select_chord4[select_table][thr%6]][1]] * osc_inverse[1]; + osc_scale_rate[2] = freq_rate[chord_4[select_chord4[select_table][thr%6]][2]] * osc_inverse[2]; + osc_scale_rate[3] = freq_rate[chord_4[select_chord4[select_table][thr%6]][3]] * osc_inverse[3]; + }; // -------------------push sw , change wavetable------------------------------- - push_sw = digitalRead(6); + push_sw = digitalRead(PUSHBUTTON_PIN); + // TODO: Add propper debouncing for the button here if (push_sw == 0 && old_push_sw == 1) {//when push sw ON - waveform++;//change waveform - if (waveform > 7) { - waveform = 0; - } - table_set(); + // Change the selected waveform and ensure the selection is within bounds + waveform_selection = min(waveform_selection + 1, 6); + wavetable_populate(); + } +} + +// Reads the mode switch, a tri-state On-Off-On toggle switch +// Assign the resulting mode to the select_mode variable +void readModeSwitch() { + bool left = digitalRead(MODESWITCH_PIN_A); + bool right = digitalRead(MODESWITCH_PIN_B); + if (left && right) { + // Chord with bass + select_mode = 1; + } else if (!left && right) { + // Arpreggio + select_mode = 2; + } else if (left && !right) { + // Chord without bass + select_mode = 0; } } -void qnt_set(){//quantize v/oct input - if(chord_mode==0 ||chord_mode==1 ||chord_mode==2||chord_mode==3){//major scale - for(j=0;j<31;j++){ - if(adc>=majthr[j] && adc<majthr[j+1]){ - thr=j; +// Select the quantization for the V/oct input +void quantizer_select(){ + // Major Scale + if (chord_mode <= 3) { + for (j=0; j<31; j++) { + if (adc>=majthr[j] && adc<majthr[j+1]) { + thr = j; } } - for(j=0;j<31;j++){ - qnt[j]=majqnt[j]; + for (j=0; j<31; j++) { + qnt[j] = majqnt[j]; } } - if(chord_mode==4 ||chord_mode==5){//minor scale - for(j=0;j<31;j++){ - if(adc>=minthr[j] && adc<minthr[j+1]){ - thr=j; + // Minor Scale + if (chord_mode >= 4) { + for (j=0; j<31; j++) { + if (adc>=minthr[j] && adc<minthr[j+1]) { + thr = j; } } - for(j=0;j<31;j++){ - qnt[j]=minqnt[j]; + for (j=0; j<31; j++) { + qnt[j] = minqnt[j]; } } } -void table_set() {//make wavetable - switch (waveform) { +// Populate the wavetable with values +void wavetable_populate() { + switch (waveform_selection) { + // Sawtooth wave case 0: - for (int i = 0; i < 256; i++) { //saw - wavetable[i] = i * 4 - 512; - } - break; + for (int i = 0; i < 256; i++) { + wavetable[i] = i * 4 - 512; + } + break; + // Sine wave case 1: - for (int i = 0; i < 256; i++) { //sin - wavetable[i] = (sin(2 * M_PI * i / 256)) * 511; - } - break; + for (int i = 0; i < 256; i++) { + wavetable[i] = (sin(2 * M_PI * i / 256)) * 511; + } + break; + // Square Wave case 2: - for (int i = 0; i < 128; i++) { //squ - wavetable[i] = 511; - wavetable[i + 128] = -511; - } - break; + for (int i = 0; i < 128; i++) { + wavetable[i] = 511; + wavetable[i + 128] = -511; + } + break; + // Triangle wave case 3: - for (int i = 0; i < 128; i++) { //tri - wavetable[i] = i * 8 - 511; - wavetable[i + 128] = 511 - i * 8; - } - break; + for (int i = 0; i < 128; i++) { + wavetable[i] = i * 8 - 511; + wavetable[i + 128] = 511 - i * 8; + } + break; + // Octave-Sawtooth wave case 4: - for (int i = 0; i < 128; i++) { //oct saw - wavetable[i] = i * 4 - 512 + i * 2; - wavetable[i + 128] = i * 2 - 256 + i * 4; - } - break; + for (int i = 0; i < 128; i++) { + wavetable[i] = i * 4 - 512 + i * 2; + wavetable[i + 128] = i * 2 - 256 + i * 4; + } + break; + // FM1 Wave case 5: - for (int i = 0; i < 256; i++) { //FM1 - wavetable[i] = (sin(2 * M_PI * i / 256 + sin(2 * M_PI * 3 * i / 256)) ) * 511; - } - break; + for (int i = 0; i < 256; i++) { + wavetable[i] = (sin(2 * M_PI * i / 256 + sin(2 * M_PI * 3 * i / 256)) ) * 511; + } + break; + // FM2 Wave case 6: - for (int i = 0; i < 256; i++) { //FM2 - wavetable[i] = (sin(2 * M_PI * i / 256 + sin(2 * M_PI * 7 * i / 256))) * 511; - } - break; + for (int i = 0; i < 256; i++) { + wavetable[i] = (sin(2 * M_PI * i / 256 + sin(2 * M_PI * 7 * i / 256))) * 511; + } + break; + // FM3 Wave case 7: - for (int i = 0; i < 256; i++) { //FM3 - wavetable[i] = (sin(2 * M_PI * i / 256 + sin(2 * M_PI * 4 * i / 256 + sin(2 * M_PI * 11 * i / 256)))) * 511; - } - break; + for (int i = 0; i < 256; i++) { + wavetable[i] = (sin(2 * M_PI * i / 256 + sin(2 * M_PI * 4 * i / 256 + sin(2 * M_PI * 11 * i / 256)))) * 511; + } + break; } } diff --git a/bom.ods b/bom.ods new file mode 100644 index 0000000000000000000000000000000000000000..acb7e250eb426b36df6d5ce3a7dcb94c67a35cec Binary files /dev/null and b/bom.ods differ