]> git.donarmstrong.com Git - qmk_firmware.git/blob - quantum/audio/voices.c
Merge pull request #282 from jasontwong/master
[qmk_firmware.git] / quantum / audio / voices.c
1 #include "voices.h"
2 #include "stdlib.h"
3
4 // these are imported from audio.c
5 extern uint16_t envelope_index;
6 extern float note_timbre;
7 extern float polyphony_rate;
8
9 voice_type voice = default_voice;
10
11 void set_voice(voice_type v) {
12     voice = v;
13 }
14
15 void voice_iterate() {
16     voice = (voice + 1) % number_of_voices;
17 }
18
19 void voice_deiterate() {
20     voice = (voice - 1) % number_of_voices;
21 }
22
23 float voice_envelope(float frequency) {
24     // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
25     uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
26
27     switch (voice) {
28         case default_voice:
29             note_timbre = TIMBRE_50;
30             polyphony_rate = 0;
31                 break;
32
33         case butts_fader:
34             polyphony_rate = 0;
35             switch (compensated_index) {
36                 case 0 ... 9:
37                     frequency = frequency / 4;
38                     note_timbre = TIMBRE_12;
39                         break;
40
41                 case 10 ... 19:
42                     frequency = frequency / 2;
43                     note_timbre = TIMBRE_12;
44                         break;
45
46                 case 20 ... 200:
47                     note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
48                         break;
49
50                 default:
51                     note_timbre = 0;
52                         break;
53             }
54             break;
55
56         case octave_crunch:
57             polyphony_rate = 0;
58             switch (compensated_index) {
59                 case 0 ... 9:
60                 case 20 ... 24:
61                 case 30 ... 32:
62                     frequency = frequency / 2;
63                     note_timbre = TIMBRE_12;
64                 break;
65
66                 case 10 ... 19:
67                 case 25 ... 29:
68                 case 33 ... 35:
69                     frequency = frequency * 2;
70                     note_timbre = TIMBRE_12;
71                         break;
72
73                 default:
74                     note_timbre = TIMBRE_12;
75                         break;
76             }
77                 break;
78
79         case duty_osc:
80             // This slows the loop down a substantial amount, so higher notes may freeze
81             polyphony_rate = 0;
82             switch (compensated_index) {
83                 default:
84                     #define OCS_SPEED 10
85                     #define OCS_AMP   .25
86                     // sine wave is slow
87                     // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
88                     // triangle wave is a bit faster
89                     note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
90                         break;
91             }
92                 break;
93
94         case duty_octave_down:
95             polyphony_rate = 0;
96             note_timbre = (envelope_index % 2) * .125 + .375 * 2;
97             if ((envelope_index % 4) == 0)
98                 note_timbre = 0.5;
99             if ((envelope_index % 8) == 0)
100                 note_timbre = 0;
101             break;
102         // case duty_fifth_down:
103         //     note_timbre = 0.5;
104         //     if ((envelope_index % 3) == 0)
105         //         note_timbre = 0.75;
106         //     break;
107         // case duty_fourth_down:
108         //     note_timbre = 0.0;
109         //     if ((envelope_index % 12) == 0)
110         //         note_timbre = 0.75;
111         //     if (((envelope_index % 12) % 4) != 1)
112         //         note_timbre = 0.75;
113         //     break;
114         // case duty_third_down:
115         //     note_timbre = 0.5;
116         //     if ((envelope_index % 5) == 0)
117         //         note_timbre = 0.75;
118         //     break;
119         // case duty_fifth_third_down:
120         //     note_timbre = 0.5;
121         //     if ((envelope_index % 5) == 0)
122         //         note_timbre = 0.75;
123         //     if ((envelope_index % 3) == 0)
124         //         note_timbre = 0.25;
125         //     break;
126
127                 default:
128                         break;
129     }
130
131     return frequency;
132 }