muse.c (2314B)
1 #include "muse.h" 2 3 #include <stdbool.h> 4 5 enum { MUSE_OFF, MUSE_ON, MUSE_C_1_2, MUSE_C1, MUSE_C2, MUSE_C4, MUSE_C8, MUSE_C3, MUSE_C6, MUSE_B1, MUSE_B2, MUSE_B3, MUSE_B4, MUSE_B5, MUSE_B6, MUSE_B7, MUSE_B8, MUSE_B9, MUSE_B10, MUSE_B11, MUSE_B12, MUSE_B13, MUSE_B14, MUSE_B15, MUSE_B16, MUSE_B17, MUSE_B18, MUSE_B19, MUSE_B20, MUSE_B21, MUSE_B22, MUSE_B23, MUSE_B24, MUSE_B25, MUSE_B26, MUSE_B27, MUSE_B28, MUSE_B29, MUSE_B30, MUSE_B31 }; 6 7 bool number_of_ones_to_bool[16] = {1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1}; 8 9 uint8_t muse_interval[4] = {MUSE_B7, MUSE_B19, MUSE_B3, MUSE_B28}; 10 uint8_t muse_theme[4] = {MUSE_B8, MUSE_B23, MUSE_B18, MUSE_B17}; 11 12 bool muse_timer_1bit = 0; 13 uint8_t muse_timer_2bit = 0; 14 uint8_t muse_timer_2bit_counter = 0; 15 uint8_t muse_timer_4bit = 0; 16 uint32_t muse_timer_31bit = 0; 17 18 bool bit_for_value(uint8_t value) { 19 switch (value) { 20 case MUSE_OFF: 21 return 0; 22 case MUSE_ON: 23 return 1; 24 case MUSE_C_1_2: 25 return muse_timer_1bit; 26 case MUSE_C1: 27 return (muse_timer_4bit & 1); 28 case MUSE_C2: 29 return (muse_timer_4bit & 2); 30 case MUSE_C4: 31 return (muse_timer_4bit & 4); 32 case MUSE_C8: 33 return (muse_timer_4bit & 8); 34 case MUSE_C3: 35 return (muse_timer_2bit & 1); 36 case MUSE_C6: 37 return (muse_timer_2bit & 2); 38 default: 39 return muse_timer_31bit & (1UL << (value - MUSE_B1)); 40 } 41 } 42 43 uint8_t muse_clock_pulse(void) { 44 bool top = number_of_ones_to_bool[bit_for_value(muse_theme[0]) + (bit_for_value(muse_theme[1]) << 1) + (bit_for_value(muse_theme[2]) << 2) + (bit_for_value(muse_theme[3]) << 3)]; 45 46 if (muse_timer_1bit == 0) { 47 if (muse_timer_2bit_counter == 0) { 48 muse_timer_2bit = (muse_timer_2bit + 1) % 4; 49 } 50 muse_timer_2bit_counter = (muse_timer_2bit_counter + 1) % 3; 51 muse_timer_4bit = (muse_timer_4bit + 1) % 16; 52 muse_timer_31bit = (muse_timer_31bit << 1) + top; 53 } 54 55 muse_timer_1bit = (muse_timer_1bit + 1) % 2; 56 57 return bit_for_value(muse_interval[0]) + (bit_for_value(muse_interval[1]) << 1) + (bit_for_value(muse_interval[2]) << 2) + (bit_for_value(muse_interval[3]) << 3); 58 }