]> git.donarmstrong.com Git - qmk_firmware.git/blob - quantum/audio/voices.c
06ff275ba43b985739b74e737a392865ccab9914
[qmk_firmware.git] / quantum / audio / voices.c
1 #include "voices.h"
2 #include "audio.h"
3 #include "stdlib.h"
4
5 // these are imported from audio.c
6 extern uint16_t envelope_index;
7 extern float note_timbre;
8 extern float polyphony_rate;
9 extern bool glissando;
10
11 voice_type voice = default_voice;
12
13 void set_voice(voice_type v) {
14     voice = v;
15 }
16
17 void voice_iterate() {
18     voice = (voice + 1) % number_of_voices;
19 }
20
21 void voice_deiterate() {
22     voice = (voice - 1 + number_of_voices) % number_of_voices;
23 }
24
25 float voice_envelope(float frequency) {
26     // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
27     uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
28
29     switch (voice) {
30         case default_voice:
31             glissando = true;
32             note_timbre = TIMBRE_50;
33             polyphony_rate = 0;
34                 break;
35
36         case something:
37             glissando = false;
38             polyphony_rate = 0;
39             switch (compensated_index) {
40                 case 0 ... 9:
41                     note_timbre = TIMBRE_12;
42                     break;
43
44                 case 10 ... 19:
45                     note_timbre = TIMBRE_25;
46                     break;
47
48                 case 20 ... 200:
49                     note_timbre = .125 + .125;
50                     break;
51
52                 default:
53                     note_timbre = .125;
54                     break;
55             }
56             break;
57
58         case drums:
59             glissando = false;
60             polyphony_rate = 0;
61                 note_timbre = 0;
62                 switch (envelope_index) {
63                     case 0 ... 20:
64                         note_timbre = 0.5;
65                     default:
66                         frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8);
67                         break;
68                 }
69             // if (frequency < 80.0) {
70             //     switch (envelope_index % 4) {
71             //         case 0:
72             //             frequency = 348.0;
73             //         case 1:
74             //             frequency = 53.0;
75             //         case 2:
76             //             frequency = 128.0;
77             //         case 3:
78             //             frequency = 934.0;
79             //         default:
80             //             break;
81             //     }
82             // } else if (frequency < 160.0) {
83
84             // } else if (frequency < 320.0) {
85
86             // } else if (frequency < 640.0) {
87
88             // } else if (frequency < 1280.0) {
89
90             // }
91             break;
92         case butts_fader:
93             glissando = true;
94             polyphony_rate = 0;
95             switch (compensated_index) {
96                 case 0 ... 9:
97                     frequency = frequency / 4;
98                     note_timbre = TIMBRE_12;
99                         break;
100
101                 case 10 ... 19:
102                     frequency = frequency / 2;
103                     note_timbre = TIMBRE_12;
104                         break;
105
106                 case 20 ... 200:
107                     note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
108                         break;
109
110                 default:
111                     note_timbre = 0;
112                         break;
113             }
114             break;
115
116         // case octave_crunch:
117         //     polyphony_rate = 0;
118         //     switch (compensated_index) {
119         //         case 0 ... 9:
120         //         case 20 ... 24:
121         //         case 30 ... 32:
122         //             frequency = frequency / 2;
123         //             note_timbre = TIMBRE_12;
124         //         break;
125
126         //         case 10 ... 19:
127         //         case 25 ... 29:
128         //         case 33 ... 35:
129         //             frequency = frequency * 2;
130         //             note_timbre = TIMBRE_12;
131                //          break;
132
133         //         default:
134         //             note_timbre = TIMBRE_12;
135         //              break;
136         //     }
137                //  break;
138
139         case duty_osc:
140             // This slows the loop down a substantial amount, so higher notes may freeze
141             glissando = true;
142             polyphony_rate = 0;
143             switch (compensated_index) {
144                 default:
145                     #define OCS_SPEED 10
146                     #define OCS_AMP   .25
147                     // sine wave is slow
148                     // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
149                     // triangle wave is a bit faster
150                     note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
151                         break;
152             }
153                 break;
154
155         case duty_octave_down:
156             glissando = true;
157             polyphony_rate = 0;
158             note_timbre = (envelope_index % 2) * .125 + .375 * 2;
159             if ((envelope_index % 4) == 0)
160                 note_timbre = 0.5;
161             if ((envelope_index % 8) == 0)
162                 note_timbre = 0;
163             break;
164         case delayed_vibrato:
165             glissando = true;
166             polyphony_rate = 0;
167             note_timbre = TIMBRE_50;
168             #define VOICE_VIBRATO_DELAY 150
169             #define VOICE_VIBRATO_SPEED 50
170             switch (compensated_index) {
171                 case 0 ... VOICE_VIBRATO_DELAY:
172                     break;
173                 default:
174                     frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
175                     break;
176             }
177             break;
178         // case delayed_vibrato_octave:
179         //     polyphony_rate = 0;
180         //     if ((envelope_index % 2) == 1) {
181         //         note_timbre = 0.55;
182         //     } else {
183         //         note_timbre = 0.45;
184         //     }
185         //     #define VOICE_VIBRATO_DELAY 150
186         //     #define VOICE_VIBRATO_SPEED 50
187         //     switch (compensated_index) {
188         //         case 0 ... VOICE_VIBRATO_DELAY:
189         //             break;
190         //         default:
191         //             frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
192         //             break;
193         //     }
194         //     break;
195         // case duty_fifth_down:
196         //     note_timbre = 0.5;
197         //     if ((envelope_index % 3) == 0)
198         //         note_timbre = 0.75;
199         //     break;
200         // case duty_fourth_down:
201         //     note_timbre = 0.0;
202         //     if ((envelope_index % 12) == 0)
203         //         note_timbre = 0.75;
204         //     if (((envelope_index % 12) % 4) != 1)
205         //         note_timbre = 0.75;
206         //     break;
207         // case duty_third_down:
208         //     note_timbre = 0.5;
209         //     if ((envelope_index % 5) == 0)
210         //         note_timbre = 0.75;
211         //     break;
212         // case duty_fifth_third_down:
213         //     note_timbre = 0.5;
214         //     if ((envelope_index % 5) == 0)
215         //         note_timbre = 0.75;
216         //     if ((envelope_index % 3) == 0)
217         //         note_timbre = 0.25;
218         //     break;
219
220                 default:
221                         break;
222     }
223
224     return frequency;
225 }
226
227