/* * "Algorithmic Symphonies" * When you combine modula arithmetic with a counter variable, * you can get sequences that sound like 4-bit chiptunes. * Note that we're just outputting numerical values * directly as a voltage. * Play around with these formulas defined here, or see others * in the attached file "music_formula_collection.txt". * */ // ------- Preamble -------- // #include /* Defines pins, ports, etc */ #include /* Functions to waste time */ #include #include "pinDefines.h" #include "macros.h" static inline void initTimer0(void){ set_bit(TCCR0A, COM0A1); /* PWM output on OCR0A */ set_bit(SPEAKER_DDR, SPEAKER); /* enable output on pin */ set_bit(TCCR0A, WGM00); /* Fast PWM mode */ set_bit(TCCR0A, WGM01); /* Fast PWM mode, pt.2 */ set_bit(TCCR0B, CS00); /* Clock with /1 prescaler */ } static inline void pollButton(void){ if (bit_is_clear(BUTTON_PIN, BUTTON)) { set_bit(SPEAKER_DDR, SPEAKER); /* enable output on pin */ clear_bit(LED_PORT, LED0); } else { clear_bit(SPEAKER_DDR, SPEAKER); /* disable output on pin */ set_bit(LED_PORT, LED0); } } int main(void){ uint16_t t=0; // -------- Inits --------- // clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ initTimer0(); set_bit(BUTTON_PORT, BUTTON); /* pullup on button */ set_bit(LED_DDR, LED0); /* LED on for diagnostics */ set_bit(LED_PORT, LED0); _delay_ms(100); clear_bit(LED_PORT, LED0); set_bit(SPEAKER_DDR, SPEAKER); OCR0A = 210; // ------ Event loop ------ // while(1){ t++; OCR0A = (uint8_t) ((t<<1)^((t<<1)+(t>>7)&t>>12))|t>>(4-(1^7&(t>>19)))|t>>7; /* "crowd" */ // OCR0A = (uint8_t) t; /* sawtooth */ // OCR0A = (uint8_t) t * (t >> 8); /* rising pitch + aliases all over */ // OCR0A = (uint8_t) t & (t >> 8); /* arpeggios */ // OCR0A = (uint8_t) t*( 42 & t >> 10 ); // OCR0A = (uint8_t) t*(t>>((t>>9)|(t>>8))&(63&(t>>4))); /* space invaders vs pong */ // OCR0A = (uint8_t) t*(t>>8*((t>>15)|(t>>8))&(20|(t>>19)*5>>t|(t>>3))); // OCR0A = (uint8_t) (t*5&t>>7)|(t*3&t>>10); // OCR0A = (uint8_t) (t*9 & t>>4 | t* 5 & t>> 7 | t * 3 & t/1024)-1; // OCR0A = (uint8_t) (t>>5)|(t>>4)|((t%42)*(t>>4)|(0x15483113)-(t>>4))/(t>>16)^(t|(t>>4)); // OCR0A = (uint8_t) t*(( (t>>12) | (t>>8)) & (63 & (t>>4)) ); /* glitchy */ pollButton(); _delay_us(124); /* Aiming for 8kHz sample rate */ } /* End event loop */ return 0; /* This line is never reached */ }