summaryrefslogtreecommitdiff
path: root/quantum/audio
diff options
context:
space:
mode:
authorWilliam Chang <william@factual.com>2019-11-20 22:17:07 -0800
committerWilliam Chang <william@factual.com>2019-11-20 22:17:07 -0800
commite7f4d56592b3975c38af329e77b4efd9108495e8 (patch)
tree0a416bccbf70bfdbdb9ffcdb3bf136b47378c014 /quantum/audio
parent71493b2f9bbd5f3d18373c518fa14ccafcbf48fc (diff)
parent8416a94ad27b3ff058576f09f35f0704a8b39ff3 (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'quantum/audio')
-rw-r--r--quantum/audio/audio.c740
-rw-r--r--quantum/audio/audio.h26
-rw-r--r--quantum/audio/audio_arm.c846
-rw-r--r--quantum/audio/audio_pwm.c637
-rw-r--r--quantum/audio/luts.c380
-rw-r--r--quantum/audio/luts.h18
-rw-r--r--quantum/audio/muse.c137
-rw-r--r--quantum/audio/musical_notes.h245
-rw-r--r--quantum/audio/song_list.h319
-rw-r--r--quantum/audio/voices.c250
-rw-r--r--quantum/audio/voices.h20
-rw-r--r--quantum/audio/wave.h273
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(&note_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(&note_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat)); \
+ _Pragma("message \"'PLAY_NOTE_ARRAY' macro is deprecated\"")
#define PLAY_SONG(note_array) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), false)
#define PLAY_LOOP(note_array) play_notes(&note_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};