]> git.donarmstrong.com Git - qmk_firmware.git/blob - quantum/audio/voices.c
update layout macros for planck
[qmk_firmware.git] / quantum / audio / voices.c
1 /* Copyright 2016 Jack Humbert
2  *
3  * This program is free software: you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation, either version 2 of the License, or
6  * (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15  */
16 #include "voices.h"
17 #include "audio.h"
18 #include "stdlib.h"
19
20 // these are imported from audio.c
21 extern uint16_t envelope_index;
22 extern float note_timbre;
23 extern float polyphony_rate;
24 extern bool glissando;
25
26 voice_type voice = default_voice;
27
28 void set_voice(voice_type v) {
29     voice = v;
30 }
31
32 void voice_iterate() {
33     voice = (voice + 1) % number_of_voices;
34 }
35
36 void voice_deiterate() {
37     voice = (voice - 1 + number_of_voices) % number_of_voices;
38 }
39
40 float voice_envelope(float frequency) {
41     // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
42     __attribute__ ((unused))
43     uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
44
45     switch (voice) {
46         case default_voice:
47             glissando = false;
48             note_timbre = TIMBRE_50;
49             polyphony_rate = 0;
50                 break;
51
52     #ifdef AUDIO_VOICES
53
54         case something:
55             glissando = false;
56             polyphony_rate = 0;
57             switch (compensated_index) {
58                 case 0 ... 9:
59                     note_timbre = TIMBRE_12;
60                     break;
61
62                 case 10 ... 19:
63                     note_timbre = TIMBRE_25;
64                     break;
65
66                 case 20 ... 200:
67                     note_timbre = .125 + .125;
68                     break;
69
70                 default:
71                     note_timbre = .125;
72                     break;
73             }
74             break;
75
76         case drums:
77             glissando = false;
78             polyphony_rate = 0;
79                 // switch (compensated_index) {
80                 //     case 0 ... 10:
81                 //         note_timbre = 0.5;
82                 //         break;
83                 //     case 11 ... 20:
84                 //         note_timbre = 0.5 * (21 - compensated_index) / 10;
85                 //         break;
86                 //     default:
87                 //         note_timbre = 0;
88                 //         break;
89                 // }
90                 // frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8);
91
92             if (frequency < 80.0) {
93
94             } else if (frequency < 160.0) {
95
96                 // Bass drum: 60 - 100 Hz
97                 frequency = (rand() % (int)(40)) + 60;
98                 switch (envelope_index) {
99                     case 0 ... 10:
100                         note_timbre = 0.5;
101                         break;
102                     case 11 ... 20:
103                         note_timbre = 0.5 * (21 - envelope_index) / 10;
104                         break;
105                     default:
106                         note_timbre = 0;
107                         break;
108                 }
109
110             } else if (frequency < 320.0) {
111
112
113                 // Snare drum: 1 - 2 KHz
114                 frequency = (rand() % (int)(1000)) + 1000;
115                 switch (envelope_index) {
116                     case 0 ... 5:
117                         note_timbre = 0.5;
118                         break;
119                     case 6 ... 20:
120                         note_timbre = 0.5 * (21 - envelope_index) / 15;
121                         break;
122                     default:
123                         note_timbre = 0;
124                         break;
125                 }
126
127             } else if (frequency < 640.0) {
128
129                 // Closed Hi-hat: 3 - 5 KHz
130                 frequency = (rand() % (int)(2000)) + 3000;
131                 switch (envelope_index) {
132                     case 0 ... 15:
133                         note_timbre = 0.5;
134                         break;
135                     case 16 ... 20:
136                         note_timbre = 0.5 * (21 - envelope_index) / 5;
137                         break;
138                     default:
139                         note_timbre = 0;
140                         break;
141                 }
142
143             } else if (frequency < 1280.0) {
144
145                 // Open Hi-hat: 3 - 5 KHz
146                 frequency = (rand() % (int)(2000)) + 3000;
147                 switch (envelope_index) {
148                     case 0 ... 35:
149                         note_timbre = 0.5;
150                         break;
151                     case 36 ... 50:
152                         note_timbre = 0.5 * (51 - envelope_index) / 15;
153                         break;
154                     default:
155                         note_timbre = 0;
156                         break;
157                 }
158
159             }
160             break;
161         case butts_fader:
162             glissando = true;
163             polyphony_rate = 0;
164             switch (compensated_index) {
165                 case 0 ... 9:
166                     frequency = frequency / 4;
167                     note_timbre = TIMBRE_12;
168                         break;
169
170                 case 10 ... 19:
171                     frequency = frequency / 2;
172                     note_timbre = TIMBRE_12;
173                         break;
174
175                 case 20 ... 200:
176                     note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
177                         break;
178
179                 default:
180                     note_timbre = 0;
181                         break;
182             }
183             break;
184
185         // case octave_crunch:
186         //     polyphony_rate = 0;
187         //     switch (compensated_index) {
188         //         case 0 ... 9:
189         //         case 20 ... 24:
190         //         case 30 ... 32:
191         //             frequency = frequency / 2;
192         //             note_timbre = TIMBRE_12;
193         //         break;
194
195         //         case 10 ... 19:
196         //         case 25 ... 29:
197         //         case 33 ... 35:
198         //             frequency = frequency * 2;
199         //             note_timbre = TIMBRE_12;
200                //          break;
201
202         //         default:
203         //             note_timbre = TIMBRE_12;
204         //              break;
205         //     }
206                //  break;
207
208         case duty_osc:
209             // This slows the loop down a substantial amount, so higher notes may freeze
210             glissando = true;
211             polyphony_rate = 0;
212             switch (compensated_index) {
213                 default:
214                     #define OCS_SPEED 10
215                     #define OCS_AMP   .25
216                     // sine wave is slow
217                     // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
218                     // triangle wave is a bit faster
219                     note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
220                         break;
221             }
222                 break;
223
224         case duty_octave_down:
225             glissando = true;
226             polyphony_rate = 0;
227             note_timbre = (envelope_index % 2) * .125 + .375 * 2;
228             if ((envelope_index % 4) == 0)
229                 note_timbre = 0.5;
230             if ((envelope_index % 8) == 0)
231                 note_timbre = 0;
232             break;
233         case delayed_vibrato:
234             glissando = true;
235             polyphony_rate = 0;
236             note_timbre = TIMBRE_50;
237             #define VOICE_VIBRATO_DELAY 150
238             #define VOICE_VIBRATO_SPEED 50
239             switch (compensated_index) {
240                 case 0 ... VOICE_VIBRATO_DELAY:
241                     break;
242                 default:
243                     frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
244                     break;
245             }
246             break;
247         // case delayed_vibrato_octave:
248         //     polyphony_rate = 0;
249         //     if ((envelope_index % 2) == 1) {
250         //         note_timbre = 0.55;
251         //     } else {
252         //         note_timbre = 0.45;
253         //     }
254         //     #define VOICE_VIBRATO_DELAY 150
255         //     #define VOICE_VIBRATO_SPEED 50
256         //     switch (compensated_index) {
257         //         case 0 ... VOICE_VIBRATO_DELAY:
258         //             break;
259         //         default:
260         //             frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
261         //             break;
262         //     }
263         //     break;
264         // case duty_fifth_down:
265         //     note_timbre = 0.5;
266         //     if ((envelope_index % 3) == 0)
267         //         note_timbre = 0.75;
268         //     break;
269         // case duty_fourth_down:
270         //     note_timbre = 0.0;
271         //     if ((envelope_index % 12) == 0)
272         //         note_timbre = 0.75;
273         //     if (((envelope_index % 12) % 4) != 1)
274         //         note_timbre = 0.75;
275         //     break;
276         // case duty_third_down:
277         //     note_timbre = 0.5;
278         //     if ((envelope_index % 5) == 0)
279         //         note_timbre = 0.75;
280         //     break;
281         // case duty_fifth_third_down:
282         //     note_timbre = 0.5;
283         //     if ((envelope_index % 5) == 0)
284         //         note_timbre = 0.75;
285         //     if ((envelope_index % 3) == 0)
286         //         note_timbre = 0.25;
287         //     break;
288
289     #endif
290
291                 default:
292                         break;
293     }
294
295     return frequency;
296 }