/*
   Direct-digital synthesis
   Phasing saw waves demo

*/

#include "fatSaw.h"

int main(void) {

  uint16_t accumulators[NUMBER_OSCILLATORS];
  uint8_t waveStep;
  int16_t mixer = 0;
  uint8_t i;

  // -------- Inits --------- //

  clock_prescale_set(clock_div_1);                  /* CPU clock 8 MHz */
  initTimer0();
  SPEAKER_DDR |= (1 << SPEAKER);                     /* speaker output */
  LED_DDR |= (1 << LED0);

  // Init all to same phase
  for (i = 0; i < NUMBER_OSCILLATORS; i++) {
    accumulators[i] = 0;
  }

  // ------ Event loop ------ //
  while (1) {

                                   /* Load in the PWM value when ready */
    loop_until_bit_is_set(TIFR0, TOV0); /* wait until overflow bit set */
    OCR0A = 128 + mixer;           /* signed-integers need shifting up */
    TIFR0 |= (1 << TOV0);                   /* re-set the overflow bit */

                              /* Update all accumulators, mix together */
    mixer = 0;
    for (i = 0; i < NUMBER_OSCILLATORS; i++) {
      accumulators[i] += BASEPITCH;
      waveStep = accumulators[i] >> 8;

      // Add extra phase increment.
      // Makes shifting overtones when
      // different frequency components add, subtract
      if (waveStep == 0) {                   /* roughly once per cycle */
        accumulators[i] += PHASE_RATE * i;          /* add extra phase */
      }

      mixer += fullSaw15[waveStep];
    }
    mixer = mixer >> OSCILLATOR_SHIFT;
                                 /* Dividing by bitshift is very fast. */

  }                                                  /* End event loop */
  return 0;                            /* This line is never reached */
}
