summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--quantum/audio.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/quantum/audio.c b/quantum/audio.c
index 1327887d9a..df421ef999 100644
--- a/quantum/audio.c
+++ b/quantum/audio.c
@@ -302,18 +302,19 @@ float vibrato(float average_freq) {
float envelope(float f) {
uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / f));
switch (compensated_index) {
- case 0:
- note_timbre = TIMBRE_50;
- break;
- case 20:
- note_timbre = TIMBRE_25;
- break;
- case 32:
+ case 0 ... 9:
+ f = f / 4;
note_timbre = TIMBRE_12;
break;
- case 40 ... 60:
+ case 10 ... 19:
f = f / 2;
- note_timbre = TIMBRE_50;
+ 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;
}
return f;
@@ -414,6 +415,8 @@ ISR(TIMER3_COMPA_vect) {
}
freq = 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
}