summaryrefslogtreecommitdiffstats
path: root/quantum/audio/voices.c
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2016-04-21 06:37:45 +0200
committerJack Humbert <jack.humb@gmail.com>2016-04-21 06:37:45 +0200
commit73228f5e5d1d4cd31a46e5e93aa893a8f727e3b9 (patch)
treea2c07de2c28427d8114ebcdaa2df36cea4d1800b /quantum/audio/voices.c
parent2e60054951ce08e973c735991bd95390c6aa3842 (diff)
downloadqmk_firmware-73228f5e5d1d4cd31a46e5e93aa893a8f727e3b9.tar.gz
qmk_firmware-73228f5e5d1d4cd31a46e5e93aa893a8f727e3b9.tar.xz
restructures audio, begins voicing
Diffstat (limited to 'quantum/audio/voices.c')
-rw-r--r--quantum/audio/voices.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c
new file mode 100644
index 000000000..30e8be641
--- /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