diff options
Diffstat (limited to 'quantum/audio')
-rw-r--r-- | quantum/audio/audio.c | 740 | ||||
-rw-r--r-- | quantum/audio/audio.h | 26 | ||||
-rw-r--r-- | quantum/audio/audio_arm.c | 846 | ||||
-rw-r--r-- | quantum/audio/audio_pwm.c | 637 | ||||
-rw-r--r-- | quantum/audio/luts.c | 380 | ||||
-rw-r--r-- | quantum/audio/luts.h | 18 | ||||
-rw-r--r-- | quantum/audio/muse.c | 137 | ||||
-rw-r--r-- | quantum/audio/musical_notes.h | 245 | ||||
-rw-r--r-- | quantum/audio/song_list.h | 319 | ||||
-rw-r--r-- | quantum/audio/voices.c | 250 | ||||
-rw-r--r-- | quantum/audio/voices.h | 20 | ||||
-rw-r--r-- | quantum/audio/wave.h | 273 |
12 files changed, 1423 insertions, 2468 deletions
diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index 3da164c736..781378788c 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -18,9 +18,9 @@ #include <string.h> //#include <math.h> #if defined(__AVR__) - #include <avr/pgmspace.h> - #include <avr/interrupt.h> - #include <avr/io.h> +# include <avr/pgmspace.h> +# include <avr/interrupt.h> +# include <avr/io.h> #endif #include "print.h" #include "audio.h" @@ -35,119 +35,118 @@ // Timer Abstractions // ----------------------------------------------------------------------------- -//Currently we support timers 1 and 3 used at the sime time, channels A-C, -//pins PB5, PB6, PB7, PC4, PC5, and PC6 +// Currently we support timers 1 and 3 used at the sime time, channels A-C, +// pins PB5, PB6, PB7, PC4, PC5, and PC6 #if defined(C6_AUDIO) - #define CPIN_AUDIO - #define CPIN_SET_DIRECTION DDRC |= _BV(PORTC6); - #define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); - #define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A) - #define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A) - #define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1); - #define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0)); - #define TIMER_3_PERIOD ICR3 - #define TIMER_3_DUTY_CYCLE OCR3A - #define TIMER3_AUDIO_vect TIMER3_COMPA_vect +# define CPIN_AUDIO +# define CPIN_SET_DIRECTION DDRC |= _BV(PORTC6); +# define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); +# define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A) +# define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A) +# define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1); +# define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0)); +# define TIMER_3_PERIOD ICR3 +# define TIMER_3_DUTY_CYCLE OCR3A +# define TIMER3_AUDIO_vect TIMER3_COMPA_vect #endif #if defined(C5_AUDIO) - #define CPIN_AUDIO - #define CPIN_SET_DIRECTION DDRC |= _BV(PORTC5); - #define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3B1) | (0 << COM3B0) | (1 << WGM31) | (0 << WGM30); - #define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3B) - #define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3B) - #define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3B1); - #define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3B1) | _BV(COM3B0)); - #define TIMER_3_PERIOD ICR3 - #define TIMER_3_DUTY_CYCLE OCR3B - #define TIMER3_AUDIO_vect TIMER3_COMPB_vect +# define CPIN_AUDIO +# define CPIN_SET_DIRECTION DDRC |= _BV(PORTC5); +# define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3B1) | (0 << COM3B0) | (1 << WGM31) | (0 << WGM30); +# define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3B) +# define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3B) +# define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3B1); +# define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3B1) | _BV(COM3B0)); +# define TIMER_3_PERIOD ICR3 +# define TIMER_3_DUTY_CYCLE OCR3B +# define TIMER3_AUDIO_vect TIMER3_COMPB_vect #endif #if defined(C4_AUDIO) - #define CPIN_AUDIO - #define CPIN_SET_DIRECTION DDRC |= _BV(PORTC4); - #define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3C1) | (0 << COM3C0) | (1 << WGM31) | (0 << WGM30); - #define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3C) - #define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3C) - #define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3C1); - #define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3C1) | _BV(COM3C0)); - #define TIMER_3_PERIOD ICR3 - #define TIMER_3_DUTY_CYCLE OCR3C - #define TIMER3_AUDIO_vect TIMER3_COMPC_vect +# define CPIN_AUDIO +# define CPIN_SET_DIRECTION DDRC |= _BV(PORTC4); +# define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3C1) | (0 << COM3C0) | (1 << WGM31) | (0 << WGM30); +# define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3C) +# define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3C) +# define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3C1); +# define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3C1) | _BV(COM3C0)); +# define TIMER_3_PERIOD ICR3 +# define TIMER_3_DUTY_CYCLE OCR3C +# define TIMER3_AUDIO_vect TIMER3_COMPC_vect #endif #if defined(B5_AUDIO) - #define BPIN_AUDIO - #define BPIN_SET_DIRECTION DDRB |= _BV(PORTB5); - #define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10); - #define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1A) - #define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1A) - #define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1A1); - #define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1A1) | _BV(COM1A0)); - #define TIMER_1_PERIOD ICR1 - #define TIMER_1_DUTY_CYCLE OCR1A - #define TIMER1_AUDIO_vect TIMER1_COMPA_vect +# define BPIN_AUDIO +# define BPIN_SET_DIRECTION DDRB |= _BV(PORTB5); +# define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10); +# define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1A) +# define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1A) +# define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1A1); +# define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1A1) | _BV(COM1A0)); +# define TIMER_1_PERIOD ICR1 +# define TIMER_1_DUTY_CYCLE OCR1A +# define TIMER1_AUDIO_vect TIMER1_COMPA_vect #endif #if defined(B6_AUDIO) - #define BPIN_AUDIO - #define BPIN_SET_DIRECTION DDRB |= _BV(PORTB6); - #define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1B1) | (0 << COM1B0) | (1 << WGM11) | (0 << WGM10); - #define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1B) - #define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1B) - #define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1B1); - #define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1B1) | _BV(COM1B0)); - #define TIMER_1_PERIOD ICR1 - #define TIMER_1_DUTY_CYCLE OCR1B - #define TIMER1_AUDIO_vect TIMER1_COMPB_vect +# define BPIN_AUDIO +# define BPIN_SET_DIRECTION DDRB |= _BV(PORTB6); +# define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1B1) | (0 << COM1B0) | (1 << WGM11) | (0 << WGM10); +# define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1B) +# define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1B) +# define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1B1); +# define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1B1) | _BV(COM1B0)); +# define TIMER_1_PERIOD ICR1 +# define TIMER_1_DUTY_CYCLE OCR1B +# define TIMER1_AUDIO_vect TIMER1_COMPB_vect #endif #if defined(B7_AUDIO) - #define BPIN_AUDIO - #define BPIN_SET_DIRECTION DDRB |= _BV(PORTB7); - #define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1C1) | (0 << COM1C0) | (1 << WGM11) | (0 << WGM10); - #define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1C) - #define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1C) - #define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1C1); - #define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1C1) | _BV(COM1C0)); - #define TIMER_1_PERIOD ICR1 - #define TIMER_1_DUTY_CYCLE OCR1C - #define TIMER1_AUDIO_vect TIMER1_COMPC_vect +# define BPIN_AUDIO +# define BPIN_SET_DIRECTION DDRB |= _BV(PORTB7); +# define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1C1) | (0 << COM1C0) | (1 << WGM11) | (0 << WGM10); +# define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1C) +# define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1C) +# define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1C1); +# define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1C1) | _BV(COM1C0)); +# define TIMER_1_PERIOD ICR1 +# define TIMER_1_DUTY_CYCLE OCR1C +# define TIMER1_AUDIO_vect TIMER1_COMPC_vect #endif // ----------------------------------------------------------------------------- - -int voices = 0; -int voice_place = 0; -float frequency = 0; +int voices = 0; +int voice_place = 0; +float frequency = 0; float frequency_alt = 0; -int volume = 0; -long position = 0; +int volume = 0; +long position = 0; float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -bool sliding = false; +int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +bool sliding = false; float place = 0; -uint8_t * sample; +uint8_t* sample; uint16_t sample_length = 0; -bool playing_notes = false; -bool playing_note = false; +bool playing_notes = false; +bool playing_note = false; float note_frequency = 0; -float note_length = 0; -uint8_t note_tempo = TEMPO_DEFAULT; -float note_timbre = TIMBRE_DEFAULT; -uint16_t note_position = 0; -float (* notes_pointer)[][2]; +float note_length = 0; +uint8_t note_tempo = TEMPO_DEFAULT; +float note_timbre = TIMBRE_DEFAULT; +uint16_t note_position = 0; +float (*notes_pointer)[][2]; uint16_t notes_count; bool notes_repeat; bool note_resting = false; uint16_t current_note = 0; -uint8_t rest_counter = 0; +uint8_t rest_counter = 0; #ifdef VIBRATO_ENABLE -float vibrato_counter = 0; +float vibrato_counter = 0; float vibrato_strength = .5; -float vibrato_rate = 0.125; +float vibrato_rate = 0.125; #endif float polyphony_rate = 0; @@ -157,73 +156,69 @@ static bool audio_initialized = false; audio_config_t audio_config; uint16_t envelope_index = 0; -bool glissando = true; +bool glissando = true; #ifndef STARTUP_SONG - #define STARTUP_SONG SONG(STARTUP_SOUND) +# define STARTUP_SONG SONG(STARTUP_SOUND) #endif #ifndef AUDIO_ON_SONG - #define AUDIO_ON_SONG SONG(AUDIO_ON_SOUND) +# define AUDIO_ON_SONG SONG(AUDIO_ON_SOUND) #endif #ifndef AUDIO_OFF_SONG - #define AUDIO_OFF_SONG SONG(AUDIO_OFF_SOUND) +# define AUDIO_OFF_SONG SONG(AUDIO_OFF_SOUND) #endif -float startup_song[][2] = STARTUP_SONG; -float audio_on_song[][2] = AUDIO_ON_SONG; +float startup_song[][2] = STARTUP_SONG; +float audio_on_song[][2] = AUDIO_ON_SONG; float audio_off_song[][2] = AUDIO_OFF_SONG; -void audio_init() -{ - +void audio_init() { // Check EEPROM - if (!eeconfig_is_enabled()) - { + if (!eeconfig_is_enabled()) { eeconfig_init(); } audio_config.raw = eeconfig_read_audio(); if (!audio_initialized) { +// Set audio ports as output +#ifdef CPIN_AUDIO + CPIN_SET_DIRECTION + DISABLE_AUDIO_COUNTER_3_ISR; +#endif +#ifdef BPIN_AUDIO + BPIN_SET_DIRECTION + DISABLE_AUDIO_COUNTER_1_ISR; +#endif - // Set audio ports as output - #ifdef CPIN_AUDIO - CPIN_SET_DIRECTION - DISABLE_AUDIO_COUNTER_3_ISR; - #endif - #ifdef BPIN_AUDIO - BPIN_SET_DIRECTION - DISABLE_AUDIO_COUNTER_1_ISR; - #endif - - // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers TCCR3A/TCCR3B, TCCR1A/TCCR1B - // Compare Output Mode (COM3An and COM1An) = 0b00 = Normal port operation - // OC3A -- PC6 - // OC3B -- PC5 - // OC3C -- PC4 - // OC1A -- PB5 - // OC1B -- PB6 - // OC1C -- PB7 - - // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14. Period = ICR3, Duty Cycle OCR3A) - // OCR3A - PC6 - // OCR3B - PC5 - // OCR3C - PC4 - // OCR1A - PB5 - // OCR1B - PB6 - // OCR1C - PB7 - - // Clock Select (CS3n) = 0b010 = Clock / 8 - #ifdef CPIN_AUDIO - INIT_AUDIO_COUNTER_3 - TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); - TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER)); - TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre); - #endif - #ifdef BPIN_AUDIO - INIT_AUDIO_COUNTER_1 - TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10); - TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER)); - TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre); - #endif +// TCCR3A / TCCR3B: Timer/Counter #3 Control Registers TCCR3A/TCCR3B, TCCR1A/TCCR1B +// Compare Output Mode (COM3An and COM1An) = 0b00 = Normal port operation +// OC3A -- PC6 +// OC3B -- PC5 +// OC3C -- PC4 +// OC1A -- PB5 +// OC1B -- PB6 +// OC1C -- PB7 + +// Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14. Period = ICR3, Duty Cycle OCR3A) +// OCR3A - PC6 +// OCR3B - PC5 +// OCR3C - PC4 +// OCR1A - PB5 +// OCR1B - PB6 +// OCR1C - PB7 + +// Clock Select (CS3n) = 0b010 = Clock / 8 +#ifdef CPIN_AUDIO + INIT_AUDIO_COUNTER_3 + TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); + TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER)); + TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre); +#endif +#ifdef BPIN_AUDIO + INIT_AUDIO_COUNTER_1 + TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10); + TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER)); + TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre); +#endif audio_initialized = true; } @@ -231,11 +226,9 @@ void audio_init() if (audio_config.enable) { PLAY_SONG(startup_song); } - } -void stop_all_notes() -{ +void stop_all_notes() { dprintf("audio stop all notes"); if (!audio_initialized) { @@ -243,31 +236,29 @@ void stop_all_notes() } voices = 0; - #ifdef CPIN_AUDIO - DISABLE_AUDIO_COUNTER_3_ISR; - DISABLE_AUDIO_COUNTER_3_OUTPUT; - #endif +#ifdef CPIN_AUDIO + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; +#endif - #ifdef BPIN_AUDIO - DISABLE_AUDIO_COUNTER_1_ISR; - DISABLE_AUDIO_COUNTER_1_OUTPUT; - #endif +#ifdef BPIN_AUDIO + DISABLE_AUDIO_COUNTER_1_ISR; + DISABLE_AUDIO_COUNTER_1_OUTPUT; +#endif playing_notes = false; - playing_note = false; - frequency = 0; + playing_note = false; + frequency = 0; frequency_alt = 0; - volume = 0; + volume = 0; - for (uint8_t i = 0; i < 8; i++) - { + for (uint8_t i = 0; i < 8; i++) { frequencies[i] = 0; - volumes[i] = 0; + volumes[i] = 0; } } -void stop_note(float freq) -{ +void stop_note(float freq) { dprintf("audio stop note freq=%d", (int)freq); if (playing_note) { @@ -277,133 +268,129 @@ void stop_note(float freq) for (int i = 7; i >= 0; i--) { if (frequencies[i] == freq) { frequencies[i] = 0; - volumes[i] = 0; + volumes[i] = 0; for (int j = i; (j < 7); j++) { - frequencies[j] = frequencies[j+1]; - frequencies[j+1] = 0; - volumes[j] = volumes[j+1]; - volumes[j+1] = 0; + frequencies[j] = frequencies[j + 1]; + frequencies[j + 1] = 0; + volumes[j] = volumes[j + 1]; + volumes[j + 1] = 0; } break; } } voices--; - if (voices < 0) - voices = 0; + if (voices < 0) voices = 0; if (voice_place >= voices) { voice_place = 0; } if (voices == 0) { - #ifdef CPIN_AUDIO - DISABLE_AUDIO_COUNTER_3_ISR; - DISABLE_AUDIO_COUNTER_3_OUTPUT; - #endif - #ifdef BPIN_AUDIO - DISABLE_AUDIO_COUNTER_1_ISR; - DISABLE_AUDIO_COUNTER_1_OUTPUT; - #endif - frequency = 0; +#ifdef CPIN_AUDIO + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; +#endif +#ifdef BPIN_AUDIO + DISABLE_AUDIO_COUNTER_1_ISR; + DISABLE_AUDIO_COUNTER_1_OUTPUT; +#endif + frequency = 0; frequency_alt = 0; - volume = 0; - playing_note = false; + volume = 0; + playing_note = false; } } } #ifdef VIBRATO_ENABLE -float mod(float a, int b) -{ +float mod(float a, int b) { float r = fmod(a, b); return r < 0 ? r + b : r; } float vibrato(float average_freq) { - #ifdef VIBRATO_STRENGTH_ENABLE - float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength); - #else - float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter]; - #endif - vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); +# ifdef VIBRATO_STRENGTH_ENABLE + float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength); +# else + float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter]; +# endif + vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0 / average_freq)), VIBRATO_LUT_LENGTH); return vibrated_freq; } #endif #ifdef CPIN_AUDIO -ISR(TIMER3_AUDIO_vect) -{ +ISR(TIMER3_AUDIO_vect) { float freq; if (playing_note) { if (voices > 0) { - - #ifdef BPIN_AUDIO +# ifdef BPIN_AUDIO float freq_alt = 0; - if (voices > 1) { - if (polyphony_rate == 0) { - if (glissando) { - if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440/frequencies[voices - 2]/12/2)) { - frequency_alt = frequency_alt * pow(2, 440/frequency_alt/12/2); - } else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440/frequencies[voices - 2]/12/2)) { - frequency_alt = frequency_alt * pow(2, -440/frequency_alt/12/2); - } else { - frequency_alt = frequencies[voices - 2]; - } + if (voices > 1) { + if (polyphony_rate == 0) { + if (glissando) { + if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440 / frequencies[voices - 2] / 12 / 2)) { + frequency_alt = frequency_alt * pow(2, 440 / frequency_alt / 12 / 2); + } else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440 / frequencies[voices - 2] / 12 / 2)) { + frequency_alt = frequency_alt * pow(2, -440 / frequency_alt / 12 / 2); } else { frequency_alt = frequencies[voices - 2]; } - - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq_alt = vibrato(frequency_alt); - } else { - freq_alt = frequency_alt; - } - #else - freq_alt = frequency_alt; - #endif + } else { + frequency_alt = frequencies[voices - 2]; } - if (envelope_index < 65535) { - envelope_index++; +# ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq_alt = vibrato(frequency_alt); + } else { + freq_alt = frequency_alt; } +# else + freq_alt = frequency_alt; +# endif + } - freq_alt = voice_envelope(freq_alt); + if (envelope_index < 65535) { + envelope_index++; + } - if (freq_alt < 30.517578125) { - freq_alt = 30.52; - } + freq_alt = voice_envelope(freq_alt); - TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (freq_alt * CPU_PRESCALER)); - TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq_alt * CPU_PRESCALER)) * note_timbre); + if (freq_alt < 30.517578125) { + freq_alt = 30.52; } - #endif + + TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (freq_alt * CPU_PRESCALER)); + TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq_alt * CPU_PRESCALER)) * note_timbre); + } +# endif if (polyphony_rate > 0) { if (voices > 1) { voice_place %= voices; if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { voice_place = (voice_place + 1) % voices; - place = 0.0; + place = 0.0; } } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequencies[voice_place]); - } else { - freq = frequencies[voice_place]; - } - #else +# ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequencies[voice_place]); + } else { freq = frequencies[voice_place]; - #endif + } +# else + freq = frequencies[voice_place]; +# endif } else { if (glissando) { - if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, 440/frequency/12/2); - } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, -440/frequency/12/2); + if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) { + frequency = frequency * pow(2, 440 / frequency / 12 / 2); + } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) { + frequency = frequency * pow(2, -440 / frequency / 12 / 2); } else { frequency = frequencies[voices - 1]; } @@ -411,15 +398,15 @@ ISR(TIMER3_AUDIO_vect) frequency = frequencies[voices - 1]; } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequency); - } else { - freq = frequency; - } - #else +# ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequency); + } else { freq = frequency; - #endif + } +# else + freq = frequency; +# endif } if (envelope_index < 65535) { @@ -432,32 +419,32 @@ ISR(TIMER3_AUDIO_vect) freq = 30.52; } - TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); + TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); } } if (playing_notes) { if (note_frequency > 0) { - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(note_frequency); - } else { - freq = note_frequency; - } - #else - freq = note_frequency; - #endif +# ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(note_frequency); + } else { + freq = note_frequency; + } +# else + freq = note_frequency; +# endif if (envelope_index < 65535) { envelope_index++; } freq = voice_envelope(freq); - TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); + TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); } else { - TIMER_3_PERIOD = 0; + TIMER_3_PERIOD = 0; TIMER_3_DUTY_CYCLE = 0; } @@ -489,16 +476,16 @@ ISR(TIMER3_AUDIO_vect) current_note--; if ((*notes_pointer)[current_note][0] == (*notes_pointer)[current_note + 1][0]) { note_frequency = 0; - note_length = 1; + note_length = 1; } else { note_frequency = (*notes_pointer)[current_note][0]; - note_length = 1; + note_length = 1; } } else { - note_resting = false; + note_resting = false; envelope_index = 0; note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); } note_position = 0; @@ -507,15 +494,14 @@ ISR(TIMER3_AUDIO_vect) if (!audio_config.enable) { playing_notes = false; - playing_note = false; + playing_note = false; } } #endif #ifdef BPIN_AUDIO -ISR(TIMER1_AUDIO_vect) -{ - #if defined(BPIN_AUDIO) && !defined(CPIN_AUDIO) +ISR(TIMER1_AUDIO_vect) { +# if defined(BPIN_AUDIO) && !defined(CPIN_AUDIO) float freq = 0; if (playing_note) { @@ -525,25 +511,25 @@ ISR(TIMER1_AUDIO_vect) voice_place %= voices; if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { voice_place = (voice_place + 1) % voices; - place = 0.0; + place = 0.0; } } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequencies[voice_place]); - } else { - freq = frequencies[voice_place]; - } - #else +# ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequencies[voice_place]); + } else { freq = frequencies[voice_place]; - #endif + } +# else + freq = frequencies[voice_place]; +# endif } else { if (glissando) { - if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, 440/frequency/12/2); - } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, -440/frequency/12/2); + if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) { + frequency = frequency * pow(2, 440 / frequency / 12 / 2); + } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) { + frequency = frequency * pow(2, -440 / frequency / 12 / 2); } else { frequency = frequencies[voices - 1]; } @@ -551,15 +537,15 @@ ISR(TIMER1_AUDIO_vect) frequency = frequencies[voices - 1]; } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequency); - } else { - freq = frequency; - } - #else +# ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequency); + } else { freq = frequency; - #endif + } +# else + freq = frequency; +# endif } if (envelope_index < 65535) { @@ -572,32 +558,32 @@ ISR(TIMER1_AUDIO_vect) freq = 30.52; } - TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); + TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); } } if (playing_notes) { if (note_frequency > 0) { - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(note_frequency); - } else { - freq = note_frequency; - } - #else - freq = note_frequency; - #endif +# ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(note_frequency); + } else { + freq = note_frequency; + } +# else + freq = note_frequency; +# endif if (envelope_index < 65535) { envelope_index++; } freq = voice_envelope(freq); - TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); + TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); } else { - TIMER_1_PERIOD = 0; + TIMER_1_PERIOD = 0; TIMER_1_DUTY_CYCLE = 0; } @@ -629,16 +615,16 @@ ISR(TIMER1_AUDIO_vect) current_note--; if ((*notes_pointer)[current_note][0] == (*notes_pointer)[current_note + 1][0]) { note_frequency = 0; - note_length = 1; + note_length = 1; } else { note_frequency = (*notes_pointer)[current_note][0]; - note_length = 1; + note_length = 1; } } else { - note_resting = false; + note_resting = false; envelope_index = 0; note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); } note_position = 0; @@ -647,14 +633,13 @@ ISR(TIMER1_AUDIO_vect) if (!audio_config.enable) { playing_notes = false; - playing_note = false; + playing_note = false; } -#endif +# endif } #endif void play_note(float freq, int vol) { - dprintf("audio play note freq=%d vol=%d", (int)freq, vol); if (!audio_initialized) { @@ -662,16 +647,15 @@ void play_note(float freq, int vol) { } if (audio_config.enable && voices < 8) { - #ifdef CPIN_AUDIO - DISABLE_AUDIO_COUNTER_3_ISR; - #endif - #ifdef BPIN_AUDIO - DISABLE_AUDIO_COUNTER_1_ISR; - #endif +#ifdef CPIN_AUDIO + DISABLE_AUDIO_COUNTER_3_ISR; +#endif +#ifdef BPIN_AUDIO + DISABLE_AUDIO_COUNTER_1_ISR; +#endif // Cancel notes if notes are playing - if (playing_notes) - stop_all_notes(); + if (playing_notes) stop_all_notes(); playing_note = true; @@ -679,90 +663,78 @@ void play_note(float freq, int vol) { if (freq > 0) { frequencies[voices] = freq; - volumes[voices] = vol; + volumes[voices] = vol; voices++; } - #ifdef CPIN_AUDIO - ENABLE_AUDIO_COUNTER_3_ISR; - ENABLE_AUDIO_COUNTER_3_OUTPUT; - #endif - #ifdef BPIN_AUDIO - #ifdef CPIN_AUDIO - if (voices > 1) { - ENABLE_AUDIO_COUNTER_1_ISR; - ENABLE_AUDIO_COUNTER_1_OUTPUT; - } - #else +#ifdef CPIN_AUDIO + ENABLE_AUDIO_COUNTER_3_ISR; + ENABLE_AUDIO_COUNTER_3_OUTPUT; +#endif +#ifdef BPIN_AUDIO +# ifdef CPIN_AUDIO + if (voices > 1) { ENABLE_AUDIO_COUNTER_1_ISR; ENABLE_AUDIO_COUNTER_1_OUTPUT; - #endif - #endif + } +# else + ENABLE_AUDIO_COUNTER_1_ISR; + ENABLE_AUDIO_COUNTER_1_OUTPUT; +# endif +#endif } - } -void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) -{ - +void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) { if (!audio_initialized) { audio_init(); } if (audio_config.enable) { - - #ifdef CPIN_AUDIO - DISABLE_AUDIO_COUNTER_3_ISR; - #endif - #ifdef BPIN_AUDIO - DISABLE_AUDIO_COUNTER_1_ISR; - #endif +#ifdef CPIN_AUDIO + DISABLE_AUDIO_COUNTER_3_ISR; +#endif +#ifdef BPIN_AUDIO + DISABLE_AUDIO_COUNTER_1_ISR; +#endif // Cancel note if a note is playing - if (playing_note) - stop_all_notes(); + if (playing_note) stop_all_notes(); playing_notes = true; notes_pointer = np; - notes_count = n_count; - notes_repeat = n_repeat; + notes_count = n_count; + notes_repeat = n_repeat; - place = 0; + place = 0; current_note = 0; note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); - note_position = 0; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + note_position = 0; - - #ifdef CPIN_AUDIO - ENABLE_AUDIO_COUNTER_3_ISR; - ENABLE_AUDIO_COUNTER_3_OUTPUT; - #endif - #ifdef BPIN_AUDIO - #ifndef CPIN_AUDIO - ENABLE_AUDIO_COUNTER_1_ISR; - ENABLE_AUDIO_COUNTER_1_OUTPUT; - #endif - #endif +#ifdef CPIN_AUDIO + ENABLE_AUDIO_COUNTER_3_ISR; + ENABLE_AUDIO_COUNTER_3_OUTPUT; +#endif +#ifdef BPIN_AUDIO +# ifndef CPIN_AUDIO + ENABLE_AUDIO_COUNTER_1_ISR; + ENABLE_AUDIO_COUNTER_1_OUTPUT; +# endif +#endif } - } -bool is_playing_notes(void) { - return playing_notes; -} +bool is_playing_notes(void) { return playing_notes; } -bool is_audio_on(void) { - return (audio_config.enable != 0); -} +bool is_audio_on(void) { return (audio_config.enable != 0); } void audio_toggle(void) { audio_config.enable ^= 1; eeconfig_update_audio(audio_config.raw); - if (audio_config.enable) - audio_on_user(); + if (audio_config.enable) audio_on_user(); } void audio_on(void) { @@ -784,73 +756,45 @@ void audio_off(void) { // Vibrato rate functions -void set_vibrato_rate(float rate) { - vibrato_rate = rate; -} +void set_vibrato_rate(float rate) { vibrato_rate = rate; } -void increase_vibrato_rate(float change) { - vibrato_rate *= change; -} +void increase_vibrato_rate(float change) { vibrato_rate *= change; } -void decrease_vibrato_rate(float change) { - vibrato_rate /= change; -} +void decrease_vibrato_rate(float change) { vibrato_rate /= change; } -#ifdef VIBRATO_STRENGTH_ENABLE +# ifdef VIBRATO_STRENGTH_ENABLE -void set_vibrato_strength(float strength) { - vibrato_strength = strength; -} +void set_vibrato_strength(float strength) { vibrato_strength = strength; } -void increase_vibrato_strength(float change) { - vibrato_strength *= change; -} +void increase_vibrato_strength(float change) { vibrato_strength *= change; } -void decrease_vibrato_strength(float change) { - vibrato_strength /= change; -} +void decrease_vibrato_strength(float change) { vibrato_strength /= change; } -#endif /* VIBRATO_STRENGTH_ENABLE */ +# endif /* VIBRATO_STRENGTH_ENABLE */ #endif /* VIBRATO_ENABLE */ // Polyphony functions -void set_polyphony_rate(float rate) { - polyphony_rate = rate; -} +void set_polyphony_rate(float rate) { polyphony_rate = rate; } -void enable_polyphony() { - polyphony_rate = 5; -} +void enable_polyphony() { polyphony_rate = 5; } -void disable_polyphony() { - polyphony_rate = 0; -} +void disable_polyphony() { polyphony_rate = 0; } -void increase_polyphony_rate(float change) { - polyphony_rate *= change; -} +void increase_polyphony_rate(float change) { polyphony_rate *= change; } -void decrease_polyphony_rate(float change) { - polyphony_rate /= change; -} +void decrease_polyphony_rate(float change) { polyphony_rate /= change; } // Timbre function -void set_timbre(float timbre) { - note_timbre = timbre; -} +void set_timbre(float timbre) { note_timbre = timbre; } // Tempo functions -void set_tempo(uint8_t tempo) { - note_tempo = tempo; -} +void set_tempo(uint8_t tempo) { note_tempo = tempo; } -void decrease_tempo(uint8_t tempo_change) { - note_tempo += tempo_change; -} +void decrease_tempo(uint8_t tempo_change) { note_tempo += tempo_change; } void increase_tempo(uint8_t tempo_change) { if (note_tempo - tempo_change < 10) { diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index 8136c5b258..2bcc27b4a1 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h @@ -19,7 +19,7 @@ #include <stdint.h> #include <stdbool.h> #if defined(__AVR__) - #include <avr/io.h> +# include <avr/io.h> #endif #include "wait.h" #include "musical_notes.h" @@ -39,9 +39,9 @@ typedef union { uint8_t raw; struct { - bool enable :1; - bool clicky_enable :1; - uint8_t level :6; + bool enable : 1; + bool clicky_enable : 1; + uint8_t level : 6; }; } audio_config_t; @@ -58,13 +58,13 @@ void set_vibrato_rate(float rate); void increase_vibrato_rate(float change); void decrease_vibrato_rate(float change); -#ifdef VIBRATO_STRENGTH_ENABLE +# ifdef VIBRATO_STRENGTH_ENABLE void set_vibrato_strength(float strength); void increase_vibrato_strength(float change); void decrease_vibrato_strength(float change); -#endif +# endif #endif @@ -85,25 +85,23 @@ void decrease_tempo(uint8_t tempo_change); void audio_init(void); #ifdef PWM_AUDIO -void play_sample(uint8_t * s, uint16_t l, bool r); +void play_sample(uint8_t* s, uint16_t l, bool r); #endif void play_note(float freq, int vol); void stop_note(float freq); void stop_all_notes(void); void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat); -#define SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ - 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ - 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \ - 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \ - 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), } +#define SCALE \ + (int8_t[]) { 0 + (12 * 0), 2 + (12 * 0), 4 + (12 * 0), 5 + (12 * 0), 7 + (12 * 0), 9 + (12 * 0), 11 + (12 * 0), 0 + (12 * 1), 2 + (12 * 1), 4 + (12 * 1), 5 + (12 * 1), 7 + (12 * 1), 9 + (12 * 1), 11 + (12 * 1), 0 + (12 * 2), 2 + (12 * 2), 4 + (12 * 2), 5 + (12 * 2), 7 + (12 * 2), 9 + (12 * 2), 11 + (12 * 2), 0 + (12 * 3), 2 + (12 * 3), 4 + (12 * 3), 5 + (12 * 3), 7 + (12 * 3), 9 + (12 * 3), 11 + (12 * 3), 0 + (12 * 4), 2 + (12 * 4), 4 + (12 * 4), 5 + (12 * 4), 7 + (12 * 4), 9 + (12 * 4), 11 + (12 * 4), } // These macros are used to allow play_notes to play an array of indeterminate // length. This works around the limitation of C's sizeof operation on pointers. // The global float array for the song must be used here. #define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0])))) -#define PLAY_NOTE_ARRAY(note_array, note_repeat, deprecated_arg) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat)); \ - _Pragma ("message \"'PLAY_NOTE_ARRAY' macro is deprecated\"") +#define PLAY_NOTE_ARRAY(note_array, note_repeat, deprecated_arg) \ + play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat)); \ + _Pragma("message \"'PLAY_NOTE_ARRAY' macro is deprecated\"") #define PLAY_SONG(note_array) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), false) #define PLAY_LOOP(note_array) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), true) diff --git a/quantum/audio/audio_arm.c b/quantum/audio/audio_arm.c index de0cd15c58..87d625301f 100644 --- a/quantum/audio/audio_arm.c +++ b/quantum/audio/audio_arm.c @@ -26,41 +26,41 @@ // ----------------------------------------------------------------------------- -int voices = 0; -int voice_place = 0; -float frequency = 0; +int voices = 0; +int voice_place = 0; +float frequency = 0; float frequency_alt = 0; -int volume = 0; -long position = 0; +int volume = 0; +long position = 0; float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -bool sliding = false; +int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +bool sliding = false; float place = 0; -uint8_t * sample; +uint8_t *sample; uint16_t sample_length = 0; -bool playing_notes = false; -bool playing_note = false; +bool playing_notes = false; +bool playing_note = false; float note_frequency = 0; -float note_length = 0; -uint8_t note_tempo = TEMPO_DEFAULT; -float note_timbre = TIMBRE_DEFAULT; -uint16_t note_position = 0; -float (* notes_pointer)[][2]; +float note_length = 0; +uint8_t note_tempo = TEMPO_DEFAULT; +float note_timbre = TIMBRE_DEFAULT; +uint16_t note_position = 0; +float (*notes_pointer)[][2]; uint16_t notes_count; bool notes_repeat; bool note_resting = false; uint16_t current_note = 0; -uint8_t rest_counter = 0; +uint8_t rest_counter = 0; #ifdef VIBRATO_ENABLE -float vibrato_counter = 0; +float vibrato_counter = 0; float vibrato_strength = .5; -float vibrato_rate = 0.125; +float vibrato_rate = 0.125; #endif float polyphony_rate = 0; @@ -70,10 +70,10 @@ static bool audio_initialized = false; audio_config_t audio_config; uint16_t envelope_index = 0; -bool glissando = true; +bool glissando = true; #ifndef STARTUP_SONG - #define STARTUP_SONG SONG(STARTUP_SOUND) +# define STARTUP_SONG SONG(STARTUP_SOUND) #endif float startup_song[][2] = STARTUP_SONG; @@ -81,27 +81,32 @@ static void gpt_cb8(GPTDriver *gptp); #define DAC_BUFFER_SIZE 100 #ifndef DAC_SAMPLE_MAX -#define DAC_SAMPLE_MAX 65535U +# define DAC_SAMPLE_MAX 65535U #endif -#define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \ +#define START_CHANNEL_1() \ + gptStart(&GPTD6, &gpt6cfg1); \ gptStartContinuous(&GPTD6, 2U) -#define START_CHANNEL_2() gptStart(&GPTD7, &gpt7cfg1); \ +#define START_CHANNEL_2() \ + gptStart(&GPTD7, &gpt7cfg1); \ gptStartContinuous(&GPTD7, 2U) #define STOP_CHANNEL_1() gptStopTimer(&GPTD6) #define STOP_CHANNEL_2() gptStopTimer(&GPTD7) -#define RESTART_CHANNEL_1() STOP_CHANNEL_1(); \ +#define RESTART_CHANNEL_1() \ + STOP_CHANNEL_1(); \ START_CHANNEL_1() -#define RESTART_CHANNEL_2() STOP_CHANNEL_2(); \ +#define RESTART_CHANNEL_2() \ + STOP_CHANNEL_2(); \ START_CHANNEL_2() -#define UPDATE_CHANNEL_1_FREQ(freq) gpt6cfg1.frequency = freq * DAC_BUFFER_SIZE; \ +#define UPDATE_CHANNEL_1_FREQ(freq) \ + gpt6cfg1.frequency = freq * DAC_BUFFER_SIZE; \ RESTART_CHANNEL_1() -#define UPDATE_CHANNEL_2_FREQ(freq) gpt7cfg1.frequency = freq * DAC_BUFFER_SIZE; \ +#define UPDATE_CHANNEL_2_FREQ(freq) \ + gpt7cfg1.frequency = freq * DAC_BUFFER_SIZE; \ RESTART_CHANNEL_2() #define GET_CHANNEL_1_FREQ (uint16_t)(gpt6cfg1.frequency * DAC_BUFFER_SIZE) #define GET_CHANNEL_2_FREQ (uint16_t)(gpt7cfg1.frequency * DAC_BUFFER_SIZE) - /* * GPT6 configuration. */ @@ -112,27 +117,20 @@ static void gpt_cb8(GPTDriver *gptp); // .dier = 0U // }; -GPTConfig gpt6cfg1 = { - .frequency = 440U*DAC_BUFFER_SIZE, - .callback = NULL, - .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ - .dier = 0U -}; +GPTConfig gpt6cfg1 = {.frequency = 440U * DAC_BUFFER_SIZE, + .callback = NULL, + .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ + .dier = 0U}; -GPTConfig gpt7cfg1 = { - .frequency = 440U*DAC_BUFFER_SIZE, - .callback = NULL, - .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ - .dier = 0U -}; - -GPTConfig gpt8cfg1 = { - .frequency = 10, - .callback = gpt_cb8, - .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ - .dier = 0U -}; +GPTConfig gpt7cfg1 = {.frequency = 440U * DAC_BUFFER_SIZE, + .callback = NULL, + .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ + .dier = 0U}; +GPTConfig gpt8cfg1 = {.frequency = 10, + .callback = gpt_cb8, + .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ + .dier = 0U}; /* * DAC test buffer (sine wave). @@ -205,122 +203,101 @@ GPTConfig gpt8cfg1 = { // squarewave static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = { - // First half is max, second half is 0 - [0 ... DAC_BUFFER_SIZE/2-1] = DAC_SAMPLE_MAX, - [DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = 0, + // First half is max, second half is 0 + [0 ... DAC_BUFFER_SIZE / 2 - 1] = DAC_SAMPLE_MAX, + [DAC_BUFFER_SIZE / 2 ... DAC_BUFFER_SIZE - 1] = 0, }; // squarewave static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = { - // opposite of dac_buffer above - [0 ... DAC_BUFFER_SIZE/2-1] = 0, - [DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = DAC_SAMPLE_MAX, + // opposite of dac_buffer above + [0 ... DAC_BUFFER_SIZE / 2 - 1] = 0, + [DAC_BUFFER_SIZE / 2 ... DAC_BUFFER_SIZE - 1] = DAC_SAMPLE_MAX, }; /* * DAC streaming callback. */ -size_t nx = 0, ny = 0, nz = 0; +size_t nx = 0, ny = 0, nz = 0; static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) { + (void)dacp; - (void)dacp; - - nz++; - if (dac_buffer == buffer) { - nx += n; - } - else { - ny += n; - } + nz++; + if (dac_buffer == buffer) { + nx += n; + } else { + ny += n; + } - if ((nz % 1000) == 0) { - // palTogglePad(GPIOD, GPIOD_LED3); - } + if ((nz % 1000) == 0) { + // palTogglePad(GPIOD, GPIOD_LED3); + } } /* * DAC error callback. */ static void error_cb1(DACDriver *dacp, dacerror_t err) { + (void)dacp; + (void)err; - (void)dacp; - (void)err; - - chSysHalt("DAC failure"); + chSysHalt("DAC failure"); } -static const DACConfig dac1cfg1 = { - .init = DAC_SAMPLE_MAX, - .datamode = DAC_DHRM_12BIT_RIGHT -}; +static const DACConfig dac1cfg1 = {.init = DAC_SAMPLE_MAX, .datamode = DAC_DHRM_12BIT_RIGHT}; -static const DACConversionGroup dacgrpcfg1 = { - .num_channels = 1U, - .end_cb = end_cb1, - .error_cb = error_cb1, - .trigger = DAC_TRG(0) -}; +static const DACConversionGroup dacgrpcfg1 = {.num_channels = 1U, .end_cb = end_cb1, .error_cb = error_cb1, .trigger = DAC_TRG(0)}; -static const DACConfig dac1cfg2 = { - .init = DAC_SAMPLE_MAX, - .datamode = DAC_DHRM_12BIT_RIGHT -}; +static const DACConfig dac1cfg2 = {.init = DAC_SAMPLE_MAX, .datamode = DAC_DHRM_12BIT_RIGHT}; -static const DACConversionGroup dacgrpcfg2 = { - .num_channels = 1U, - .end_cb = end_cb1, - .error_cb = error_cb1, - .trigger = DAC_TRG(0) -}; +static const DACConversionGroup dacgrpcfg2 = {.num_channels = 1U, .end_cb = end_cb1, .error_cb = error_cb1, .trigger = DAC_TRG(0)}; void audio_init() { + if (audio_initialized) { + return; + } - if (audio_initialized) { - return; - } - - // Check EEPROM - #if defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE) +// Check EEPROM +#if defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE) if (!eeconfig_is_enabled()) { - eeconfig_init(); + eeconfig_init(); } audio_config.raw = eeconfig_read_audio(); -#else // ARM EEPROM - audio_config.enable = true; - #ifdef AUDIO_CLICKY_ON +#else // ARM EEPROM + audio_config.enable = true; +# ifdef AUDIO_CLICKY_ON audio_config.clicky_enable = true; - #endif -#endif // ARM EEPROM - - /* - * Starting DAC1 driver, setting up the output pin as analog as suggested - * by the Reference Manual. - */ - palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG); - palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG); - dacStart(&DACD1, &dac1cfg1); - dacStart(&DACD2, &dac1cfg2); - - /* - * Starting GPT6/7 driver, it is used for triggering the DAC. - */ - START_CHANNEL_1(); - START_CHANNEL_2(); - - /* - * Starting a continuous conversion. - */ - dacStartConversion(&DACD1, &dacgrpcfg1, (dacsample_t *)dac_buffer, DAC_BUFFER_SIZE); - dacStartConversion(&DACD2, &dacgrpcfg2, (dacsample_t *)dac_buffer_2, DAC_BUFFER_SIZE); - - audio_initialized = true; - - if (audio_config.enable) { - PLAY_SONG(startup_song); - } else { - stop_all_notes(); - } - +# endif +#endif // ARM EEPROM + + /* + * Starting DAC1 driver, setting up the output pin as analog as suggested + * by the Reference Manual. + */ + palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG); + palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG); + dacStart(&DACD1, &dac1cfg1); + dacStart(&DACD2, &dac1cfg2); + + /* + * Starting GPT6/7 driver, it is used for triggering the DAC. + */ + START_CHANNEL_1(); + START_CHANNEL_2(); + + /* + * Starting a continuous conversion. + */ + dacStartConversion(&DACD1, &dacgrpcfg1, (dacsample_t *)dac_buffer, DAC_BUFFER_SIZE); + dacStartConversion(&DACD2, &dacgrpcfg2, (dacsample_t *)dac_buffer_2, DAC_BUFFER_SIZE); + + audio_initialized = true; + + if (audio_config.enable) { + PLAY_SONG(startup_song); + } else { + stop_all_notes(); + } } void stop_all_notes() { @@ -336,437 +313,396 @@ void stop_all_notes() { gptStopTimer(&GPTD8); playing_notes = false; - playing_note = false; - frequency = 0; + playing_note = false; + frequency = 0; frequency_alt = 0; - volume = 0; + volume = 0; - for (uint8_t i = 0; i < 8; i++) - { + for (uint8_t i = 0; i < 8; i++) { frequencies[i] = 0; - volumes[i] = 0; + volumes[i] = 0; } } void stop_note(float freq) { - dprintf("audio stop note freq=%d", (int)freq); + dprintf("audio stop note freq=%d", (int)freq); - if (playing_note) { - if (!audio_initialized) { - audio_init(); - } - for (int i = 7; i >= 0; i--) { - if (frequencies[i] == freq) { - frequencies[i] = 0; - volumes[i] = 0; - for (int j = i; (j < 7); j++) { - frequencies[j] = frequencies[j+1]; - frequencies[j+1] = 0; - volumes[j] = volumes[j+1]; - volumes[j+1] = 0; + if (playing_note) { + if (!audio_initialized) { + audio_init(); + } + for (int i = 7; i >= 0; i--) { + if (frequencies[i] == freq) { + frequencies[i] = 0; + volumes[i] = 0; + for (int j = i; (j < 7); j++) { + frequencies[j] = frequencies[j + 1]; + frequencies[j + 1] = 0; + volumes[j] = volumes[j + 1]; + volumes[j + 1] = 0; + } + break; + } + } + voices--; + if (voices < 0) { + voices = 0; + } + if (voice_place >= voices) { + voice_place = 0; + } + if (voices == 0) { + STOP_CHANNEL_1(); + STOP_CHANNEL_2(); + gptStopTimer(&GPTD8); + frequency = 0; + frequency_alt = 0; + volume = 0; + playing_note = false; } - break; - } - } - voices--; - if (voices < 0) { - voices = 0; - } - if (voice_place >= voices) { - voice_place = 0; - } - if (voices == 0) { - STOP_CHANNEL_1(); - STOP_CHANNEL_2(); - gptStopTimer(&GPTD8); - frequency = 0; - frequency_alt = 0; - volume = 0; - playing_note = false; } - } } #ifdef VIBRATO_ENABLE float mod(float a, int b) { - float r = fmod(a, b); - return r < 0 ? r + b : r; + float r = fmod(a, b); + return r < 0 ? r + b : r; } float vibrato(float average_freq) { - #ifdef VIBRATO_STRENGTH_ENABLE +# ifdef VIBRATO_STRENGTH_ENABLE float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength); - #else +# else float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter]; - #endif - vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); - return vibrated_freq; +# endif + vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0 / average_freq)), VIBRATO_LUT_LENGTH); + return vibrated_freq; } #endif static void gpt_cb8(GPTDriver *gptp) { - float freq; - - if (playing_note) { - if (voices > 0) { - - float freq_alt = 0; - if (voices > 1) { - if (polyphony_rate == 0) { - if (glissando) { - if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440/frequencies[voices - 2]/12/2)) { - frequency_alt = frequency_alt * pow(2, 440/frequency_alt/12/2); - } else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440/frequencies[voices - 2]/12/2)) { - frequency_alt = frequency_alt * pow(2, -440/frequency_alt/12/2); - } else { - frequency_alt = frequencies[voices - 2]; - } - } else { - frequency_alt = frequencies[voices - 2]; - } + float freq; - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq_alt = vibrato(frequency_alt); - } else { - freq_alt = frequency_alt; - } - #else - freq_alt = frequency_alt; - #endif - } + if (playing_note) { + if (voices > 0) { + float freq_alt = 0; + if (voices > 1) { + if (polyphony_rate == 0) { + if (glissando) { + if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440 / frequencies[voices - 2] / 12 / 2)) { + frequency_alt = frequency_alt * pow(2, 440 / frequency_alt / 12 / 2); + } else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440 / frequencies[voices - 2] / 12 / 2)) { + frequency_alt = frequency_alt * pow(2, -440 / frequency_alt / 12 / 2); + } else { + frequency_alt = frequencies[voices - 2]; + } + } else { + frequency_alt = frequencies[voices - 2]; + } - if (envelope_index < 65535) { - envelope_index++; - } +#ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq_alt = vibrato(frequency_alt); + } else { + freq_alt = frequency_alt; + } +#else + freq_alt = frequency_alt; +#endif + } - freq_alt = voice_envelope(freq_alt); + if (envelope_index < 65535) { + envelope_index++; + } - if (freq_alt < 30.517578125) { - freq_alt = 30.52; - } + freq_alt = voice_envelope(freq_alt); - if (GET_CHANNEL_2_FREQ != (uint16_t)freq_alt) { - UPDATE_CHANNEL_2_FREQ(freq_alt); - } else { - RESTART_CHANNEL_2(); - } - //note_timbre; - } - - if (polyphony_rate > 0) { - if (voices > 1) { - voice_place %= voices; - if (place++ > (frequencies[voice_place] / polyphony_rate)) { - voice_place = (voice_place + 1) % voices; - place = 0.0; - } - } + if (freq_alt < 30.517578125) { + freq_alt = 30.52; + } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequencies[voice_place]); - } else { - freq = frequencies[voice_place]; - } - #else - freq = frequencies[voice_place]; - #endif - } else { - if (glissando) { - if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, 440/frequency/12/2); - } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, -440/frequency/12/2); - } else { - frequency = frequencies[voices - 1]; - } - } else { - frequency = frequencies[voices - 1]; - } + if (GET_CHANNEL_2_FREQ != (uint16_t)freq_alt) { + UPDATE_CHANNEL_2_FREQ(freq_alt); + } else { + RESTART_CHANNEL_2(); + } + // note_timbre; + } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequency); - } else { - freq = frequency; - } - #else - freq = frequency; - #endif - } + if (polyphony_rate > 0) { + if (voices > 1) { + voice_place %= voices; + if (place++ > (frequencies[voice_place] / polyphony_rate)) { + voice_place = (voice_place + 1) % voices; + place = 0.0; + } + } - if (envelope_index < 65535) { - envelope_index++; - } +#ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequencies[voice_place]); + } else { + freq = frequencies[voice_place]; + } +#else + freq = frequencies[voice_place]; +#endif + } else { + if (glissando) { + if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) { + frequency = frequency * pow(2, 440 / frequency / 12 / 2); + } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) { + frequency = frequency * pow(2, -440 / frequency / 12 / 2); + } else { + frequency = frequencies[voices - 1]; + } + } else { + frequency = frequencies[voices - 1]; + } - freq = voice_envelope(freq); +#ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequency); + } else { + freq = frequency; + } +#else + freq = frequency; +#endif + } - if (freq < 30.517578125) { - freq = 30.52; - } + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); - if (GET_CHANNEL_1_FREQ != (uint16_t)freq) { - UPDATE_CHANNEL_1_FREQ(freq); - } else { - RESTART_CHANNEL_1(); - } - //note_timbre; - } - } + if (freq < 30.517578125) { + freq = 30.52; + } - if (playing_notes) { - if (note_frequency > 0) { - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(note_frequency); - } else { - freq = note_frequency; + if (GET_CHANNEL_1_FREQ != (uint16_t)freq) { + UPDATE_CHANNEL_1_FREQ(freq); + } else { + RESTART_CHANNEL_1(); + } + // note_timbre; } - #else - freq = note_frequency; - #endif - - if (envelope_index < 65535) { - envelope_index++; - } - freq = voice_envelope(freq); - - - if (GET_CHANNEL_1_FREQ != (uint16_t)freq) { - UPDATE_CHANNEL_1_FREQ(freq); - UPDATE_CHANNEL_2_FREQ(freq); - } - //note_timbre; - } else { - // gptStopTimer(&GPTD6); - // gptStopTimer(&GPTD7); } - note_position++; - bool end_of_note = false; - if (GET_CHANNEL_1_FREQ > 0) { - if (!note_resting) - end_of_note = (note_position >= (note_length*8 - 1)); - else - end_of_note = (note_position >= (note_length*8)); - } else { - end_of_note = (note_position >= (note_length*8)); - } + if (playing_notes) { + if (note_frequency > 0) { +#ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(note_frequency); + } else { + freq = note_frequency; + } +#else + freq = note_frequency; +#endif - if (end_of_note) { - current_note++; - if (current_note >= notes_count) { - if (notes_repeat) { - current_note = 0; + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); + + if (GET_CHANNEL_1_FREQ != (uint16_t)freq) { + UPDATE_CHANNEL_1_FREQ(freq); + UPDATE_CHANNEL_2_FREQ(freq); + } + // note_timbre; } else { - STOP_CHANNEL_1(); - STOP_CHANNEL_2(); - // gptStopTimer(&GPTD8); - playing_notes = false; - return; + // gptStopTimer(&GPTD6); + // gptStopTimer(&GPTD7); } - } - if (!note_resting) { - note_resting = true; - current_note--; - if ((*notes_pointer)[current_note][0] == (*notes_pointer)[current_note + 1][0]) { - note_frequency = 0; - note_length = 1; + + note_position++; + bool end_of_note = false; + if (GET_CHANNEL_1_FREQ > 0) { + if (!note_resting) + end_of_note = (note_position >= (note_length * 8 - 1)); + else + end_of_note = (note_position >= (note_length * 8)); } else { - note_frequency = (*notes_pointer)[current_note][0]; - note_length = 1; + end_of_note = (note_position >= (note_length * 8)); } - } else { - note_resting = false; - envelope_index = 0; - note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); - } - note_position = 0; + if (end_of_note) { + current_note++; + if (current_note >= notes_count) { + if (notes_repeat) { + current_note = 0; + } else { + STOP_CHANNEL_1(); + STOP_CHANNEL_2(); + // gptStopTimer(&GPTD8); + playing_notes = false; + return; + } + } + if (!note_resting) { + note_resting = true; + current_note--; + if ((*notes_pointer)[current_note][0] == (*notes_pointer)[current_note + 1][0]) { + note_frequency = 0; + note_length = 1; + } else { + note_frequency = (*notes_pointer)[current_note][0]; + note_length = 1; + } + } else { + note_resting = false; + envelope_index = 0; + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + } + + note_position = 0; + } } - } - if (!audio_config.enable) { - playing_notes = false; - playing_note = false; - } + if (!audio_config.enable) { + playing_notes = false; + playing_note = false; + } } void play_note(float freq, int vol) { + dprintf("audio play note freq=%d vol=%d", (int)freq, vol); - dprintf("audio play note freq=%d vol=%d", (int)freq, vol); - - if (!audio_initialized) { - audio_init(); - } - - if (audio_config.enable && voices < 8) { - - // Cancel notes if notes are playing - if (playing_notes) { - stop_all_notes(); + if (!audio_initialized) { + audio_init(); } - playing_note = true; + if (audio_config.enable && voices < 8) { + // Cancel notes if notes are playing + if (playing_notes) { + stop_all_notes(); + } - envelope_index = 0; + playing_note = true; - if (freq > 0) { - frequencies[voices] = freq; - volumes[voices] = vol; - voices++; - } + envelope_index = 0; - gptStart(&GPTD8, &gpt8cfg1); - gptStartContinuous(&GPTD8, 2U); - RESTART_CHANNEL_1(); - RESTART_CHANNEL_2(); - } + if (freq > 0) { + frequencies[voices] = freq; + volumes[voices] = vol; + voices++; + } + gptStart(&GPTD8, &gpt8cfg1); + gptStartContinuous(&GPTD8, 2U); + RESTART_CHANNEL_1(); + RESTART_CHANNEL_2(); + } } void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) { - - if (!audio_initialized) { - audio_init(); - } - - if (audio_config.enable) { - - // Cancel note if a note is playing - if (playing_note) { - stop_all_notes(); + if (!audio_initialized) { + audio_init(); } - playing_notes = true; + if (audio_config.enable) { + // Cancel note if a note is playing + if (playing_note) { + stop_all_notes(); + } - notes_pointer = np; - notes_count = n_count; - notes_repeat = n_repeat; + playing_notes = true; - place = 0; - current_note = 0; + notes_pointer = np; + notes_count = n_count; + notes_repeat = n_repeat; - note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); - note_position = 0; + place = 0; + current_note = 0; - gptStart(&GPTD8, &gpt8cfg1); - gptStartContinuous(&GPTD8, 2U); - RESTART_CHANNEL_1(); - RESTART_CHANNEL_2(); - } -} + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + note_position = 0; -bool is_playing_notes(void) { - return playing_notes; + gptStart(&GPTD8, &gpt8cfg1); + gptStartContinuous(&GPTD8, 2U); + RESTART_CHANNEL_1(); + RESTART_CHANNEL_2(); + } } -bool is_audio_on(void) { - return (audio_config.enable != 0); -} +bool is_playing_notes(void) { return playing_notes; } + +bool is_audio_on(void) { return (audio_config.enable != 0); } void audio_toggle(void) { - audio_config.enable ^= 1; - eeconfig_update_audio(audio_config.raw); - if (audio_config.enable) { - audio_on_user(); - } + audio_config.enable ^= 1; + eeconfig_update_audio(audio_config.raw); + if (audio_config.enable) { + audio_on_user(); + } } void audio_on(void) { - audio_config.enable = 1; - eeconfig_update_audio(audio_config.raw); - audio_on_user(); + audio_config.enable = 1; + eeconfig_update_audio(audio_config.raw); + audio_on_user(); } void audio_off(void) { - stop_all_notes(); - audio_config.enable = 0; - eeconfig_update_audio(audio_config.raw); + stop_all_notes(); + audio_config.enable = 0; + eeconfig_update_audio(audio_config.raw); } #ifdef VIBRATO_ENABLE // Vibrato rate functions -void set_vibrato_rate(float rate) { - vibrato_rate = rate; -} +void set_vibrato_rate(float rate) { vibrato_rate = rate; } -void increase_vibrato_rate(float change) { - vibrato_rate *= change; -} +void increase_vibrato_rate(float change) { vibrato_rate *= change; } -void decrease_vibrato_rate(float change) { - vibrato_rate /= change; -} +void decrease_vibrato_rate(float change) { vibrato_rate /= change; } -#ifdef VIBRATO_STRENGTH_ENABLE +# ifdef VIBRATO_STRENGTH_ENABLE -void set_vibrato_strength(float strength) { - vibrato_strength = strength; -} +void set_vibrato_strength(float strength) { vibrato_strength = strength; } -void increase_vibrato_strength(float change) { - vibrato_strength *= change; -} +void increase_vibrato_strength(float change) { vibrato_strength *= change; } -void decrease_vibrato_strength(float change) { - vibrato_strength /= change; -} +void decrease_vibrato_strength(float change) { vibrato_strength /= change; } -#endif /* VIBRATO_STRENGTH_ENABLE */ +# endif /* VIBRATO_STRENGTH_ENABLE */ #endif /* VIBRATO_ENABLE */ // Polyphony functions -void set_polyphony_rate(float rate) { - polyphony_rate = rate; -} +void set_polyphony_rate(float rate) { polyphony_rate = rate; } -void enable_polyphony() { - polyphony_rate = 5; -} +void enable_polyphony() { polyphony_rate = 5; } -void disable_polyphony() { - polyphony_rate = 0; -} +void disable_polyphony() { polyphony_rate = 0; } -void increase_polyphony_rate(float change) { - polyphony_rate *= change; -} +void increase_polyphony_rate(float change) { polyphony_rate *= change; } -void decrease_polyphony_rate(float change) { - polyphony_rate /= change; -} +void decrease_polyphony_rate(float change) { polyphony_rate /= change; } // Timbre function -void set_timbre(float timbre) { - note_timbre = timbre; -} +void set_timbre(float timbre) { note_timbre = timbre; } // Tempo functions -void set_tempo(uint8_t tempo) { - note_tempo = tempo; -} +void set_tempo(uint8_t tempo) { note_tempo = tempo; } -void decrease_tempo(uint8_t tempo_change) { - note_tempo += tempo_change; -} +void decrease_tempo(uint8_t tempo_change) { note_tempo += tempo_change; } void increase_tempo(uint8_t tempo_change) { - if (note_tempo - tempo_change < 10) { - note_tempo = 10; - } else { - note_tempo -= tempo_change; - } + if (note_tempo - tempo_change < 10) { + note_tempo = 10; + } else { + note_tempo -= tempo_change; + } } diff --git a/quantum/audio/audio_pwm.c b/quantum/audio/audio_pwm.c index ed67136099..545aef6dd7 100644 --- a/quantum/audio/audio_pwm.c +++ b/quantum/audio/audio_pwm.c @@ -29,7 +29,6 @@ #define CPU_PRESCALER 8 - // Timer Abstractions // TIMSK3 - Timer/Counter #3 Interrupt Mask Register @@ -37,70 +36,67 @@ #define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A) #define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A) - // TCCR3A: Timer/Counter #3 Control Register // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 #define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1); #define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0)); - #define NOTE_PERIOD ICR3 #define NOTE_DUTY_CYCLE OCR3A - #ifdef PWM_AUDIO - #include "wave.h" - #define SAMPLE_DIVIDER 39 - #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) - // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap - - float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint16_t place_int = 0; - bool repeat = true; +# include "wave.h" +# define SAMPLE_DIVIDER 39 +# define SAMPLE_RATE (2000000.0 / SAMPLE_DIVIDER / 2048) +// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap + +float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +uint16_t place_int = 0; +bool repeat = true; #endif void delay_us(int count) { - while(count--) { - _delay_us(1); - } + while (count--) { + _delay_us(1); + } } -int voices = 0; -int voice_place = 0; -float frequency = 0; -int volume = 0; -long position = 0; +int voices = 0; +int voice_place = 0; +float frequency = 0; +int volume = 0; +long position = 0; float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -bool sliding = false; +int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +bool sliding = false; float place = 0; -uint8_t * sample; +uint8_t* sample; uint16_t sample_length = 0; // float freq = 0; -bool playing_notes = false; -bool playing_note = false; +bool playing_notes = false; +bool playing_note = false; float note_frequency = 0; -float note_length = 0; -uint8_t note_tempo = TEMPO_DEFAULT; -float note_timbre = TIMBRE_DEFAULT; -uint16_t note_position = 0; -float (* notes_pointer)[][2]; +float note_length = 0; +uint8_t note_tempo = TEMPO_DEFAULT; +float note_timbre = TIMBRE_DEFAULT; +uint16_t note_position = 0; +float (*notes_pointer)[][2]; uint16_t notes_count; bool notes_repeat; float notes_rest; bool note_resting = false; uint16_t current_note = 0; -uint8_t rest_counter = 0; +uint8_t rest_counter = 0; #ifdef VIBRATO_ENABLE -float vibrato_counter = 0; +float vibrato_counter = 0; float vibrato_strength = .5; -float vibrato_rate = 0.125; +float vibrato_rate = 0.125; #endif float polyphony_rate = 0; @@ -112,50 +108,49 @@ audio_config_t audio_config; uint16_t envelope_index = 0; void audio_init() { - // Check EEPROM - if (!eeconfig_is_enabled()) - { + if (!eeconfig_is_enabled()) { eeconfig_init(); } audio_config.raw = eeconfig_read_audio(); - #ifdef PWM_AUDIO +#ifdef PWM_AUDIO - PLLFRQ = _BV(PDIV2); - PLLCSR = _BV(PLLE); - while(!(PLLCSR & _BV(PLOCK))); - PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ + PLLFRQ = _BV(PDIV2); + PLLCSR = _BV(PLLE); + while (!(PLLCSR & _BV(PLOCK))) + ; + PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ - /* Init a fast PWM on Timer4 */ - TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ - TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ - OCR4A = 0; + /* Init a fast PWM on Timer4 */ + TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ + TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ + OCR4A = 0; - /* Enable the OC4A output */ - DDRC |= _BV(PORTC6); + /* Enable the OC4A output */ + DDRC |= _BV(PORTC6); - DISABLE_AUDIO_COUNTER_3_ISR; // Turn off 3A interputs + DISABLE_AUDIO_COUNTER_3_ISR; // Turn off 3A interputs - TCCR3A = 0x0; // Options not needed - TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC - OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback + TCCR3A = 0x0; // Options not needed + TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC + OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback - #else +#else - // Set port PC6 (OC3A and /OC4A) as output - DDRC |= _BV(PORTC6); + // Set port PC6 (OC3A and /OC4A) as output + DDRC |= _BV(PORTC6); - DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_ISR; - // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers - // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 - // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A) - // Clock Select (CS3n) = 0b010 = Clock / 8 - TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); - TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); + // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers + // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 + // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A) + // Clock Select (CS3n) = 0b010 = Clock / 8 + TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); + TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); - #endif +#endif audio_initialized = true; } @@ -165,62 +160,59 @@ void stop_all_notes() { audio_init(); } voices = 0; - #ifdef PWM_AUDIO - DISABLE_AUDIO_COUNTER_3_ISR; - #else - DISABLE_AUDIO_COUNTER_3_ISR; - DISABLE_AUDIO_COUNTER_3_OUTPUT; - #endif +#ifdef PWM_AUDIO + DISABLE_AUDIO_COUNTER_3_ISR; +#else + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; +#endif playing_notes = false; - playing_note = false; - frequency = 0; - volume = 0; + playing_note = false; + frequency = 0; + volume = 0; - for (uint8_t i = 0; i < 8; i++) - { + for (uint8_t i = 0; i < 8; i++) { frequencies[i] = 0; - volumes[i] = 0; + volumes[i] = 0; } } -void stop_note(float freq) -{ +void stop_note(float freq) { if (playing_note) { if (!audio_initialized) { audio_init(); } - #ifdef PWM_AUDIO - freq = freq / SAMPLE_RATE; - #endif +#ifdef PWM_AUDIO + freq = freq / SAMPLE_RATE; +#endif for (int i = 7; i >= 0; i--) { if (frequencies[i] == freq) { frequencies[i] = 0; - volumes[i] = 0; + volumes[i] = 0; for (int j = i; (j < 7); j++) { - frequencies[j] = frequencies[j+1]; - frequencies[j+1] = 0; - volumes[j] = volumes[j+1]; - volumes[j+1] = 0; + frequencies[j] = frequencies[j + 1]; + frequencies[j + 1] = 0; + volumes[j] = volumes[j + 1]; + volumes[j + 1] = 0; } break; } } voices--; - if (voices < 0) - voices = 0; + if (voices < 0) voices = 0; if (voice_place >= voices) { voice_place = 0; } if (voices == 0) { - #ifdef PWM_AUDIO - DISABLE_AUDIO_COUNTER_3_ISR; - #else - DISABLE_AUDIO_COUNTER_3_ISR; - DISABLE_AUDIO_COUNTER_3_OUTPUT; - #endif - frequency = 0; - volume = 0; +#ifdef PWM_AUDIO + DISABLE_AUDIO_COUNTER_3_ISR; +#else + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; +#endif + frequency = 0; + volume = 0; playing_note = false; } } @@ -228,126 +220,120 @@ void stop_note(float freq) #ifdef VIBRATO_ENABLE -float mod(float a, int b) -{ +float mod(float a, int b) { float r = fmod(a, b); return r < 0 ? r + b : r; } float vibrato(float average_freq) { - #ifdef VIBRATO_STRENGTH_ENABLE - float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength); - #else - float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter]; - #endif - vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); +# ifdef VIBRATO_STRENGTH_ENABLE + float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength); +# else + float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter]; +# endif + vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0 / average_freq)), VIBRATO_LUT_LENGTH); return vibrated_freq; } #endif -ISR(TIMER3_COMPA_vect) -{ +ISR(TIMER3_COMPA_vect) { if (playing_note) { - #ifdef PWM_AUDIO - if (voices == 1) { +#ifdef PWM_AUDIO + if (voices == 1) { + // SINE + OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; + + // SQUARE + // if (((int)place) >= 1024){ + // OCR4A = 0xFF >> 2; + // } else { + // OCR4A = 0x00; + // } + + // SAWTOOTH + // OCR4A = (int)place / 4; + + // TRIANGLE + // if (((int)place) >= 1024) { + // OCR4A = (int)place / 2; + // } else { + // OCR4A = 2048 - (int)place / 2; + // } + + place += frequency; + + if (place >= SINE_LENGTH) place -= SINE_LENGTH; + + } else { + int sum = 0; + for (int i = 0; i < voices; i++) { // SINE - OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; + sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2; // SQUARE - // if (((int)place) >= 1024){ - // OCR4A = 0xFF >> 2; + // if (((int)places[i]) >= 1024){ + // sum += 0xFF >> 2; // } else { - // OCR4A = 0x00; + // sum += 0x00; // } - // SAWTOOTH - // OCR4A = (int)place / 4; - - // TRIANGLE - // if (((int)place) >= 1024) { - // OCR4A = (int)place / 2; - // } else { - // OCR4A = 2048 - (int)place / 2; - // } + places[i] += frequencies[i]; - place += frequency; - - if (place >= SINE_LENGTH) - place -= SINE_LENGTH; - - } else { - int sum = 0; - for (int i = 0; i < voices; i++) { - // SINE - sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2; - - // SQUARE - // if (((int)places[i]) >= 1024){ - // sum += 0xFF >> 2; - // } else { - // sum += 0x00; - // } - - places[i] += frequencies[i]; - - if (places[i] >= SINE_LENGTH) - places[i] -= SINE_LENGTH; - } - OCR4A = sum; + if (places[i] >= SINE_LENGTH) places[i] -= SINE_LENGTH; } - #else - if (voices > 0) { - float freq; - if (polyphony_rate > 0) { - if (voices > 1) { - voice_place %= voices; - if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { - voice_place = (voice_place + 1) % voices; - place = 0.0; - } - } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequencies[voice_place]); - } else { - #else - { - #endif - freq = frequencies[voice_place]; + OCR4A = sum; + } +#else + if (voices > 0) { + float freq; + if (polyphony_rate > 0) { + if (voices > 1) { + voice_place %= voices; + if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { + voice_place = (voice_place + 1) % voices; + place = 0.0; } + } +# ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequencies[voice_place]); } else { - if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, 440/frequency/12/2); - } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, -440/frequency/12/2); - } else { - frequency = frequencies[voices - 1]; - } - - - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequency); - } else { - #else - { - #endif - freq = frequency; - } +# else + { +# endif + freq = frequencies[voice_place]; + } + } else { + if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) { + frequency = frequency * pow(2, 440 / frequency / 12 / 2); + } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) { + frequency = frequency * pow(2, -440 / frequency / 12 / 2); + } else { + frequency = frequencies[voices - 1]; } - if (envelope_index < 65535) { - envelope_index++; +# ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequency); + } else { +# else + { +# endif + freq = frequency; } - freq = voice_envelope(freq); + } - if (freq < 30.517578125) - freq = 30.52; - NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period - NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + if (envelope_index < 65535) { + envelope_index++; } - #endif + freq = voice_envelope(freq); + + if (freq < 30.517578125) freq = 30.52; + NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period + NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + } +#endif } // SAMPLE @@ -361,41 +347,38 @@ ISR(TIMER3_COMPA_vect) // else // DISABLE_AUDIO_COUNTER_3_ISR; - if (playing_notes) { - #ifdef PWM_AUDIO - OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; - - place += note_frequency; - if (place >= SINE_LENGTH) - place -= SINE_LENGTH; - #else - if (note_frequency > 0) { - float freq; - - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(note_frequency); - } else { - #else - { - #endif - freq = note_frequency; - } +#ifdef PWM_AUDIO + OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; - if (envelope_index < 65535) { - envelope_index++; - } - freq = voice_envelope(freq); + place += note_frequency; + if (place >= SINE_LENGTH) place -= SINE_LENGTH; +#else + if (note_frequency > 0) { + float freq; - NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period - NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period +# ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(note_frequency); } else { - NOTE_PERIOD = 0; - NOTE_DUTY_CYCLE = 0; +# else + { +# endif + freq = note_frequency; } - #endif + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); + + NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period + NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + } else { + NOTE_PERIOD = 0; + NOTE_DUTY_CYCLE = 0; + } +#endif note_position++; bool end_of_note = false; @@ -409,126 +392,116 @@ ISR(TIMER3_COMPA_vect) if (notes_repeat) { current_note = 0; } else { - #ifdef PWM_AUDIO - DISABLE_AUDIO_COUNTER_3_ISR; - #else - DISABLE_AUDIO_COUNTER_3_ISR; - DISABLE_AUDIO_COUNTER_3_OUTPUT; - #endif +#ifdef PWM_AUDIO + DISABLE_AUDIO_COUNTER_3_ISR; +#else + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; +#endif playing_notes = false; return; } } if (!note_resting && (notes_rest > 0)) { - note_resting = true; + note_resting = true; note_frequency = 0; - note_length = notes_rest; + note_length = notes_rest; current_note--; } else { note_resting = false; - #ifdef PWM_AUDIO - note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100); - #else - envelope_index = 0; - note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); - #endif +#ifdef PWM_AUDIO + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100); +#else + envelope_index = 0; + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); +#endif } note_position = 0; } - } if (!audio_config.enable) { playing_notes = false; - playing_note = false; + playing_note = false; } } void play_note(float freq, int vol) { - if (!audio_initialized) { audio_init(); } - if (audio_config.enable && voices < 8) { - DISABLE_AUDIO_COUNTER_3_ISR; - - // Cancel notes if notes are playing - if (playing_notes) - stop_all_notes(); + if (audio_config.enable && voices < 8) { + DISABLE_AUDIO_COUNTER_3_ISR; - playing_note = true; + // Cancel notes if notes are playing + if (playing_notes) stop_all_notes(); - envelope_index = 0; + playing_note = true; - #ifdef PWM_AUDIO - freq = freq / SAMPLE_RATE; - #endif - if (freq > 0) { - frequencies[voices] = freq; - volumes[voices] = vol; - voices++; - } + envelope_index = 0; - #ifdef PWM_AUDIO - ENABLE_AUDIO_COUNTER_3_ISR; - #else - ENABLE_AUDIO_COUNTER_3_ISR; - ENABLE_AUDIO_COUNTER_3_OUTPUT; - #endif - } +#ifdef PWM_AUDIO + freq = freq / SAMPLE_RATE; +#endif + if (freq > 0) { + frequencies[voices] = freq; + volumes[voices] = vol; + voices++; + } +#ifdef PWM_AUDIO + ENABLE_AUDIO_COUNTER_3_ISR; +#else + ENABLE_AUDIO_COUNTER_3_ISR; + ENABLE_AUDIO_COUNTER_3_OUTPUT; +#endif + } } -void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) -{ - +void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) { if (!audio_initialized) { audio_init(); } - if (audio_config.enable) { - - DISABLE_AUDIO_COUNTER_3_ISR; - - // Cancel note if a note is playing - if (playing_note) - stop_all_notes(); - - playing_notes = true; + if (audio_config.enable) { + DISABLE_AUDIO_COUNTER_3_ISR; - notes_pointer = np; - notes_count = n_count; - notes_repeat = n_repeat; - notes_rest = n_rest; + // Cancel note if a note is playing + if (playing_note) stop_all_notes(); - place = 0; - current_note = 0; + playing_notes = true; - #ifdef PWM_AUDIO - note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100); - #else - note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); - #endif - note_position = 0; + notes_pointer = np; + notes_count = n_count; + notes_repeat = n_repeat; + notes_rest = n_rest; + place = 0; + current_note = 0; - #ifdef PWM_AUDIO - ENABLE_AUDIO_COUNTER_3_ISR; - #else - ENABLE_AUDIO_COUNTER_3_ISR; - ENABLE_AUDIO_COUNTER_3_OUTPUT; - #endif - } +#ifdef PWM_AUDIO + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100); +#else + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); +#endif + note_position = 0; +#ifdef PWM_AUDIO + ENABLE_AUDIO_COUNTER_3_ISR; +#else + ENABLE_AUDIO_COUNTER_3_ISR; + ENABLE_AUDIO_COUNTER_3_OUTPUT; +#endif + } } #ifdef PWM_AUDIO -void play_sample(uint8_t * s, uint16_t l, bool r) { +void play_sample(uint8_t* s, uint16_t l, bool r) { if (!audio_initialized) { audio_init(); } @@ -536,17 +509,16 @@ void play_sample(uint8_t * s, uint16_t l, bool r) { if (audio_config.enable) { DISABLE_AUDIO_COUNTER_3_ISR; stop_all_notes(); - place_int = 0; - sample = s; + place_int = 0; + sample = s; sample_length = l; - repeat = r; + repeat = r; ENABLE_AUDIO_COUNTER_3_ISR; } } #endif - void audio_toggle(void) { audio_config.enable ^= 1; eeconfig_update_audio(audio_config.raw); @@ -566,73 +538,45 @@ void audio_off(void) { // Vibrato rate functions -void set_vibrato_rate(float rate) { - vibrato_rate = rate; -} +void set_vibrato_rate(float rate) { vibrato_rate = rate; } -void increase_vibrato_rate(float change) { - vibrato_rate *= change; -} +void increase_vibrato_rate(float change) { vibrato_rate *= change; } -void decrease_vibrato_rate(float change) { - vibrato_rate /= change; -} +void decrease_vibrato_rate(float change) { vibrato_rate /= change; } -#ifdef VIBRATO_STRENGTH_ENABLE +# ifdef VIBRATO_STRENGTH_ENABLE -void set_vibrato_strength(float strength) { - vibrato_strength = strength; -} +void set_vibrato_strength(float strength) { vibrato_strength = strength; } -void increase_vibrato_strength(float change) { - vibrato_strength *= change; -} +void increase_vibrato_strength(float change) { vibrato_strength *= change; } -void decrease_vibrato_strength(float change) { - vibrato_strength /= change; -} +void decrease_vibrato_strength(float change) { vibrato_strength /= change; } -#endif /* VIBRATO_STRENGTH_ENABLE */ +# endif /* VIBRATO_STRENGTH_ENABLE */ #endif /* VIBRATO_ENABLE */ // Polyphony functions -void set_polyphony_rate(float rate) { - polyphony_rate = rate; -} +void set_polyphony_rate(float rate) { polyphony_rate = rate; } -void enable_polyphony() { - polyphony_rate = 5; -} +void enable_polyphony() { polyphony_rate = 5; } -void disable_polyphony() { - polyphony_rate = 0; -} +void disable_polyphony() { polyphony_rate = 0; } -void increase_polyphony_rate(float change) { - polyphony_rate *= change; -} +void increase_polyphony_rate(float change) { polyphony_rate *= change; } -void decrease_polyphony_rate(float change) { - polyphony_rate /= change; -} +void decrease_polyphony_rate(float change) { polyphony_rate /= change; } // Timbre function -void set_timbre(float timbre) { - note_timbre = timbre; -} +void set_timbre(float timbre) { note_timbre = timbre; } // Tempo functions -void set_tempo(uint8_t tempo) { - note_tempo = tempo; -} +void set_tempo(uint8_t tempo) { note_tempo = tempo; } -void decrease_tempo(uint8_t tempo_change) { - note_tempo += tempo_change; -} +void decrease_tempo(uint8_t tempo_change) { note_tempo += tempo_change; } void increase_tempo(uint8_t tempo_change) { if (note_tempo - tempo_change < 10) { @@ -642,17 +586,10 @@ void increase_tempo(uint8_t tempo_change) { } } - //------------------------------------------------------------------------------ // Override these functions in your keymap file to play different tunes on // startup and bootloader jump -__attribute__ ((weak)) -void play_startup_tone() -{ -} +__attribute__((weak)) void play_startup_tone() {} -__attribute__ ((weak)) -void play_goodbye_tone() -{ -} +__attribute__((weak)) void play_goodbye_tone() {} //------------------------------------------------------------------------------ diff --git a/quantum/audio/luts.c b/quantum/audio/luts.c index 4404aff434..e8f77a0f33 100644 --- a/quantum/audio/luts.c +++ b/quantum/audio/luts.c @@ -16,380 +16,12 @@ #include "luts.h" -const float vibrato_lut[VIBRATO_LUT_LENGTH] = -{ - 1.0022336811487, - 1.0042529943610, - 1.0058584256028, - 1.0068905285205, - 1.0072464122237, - 1.0068905285205, - 1.0058584256028, - 1.0042529943610, - 1.0022336811487, - 1.0000000000000, - 0.9977712970630, - 0.9957650169978, - 0.9941756956510, - 0.9931566259436, - 0.9928057204913, - 0.9931566259436, - 0.9941756956510, - 0.9957650169978, - 0.9977712970630, - 1.0000000000000, +const float vibrato_lut[VIBRATO_LUT_LENGTH] = { + 1.0022336811487, 1.0042529943610, 1.0058584256028, 1.0068905285205, 1.0072464122237, 1.0068905285205, 1.0058584256028, 1.0042529943610, 1.0022336811487, 1.0000000000000, 0.9977712970630, 0.9957650169978, 0.9941756956510, 0.9931566259436, 0.9928057204913, 0.9931566259436, 0.9941756956510, 0.9957650169978, 0.9977712970630, 1.0000000000000, }; -const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH] = -{ - 0x8E0B, - 0x8C02, - 0x8A00, - 0x8805, - 0x8612, - 0x8426, - 0x8241, - 0x8063, - 0x7E8C, - 0x7CBB, - 0x7AF2, - 0x792E, - 0x7772, - 0x75BB, - 0x740B, - 0x7261, - 0x70BD, - 0x6F20, - 0x6D88, - 0x6BF6, - 0x6A69, - 0x68E3, - 0x6762, - 0x65E6, - 0x6470, - 0x6300, - 0x6194, - 0x602E, - 0x5ECD, - 0x5D71, - 0x5C1A, - 0x5AC8, - 0x597B, - 0x5833, - 0x56EF, - 0x55B0, - 0x5475, - 0x533F, - 0x520E, - 0x50E1, - 0x4FB8, - 0x4E93, - 0x4D73, - 0x4C57, - 0x4B3E, - 0x4A2A, - 0x491A, - 0x480E, - 0x4705, - 0x4601, - 0x4500, - 0x4402, - 0x4309, - 0x4213, - 0x4120, - 0x4031, - 0x3F46, - 0x3E5D, - 0x3D79, - 0x3C97, - 0x3BB9, - 0x3ADD, - 0x3A05, - 0x3930, - 0x385E, - 0x3790, - 0x36C4, - 0x35FB, - 0x3534, - 0x3471, - 0x33B1, - 0x32F3, - 0x3238, - 0x3180, - 0x30CA, - 0x3017, - 0x2F66, - 0x2EB8, - 0x2E0D, - 0x2D64, - 0x2CBD, - 0x2C19, - 0x2B77, - 0x2AD8, - 0x2A3A, - 0x299F, - 0x2907, - 0x2870, - 0x27DC, - 0x2749, - 0x26B9, - 0x262B, - 0x259F, - 0x2515, - 0x248D, - 0x2407, - 0x2382, - 0x2300, - 0x2280, - 0x2201, - 0x2184, - 0x2109, - 0x2090, - 0x2018, - 0x1FA3, - 0x1F2E, - 0x1EBC, - 0x1E4B, - 0x1DDC, - 0x1D6E, - 0x1D02, - 0x1C98, - 0x1C2F, - 0x1BC8, - 0x1B62, - 0x1AFD, - 0x1A9A, - 0x1A38, - 0x19D8, - 0x1979, - 0x191C, - 0x18C0, - 0x1865, - 0x180B, - 0x17B3, - 0x175C, - 0x1706, - 0x16B2, - 0x165E, - 0x160C, - 0x15BB, - 0x156C, - 0x151D, - 0x14CF, - 0x1483, - 0x1438, - 0x13EE, - 0x13A4, - 0x135C, - 0x1315, - 0x12CF, - 0x128A, - 0x1246, - 0x1203, - 0x11C1, - 0x1180, - 0x1140, - 0x1100, - 0x10C2, - 0x1084, - 0x1048, - 0x100C, - 0xFD1, - 0xF97, - 0xF5E, - 0xF25, - 0xEEE, - 0xEB7, - 0xE81, - 0xE4C, - 0xE17, - 0xDE4, - 0xDB1, - 0xD7E, - 0xD4D, - 0xD1C, - 0xCEC, - 0xCBC, - 0xC8E, - 0xC60, - 0xC32, - 0xC05, - 0xBD9, - 0xBAE, - 0xB83, - 0xB59, - 0xB2F, - 0xB06, - 0xADD, - 0xAB6, - 0xA8E, - 0xA67, - 0xA41, - 0xA1C, - 0x9F7, - 0x9D2, - 0x9AE, - 0x98A, - 0x967, - 0x945, - 0x923, - 0x901, - 0x8E0, - 0x8C0, - 0x8A0, - 0x880, - 0x861, - 0x842, - 0x824, - 0x806, - 0x7E8, - 0x7CB, - 0x7AF, - 0x792, - 0x777, - 0x75B, - 0x740, - 0x726, - 0x70B, - 0x6F2, - 0x6D8, - 0x6BF, - 0x6A6, - 0x68E, - 0x676, - 0x65E, - 0x647, - 0x630, - 0x619, - 0x602, - 0x5EC, - 0x5D7, - 0x5C1, - 0x5AC, - 0x597, - 0x583, - 0x56E, - 0x55B, - 0x547, - 0x533, - 0x520, - 0x50E, - 0x4FB, - 0x4E9, - 0x4D7, - 0x4C5, - 0x4B3, - 0x4A2, - 0x491, - 0x480, - 0x470, - 0x460, - 0x450, - 0x440, - 0x430, - 0x421, - 0x412, - 0x403, - 0x3F4, - 0x3E5, - 0x3D7, - 0x3C9, - 0x3BB, - 0x3AD, - 0x3A0, - 0x393, - 0x385, - 0x379, - 0x36C, - 0x35F, - 0x353, - 0x347, - 0x33B, - 0x32F, - 0x323, - 0x318, - 0x30C, - 0x301, - 0x2F6, - 0x2EB, - 0x2E0, - 0x2D6, - 0x2CB, - 0x2C1, - 0x2B7, - 0x2AD, - 0x2A3, - 0x299, - 0x290, - 0x287, - 0x27D, - 0x274, - 0x26B, - 0x262, - 0x259, - 0x251, - 0x248, - 0x240, - 0x238, - 0x230, - 0x228, - 0x220, - 0x218, - 0x210, - 0x209, - 0x201, - 0x1FA, - 0x1F2, - 0x1EB, - 0x1E4, - 0x1DD, - 0x1D6, - 0x1D0, - 0x1C9, - 0x1C2, - 0x1BC, - 0x1B6, - 0x1AF, - 0x1A9, - 0x1A3, - 0x19D, - 0x197, - 0x191, - 0x18C, - 0x186, - 0x180, - 0x17B, - 0x175, - 0x170, - 0x16B, - 0x165, - 0x160, - 0x15B, - 0x156, - 0x151, - 0x14C, - 0x148, - 0x143, - 0x13E, - 0x13A, - 0x135, - 0x131, - 0x12C, - 0x128, - 0x124, - 0x120, - 0x11C, - 0x118, - 0x114, - 0x110, - 0x10C, - 0x108, - 0x104, - 0x100, - 0xFD, - 0xF9, - 0xF5, - 0xF2, - 0xEE, +const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH] = { + 0x8E0B, 0x8C02, 0x8A00, 0x8805, 0x8612, 0x8426, 0x8241, 0x8063, 0x7E8C, 0x7CBB, 0x7AF2, 0x792E, 0x7772, 0x75BB, 0x740B, 0x7261, 0x70BD, 0x6F20, 0x6D88, 0x6BF6, 0x6A69, 0x68E3, 0x6762, 0x65E6, 0x6470, 0x6300, 0x6194, 0x602E, 0x5ECD, 0x5D71, 0x5C1A, 0x5AC8, 0x597B, 0x5833, 0x56EF, 0x55B0, 0x5475, 0x533F, 0x520E, 0x50E1, 0x4FB8, 0x4E93, 0x4D73, 0x4C57, 0x4B3E, 0x4A2A, 0x491A, 0x480E, 0x4705, 0x4601, 0x4500, 0x4402, 0x4309, 0x4213, 0x4120, 0x4031, 0x3F46, 0x3E5D, 0x3D79, 0x3C97, 0x3BB9, 0x3ADD, 0x3A05, 0x3930, 0x385E, 0x3790, 0x36C4, 0x35FB, 0x3534, 0x3471, 0x33B1, 0x32F3, 0x3238, 0x3180, 0x30CA, 0x3017, 0x2F66, 0x2EB8, 0x2E0D, 0x2D64, 0x2CBD, 0x2C19, 0x2B77, 0x2AD8, 0x2A3A, 0x299F, 0x2907, 0x2870, 0x27DC, 0x2749, 0x26B9, 0x262B, 0x259F, 0x2515, 0x248D, 0x2407, 0x2382, 0x2300, 0x2280, 0x2201, 0x2184, 0x2109, 0x2090, 0x2018, 0x1FA3, 0x1F2E, 0x1EBC, 0x1E4B, 0x1DDC, 0x1D6E, 0x1D02, 0x1C98, 0x1C2F, 0x1BC8, 0x1B62, 0x1AFD, 0x1A9A, + 0x1A38, 0x19D8, 0x1979, 0x191C, 0x18C0, 0x1865, 0x180B, 0x17B3, 0x175C, 0x1706, 0x16B2, 0x165E, 0x160C, 0x15BB, 0x156C, 0x151D, 0x14CF, 0x1483, 0x1438, 0x13EE, 0x13A4, 0x135C, 0x1315, 0x12CF, 0x128A, 0x1246, 0x1203, 0x11C1, 0x1180, 0x1140, 0x1100, 0x10C2, 0x1084, 0x1048, 0x100C, 0xFD1, 0xF97, 0xF5E, 0xF25, 0xEEE, 0xEB7, 0xE81, 0xE4C, 0xE17, 0xDE4, 0xDB1, 0xD7E, 0xD4D, 0xD1C, 0xCEC, 0xCBC, 0xC8E, 0xC60, 0xC32, 0xC05, 0xBD9, 0xBAE, 0xB83, 0xB59, 0xB2F, 0xB06, 0xADD, 0xAB6, 0xA8E, 0xA67, 0xA41, 0xA1C, 0x9F7, 0x9D2, 0x9AE, 0x98A, 0x967, 0x945, 0x923, 0x901, 0x8E0, 0x8C0, 0x8A0, 0x880, 0x861, 0x842, 0x824, 0x806, 0x7E8, 0x7CB, 0x7AF, 0x792, 0x777, 0x75B, 0x740, 0x726, 0x70B, 0x6F2, 0x6D8, 0x6BF, 0x6A6, 0x68E, 0x676, 0x65E, 0x647, 0x630, 0x619, 0x602, 0x5EC, 0x5D7, 0x5C1, 0x5AC, 0x597, 0x583, 0x56E, 0x55B, 0x547, 0x533, 0x520, 0x50E, 0x4FB, 0x4E9, + 0x4D7, 0x4C5, 0x4B3, 0x4A2, 0x491, 0x480, 0x470, 0x460, 0x450, 0x440, 0x430, 0x421, 0x412, 0x403, 0x3F4, 0x3E5, 0x3D7, 0x3C9, 0x3BB, 0x3AD, 0x3A0, 0x393, 0x385, 0x379, 0x36C, 0x35F, 0x353, 0x347, 0x33B, 0x32F, 0x323, 0x318, 0x30C, 0x301, 0x2F6, 0x2EB, 0x2E0, 0x2D6, 0x2CB, 0x2C1, 0x2B7, 0x2AD, 0x2A3, 0x299, 0x290, 0x287, 0x27D, 0x274, 0x26B, 0x262, 0x259, 0x251, 0x248, 0x240, 0x238, 0x230, 0x228, 0x220, 0x218, 0x210, 0x209, 0x201, 0x1FA, 0x1F2, 0x1EB, 0x1E4, 0x1DD, 0x1D6, 0x1D0, 0x1C9, 0x1C2, 0x1BC, 0x1B6, 0x1AF, 0x1A9, 0x1A3, 0x19D, 0x197, 0x191, 0x18C, 0x186, 0x180, 0x17B, 0x175, 0x170, 0x16B, 0x165, 0x160, 0x15B, 0x156, 0x151, 0x14C, 0x148, 0x143, 0x13E, 0x13A, 0x135, 0x131, 0x12C, 0x128, 0x124, 0x120, 0x11C, 0x118, 0x114, 0x110, 0x10C, 0x108, 0x104, 0x100, 0xFD, 0xF9, 0xF5, 0xF2, 0xEE, }; - diff --git a/quantum/audio/luts.h b/quantum/audio/luts.h index a377a6c870..117d74cd00 100644 --- a/quantum/audio/luts.h +++ b/quantum/audio/luts.h @@ -15,22 +15,22 @@ */ #if defined(__AVR__) - #include <avr/io.h> - #include <avr/interrupt.h> - #include <avr/pgmspace.h> +# include <avr/io.h> +# include <avr/interrupt.h> +# include <avr/pgmspace.h> #else - #include "ch.h" - #include "hal.h" +# include "ch.h" +# include "hal.h" #endif #ifndef LUTS_H -#define LUTS_H +# define LUTS_H -#define VIBRATO_LUT_LENGTH 20 +# define VIBRATO_LUT_LENGTH 20 -#define FREQUENCY_LUT_LENGTH 349 +# define FREQUENCY_LUT_LENGTH 349 -extern const float vibrato_lut[VIBRATO_LUT_LENGTH]; +extern const float vibrato_lut[VIBRATO_LUT_LENGTH]; extern const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH]; #endif /* LUTS_H */ diff --git a/quantum/audio/muse.c b/quantum/audio/muse.c index f3cb592d81..01b95671fd 100644 --- a/quantum/audio/muse.c +++ b/quantum/audio/muse.c @@ -1,111 +1,56 @@ #include "muse.h" -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 -}; +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 }; -bool number_of_ones_to_bool[16] = { - 1, 0, 0, 1, 0, 1, 1, 0, - 0, 1, 1, 0, 1, 0, 0, 1 -}; +bool number_of_ones_to_bool[16] = {1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1}; -uint8_t muse_interval[4] = {MUSE_B7, MUSE_B19, MUSE_B3, MUSE_B28}; +uint8_t muse_interval[4] = {MUSE_B7, MUSE_B19, MUSE_B3, MUSE_B28}; uint8_t muse_theme[4] = {MUSE_B8, MUSE_B23, MUSE_B18, MUSE_B17}; -bool muse_timer_1bit = 0; -uint8_t muse_timer_2bit = 0; -uint8_t muse_timer_2bit_counter = 0; -uint8_t muse_timer_4bit = 0; -uint32_t muse_timer_31bit = 0; +bool muse_timer_1bit = 0; +uint8_t muse_timer_2bit = 0; +uint8_t muse_timer_2bit_counter = 0; +uint8_t muse_timer_4bit = 0; +uint32_t muse_timer_31bit = 0; bool bit_for_value(uint8_t value) { - switch (value) { - case MUSE_OFF: - return 0; - case MUSE_ON: - return 1; - case MUSE_C_1_2: - return muse_timer_1bit; - case MUSE_C1: - return (muse_timer_4bit & 1); - case MUSE_C2: - return (muse_timer_4bit & 2); - case MUSE_C4: - return (muse_timer_4bit & 4); - case MUSE_C8: - return (muse_timer_4bit & 8); - case MUSE_C3: - return (muse_timer_2bit & 1); - case MUSE_C6: - return (muse_timer_2bit & 2); - default: - return muse_timer_31bit & (1UL << (value - MUSE_B1)); - } + switch (value) { + case MUSE_OFF: + return 0; + case MUSE_ON: + return 1; + case MUSE_C_1_2: + return muse_timer_1bit; + case MUSE_C1: + return (muse_timer_4bit & 1); + case MUSE_C2: + return (muse_timer_4bit & 2); + case MUSE_C4: + return (muse_timer_4bit & 4); + case MUSE_C8: + return (muse_timer_4bit & 8); + case MUSE_C3: + return (muse_timer_2bit & 1); + case MUSE_C6: + return (muse_timer_2bit & 2); + default: + return muse_timer_31bit & (1UL << (value - MUSE_B1)); + } } uint8_t muse_clock_pulse(void) { - - 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) - ]; - - if (muse_timer_1bit == 0) { - if (muse_timer_2bit_counter == 0) { - muse_timer_2bit = (muse_timer_2bit + 1) % 4; + 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)]; + + if (muse_timer_1bit == 0) { + if (muse_timer_2bit_counter == 0) { + muse_timer_2bit = (muse_timer_2bit + 1) % 4; + } + muse_timer_2bit_counter = (muse_timer_2bit_counter + 1) % 3; + muse_timer_4bit = (muse_timer_4bit + 1) % 16; + muse_timer_31bit = (muse_timer_31bit << 1) + top; } - muse_timer_2bit_counter = (muse_timer_2bit_counter + 1) % 3; - muse_timer_4bit = (muse_timer_4bit + 1) % 16; - muse_timer_31bit = (muse_timer_31bit << 1) + top; - } - - muse_timer_1bit = (muse_timer_1bit + 1) % 2; - 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); + muse_timer_1bit = (muse_timer_1bit + 1) % 2; + 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); } diff --git a/quantum/audio/musical_notes.h b/quantum/audio/musical_notes.h index cd54af38d2..9742e19c43 100644 --- a/quantum/audio/musical_notes.h +++ b/quantum/audio/musical_notes.h @@ -20,55 +20,55 @@ // Tempo Placeholder #define TEMPO_DEFAULT 100 - -#define SONG(notes...) { notes } - +#define SONG(notes...) \ + { notes } // Note Types -#define MUSICAL_NOTE(note, duration) {(NOTE##note), duration} -#define BREVE_NOTE(note) MUSICAL_NOTE(note, 128) -#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64) -#define HALF_NOTE(note) MUSICAL_NOTE(note, 32) -#define QUARTER_NOTE(note) MUSICAL_NOTE(note, 16) -#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8) -#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4) - -#define BREVE_DOT_NOTE(note) MUSICAL_NOTE(note, 128+64) -#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64+32) -#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32+16) -#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16+8) -#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8+4) -#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4+2) +#define MUSICAL_NOTE(note, duration) \ + { (NOTE##note), duration } +#define BREVE_NOTE(note) MUSICAL_NOTE(note, 128) +#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64) +#define HALF_NOTE(note) MUSICAL_NOTE(note, 32) +#define QUARTER_NOTE(note) MUSICAL_NOTE(note, 16) +#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8) +#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4) + +#define BREVE_DOT_NOTE(note) MUSICAL_NOTE(note, 128 + 64) +#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64 + 32) +#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32 + 16) +#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16 + 8) +#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8 + 4) +#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4 + 2) // Note Type Shortcuts -#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration) -#define B__NOTE(n) BREVE_NOTE(n) -#define W__NOTE(n) WHOLE_NOTE(n) -#define H__NOTE(n) HALF_NOTE(n) -#define Q__NOTE(n) QUARTER_NOTE(n) -#define E__NOTE(n) EIGHTH_NOTE(n) -#define S__NOTE(n) SIXTEENTH_NOTE(n) -#define BD_NOTE(n) BREVE_DOT_NOTE(n) -#define WD_NOTE(n) WHOLE_DOT_NOTE(n) -#define HD_NOTE(n) HALF_DOT_NOTE(n) -#define QD_NOTE(n) QUARTER_DOT_NOTE(n) -#define ED_NOTE(n) EIGHTH_DOT_NOTE(n) -#define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n) +#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration) +#define B__NOTE(n) BREVE_NOTE(n) +#define W__NOTE(n) WHOLE_NOTE(n) +#define H__NOTE(n) HALF_NOTE(n) +#define Q__NOTE(n) QUARTER_NOTE(n) +#define E__NOTE(n) EIGHTH_NOTE(n) +#define S__NOTE(n) SIXTEENTH_NOTE(n) +#define BD_NOTE(n) BREVE_DOT_NOTE(n) +#define WD_NOTE(n) WHOLE_DOT_NOTE(n) +#define HD_NOTE(n) HALF_DOT_NOTE(n) +#define QD_NOTE(n) QUARTER_DOT_NOTE(n) +#define ED_NOTE(n) EIGHTH_DOT_NOTE(n) +#define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n) // Note Timbre // Changes how the notes sound -#define TIMBRE_12 0.125f -#define TIMBRE_25 0.250f -#define TIMBRE_50 0.500f -#define TIMBRE_75 0.750f -#define TIMBRE_DEFAULT TIMBRE_50 +#define TIMBRE_12 0.125f +#define TIMBRE_25 0.250f +#define TIMBRE_50 0.500f +#define TIMBRE_75 0.750f +#define TIMBRE_DEFAULT TIMBRE_50 // Notes - # = Octave #ifdef __arm__ -#define NOTE_REST 1.00f +# define NOTE_REST 1.00f #else -#define NOTE_REST 0.00f +# define NOTE_REST 0.00f #endif /* These notes are currently bugged @@ -97,91 +97,91 @@ #define NOTE_AS1 58.27f */ -#define NOTE_B1 61.74f -#define NOTE_C2 65.41f -#define NOTE_CS2 69.30f -#define NOTE_D2 73.42f -#define NOTE_DS2 77.78f -#define NOTE_E2 82.41f -#define NOTE_F2 87.31f -#define NOTE_FS2 92.50f -#define NOTE_G2 98.00f -#define NOTE_GS2 103.83f -#define NOTE_A2 110.00f -#define NOTE_AS2 116.54f -#define NOTE_B2 123.47f -#define NOTE_C3 130.81f -#define NOTE_CS3 138.59f -#define NOTE_D3 146.83f -#define NOTE_DS3 155.56f -#define NOTE_E3 164.81f -#define NOTE_F3 174.61f -#define NOTE_FS3 185.00f -#define NOTE_G3 196.00f -#define NOTE_GS3 207.65f -#define NOTE_A3 220.00f -#define NOTE_AS3 233.08f -#define NOTE_B3 246.94f -#define NOTE_C4 261.63f -#define NOTE_CS4 277.18f -#define NOTE_D4 293.66f -#define NOTE_DS4 311.13f -#define NOTE_E4 329.63f -#define NOTE_F4 349.23f -#define NOTE_FS4 369.99f -#define NOTE_G4 392.00f -#define NOTE_GS4 415.30f -#define NOTE_A4 440.00f -#define NOTE_AS4 466.16f -#define NOTE_B4 493.88f -#define NOTE_C5 523.25f -#define NOTE_CS5 554.37f -#define NOTE_D5 587.33f -#define NOTE_DS5 622.25f -#define NOTE_E5 659.26f -#define NOTE_F5 698.46f -#define NOTE_FS5 739.99f -#define NOTE_G5 783.99f -#define NOTE_GS5 830.61f -#define NOTE_A5 880.00f -#define NOTE_AS5 932.33f -#define NOTE_B5 987.77f -#define NOTE_C6 1046.50f -#define NOTE_CS6 1108.73f -#define NOTE_D6 1174.66f -#define NOTE_DS6 1244.51f -#define NOTE_E6 1318.51f -#define NOTE_F6 1396.91f -#define NOTE_FS6 1479.98f -#define NOTE_G6 1567.98f -#define NOTE_GS6 1661.22f -#define NOTE_A6 1760.00f -#define NOTE_AS6 1864.66f -#define NOTE_B6 1975.53f -#define NOTE_C7 2093.00f -#define NOTE_CS7 2217.46f -#define NOTE_D7 2349.32f -#define NOTE_DS7 2489.02f -#define NOTE_E7 2637.02f -#define NOTE_F7 2793.83f -#define NOTE_FS7 2959.96f -#define NOTE_G7 3135.96f -#define NOTE_GS7 3322.44f -#define NOTE_A7 3520.00f -#define NOTE_AS7 3729.31f -#define NOTE_B7 3951.07f -#define NOTE_C8 4186.01f -#define NOTE_CS8 4434.92f -#define NOTE_D8 4698.64f -#define NOTE_DS8 4978.03f -#define NOTE_E8 5274.04f -#define NOTE_F8 5587.65f -#define NOTE_FS8 5919.91f -#define NOTE_G8 6271.93f -#define NOTE_GS8 6644.88f -#define NOTE_A8 7040.00f -#define NOTE_AS8 7458.62f -#define NOTE_B8 7902.13f +#define NOTE_B1 61.74f +#define NOTE_C2 65.41f +#define NOTE_CS2 69.30f +#define NOTE_D2 73.42f +#define NOTE_DS2 77.78f +#define NOTE_E2 82.41f +#define NOTE_F2 87.31f +#define NOTE_FS2 92.50f +#define NOTE_G2 98.00f +#define NOTE_GS2 103.83f +#define NOTE_A2 110.00f +#define NOTE_AS2 116.54f +#define NOTE_B2 123.47f +#define NOTE_C3 130.81f +#define NOTE_CS3 138.59f +#define NOTE_D3 146.83f +#define NOTE_DS3 155.56f +#define NOTE_E3 164.81f +#define NOTE_F3 174.61f +#define NOTE_FS3 185.00f +#define NOTE_G3 196.00f +#define NOTE_GS3 207.65f +#define NOTE_A3 220.00f +#define NOTE_AS3 233.08f +#define NOTE_B3 246.94f +#define NOTE_C4 261.63f +#define NOTE_CS4 277.18f +#define NOTE_D4 293.66f +#define NOTE_DS4 311.13f +#define NOTE_E4 329.63f +#define NOTE_F4 349.23f +#define NOTE_FS4 369.99f +#define NOTE_G4 392.00f +#define NOTE_GS4 415.30f +#define NOTE_A4 440.00f +#define NOTE_AS4 466.16f +#define NOTE_B4 493.88f +#define NOTE_C5 523.25f +#define NOTE_CS5 554.37f +#define NOTE_D5 587.33f +#define NOTE_DS5 622.25f +#define NOTE_E5 659.26f +#define NOTE_F5 698.46f +#define NOTE_FS5 739.99f +#define NOTE_G5 783.99f +#define NOTE_GS5 830.61f +#define NOTE_A5 880.00f +#define NOTE_AS5 932.33f +#define NOTE_B5 987.77f +#define NOTE_C6 1046.50f +#define NOTE_CS6 1108.73f +#define NOTE_D6 1174.66f +#define NOTE_DS6 1244.51f +#define NOTE_E6 1318.51f +#define NOTE_F6 1396.91f +#define NOTE_FS6 1479.98f +#define NOTE_G6 1567.98f +#define NOTE_GS6 1661.22f +#define NOTE_A6 1760.00f +#define NOTE_AS6 1864.66f +#define NOTE_B6 1975.53f +#define NOTE_C7 2093.00f +#define NOTE_CS7 2217.46f +#define NOTE_D7 2349.32f +#define NOTE_DS7 2489.02f +#define NOTE_E7 2637.02f +#define NOTE_F7 2793.83f +#define NOTE_FS7 2959.96f +#define NOTE_G7 3135.96f +#define NOTE_GS7 3322.44f +#define NOTE_A7 3520.00f +#define NOTE_AS7 3729.31f +#define NOTE_B7 3951.07f +#define NOTE_C8 4186.01f +#define NOTE_CS8 4434.92f +#define NOTE_D8 4698.64f +#define NOTE_DS8 4978.03f +#define NOTE_E8 5274.04f +#define NOTE_F8 5587.65f +#define NOTE_FS8 5919.91f +#define NOTE_G8 6271.93f +#define NOTE_GS8 6644.88f +#define NOTE_A8 7040.00f +#define NOTE_AS8 7458.62f +#define NOTE_B8 7902.13f // Flat Aliases #define NOTE_DF0 NOTE_CS0 @@ -230,5 +230,4 @@ #define NOTE_AF8 NOTE_GS8 #define NOTE_BF8 NOTE_AS8 - #endif diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h index 33dbcfcb1d..3d0e0e51ed 100644 --- a/quantum/audio/song_list.h +++ b/quantum/audio/song_list.h @@ -26,25 +26,15 @@ * Author: Friedrich Schiller + License: Public Domain */ -#define ODE_TO_JOY \ - Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \ - Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \ - Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \ - QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4), +#define ODE_TO_JOY Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4), /* Rock-a-bye Baby * Author: Unknown + License: Public Domain */ -#define ROCK_A_BYE_BABY \ - QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \ - H__NOTE(_A5), Q__NOTE(_G5), \ - QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \ - H__NOTE(_FS5), +#define ROCK_A_BYE_BABY QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), H__NOTE(_A5), Q__NOTE(_G5), QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), H__NOTE(_FS5), - -#define CLUEBOARD_SOUND \ - HD_NOTE(_C3), HD_NOTE(_D3), HD_NOTE(_E3), HD_NOTE(_F3), HD_NOTE(_G3), HD_NOTE(_A4), HD_NOTE(_B4), HD_NOTE(_C4) +#define CLUEBOARD_SOUND HD_NOTE(_C3), HD_NOTE(_D3), HD_NOTE(_E3), HD_NOTE(_F3), HD_NOTE(_G3), HD_NOTE(_A4), HD_NOTE(_B4), HD_NOTE(_C4) /* HD_NOTE(_G3), HD_NOTE(_E3), HD_NOTE(_C3), \ Q__NOTE(_E3), Q__NOTE(_C3), Q__NOTE(_G3), \ @@ -56,258 +46,93 @@ Q__NOTE(_F3) */ -#define STARTUP_SOUND \ - E__NOTE(_E6), \ - E__NOTE(_A6), \ - ED_NOTE(_E7), - -#define GOODBYE_SOUND \ - E__NOTE(_E7), \ - E__NOTE(_A6), \ - ED_NOTE(_E6), - -#define PLANCK_SOUND \ - ED_NOTE(_E7 ), \ - E__NOTE(_CS7), \ - E__NOTE(_E6 ), \ - E__NOTE(_A6 ), \ - M__NOTE(_CS7, 20), - -#define PREONIC_SOUND \ - M__NOTE(_B5, 20), \ - E__NOTE(_B6), \ - M__NOTE(_DS6, 20), \ - E__NOTE(_B6), - -#define QWERTY_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - Q__NOTE(_E7 ), - -#define COLEMAK_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - ED_NOTE(_E7 ), \ - S__NOTE(_REST), \ - ED_NOTE(_GS7 ), - -#define DVORAK_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - E__NOTE(_E7 ), \ - S__NOTE(_REST), \ - E__NOTE(_FS7 ), \ - S__NOTE(_REST), \ - E__NOTE(_E7 ), - -#define WORKMAN_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - ED_NOTE(_FS7 ), \ - S__NOTE(_REST), \ - ED_NOTE(_A7 ), - -#define PLOVER_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - ED_NOTE(_E7 ), \ - S__NOTE(_REST), \ - ED_NOTE(_A7 ), - -#define PLOVER_GOODBYE_SOUND \ - E__NOTE(_GS6 ), \ - E__NOTE(_A6 ), \ - S__NOTE(_REST), \ - ED_NOTE(_A7 ), \ - S__NOTE(_REST), \ - ED_NOTE(_E7 ), - -#define MUSIC_ON_SOUND \ - E__NOTE(_A5 ), \ - E__NOTE(_B5 ), \ - E__NOTE(_CS6), \ - E__NOTE(_D6 ), \ - E__NOTE(_E6 ), \ - E__NOTE(_FS6), \ - E__NOTE(_GS6), \ - E__NOTE(_A6 ), - -#define AUDIO_ON_SOUND \ - E__NOTE(_A5 ), \ - E__NOTE(_A6 ), - -#define AUDIO_OFF_SOUND \ - E__NOTE(_A6 ), \ - E__NOTE(_A5 ), +#define STARTUP_SOUND E__NOTE(_E6), E__NOTE(_A6), ED_NOTE(_E7), + +#define GOODBYE_SOUND E__NOTE(_E7), E__NOTE(_A6), ED_NOTE(_E6), + +#define PLANCK_SOUND ED_NOTE(_E7), E__NOTE(_CS7), E__NOTE(_E6), E__NOTE(_A6), M__NOTE(_CS7, 20), + +#define PREONIC_SOUND M__NOTE(_B5, 20), E__NOTE(_B6), M__NOTE(_DS6, 20), E__NOTE(_B6), + +#define QWERTY_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), Q__NOTE(_E7), + +#define COLEMAK_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_E7), S__NOTE(_REST), ED_NOTE(_GS7), + +#define DVORAK_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), E__NOTE(_E7), S__NOTE(_REST), E__NOTE(_FS7), S__NOTE(_REST), E__NOTE(_E7), + +#define WORKMAN_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_FS7), S__NOTE(_REST), ED_NOTE(_A7), + +#define PLOVER_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_E7), S__NOTE(_REST), ED_NOTE(_A7), + +#define PLOVER_GOODBYE_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_A7), S__NOTE(_REST), ED_NOTE(_E7), + +#define MUSIC_ON_SOUND E__NOTE(_A5), E__NOTE(_B5), E__NOTE(_CS6), E__NOTE(_D6), E__NOTE(_E6), E__NOTE(_FS6), E__NOTE(_GS6), E__NOTE(_A6), + +#define AUDIO_ON_SOUND E__NOTE(_A5), E__NOTE(_A6), + +#define AUDIO_OFF_SOUND E__NOTE(_A6), E__NOTE(_A5), #define MUSIC_SCALE_SOUND MUSIC_ON_SOUND -#define MUSIC_OFF_SOUND \ - E__NOTE(_A6 ), \ - E__NOTE(_GS6 ), \ - E__NOTE(_FS6), \ - E__NOTE(_E6 ), \ - E__NOTE(_D6 ), \ - E__NOTE(_CS6), \ - E__NOTE(_B5), \ - E__NOTE(_A5 ), - -#define VOICE_CHANGE_SOUND \ - Q__NOTE(_A5 ), \ - Q__NOTE(_CS6), \ - Q__NOTE(_E6 ), \ - Q__NOTE(_A6 ), - -#define CHROMATIC_SOUND \ - Q__NOTE(_A5 ), \ - Q__NOTE(_AS5 ), \ - Q__NOTE(_B5), \ - Q__NOTE(_C6 ), \ - Q__NOTE(_CS6 ), - -#define MAJOR_SOUND \ - Q__NOTE(_A5 ), \ - Q__NOTE(_B5 ), \ - Q__NOTE(_CS6), \ - Q__NOTE(_D6 ), \ - Q__NOTE(_E6 ), - -#define MINOR_SOUND \ - Q__NOTE(_A5 ), \ - Q__NOTE(_B5 ), \ - Q__NOTE(_C6 ), \ - Q__NOTE(_D6 ), \ - Q__NOTE(_E6 ), - -#define GUITAR_SOUND \ - Q__NOTE(_E5 ), \ - Q__NOTE(_A5), \ - Q__NOTE(_D6 ), \ - Q__NOTE(_G6 ), - -#define VIOLIN_SOUND \ - Q__NOTE(_G5 ), \ - Q__NOTE(_D6), \ - Q__NOTE(_A6 ), \ - Q__NOTE(_E7 ), - -#define CAPS_LOCK_ON_SOUND \ - E__NOTE(_A3), \ - E__NOTE(_B3), - -#define CAPS_LOCK_OFF_SOUND \ - E__NOTE(_B3), \ - E__NOTE(_A3), - -#define SCROLL_LOCK_ON_SOUND \ - E__NOTE(_D4), \ - E__NOTE(_E4), - -#define SCROLL_LOCK_OFF_SOUND \ - E__NOTE(_E4), \ - E__NOTE(_D4), - -#define NUM_LOCK_ON_SOUND \ - E__NOTE(_D5), \ - E__NOTE(_E5), - -#define NUM_LOCK_OFF_SOUND \ - E__NOTE(_E5), \ - E__NOTE(_D5), - -#define AG_NORM_SOUND \ - E__NOTE(_A5), \ - E__NOTE(_A5), - -#define AG_SWAP_SOUND \ - SD_NOTE(_B5), \ - SD_NOTE(_A5), \ - SD_NOTE(_B5), \ - SD_NOTE(_A5), - -#define UNICODE_WINDOWS \ - E__NOTE(_B5), \ - S__NOTE(_E6), - -#define UNICODE_LINUX \ - E__NOTE(_E6), \ - S__NOTE(_B5), - - -#define TERMINAL_SOUND \ - E__NOTE(_C5 ) +#define MUSIC_OFF_SOUND E__NOTE(_A6), E__NOTE(_GS6), E__NOTE(_FS6), E__NOTE(_E6), E__NOTE(_D6), E__NOTE(_CS6), E__NOTE(_B5), E__NOTE(_A5), + +#define VOICE_CHANGE_SOUND Q__NOTE(_A5), Q__NOTE(_CS6), Q__NOTE(_E6), Q__NOTE(_A6), + +#define CHROMATIC_SOUND Q__NOTE(_A5), Q__NOTE(_AS5), Q__NOTE(_B5), Q__NOTE(_C6), Q__NOTE(_CS6), + +#define MAJOR_SOUND Q__NOTE(_A5), Q__NOTE(_B5), Q__NOTE(_CS6), Q__NOTE(_D6), Q__NOTE(_E6), + +#define MINOR_SOUND Q__NOTE(_A5), Q__NOTE(_B5), Q__NOTE(_C6), Q__NOTE(_D6), Q__NOTE(_E6), + +#define GUITAR_SOUND Q__NOTE(_E5), Q__NOTE(_A5), Q__NOTE(_D6), Q__NOTE(_G6), +#define VIOLIN_SOUND Q__NOTE(_G5), Q__NOTE(_D6), Q__NOTE(_A6), Q__NOTE(_E7), + +#define CAPS_LOCK_ON_SOUND E__NOTE(_A3), E__NOTE(_B3), + +#define CAPS_LOCK_OFF_SOUND E__NOTE(_B3), E__NOTE(_A3), + +#define SCROLL_LOCK_ON_SOUND E__NOTE(_D4), E__NOTE(_E4), + +#define SCROLL_LOCK_OFF_SOUND E__NOTE(_E4), E__NOTE(_D4), + +#define NUM_LOCK_ON_SOUND E__NOTE(_D5), E__NOTE(_E5), + +#define NUM_LOCK_OFF_SOUND E__NOTE(_E5), E__NOTE(_D5), + +#define AG_NORM_SOUND E__NOTE(_A5), E__NOTE(_A5), + +#define AG_SWAP_SOUND SD_NOTE(_B5), SD_NOTE(_A5), SD_NOTE(_B5), SD_NOTE(_A5), + +#define UNICODE_WINDOWS E__NOTE(_B5), S__NOTE(_E6), + +#define UNICODE_LINUX E__NOTE(_E6), S__NOTE(_B5), + +#define TERMINAL_SOUND E__NOTE(_C5) /* Title: La Campanella * Author/Composer: Frank Lizst + License: Public Domain */ -#define CAMPANELLA \ - Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), \ - E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), \ - Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), \ - E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), \ - E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS6), \ - Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_E5), E__NOTE(_E5), E__NOTE(_DS6), Q__NOTE(_DS5), \ - E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), \ - E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), \ - Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), \ - E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), \ - E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), \ - Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), Q__NOTE(_CS6), E__NOTE(_CS6), E__NOTE(_DS7), Q__NOTE(_B5), \ - E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_B5), E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), \ - E__NOTE(_DS7), Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_G5), E__NOTE(_G5), E__NOTE(_DS7), \ - Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), E__NOTE(_DS7), Q__NOTE(_DS5), \ - E__NOTE(_DS5), E__NOTE(_DS7), W__NOTE(_DS6), W__NOTE(_GS5), - - - +#define CAMPANELLA \ + Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_E5), E__NOTE(_E5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), \ + E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), Q__NOTE(_CS6), E__NOTE(_CS6), E__NOTE(_DS7), Q__NOTE(_B5), E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_B5), E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), E__NOTE(_DS7), Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_G5), E__NOTE(_G5), E__NOTE(_DS7), Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), E__NOTE(_DS7), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS7), W__NOTE(_DS6), W__NOTE(_GS5), /* Title: Fantaisie-Impromptu * Author/Composer: Chopin * License: Public Domain -*/ -#define FANTASIE_IMPROMPTU \ - E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), \ - E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_A4), \ - E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), \ - E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_A4), E__NOTE(_CS5), E__NOTE(_DS5), \ - E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_CS6), E__NOTE(_DS6), E__NOTE(_B6), E__NOTE(_A6), E__NOTE(_GS6), E__NOTE(_FS6), \ - E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_FS6), E__NOTE(_CS6), E__NOTE(_C5), E__NOTE(_DS6), E__NOTE(_A5), E__NOTE(_GS5), \ - E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_FS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_DS5), \ - E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_B4), E__NOTE(_A4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), \ - E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), \ - E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_AS4), E__NOTE(_GS4), E__NOTE(_REST), \ - E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), \ - E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_DS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_REST), E__NOTE(_DS5), \ - E__NOTE(_B5), E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_CS6), E__NOTE(_B5), \ - E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_AS5), WD_NOTE(_GS5), - + */ +#define FANTASIE_IMPROMPTU \ + E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_A4), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_CS6), E__NOTE(_DS6), E__NOTE(_B6), E__NOTE(_A6), E__NOTE(_GS6), E__NOTE(_FS6), E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_FS6), E__NOTE(_CS6), E__NOTE(_C5), E__NOTE(_DS6), E__NOTE(_A5), E__NOTE(_GS5), E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_FS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_DS5), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_B4), E__NOTE(_A4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), \ + E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_AS4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_DS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_REST), E__NOTE(_DS5), E__NOTE(_B5), E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_CS6), E__NOTE(_B5), E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_AS5), WD_NOTE(_GS5), /* Title: Nocturne Op. 9 No. 1 in B flat minor * Author/Composer: Chopin License: Public Domain */ -#define NOCTURNE_OP_9_NO_1 \ - H__NOTE(_BF5), H__NOTE(_C6), H__NOTE(_DF6), H__NOTE(_A5), H__NOTE(_BF5), H__NOTE(_GF5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), \ - W__NOTE(_F5), H__NOTE(_GF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_C5), B__NOTE(_DF5), W__NOTE(_BF4), Q__NOTE(_BF5), \ - Q__NOTE(_C6), Q__NOTE(_DF6), Q__NOTE(_A5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_GS5), Q__NOTE(_A5), Q__NOTE(_C6), \ - Q__NOTE(_BF5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_GF5), Q__NOTE(_E5), Q__NOTE(_F5), Q__NOTE(_BF5), Q__NOTE(_A5), \ - Q__NOTE(_AF5), Q__NOTE(_G5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), Q__NOTE(_D5), Q__NOTE(_DF5), \ - Q__NOTE(_C5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_B4), Q__NOTE(_C5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), \ - B__NOTE(_DF5), W__NOTE(_BF4), W__NOTE(_BF5), W__NOTE(_BF5), W__NOTE(_BF5), BD_NOTE(_AF5), W__NOTE(_DF5), H__NOTE(_BF4), \ - H__NOTE(_C5), H__NOTE(_DF5), H__NOTE(_GF5), H__NOTE(_GF5), BD_NOTE(_F5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), \ - H__NOTE(_DF5), H__NOTE(_A4), B__NOTE(_AF4), W__NOTE(_DF5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), \ - H__NOTE(_EF5), BD_NOTE(_F5), - +#define NOCTURNE_OP_9_NO_1 \ + H__NOTE(_BF5), H__NOTE(_C6), H__NOTE(_DF6), H__NOTE(_A5), H__NOTE(_BF5), H__NOTE(_GF5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), H__NOTE(_GF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_C5), B__NOTE(_DF5), W__NOTE(_BF4), Q__NOTE(_BF5), Q__NOTE(_C6), Q__NOTE(_DF6), Q__NOTE(_A5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_GS5), Q__NOTE(_A5), Q__NOTE(_C6), Q__NOTE(_BF5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_GF5), Q__NOTE(_E5), Q__NOTE(_F5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_AF5), Q__NOTE(_G5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), Q__NOTE(_D5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_B4), Q__NOTE(_C5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), B__NOTE(_DF5), W__NOTE(_BF4), W__NOTE(_BF5), W__NOTE(_BF5), W__NOTE(_BF5), BD_NOTE(_AF5), W__NOTE(_DF5), H__NOTE(_BF4), H__NOTE(_C5), H__NOTE(_DF5), H__NOTE(_GF5), H__NOTE(_GF5), BD_NOTE(_F5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), H__NOTE(_A4), B__NOTE(_AF4), \ + W__NOTE(_DF5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), H__NOTE(_EF5), BD_NOTE(_F5), /* Removed sounds + This list is here solely for compatibility, so that removed songs don't just break things diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index 94147ccb66..53a65e4e37 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -19,40 +19,33 @@ // these are imported from audio.c extern uint16_t envelope_index; -extern float note_timbre; -extern float polyphony_rate; -extern bool glissando; +extern float note_timbre; +extern float polyphony_rate; +extern bool glissando; voice_type voice = default_voice; -void set_voice(voice_type v) { - voice = v; -} +void set_voice(voice_type v) { voice = v; } -void voice_iterate() { - voice = (voice + 1) % number_of_voices; -} +void voice_iterate() { voice = (voice + 1) % number_of_voices; } -void voice_deiterate() { - voice = (voice - 1 + number_of_voices) % number_of_voices; -} +void voice_deiterate() { voice = (voice - 1 + number_of_voices) % number_of_voices; } float voice_envelope(float frequency) { // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz - __attribute__ ((unused)) - uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency)); + __attribute__((unused)) uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency)); switch (voice) { case default_voice: - glissando = false; - note_timbre = TIMBRE_50; + glissando = false; + note_timbre = TIMBRE_50; polyphony_rate = 0; - break; + break; - #ifdef AUDIO_VOICES +#ifdef AUDIO_VOICES case something: - glissando = false; + glissando = false; polyphony_rate = 0; switch (compensated_index) { case 0 ... 9: @@ -74,25 +67,23 @@ float voice_envelope(float frequency) { break; case drums: - glissando = false; + glissando = false; polyphony_rate = 0; - // switch (compensated_index) { - // case 0 ... 10: - // note_timbre = 0.5; - // break; - // case 11 ... 20: - // note_timbre = 0.5 * (21 - compensated_index) / 10; - // break; - // default: - // note_timbre = 0; - // break; - // } - // frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8); + // switch (compensated_index) { + // case 0 ... 10: + // note_timbre = 0.5; + // break; + // case 11 ... 20: + // note_timbre = 0.5 * (21 - compensated_index) / 10; + // break; + // default: + // note_timbre = 0; + // break; + // } + // frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8); if (frequency < 80.0) { - } else if (frequency < 160.0) { - // Bass drum: 60 - 100 Hz frequency = (rand() % (int)(40)) + 60; switch (envelope_index) { @@ -108,8 +99,6 @@ float voice_envelope(float frequency) { } } else if (frequency < 320.0) { - - // Snare drum: 1 - 2 KHz frequency = (rand() % (int)(1000)) + 1000; switch (envelope_index) { @@ -125,7 +114,6 @@ float voice_envelope(float frequency) { } } else if (frequency < 640.0) { - // Closed Hi-hat: 3 - 5 KHz frequency = (rand() % (int)(2000)) + 3000; switch (envelope_index) { @@ -141,7 +129,6 @@ float voice_envelope(float frequency) { } } else if (frequency < 1280.0) { - // Open Hi-hat: 3 - 5 KHz frequency = (rand() % (int)(2000)) + 3000; switch (envelope_index) { @@ -155,141 +142,138 @@ float voice_envelope(float frequency) { note_timbre = 0; break; } - } break; case butts_fader: - glissando = true; + glissando = true; polyphony_rate = 0; switch (compensated_index) { case 0 ... 9: - frequency = frequency / 4; + frequency = frequency / 4; note_timbre = TIMBRE_12; - break; + break; case 10 ... 19: - frequency = frequency / 2; + frequency = frequency / 2; note_timbre = TIMBRE_12; - break; + break; case 20 ... 200: - note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125; - break; + note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2) * .125; + break; default: note_timbre = 0; - break; + break; } - break; - - // case octave_crunch: - // polyphony_rate = 0; - // switch (compensated_index) { - // case 0 ... 9: - // case 20 ... 24: - // case 30 ... 32: - // frequency = frequency / 2; - // note_timbre = TIMBRE_12; - // break; - - // case 10 ... 19: - // case 25 ... 29: - // case 33 ... 35: - // frequency = frequency * 2; - // note_timbre = TIMBRE_12; - // break; + break; - // default: - // note_timbre = TIMBRE_12; - // break; - // } - // break; + // case octave_crunch: + // polyphony_rate = 0; + // switch (compensated_index) { + // case 0 ... 9: + // case 20 ... 24: + // case 30 ... 32: + // frequency = frequency / 2; + // note_timbre = TIMBRE_12; + // break; + + // case 10 ... 19: + // case 25 ... 29: + // case 33 ... 35: + // frequency = frequency * 2; + // note_timbre = TIMBRE_12; + // break; + + // default: + // note_timbre = TIMBRE_12; + // break; + // } + // break; case duty_osc: // This slows the loop down a substantial amount, so higher notes may freeze - glissando = true; + glissando = true; polyphony_rate = 0; switch (compensated_index) { default: - #define OCS_SPEED 10 - #define OCS_AMP .25 +# define OCS_SPEED 10 +# define OCS_AMP .25 // sine wave is slow // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5; // triangle wave is a bit faster - note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2; - break; + note_timbre = (float)abs((compensated_index * OCS_SPEED % 3000) - 1500) * (OCS_AMP / 1500) + (1 - OCS_AMP) / 2; + break; } - break; + break; case duty_octave_down: - glissando = true; + glissando = true; polyphony_rate = 0; - note_timbre = (envelope_index % 2) * .125 + .375 * 2; - if ((envelope_index % 4) == 0) - note_timbre = 0.5; - if ((envelope_index % 8) == 0) - note_timbre = 0; + note_timbre = (envelope_index % 2) * .125 + .375 * 2; + if ((envelope_index % 4) == 0) note_timbre = 0.5; + if ((envelope_index % 8) == 0) note_timbre = 0; break; case delayed_vibrato: - glissando = true; + glissando = true; polyphony_rate = 0; - note_timbre = TIMBRE_50; - #define VOICE_VIBRATO_DELAY 150 - #define VOICE_VIBRATO_SPEED 50 + note_timbre = TIMBRE_50; +# define VOICE_VIBRATO_DELAY 150 +# define VOICE_VIBRATO_SPEED 50 switch (compensated_index) { case 0 ... VOICE_VIBRATO_DELAY: break; default: - frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; + frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1)) / 1000 * VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; break; } break; - // case delayed_vibrato_octave: - // polyphony_rate = 0; - // if ((envelope_index % 2) == 1) { - // note_timbre = 0.55; - // } else { - // note_timbre = 0.45; - // } - // #define VOICE_VIBRATO_DELAY 150 - // #define VOICE_VIBRATO_SPEED 50 - // switch (compensated_index) { - // case 0 ... VOICE_VIBRATO_DELAY: - // break; - // default: - // frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; - // break; - // } - // break; - // case duty_fifth_down: - // note_timbre = 0.5; - // if ((envelope_index % 3) == 0) - // note_timbre = 0.75; - // break; - // case duty_fourth_down: - // note_timbre = 0.0; - // if ((envelope_index % 12) == 0) - // note_timbre = 0.75; - // if (((envelope_index % 12) % 4) != 1) - // note_timbre = 0.75; - // break; - // case duty_third_down: - // note_timbre = 0.5; - // if ((envelope_index % 5) == 0) - // note_timbre = 0.75; - // break; - // case duty_fifth_third_down: - // note_timbre = 0.5; - // if ((envelope_index % 5) == 0) - // note_timbre = 0.75; - // if ((envelope_index % 3) == 0) - // note_timbre = 0.25; - // break; - - #endif - - default: - break; + // case delayed_vibrato_octave: + // polyphony_rate = 0; + // if ((envelope_index % 2) == 1) { + // note_timbre = 0.55; + // } else { + // note_timbre = 0.45; + // } + // #define VOICE_VIBRATO_DELAY 150 + // #define VOICE_VIBRATO_SPEED 50 + // switch (compensated_index) { + // case 0 ... VOICE_VIBRATO_DELAY: + // break; + // default: + // frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; + // break; + // } + // break; + // case duty_fifth_down: + // note_timbre = 0.5; + // if ((envelope_index % 3) == 0) + // note_timbre = 0.75; + // break; + // case duty_fourth_down: + // note_timbre = 0.0; + // if ((envelope_index % 12) == 0) + // note_timbre = 0.75; + // if (((envelope_index % 12) % 4) != 1) + // note_timbre = 0.75; + // break; + // case duty_third_down: + // note_timbre = 0.5; + // if ((envelope_index % 5) == 0) + // note_timbre = 0.75; + // break; + // case duty_fifth_third_down: + // note_timbre = 0.5; + // if ((envelope_index % 5) == 0) + // note_timbre = 0.75; + // if ((envelope_index % 3) == 0) + // note_timbre = 0.25; + // break; + +#endif + + default: + break; } return frequency; diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index 1cf33095a4..0c45b0720e 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -16,19 +16,19 @@ #include <stdint.h> #include <stdbool.h> #if defined(__AVR__) - #include <avr/io.h> +# include <avr/io.h> #endif #include "wait.h" #include "luts.h" #ifndef VOICES_H -#define VOICES_H +# define VOICES_H float voice_envelope(float frequency); typedef enum { default_voice, - #ifdef AUDIO_VOICES +# ifdef AUDIO_VOICES something, drums, butts_fader, @@ -36,13 +36,13 @@ typedef enum { duty_osc, duty_octave_down, delayed_vibrato, - // delayed_vibrato_octave, - // duty_fifth_down, - // duty_fourth_down, - // duty_third_down, - // duty_fifth_third_down, - #endif - number_of_voices // important that this is last +// delayed_vibrato_octave, +// duty_fifth_down, +// duty_fourth_down, +// duty_third_down, +// duty_fifth_third_down, +# endif + number_of_voices // important that this is last } voice_type; void set_voice(voice_type v); diff --git a/quantum/audio/wave.h b/quantum/audio/wave.h index f15615dd1b..48210a944e 100644 --- a/quantum/audio/wave.h +++ b/quantum/audio/wave.h @@ -20,262 +20,17 @@ #define SINE_LENGTH 2048 -const uint8_t sinewave[] PROGMEM= //2048 values -{ -0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x82, -0x83,0x83,0x83,0x84,0x84,0x85,0x85,0x85, -0x86,0x86,0x87,0x87,0x87,0x88,0x88,0x88, -0x89,0x89,0x8a,0x8a,0x8a,0x8b,0x8b,0x8c, -0x8c,0x8c,0x8d,0x8d,0x8e,0x8e,0x8e,0x8f, -0x8f,0x8f,0x90,0x90,0x91,0x91,0x91,0x92, -0x92,0x93,0x93,0x93,0x94,0x94,0x95,0x95, -0x95,0x96,0x96,0x96,0x97,0x97,0x98,0x98, -0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9b,0x9b, -0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x9e, -0x9e,0x9f,0x9f,0xa0,0xa0,0xa0,0xa1,0xa1, -0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa4,0xa4, -0xa5,0xa5,0xa5,0xa6,0xa6,0xa6,0xa7,0xa7, -0xa7,0xa8,0xa8,0xa9,0xa9,0xa9,0xaa,0xaa, -0xaa,0xab,0xab,0xac,0xac,0xac,0xad,0xad, -0xad,0xae,0xae,0xae,0xaf,0xaf,0xb0,0xb0, -0xb0,0xb1,0xb1,0xb1,0xb2,0xb2,0xb2,0xb3, -0xb3,0xb4,0xb4,0xb4,0xb5,0xb5,0xb5,0xb6, -0xb6,0xb6,0xb7,0xb7,0xb7,0xb8,0xb8,0xb8, -0xb9,0xb9,0xba,0xba,0xba,0xbb,0xbb,0xbb, -0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe, -0xbe,0xbf,0xbf,0xbf,0xc0,0xc0,0xc0,0xc1, -0xc1,0xc1,0xc2,0xc2,0xc2,0xc3,0xc3,0xc3, -0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6, -0xc6,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc9, -0xc9,0xc9,0xca,0xca,0xca,0xcb,0xcb,0xcb, -0xcb,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce, -0xce,0xce,0xcf,0xcf,0xcf,0xcf,0xd0,0xd0, -0xd0,0xd1,0xd1,0xd1,0xd2,0xd2,0xd2,0xd2, -0xd3,0xd3,0xd3,0xd4,0xd4,0xd4,0xd5,0xd5, -0xd5,0xd5,0xd6,0xd6,0xd6,0xd7,0xd7,0xd7, -0xd7,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9, -0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc, -0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xde, -0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xe0, -0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2, -0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4, -0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe6, -0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe8, -0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9, -0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb, -0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xed, -0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee, -0xee,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1, -0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3, -0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4, -0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5, -0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, -0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, -0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, -0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, -0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, -0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc, -0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, -0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd, -0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, -0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb, -0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa, -0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, -0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, -0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, -0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5, -0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4, -0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3, -0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, -0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0, -0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef, -0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed, -0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xeb, -0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea, -0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8, -0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6, -0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4, -0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe2, -0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe0, -0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xde,0xde, -0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc, -0xdc,0xdc,0xdb,0xdb,0xdb,0xda,0xda,0xda, -0xda,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8, -0xd7,0xd7,0xd7,0xd7,0xd6,0xd6,0xd6,0xd5, -0xd5,0xd5,0xd5,0xd4,0xd4,0xd4,0xd3,0xd3, -0xd3,0xd2,0xd2,0xd2,0xd2,0xd1,0xd1,0xd1, -0xd0,0xd0,0xd0,0xcf,0xcf,0xcf,0xcf,0xce, -0xce,0xce,0xcd,0xcd,0xcd,0xcc,0xcc,0xcc, -0xcb,0xcb,0xcb,0xcb,0xca,0xca,0xca,0xc9, -0xc9,0xc9,0xc8,0xc8,0xc8,0xc7,0xc7,0xc7, -0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc4,0xc4, -0xc4,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc1, -0xc1,0xc1,0xc0,0xc0,0xc0,0xbf,0xbf,0xbf, -0xbe,0xbe,0xbe,0xbd,0xbd,0xbd,0xbc,0xbc, -0xbc,0xbb,0xbb,0xbb,0xba,0xba,0xba,0xb9, -0xb9,0xb8,0xb8,0xb8,0xb7,0xb7,0xb7,0xb6, -0xb6,0xb6,0xb5,0xb5,0xb5,0xb4,0xb4,0xb4, -0xb3,0xb3,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1, -0xb0,0xb0,0xb0,0xaf,0xaf,0xae,0xae,0xae, -0xad,0xad,0xad,0xac,0xac,0xac,0xab,0xab, -0xaa,0xaa,0xaa,0xa9,0xa9,0xa9,0xa8,0xa8, -0xa7,0xa7,0xa7,0xa6,0xa6,0xa6,0xa5,0xa5, -0xa5,0xa4,0xa4,0xa3,0xa3,0xa3,0xa2,0xa2, -0xa2,0xa1,0xa1,0xa0,0xa0,0xa0,0x9f,0x9f, -0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c, -0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99, -0x98,0x98,0x98,0x97,0x97,0x96,0x96,0x96, -0x95,0x95,0x95,0x94,0x94,0x93,0x93,0x93, -0x92,0x92,0x91,0x91,0x91,0x90,0x90,0x8f, -0x8f,0x8f,0x8e,0x8e,0x8e,0x8d,0x8d,0x8c, -0x8c,0x8c,0x8b,0x8b,0x8a,0x8a,0x8a,0x89, -0x89,0x88,0x88,0x88,0x87,0x87,0x87,0x86, -0x86,0x85,0x85,0x85,0x84,0x84,0x83,0x83, -0x83,0x82,0x82,0x81,0x81,0x81,0x80,0x80, -0x80,0x7f,0x7f,0x7e,0x7e,0x7e,0x7d,0x7d, -0x7c,0x7c,0x7c,0x7b,0x7b,0x7a,0x7a,0x7a, -0x79,0x79,0x78,0x78,0x78,0x77,0x77,0x77, -0x76,0x76,0x75,0x75,0x75,0x74,0x74,0x73, -0x73,0x73,0x72,0x72,0x71,0x71,0x71,0x70, -0x70,0x70,0x6f,0x6f,0x6e,0x6e,0x6e,0x6d, -0x6d,0x6c,0x6c,0x6c,0x6b,0x6b,0x6a,0x6a, -0x6a,0x69,0x69,0x69,0x68,0x68,0x67,0x67, -0x67,0x66,0x66,0x65,0x65,0x65,0x64,0x64, -0x64,0x63,0x63,0x62,0x62,0x62,0x61,0x61, -0x61,0x60,0x60,0x5f,0x5f,0x5f,0x5e,0x5e, -0x5d,0x5d,0x5d,0x5c,0x5c,0x5c,0x5b,0x5b, -0x5a,0x5a,0x5a,0x59,0x59,0x59,0x58,0x58, -0x58,0x57,0x57,0x56,0x56,0x56,0x55,0x55, -0x55,0x54,0x54,0x53,0x53,0x53,0x52,0x52, -0x52,0x51,0x51,0x51,0x50,0x50,0x4f,0x4f, -0x4f,0x4e,0x4e,0x4e,0x4d,0x4d,0x4d,0x4c, -0x4c,0x4b,0x4b,0x4b,0x4a,0x4a,0x4a,0x49, -0x49,0x49,0x48,0x48,0x48,0x47,0x47,0x47, -0x46,0x46,0x45,0x45,0x45,0x44,0x44,0x44, -0x43,0x43,0x43,0x42,0x42,0x42,0x41,0x41, -0x41,0x40,0x40,0x40,0x3f,0x3f,0x3f,0x3e, -0x3e,0x3e,0x3d,0x3d,0x3d,0x3c,0x3c,0x3c, -0x3b,0x3b,0x3b,0x3a,0x3a,0x3a,0x39,0x39, -0x39,0x38,0x38,0x38,0x37,0x37,0x37,0x36, -0x36,0x36,0x35,0x35,0x35,0x34,0x34,0x34, -0x34,0x33,0x33,0x33,0x32,0x32,0x32,0x31, -0x31,0x31,0x30,0x30,0x30,0x30,0x2f,0x2f, -0x2f,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d, -0x2c,0x2c,0x2c,0x2b,0x2b,0x2b,0x2a,0x2a, -0x2a,0x2a,0x29,0x29,0x29,0x28,0x28,0x28, -0x28,0x27,0x27,0x27,0x26,0x26,0x26,0x26, -0x25,0x25,0x25,0x25,0x24,0x24,0x24,0x23, -0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x21, -0x21,0x21,0x21,0x20,0x20,0x20,0x1f,0x1f, -0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x1d,0x1d, -0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x19, -0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x17, -0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16, -0x15,0x15,0x15,0x15,0x15,0x14,0x14,0x14, -0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x12, -0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11, -0x11,0x10,0x10,0x10,0x10,0x10,0xf,0xf, -0xf,0xf,0xf,0xf,0xe,0xe,0xe,0xe, -0xe,0xd,0xd,0xd,0xd,0xd,0xd,0xc, -0xc,0xc,0xc,0xc,0xc,0xb,0xb,0xb, -0xb,0xb,0xb,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0x9,0x9,0x9,0x9,0x9,0x9, -0x9,0x8,0x8,0x8,0x8,0x8,0x8,0x8, -0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7, -0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6, -0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5, -0x5,0x5,0x4,0x4,0x4,0x4,0x4,0x4, -0x4,0x4,0x4,0x4,0x3,0x3,0x3,0x3, -0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3, -0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2, -0x2,0x2,0x2,0x2,0x2,0x2,0x1,0x1, -0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, -0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, -0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, -0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1, -0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, -0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, -0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2, -0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2, -0x2,0x3,0x3,0x3,0x3,0x3,0x3,0x3, -0x3,0x3,0x3,0x3,0x3,0x4,0x4,0x4, -0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x5, -0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5, -0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6, -0x6,0x7,0x7,0x7,0x7,0x7,0x7,0x7, -0x7,0x8,0x8,0x8,0x8,0x8,0x8,0x8, -0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xb,0xb, -0xb,0xb,0xb,0xb,0xc,0xc,0xc,0xc, -0xc,0xc,0xd,0xd,0xd,0xd,0xd,0xd, -0xe,0xe,0xe,0xe,0xe,0xf,0xf,0xf, -0xf,0xf,0xf,0x10,0x10,0x10,0x10,0x10, -0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12, -0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x14, -0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15, -0x15,0x16,0x16,0x16,0x16,0x17,0x17,0x17, -0x17,0x17,0x18,0x18,0x18,0x18,0x19,0x19, -0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1d, -0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1f, -0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21,0x21, -0x21,0x21,0x22,0x22,0x22,0x22,0x23,0x23, -0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25, -0x25,0x26,0x26,0x26,0x26,0x27,0x27,0x27, -0x28,0x28,0x28,0x28,0x29,0x29,0x29,0x2a, -0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c, -0x2c,0x2d,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e, -0x2f,0x2f,0x2f,0x30,0x30,0x30,0x30,0x31, -0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33, -0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x36, -0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38, -0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b, -0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e, -0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40, -0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43, -0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46, -0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49, -0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b, -0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e, -0x4f,0x4f,0x4f,0x50,0x50,0x51,0x51,0x51, -0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54, -0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57, -0x58,0x58,0x58,0x59,0x59,0x59,0x5a,0x5a, -0x5a,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d, -0x5d,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60, -0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63, -0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66, -0x67,0x67,0x67,0x68,0x68,0x69,0x69,0x69, -0x6a,0x6a,0x6a,0x6b,0x6b,0x6c,0x6c,0x6c, -0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x70, -0x70,0x70,0x71,0x71,0x71,0x72,0x72,0x73, -0x73,0x73,0x74,0x74,0x75,0x75,0x75,0x76, -0x76,0x77,0x77,0x77,0x78,0x78,0x78,0x79, -0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7c,0x7c, -0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f -}; +const uint8_t sinewave[] PROGMEM = // 2048 values + {0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x85, 0x85, 0x85, 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x91, 0x91, 0x91, 0x92, 0x92, 0x93, 0x93, 0x93, 0x94, 0x94, 0x95, 0x95, 0x95, 0x96, 0x96, 0x96, 0x97, 0x97, 0x98, 0x98, 0x98, 0x99, 0x99, 0x9a, 0x9a, 0x9a, 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9d, 0x9d, 0x9d, 0x9e, 0x9e, 0x9e, 0x9f, 0x9f, 0xa0, 0xa0, 0xa0, 0xa1, 0xa1, 0xa2, 0xa2, 0xa2, 0xa3, 0xa3, 0xa3, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, 0xa6, 0xa6, 0xa6, 0xa7, 0xa7, 0xa7, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xbb, + 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xc7, 0xc7, 0xc7, 0xc8, 0xc8, 0xc8, 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xcb, 0xcb, 0xcb, 0xcb, 0xcc, 0xcc, 0xcc, 0xcd, 0xcd, 0xcd, 0xce, 0xce, 0xce, 0xcf, 0xcf, 0xcf, 0xcf, 0xd0, 0xd0, 0xd0, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd4, 0xd4, 0xd5, 0xd5, 0xd5, 0xd5, 0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xd7, 0xd8, 0xd8, 0xd8, 0xd9, 0xd9, 0xd9, 0xd9, 0xda, 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe1, 0xe1, 0xe2, 0xe2, 0xe2, 0xe2, 0xe3, 0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe5, 0xe5, 0xe6, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe9, 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xef, 0xef, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, + 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, + 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, + 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd1, 0xd1, 0xd1, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc8, 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9d, + 0x9d, 0x9d, 0x9c, 0x9c, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x99, 0x99, 0x98, 0x98, 0x98, 0x97, 0x97, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x94, 0x94, 0x93, 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x91, 0x90, 0x90, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x89, 0x89, 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x86, 0x86, 0x85, 0x85, 0x85, 0x84, 0x84, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, 0x7a, 0x7a, 0x7a, 0x79, 0x79, 0x78, 0x78, 0x78, 0x77, 0x77, 0x77, 0x76, 0x76, 0x75, 0x75, 0x75, 0x74, 0x74, 0x73, 0x73, 0x73, 0x72, 0x72, 0x71, 0x71, 0x71, 0x70, 0x70, 0x70, 0x6f, 0x6f, 0x6e, 0x6e, 0x6e, 0x6d, 0x6d, 0x6c, 0x6c, 0x6c, 0x6b, 0x6b, 0x6a, 0x6a, 0x6a, 0x69, 0x69, 0x69, 0x68, 0x68, 0x67, 0x67, 0x67, 0x66, 0x66, 0x65, 0x65, 0x65, 0x64, 0x64, 0x64, 0x63, 0x63, 0x62, 0x62, 0x62, 0x61, 0x61, 0x61, 0x60, + 0x60, 0x5f, 0x5f, 0x5f, 0x5e, 0x5e, 0x5d, 0x5d, 0x5d, 0x5c, 0x5c, 0x5c, 0x5b, 0x5b, 0x5a, 0x5a, 0x5a, 0x59, 0x59, 0x59, 0x58, 0x58, 0x58, 0x57, 0x57, 0x56, 0x56, 0x56, 0x55, 0x55, 0x55, 0x54, 0x54, 0x53, 0x53, 0x53, 0x52, 0x52, 0x52, 0x51, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f, 0x4f, 0x4e, 0x4e, 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b, 0x4b, 0x4a, 0x4a, 0x4a, 0x49, 0x49, 0x49, 0x48, 0x48, 0x48, 0x47, 0x47, 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44, 0x44, 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2e, 0x2e, 0x2e, 0x2d, 0x2d, 0x2d, 0x2d, 0x2c, 0x2c, 0x2c, 0x2b, 0x2b, 0x2b, 0x2a, 0x2a, + 0x2a, 0x2a, 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x27, 0x27, 0x27, 0x26, 0x26, 0x26, 0x26, 0x25, 0x25, 0x25, 0x25, 0x24, 0x24, 0x24, 0x23, 0x23, 0x23, 0x23, 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x1f, 0x1f, 0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1e, 0x1d, 0x1d, 0x1d, 0x1d, 0x1c, 0x1c, 0x1c, 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1a, 0x1a, 0x1a, 0x1a, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x16, 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x13, 0x13, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xe, 0xe, 0xe, 0xe, 0xe, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x8, 0x8, 0x8, 0x8, 0x8, + 0x8, 0x8, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xe, 0xe, 0xe, 0xe, 0xe, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x46, + 0x46, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x66, 0x66, 0x67, 0x67, 0x67, 0x68, 0x68, 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f}; |