aboutsummaryrefslogtreecommitdiff
path: root/quantum
diff options
context:
space:
mode:
Diffstat (limited to 'quantum')
-rw-r--r--quantum/audio/audio_arm.c148
-rw-r--r--quantum/audio/muse.c111
-rw-r--r--quantum/audio/muse.h9
-rw-r--r--quantum/config_common.h102
-rw-r--r--quantum/process_keycode/process_audio.c4
-rw-r--r--quantum/process_keycode/process_audio.h4
-rw-r--r--quantum/process_keycode/process_music.c31
-rw-r--r--quantum/process_keycode/process_music.h5
-rw-r--r--quantum/rgblight.c20
-rw-r--r--quantum/rgblight_types.h4
10 files changed, 339 insertions, 99 deletions
diff --git a/quantum/audio/audio_arm.c b/quantum/audio/audio_arm.c
index 247dc337d..d38184f32 100644
--- a/quantum/audio/audio_arm.c
+++ b/quantum/audio/audio_arm.c
@@ -79,7 +79,7 @@ float startup_song[][2] = STARTUP_SONG;
79 79
80static void gpt_cb8(GPTDriver *gptp); 80static void gpt_cb8(GPTDriver *gptp);
81 81
82#define DAC_BUFFER_SIZE 360 82#define DAC_BUFFER_SIZE 720
83 83
84#define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \ 84#define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \
85 gptStartContinuous(&GPTD6, 2U) 85 gptStartContinuous(&GPTD6, 2U)
@@ -167,6 +167,39 @@ GPTConfig gpt8cfg1 = {
167// 1622, 1657, 1692, 1727, 1763, 1798, 1834, 1869, 1905, 1940, 1976, 2012 167// 1622, 1657, 1692, 1727, 1763, 1798, 1834, 1869, 1905, 1940, 1976, 2012
168// }; 168// };
169 169
170// static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = {
171// 12, 8, 5, 3, 2, 1, 0, 1, 2, 3, 5, 8,
172// 12, 16, 20, 26, 32, 38, 45, 53, 61, 70, 80, 90,
173// 101, 112, 124, 136, 150, 163, 177, 192, 208, 224, 240, 257,
174// 275, 293, 312, 331, 350, 371, 391, 413, 434, 457, 479, 503,
175// 526, 550, 575, 600, 626, 651, 678, 705, 732, 759, 787, 816,
176// 844, 873, 903, 933, 963, 993, 1024, 1055, 1086, 1118, 1150, 1182,
177// 1215, 1248, 1281, 1314, 1347, 1381, 1415, 1449, 1483, 1518, 1552, 1587,
178// 1622, 1657, 1692, 1727, 1763, 1798, 1834, 1869, 1905, 1940, 1976, 2012,
179// 2047, 2082, 2118, 2154, 2189, 2225, 2260, 2296, 2331, 2367, 2402, 2437,
180// 2472, 2507, 2542, 2576, 2611, 2645, 2679, 2713, 2747, 2780, 2813, 2846,
181// 2879, 2912, 2944, 2976, 3008, 3039, 3070, 3101, 3131, 3161, 3191, 3221,
182// 3250, 3278, 3307, 3335, 3362, 3389, 3416, 3443, 3468, 3494, 3519, 3544,
183// 3568, 3591, 3615, 3637, 3660, 3681, 3703, 3723, 3744, 3763, 3782, 3801,
184// 3819, 3837, 3854, 3870, 3886, 3902, 3917, 3931, 3944, 3958, 3970, 3982,
185// 3993, 4004, 4014, 4024, 4033, 4041, 4049, 4056, 4062, 4068, 4074, 4078,
186// 4082, 4086, 4089, 4091, 4092, 4093, 4094, 4093, 4092, 4091, 4089, 4086,
187// 4082, 4078, 4074, 4068, 4062, 4056, 4049, 4041, 4033, 4024, 4014, 4004,
188// 3993, 3982, 3970, 3958, 3944, 3931, 3917, 3902, 3886, 3870, 3854, 3837,
189// 3819, 3801, 3782, 3763, 3744, 3723, 3703, 3681, 3660, 3637, 3615, 3591,
190// 3568, 3544, 3519, 3494, 3468, 3443, 3416, 3389, 3362, 3335, 3307, 3278,
191// 3250, 3221, 3191, 3161, 3131, 3101, 3070, 3039, 3008, 2976, 2944, 2912,
192// 2879, 2846, 2813, 2780, 2747, 2713, 2679, 2645, 2611, 2576, 2542, 2507,
193// 2472, 2437, 2402, 2367, 2331, 2296, 2260, 2225, 2189, 2154, 2118, 2082,
194// 2047, 2012, 1976, 1940, 1905, 1869, 1834, 1798, 1763, 1727, 1692, 1657,
195// 1622, 1587, 1552, 1518, 1483, 1449, 1415, 1381, 1347, 1314, 1281, 1248,
196// 1215, 1182, 1150, 1118, 1086, 1055, 1024, 993, 963, 933, 903, 873,
197// 844, 816, 787, 759, 732, 705, 678, 651, 626, 600, 575, 550,
198// 526, 503, 479, 457, 434, 413, 391, 371, 350, 331, 312, 293,
199// 275, 257, 240, 224, 208, 192, 177, 163, 150, 136, 124, 112,
200// 101, 90, 80, 70, 61, 53, 45, 38, 32, 26, 20, 16
201// };
202
170// squarewave 203// squarewave
171static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = { 204static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
172 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 205 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
@@ -184,6 +217,21 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
184 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 217 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
185 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 218 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
186 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 219 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
220 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
221 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
222 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
223 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
224 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
225 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
226 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
227 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
228 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
229 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
230 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
231 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
232 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
233 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
234 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
187 235
188 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
189 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -199,26 +247,26 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
199 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
200 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
201 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
250 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
251 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
252 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
253 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
254 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
256 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
257 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
258 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
259 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
260 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
261 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
262 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
263 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
264 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
202 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 265 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
203}; 266};
204 267
205// squarewave 268// squarewave
206static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = { 269static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = {
207 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
208 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
209 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
210 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
211 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
212 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
213 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
214 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
215 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
216 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
217 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
218 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
219 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
220 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
221 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
222 270
223 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
224 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -234,7 +282,52 @@ static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = {
234 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
235 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 283 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
236 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
237 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 285 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
286 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
287 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
288 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
289 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
290 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
291 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
292 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
293 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
294 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
295 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
296 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
297 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
298 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
299 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
300 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
301 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
302 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
303 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
304 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
305 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
306 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
307 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
308 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
309 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
310 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
311 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
312 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
313 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
314 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
315 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
316 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
317 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
318 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
319 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
320 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
321 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
322 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
323 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
324 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
325 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
326 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
327 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
328 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
329 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
330 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047
238}; 331};
239 332
240/* 333/*
@@ -317,7 +410,7 @@ void audio_init()
317 dacStart(&DACD2, &dac1cfg2); 410 dacStart(&DACD2, &dac1cfg2);
318 411
319 /* 412 /*
320 * Starting GPT6 driver, it is used for triggering the DAC. 413 * Starting GPT6/7 driver, it is used for triggering the DAC.
321 */ 414 */
322 START_CHANNEL_1(); 415 START_CHANNEL_1();
323 START_CHANNEL_2(); 416 START_CHANNEL_2();
@@ -325,12 +418,8 @@ void audio_init()
325 /* 418 /*
326 * Starting a continuous conversion. 419 * Starting a continuous conversion.
327 */ 420 */
328 dacStartConversion(&DACD1, &dacgrpcfg1, 421 dacStartConversion(&DACD1, &dacgrpcfg1, (dacsample_t *)dac_buffer, DAC_BUFFER_SIZE);
329 (dacsample_t *)dac_buffer, DAC_BUFFER_SIZE); 422 dacStartConversion(&DACD2, &dacgrpcfg2, (dacsample_t *)dac_buffer_2, DAC_BUFFER_SIZE);
330 dacStartConversion(&DACD2, &dacgrpcfg2,
331 (dacsample_t *)dac_buffer_2, DAC_BUFFER_SIZE);
332 // gptStartContinuous(&GPTD6, 2U);
333
334 423
335 audio_initialized = true; 424 audio_initialized = true;
336 425
@@ -469,6 +558,8 @@ static void gpt_cb8(GPTDriver *gptp) {
469 558
470 if (GET_CHANNEL_2_FREQ != (uint16_t)freq_alt) { 559 if (GET_CHANNEL_2_FREQ != (uint16_t)freq_alt) {
471 UPDATE_CHANNEL_2_FREQ(freq_alt); 560 UPDATE_CHANNEL_2_FREQ(freq_alt);
561 } else {
562 RESTART_CHANNEL_2();
472 } 563 }
473 //note_timbre; 564 //note_timbre;
474 } 565 }
@@ -528,6 +619,8 @@ static void gpt_cb8(GPTDriver *gptp) {
528 619
529 if (GET_CHANNEL_1_FREQ != (uint16_t)freq) { 620 if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
530 UPDATE_CHANNEL_1_FREQ(freq); 621 UPDATE_CHANNEL_1_FREQ(freq);
622 } else {
623 RESTART_CHANNEL_1();
531 } 624 }
532 //note_timbre; 625 //note_timbre;
533 } 626 }
@@ -565,11 +658,11 @@ static void gpt_cb8(GPTDriver *gptp) {
565 bool end_of_note = false; 658 bool end_of_note = false;
566 if (GET_CHANNEL_1_FREQ > 0) { 659 if (GET_CHANNEL_1_FREQ > 0) {
567 if (!note_resting) 660 if (!note_resting)
568 end_of_note = (note_position >= (note_length*16 - 1)); 661 end_of_note = (note_position >= (note_length*8 - 1));
569 else 662 else
570 end_of_note = (note_position >= (note_length*16)); 663 end_of_note = (note_position >= (note_length*8));
571 } else { 664 } else {
572 end_of_note = (note_position >= (note_length*16)); 665 end_of_note = (note_position >= (note_length*8));
573 } 666 }
574 667
575 if (end_of_note) { 668 if (end_of_note) {
@@ -622,6 +715,7 @@ void play_note(float freq, int vol) {
622 715
623 if (audio_config.enable && voices < 8) { 716 if (audio_config.enable && voices < 8) {
624 717
718
625 // Cancel notes if notes are playing 719 // Cancel notes if notes are playing
626 if (playing_notes) 720 if (playing_notes)
627 stop_all_notes(); 721 stop_all_notes();
diff --git a/quantum/audio/muse.c b/quantum/audio/muse.c
new file mode 100644
index 000000000..f3cb592d8
--- /dev/null
+++ b/quantum/audio/muse.c
@@ -0,0 +1,111 @@
1#include "muse.h"
2
3enum {
4 MUSE_OFF,
5 MUSE_ON,
6 MUSE_C_1_2,
7 MUSE_C1,
8 MUSE_C2,
9 MUSE_C4,
10 MUSE_C8,
11 MUSE_C3,
12 MUSE_C6,
13 MUSE_B1,
14 MUSE_B2,
15 MUSE_B3,
16 MUSE_B4,
17 MUSE_B5,
18 MUSE_B6,
19 MUSE_B7,
20 MUSE_B8,
21 MUSE_B9,
22 MUSE_B10,
23 MUSE_B11,
24 MUSE_B12,
25 MUSE_B13,
26 MUSE_B14,
27 MUSE_B15,
28 MUSE_B16,
29 MUSE_B17,
30 MUSE_B18,
31 MUSE_B19,
32 MUSE_B20,
33 MUSE_B21,
34 MUSE_B22,
35 MUSE_B23,
36 MUSE_B24,
37 MUSE_B25,
38 MUSE_B26,
39 MUSE_B27,
40 MUSE_B28,
41 MUSE_B29,
42 MUSE_B30,
43 MUSE_B31
44};
45
46bool number_of_ones_to_bool[16] = {
47 1, 0, 0, 1, 0, 1, 1, 0,
48 0, 1, 1, 0, 1, 0, 0, 1
49};
50
51uint8_t muse_interval[4] = {MUSE_B7, MUSE_B19, MUSE_B3, MUSE_B28};
52uint8_t muse_theme[4] = {MUSE_B8, MUSE_B23, MUSE_B18, MUSE_B17};
53
54bool muse_timer_1bit = 0;
55uint8_t muse_timer_2bit = 0;
56uint8_t muse_timer_2bit_counter = 0;
57uint8_t muse_timer_4bit = 0;
58uint32_t muse_timer_31bit = 0;
59
60bool bit_for_value(uint8_t value) {
61 switch (value) {
62 case MUSE_OFF:
63 return 0;
64 case MUSE_ON:
65 return 1;
66 case MUSE_C_1_2:
67 return muse_timer_1bit;
68 case MUSE_C1:
69 return (muse_timer_4bit & 1);
70 case MUSE_C2:
71 return (muse_timer_4bit & 2);
72 case MUSE_C4:
73 return (muse_timer_4bit & 4);
74 case MUSE_C8:
75 return (muse_timer_4bit & 8);
76 case MUSE_C3:
77 return (muse_timer_2bit & 1);
78 case MUSE_C6:
79 return (muse_timer_2bit & 2);
80 default:
81 return muse_timer_31bit & (1UL << (value - MUSE_B1));
82 }
83}
84
85uint8_t muse_clock_pulse(void) {
86
87 bool top = number_of_ones_to_bool[
88 bit_for_value(muse_theme[0]) +
89 (bit_for_value(muse_theme[1]) << 1) +
90 (bit_for_value(muse_theme[2]) << 2) +
91 (bit_for_value(muse_theme[3]) << 3)
92 ];
93
94 if (muse_timer_1bit == 0) {
95 if (muse_timer_2bit_counter == 0) {
96 muse_timer_2bit = (muse_timer_2bit + 1) % 4;
97 }
98 muse_timer_2bit_counter = (muse_timer_2bit_counter + 1) % 3;
99 muse_timer_4bit = (muse_timer_4bit + 1) % 16;
100 muse_timer_31bit = (muse_timer_31bit << 1) + top;
101 }
102
103 muse_timer_1bit = (muse_timer_1bit + 1) % 2;
104
105 return
106 bit_for_value(muse_interval[0]) +
107 (bit_for_value(muse_interval[1]) << 1) +
108 (bit_for_value(muse_interval[2]) << 2) +
109 (bit_for_value(muse_interval[3]) << 3);
110
111}
diff --git a/quantum/audio/muse.h b/quantum/audio/muse.h
new file mode 100644
index 000000000..6f382a7fe
--- /dev/null
+++ b/quantum/audio/muse.h
@@ -0,0 +1,9 @@
1#ifndef MUSE_H
2#define MUSE_H
3
4#include "quantum.h"
5#include "process_audio.h"
6
7uint8_t muse_clock_pulse(void);
8
9#endif
diff --git a/quantum/config_common.h b/quantum/config_common.h
index 4c6a702af..f6f51b367 100644
--- a/quantum/config_common.h
+++ b/quantum/config_common.h
@@ -22,56 +22,58 @@
22#define ROW2COL 1 22#define ROW2COL 1
23#define CUSTOM_MATRIX 2 /* Disables built-in matrix scanning code */ 23#define CUSTOM_MATRIX 2 /* Disables built-in matrix scanning code */
24 24
25/* I/O pins */ 25#ifdef __AVR__
26#ifndef F0 26 /* I/O pins */
27 #define B0 0x30 27 #ifndef F0
28 #define B1 0x31 28 #define B0 0x30
29 #define B2 0x32 29 #define B1 0x31
30 #define B3 0x33 30 #define B2 0x32
31 #define B4 0x34 31 #define B3 0x33
32 #define B5 0x35 32 #define B4 0x34
33 #define B6 0x36 33 #define B5 0x35
34 #define B7 0x37 34 #define B6 0x36
35 #define C0 0x60 35 #define B7 0x37
36 #define C1 0x61 36 #define C0 0x60
37 #define C2 0x62 37 #define C1 0x61
38 #define C3 0x63 38 #define C2 0x62
39 #define C4 0x64 39 #define C3 0x63
40 #define C5 0x65 40 #define C4 0x64
41 #define C6 0x66 41 #define C5 0x65
42 #define C7 0x67 42 #define C6 0x66
43 #define D0 0x90 43 #define C7 0x67
44 #define D1 0x91 44 #define D0 0x90
45 #define D2 0x92 45 #define D1 0x91
46 #define D3 0x93 46 #define D2 0x92
47 #define D4 0x94 47 #define D3 0x93
48 #define D5 0x95 48 #define D4 0x94
49 #define D6 0x96 49 #define D5 0x95
50 #define D7 0x97 50 #define D6 0x96
51 #define E0 0xC0 51 #define D7 0x97
52 #define E1 0xC1 52 #define E0 0xC0
53 #define E2 0xC2 53 #define E1 0xC1
54 #define E3 0xC3 54 #define E2 0xC2
55 #define E4 0xC4 55 #define E3 0xC3
56 #define E5 0xC5 56 #define E4 0xC4
57 #define E6 0xC6 57 #define E5 0xC5
58 #define E7 0xC7 58 #define E6 0xC6
59 #define F0 0xF0 59 #define E7 0xC7
60 #define F1 0xF1 60 #define F0 0xF0
61 #define F2 0xF2 61 #define F1 0xF1
62 #define F3 0xF3 62 #define F2 0xF2
63 #define F4 0xF4 63 #define F3 0xF3
64 #define F5 0xF5 64 #define F4 0xF4
65 #define F6 0xF6 65 #define F5 0xF5
66 #define F7 0xF7 66 #define F6 0xF6
67 #define A0 0x00 67 #define F7 0xF7
68 #define A1 0x01 68 #define A0 0x00
69 #define A2 0x02 69 #define A1 0x01
70 #define A3 0x03 70 #define A2 0x02
71 #define A4 0x04 71 #define A3 0x03
72 #define A5 0x05 72 #define A4 0x04
73 #define A6 0x06 73 #define A5 0x05
74 #define A7 0x07 74 #define A6 0x06
75 #define A7 0x07
76 #endif
75#endif 77#endif
76 78
77/* USART configuration */ 79/* USART configuration */
diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c
index e9b20512e..0a25aa535 100644
--- a/quantum/process_keycode/process_audio.c
+++ b/quantum/process_keycode/process_audio.c
@@ -10,9 +10,7 @@ float voice_change_song[][2] = VOICE_CHANGE_SONG;
10 #define PITCH_STANDARD_A 440.0f 10 #define PITCH_STANDARD_A 440.0f
11#endif 11#endif
12 12
13 13float compute_freq_for_midi_note(uint8_t note)
14
15static float compute_freq_for_midi_note(uint8_t note)
16{ 14{
17 // https://en.wikipedia.org/wiki/MIDI_tuning_standard 15 // https://en.wikipedia.org/wiki/MIDI_tuning_standard
18 return pow(2.0, (note - 69) / 12.0) * PITCH_STANDARD_A; 16 return pow(2.0, (note - 69) / 12.0) * PITCH_STANDARD_A;
diff --git a/quantum/process_keycode/process_audio.h b/quantum/process_keycode/process_audio.h
index 7ac15b733..3a84c3d86 100644
--- a/quantum/process_keycode/process_audio.h
+++ b/quantum/process_keycode/process_audio.h
@@ -1,6 +1,8 @@
1#ifndef PROCESS_AUDIO_H 1#ifndef PROCESS_AUDIO_H
2#define PROCESS_AUDIO_H 2#define PROCESS_AUDIO_H
3 3
4float compute_freq_for_midi_note(uint8_t note);
5
4bool process_audio(uint16_t keycode, keyrecord_t *record); 6bool process_audio(uint16_t keycode, keyrecord_t *record);
5void process_audio_noteon(uint8_t note); 7void process_audio_noteon(uint8_t note);
6void process_audio_noteoff(uint8_t note); 8void process_audio_noteoff(uint8_t note);
@@ -8,4 +10,4 @@ void process_audio_all_notes_off(void);
8 10
9void audio_on_user(void); 11void audio_on_user(void);
10 12
11#endif \ No newline at end of file 13#endif
diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c
index 742bb08b1..697aa237f 100644
--- a/quantum/process_keycode/process_music.c
+++ b/quantum/process_keycode/process_music.c
@@ -197,17 +197,26 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
197 } 197 }
198 } 198 }
199 199
200 uint8_t note; 200 uint8_t note = 36;
201 if (music_mode == MUSIC_MODE_CHROMATIC) 201 #ifdef MUSIC_MAP
202 note = (music_starting_note + record->event.key.col + music_offset - 3)+12*(MATRIX_ROWS - record->event.key.row); 202 if (music_mode == MUSIC_MODE_CHROMATIC) {
203 else if (music_mode == MUSIC_MODE_GUITAR) 203 note = music_starting_note + music_offset + 36 + music_map[record->event.key.row][record->event.key.col];
204 note = (music_starting_note + record->event.key.col + music_offset + 32)+5*(MATRIX_ROWS - record->event.key.row); 204 } else {
205 else if (music_mode == MUSIC_MODE_VIOLIN) 205 uint8_t position = music_map[record->event.key.row][record->event.key.col];
206 note = (music_starting_note + record->event.key.col + music_offset + 32)+7*(MATRIX_ROWS - record->event.key.row); 206 note = music_starting_note + music_offset + 36 + SCALE[position % 12] + (position / 12)*12;
207 else if (music_mode == MUSIC_MODE_MAJOR) 207 }
208 note = (music_starting_note + SCALE[record->event.key.col + music_offset] - 3)+12*(MATRIX_ROWS - record->event.key.row); 208 #else
209 else 209 if (music_mode == MUSIC_MODE_CHROMATIC)
210 note = music_starting_note; 210 note = (music_starting_note + record->event.key.col + music_offset - 3)+12*(MATRIX_ROWS - record->event.key.row);
211 else if (music_mode == MUSIC_MODE_GUITAR)
212 note = (music_starting_note + record->event.key.col + music_offset + 32)+5*(MATRIX_ROWS - record->event.key.row);
213 else if (music_mode == MUSIC_MODE_VIOLIN)
214 note = (music_starting_note + record->event.key.col + music_offset + 32)+7*(MATRIX_ROWS - record->event.key.row);
215 else if (music_mode == MUSIC_MODE_MAJOR)
216 note = (music_starting_note + SCALE[record->event.key.col + music_offset] - 3)+12*(MATRIX_ROWS - record->event.key.row);
217 else
218 note = music_starting_note;
219 #endif
211 220
212 if (record->event.pressed) { 221 if (record->event.pressed) {
213 music_noteon(note); 222 music_noteon(note);
diff --git a/quantum/process_keycode/process_music.h b/quantum/process_keycode/process_music.h
index 8ccb7a3a5..f6753d4f2 100644
--- a/quantum/process_keycode/process_music.h
+++ b/quantum/process_keycode/process_music.h
@@ -29,6 +29,11 @@ enum music_modes {
29 NUMBER_OF_MODES 29 NUMBER_OF_MODES
30}; 30};
31 31
32
33#ifdef MUSIC_MAP
34 extern const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS];
35#endif
36
32bool process_music(uint16_t keycode, keyrecord_t *record); 37bool process_music(uint16_t keycode, keyrecord_t *record);
33 38
34bool is_music_on(void); 39bool is_music_on(void);
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index 4e2671d24..2490a1d9f 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -14,9 +14,11 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */ 15 */
16#include <math.h> 16#include <math.h>
17#include <avr/eeprom.h> 17#ifdef __AVR__
18#include <avr/interrupt.h> 18 #include <avr/eeprom.h>
19#include <util/delay.h> 19 #include <avr/interrupt.h>
20#endif
21#include "wait.h"
20#include "progmem.h" 22#include "progmem.h"
21#include "timer.h" 23#include "timer.h"
22#include "rgblight.h" 24#include "rgblight.h"
@@ -113,10 +115,16 @@ void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1) {
113 115
114 116
115uint32_t eeconfig_read_rgblight(void) { 117uint32_t eeconfig_read_rgblight(void) {
116 return eeprom_read_dword(EECONFIG_RGBLIGHT); 118 #ifdef __AVR__
119 return eeprom_read_dword(EECONFIG_RGBLIGHT);
120 #else
121 return 0;
122 #endif
117} 123}
118void eeconfig_update_rgblight(uint32_t val) { 124void eeconfig_update_rgblight(uint32_t val) {
119 eeprom_update_dword(EECONFIG_RGBLIGHT, val); 125 #ifdef __AVR__
126 eeprom_update_dword(EECONFIG_RGBLIGHT, val);
127 #endif
120} 128}
121void eeconfig_update_rgblight_default(void) { 129void eeconfig_update_rgblight_default(void) {
122 dprintf("eeconfig_update_rgblight_default\n"); 130 dprintf("eeconfig_update_rgblight_default\n");
@@ -311,7 +319,7 @@ void rgblight_disable(void) {
311 #ifdef RGBLIGHT_ANIMATIONS 319 #ifdef RGBLIGHT_ANIMATIONS
312 rgblight_timer_disable(); 320 rgblight_timer_disable();
313 #endif 321 #endif
314 _delay_ms(50); 322 wait_ms(50);
315 rgblight_set(); 323 rgblight_set();
316} 324}
317 325
diff --git a/quantum/rgblight_types.h b/quantum/rgblight_types.h
index b1aa7026c..49ef5c8ea 100644
--- a/quantum/rgblight_types.h
+++ b/quantum/rgblight_types.h
@@ -23,7 +23,9 @@
23#ifndef RGBLIGHT_TYPES 23#ifndef RGBLIGHT_TYPES
24#define RGBLIGHT_TYPES 24#define RGBLIGHT_TYPES
25 25
26#include <avr/io.h> 26#ifdef __AVR__
27 #include <avr/io.h>
28#endif
27 29
28#ifdef RGBW 30#ifdef RGBW
29 #define LED_TYPE struct cRGBW 31 #define LED_TYPE struct cRGBW