diff options
Diffstat (limited to 'quantum')
-rw-r--r-- | quantum/audio/audio.c (renamed from quantum/audio.c) | 17 | ||||
-rw-r--r-- | quantum/audio/audio.h (renamed from quantum/audio.h) | 1 | ||||
-rw-r--r-- | quantum/audio/musical_notes.h (renamed from quantum/musical_notes.h) | 0 | ||||
-rw-r--r-- | quantum/audio/song_list.h (renamed from quantum/song_list.h) | 16 | ||||
-rw-r--r-- | quantum/audio/vibrato_lut.h (renamed from quantum/vibrato_lut.h) | 0 | ||||
-rw-r--r-- | quantum/audio/voices.c | 60 | ||||
-rw-r--r-- | quantum/audio/voices.h | 21 | ||||
-rw-r--r-- | quantum/audio/wave.h (renamed from quantum/wave.h) | 0 | ||||
-rw-r--r-- | quantum/quantum.mk | 3 |
9 files changed, 116 insertions, 2 deletions
diff --git a/quantum/audio.c b/quantum/audio/audio.c index ab3444bc97..3225557bae 100644 --- a/quantum/audio.c +++ b/quantum/audio/audio.c @@ -81,6 +81,7 @@ bool inited = false; audio_config_t audio_config; +uint16_t envelope_index = 0; void audio_toggle(void) { audio_config.enable ^= 1; @@ -213,7 +214,6 @@ void audio_init() { #endif inited = true; - _delay_ms(500); } void stop_all_notes() { @@ -388,6 +388,14 @@ ISR(TIMER3_COMPA_vect) { freq = frequency; } } + + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); + + if (freq < 30.517578125) + freq = 30.52; ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period } @@ -427,6 +435,11 @@ ISR(TIMER3_COMPA_vect) { freq = note_frequency; } + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); + ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period } else { @@ -469,6 +482,7 @@ ISR(TIMER3_COMPA_vect) { note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100); #else + envelope_index = 0; note_frequency = (*notes_pointer)[current_note][0]; note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100); #endif @@ -496,6 +510,7 @@ if (audio_config.enable && voices < 8) { if (notes) stop_all_notes(); note = true; + envelope_index = 0; #ifdef PWM_AUDIO freq = freq / SAMPLE_RATE; #endif diff --git a/quantum/audio.h b/quantum/audio/audio.h index 2d4d303ced..d1ccfdb824 100644 --- a/quantum/audio.h +++ b/quantum/audio/audio.h @@ -4,6 +4,7 @@ #include <util/delay.h> #include "musical_notes.h" #include "song_list.h" +#include "voices.h" #ifndef AUDIO_H #define AUDIO_H diff --git a/quantum/musical_notes.h b/quantum/audio/musical_notes.h index b08d16a6fa..b08d16a6fa 100644 --- a/quantum/musical_notes.h +++ b/quantum/audio/musical_notes.h diff --git a/quantum/song_list.h b/quantum/audio/song_list.h index e992bd18a2..fc6fcdeef1 100644 --- a/quantum/song_list.h +++ b/quantum/audio/song_list.h @@ -64,6 +64,22 @@ S__NOTE(_REST), \ E__NOTE(_E7 ), +#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_SCALE_SOUND \ E__NOTE(_A5 ), \ E__NOTE(_B5 ), \ diff --git a/quantum/vibrato_lut.h b/quantum/audio/vibrato_lut.h index a2b1f3e5ce..a2b1f3e5ce 100644 --- a/quantum/vibrato_lut.h +++ b/quantum/audio/vibrato_lut.h diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c new file mode 100644 index 0000000000..51652927bd --- /dev/null +++ b/quantum/audio/voices.c @@ -0,0 +1,60 @@ +#include "voices.h" + +extern uint16_t envelope_index; +extern float note_timbre; + +voice_type voice = default_voice; + +void set_voice(voice_type v) { + voice = v; +} + +float voice_envelope(float frequency) { + // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz + uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency)); + + switch (voice) { + case default_voice: + // nothing here on purpose + break; + case butts_fader: + switch (compensated_index) { + case 0 ... 9: + frequency = frequency / 4; + note_timbre = TIMBRE_12; + break; + case 10 ... 19: + frequency = frequency / 2; + note_timbre = TIMBRE_12; + break; + case 20 ... 200: + note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125; + break; + default: + note_timbre = 0; + break; + } + break; + case octave_crunch: + 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; + } + + return frequency; +}
\ No newline at end of file diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h new file mode 100644 index 0000000000..317f5d98c5 --- /dev/null +++ b/quantum/audio/voices.h @@ -0,0 +1,21 @@ +#include <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "musical_notes.h" +#include "song_list.h" + +#ifndef VOICES_H +#define VOICES_H + +float voice_envelope(float frequency); + +typedef enum { + default_voice, + butts_fader, + octave_crunch +} voice_type; + +void set_voice(voice_type v); + +#endif
\ No newline at end of file diff --git a/quantum/wave.h b/quantum/audio/wave.h index 6ebc348519..6ebc348519 100644 --- a/quantum/wave.h +++ b/quantum/audio/wave.h diff --git a/quantum/quantum.mk b/quantum/quantum.mk index 1fe7390eba..83c4f1d1db 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -28,7 +28,7 @@ ifeq ($(strip $(MIDI_ENABLE)), yes) endif ifeq ($(strip $(AUDIO_ENABLE)), yes) - SRC += $(QUANTUM_DIR)/audio.c + SRC += $(QUANTUM_DIR)/audio/audio.c $(QUANTUM_DIR)/audio/voices.c endif ifeq ($(strip $(UNICODE_ENABLE)), yes) @@ -47,6 +47,7 @@ endif # Search Path VPATH += $(TOP_DIR)/$(QUANTUM_DIR) VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/keymap_extras +VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/audio include $(TMK_DIR)/protocol/lufa.mk |