diff --git a/Open_Theremin_V3/ihandlers.cpp b/Open_Theremin_V3/ihandlers.cpp index 1cc16bc..8025fa8 100644 --- a/Open_Theremin_V3/ihandlers.cpp +++ b/Open_Theremin_V3/ihandlers.cpp @@ -3,7 +3,6 @@ #include "ihandlers.h" #include "mcpDac.h" #include "timer.h" - #include "build.h" #include "theremin_sintable.c" @@ -15,7 +14,7 @@ #include "theremin_sintable7.c" #include "theremin_sintable8.c" -const int16_t* const wavetables[] PROGMEM = { +const int16_t* const wavetables[] = { //Fixed following a suggestion by Michael Freitas, does not need to be in PROGMEM sine_table, sine_table2, sine_table3, @@ -31,6 +30,14 @@ static const uint32_t MCP_DAC_BASE = 2047; #define INT0_STATE (PIND & (1<>6) & 0x3ff; + int16_t waveSample; + uint32_t scaledSample; + uint16_t offset = (uint16_t)(pointer >> 6) & 0x3ff; #if CV_ENABLED // Generator for CV output @@ -136,26 +148,11 @@ ISR (INT1_vect) { #else //Play sound - // Read next wave table value (3.0us) - // The slightly odd tactic here is to provide compile-time expressions for the wavetable - // positions. Making addr1 the index into the wavtables array breaks the time limit for - // the interrupt handler - switch (vWavetableSelector) { - case 1: waveSample = (int16_t) pgm_read_word_near(wavetables[1] + offset); break; - case 2: waveSample = (int16_t) pgm_read_word_near(wavetables[2] + offset); break; - case 3: waveSample = (int16_t) pgm_read_word_near(wavetables[3] + offset); break; - case 4: waveSample = (int16_t) pgm_read_word_near(wavetables[4] + offset); break; - case 5: waveSample = (int16_t) pgm_read_word_near(wavetables[5] + offset); break; - case 6: waveSample = (int16_t) pgm_read_word_near(wavetables[6] + offset); break; - case 7: waveSample = (int16_t) pgm_read_word_near(wavetables[7] + offset); break; - default: waveSample = (int16_t) pgm_read_word_near(wavetables[0] + offset); break; - }; + // Read next wave table value + waveSample = (int16_t)pgm_read_word_near(wavetables[vWavetableSelector] + offset); - if (waveSample > 0) { // multiply 16 bit wave number by 8 bit volume value (11.2us / 5.4us) - scaledSample = MCP_DAC_BASE + (mul_16_8(waveSample, vScaledVolume) >> 8); - } else { - scaledSample = MCP_DAC_BASE - (mul_16_8(-waveSample, vScaledVolume) >> 8); - } + // multiply 16 bit wave number by 8 bit volume value (11.2us / 5.4us) + scaledSample = MCP_DAC_BASE + (mulsu_16_8(waveSample, vScaledVolume) >> 8); mcpDacSend(scaledSample); //Send result to Digital to Analogue Converter (audio out) (9.6 us) @@ -190,6 +187,11 @@ ISR (INT1_vect) { noInterrupts(); enableInt1(); + + // Added by ThF 20200419 + #ifdef TH_DEBUG + HW_LED2_OFF; +#endif } /* VOLUME read - interrupt service routine for capturing volume counter value */ @@ -216,5 +218,3 @@ ISR(TIMER1_OVF_vect) { timer_overflow_counter++; } - -