summaryrefslogtreecommitdiff
path: root/quantum
diff options
context:
space:
mode:
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.c60
-rw-r--r--quantum/audio/voices.h21
-rw-r--r--quantum/audio/wave.h (renamed from quantum/wave.h)0
-rw-r--r--quantum/quantum.mk3
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