#include #include #include #include #include #include "main.h" volatile uint8_t sample_pending; // sample rate is 8M / (5 * 64) = 25000 enum { synth_channel_count = 2 }; typedef struct { uint16_t phase; uint16_t speed; } synth_channel_t; typedef struct { synth_channel_t channels[synth_channel_count]; } synth_t; static synth_t synth; static void synth_init(void) { // some test values synth.channels[0].phase = 0; synth.channels[0].speed = 1153; synth.channels[1].phase = 0; synth.channels[1].speed = 1728; } static inline uint16_t synth_mix(void) { uint16_t output = 0; for (int i = 0; i < synth_channel_count; i++) { synth_channel_t *chan = &synth.channels[i]; chan->phase += chan->speed; output += ((chan->phase >> 8) & 0xff) / 2; } return output; } static void init_sampletimer(void) { // Timer 0 // set timer0 to CTC & prescaler 64 == 125k TCCR0A = (1 << WGM01); TCCR0B = (1 << CS00) | (1 << CS01); // count up to 5 : OCR0A = 3; TCNT0 = 0; // enable interrupt TIMSK0 |= (1< maxcounter){ counter = 0; }; pulsecounter++; if (pulsecounter > 0x300){ pulsecounter = 0; pulsewidth++; if (pulsewidth > maxcounter){ pulsewidth = 0; } } OCR1B = ((counter > pulsewidth) ? 0xff : 0x00); */ OCR1B = synth_mix(); }