aboutsummaryrefslogtreecommitdiff
path: root/quantum
diff options
context:
space:
mode:
Diffstat (limited to 'quantum')
-rw-r--r--quantum/audio/audio_arm.c280
1 files changed, 230 insertions, 50 deletions
diff --git a/quantum/audio/audio_arm.c b/quantum/audio/audio_arm.c
index 43c8d67c4..247dc337d 100644
--- a/quantum/audio/audio_arm.c
+++ b/quantum/audio/audio_arm.c
@@ -77,23 +77,48 @@ bool glissando = true;
77#endif 77#endif
78float startup_song[][2] = STARTUP_SONG; 78float startup_song[][2] = STARTUP_SONG;
79 79
80static void gpt_cb6(GPTDriver *gptp);
81static void gpt_cb7(GPTDriver *gptp);
82static void gpt_cb8(GPTDriver *gptp); 80static void gpt_cb8(GPTDriver *gptp);
83 81
82#define DAC_BUFFER_SIZE 360
83
84#define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \
85 gptStartContinuous(&GPTD6, 2U)
86#define START_CHANNEL_2() gptStart(&GPTD7, &gpt7cfg1); \
87 gptStartContinuous(&GPTD7, 2U)
88#define STOP_CHANNEL_1() gptStopTimer(&GPTD6)
89#define STOP_CHANNEL_2() gptStopTimer(&GPTD7)
90#define RESTART_CHANNEL_1() STOP_CHANNEL_1(); \
91 START_CHANNEL_1()
92#define RESTART_CHANNEL_2() STOP_CHANNEL_2(); \
93 START_CHANNEL_2()
94#define UPDATE_CHANNEL_1_FREQ(freq) gpt6cfg1.frequency = freq * DAC_BUFFER_SIZE; \
95 RESTART_CHANNEL_1()
96#define UPDATE_CHANNEL_2_FREQ(freq) gpt7cfg1.frequency = freq * DAC_BUFFER_SIZE; \
97 RESTART_CHANNEL_2()
98#define GET_CHANNEL_1_FREQ gpt6cfg1.frequency
99#define GET_CHANNEL_2_FREQ gpt7cfg1.frequency
100
101
84/* 102/*
85 * GPT6 configuration. 103 * GPT6 configuration.
86 */ 104 */
105// static const GPTConfig gpt6cfg1 = {
106// .frequency = 1000000U,
107// .callback = NULL,
108// .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
109// .dier = 0U
110// };
111
87GPTConfig gpt6cfg1 = { 112GPTConfig gpt6cfg1 = {
88 .frequency = 440, 113 .frequency = 440U*DAC_BUFFER_SIZE,
89 .callback = gpt_cb6, 114 .callback = NULL,
90 .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ 115 .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
91 .dier = 0U 116 .dier = 0U
92}; 117};
93 118
94GPTConfig gpt7cfg1 = { 119GPTConfig gpt7cfg1 = {
95 .frequency = 440, 120 .frequency = 440U*DAC_BUFFER_SIZE,
96 .callback = gpt_cb7, 121 .callback = NULL,
97 .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ 122 .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
98 .dier = 0U 123 .dier = 0U
99}; 124};
@@ -105,15 +130,169 @@ GPTConfig gpt8cfg1 = {
105 .dier = 0U 130 .dier = 0U
106}; 131};
107 132
108static void gpt_cb6(GPTDriver *gptp) { 133
109 palTogglePad(GPIOA, 4); 134/*
135 * DAC test buffer (sine wave).
136 */
137// static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
138// 2047, 2082, 2118, 2154, 2189, 2225, 2260, 2296, 2331, 2367, 2402, 2437,
139// 2472, 2507, 2542, 2576, 2611, 2645, 2679, 2713, 2747, 2780, 2813, 2846,
140// 2879, 2912, 2944, 2976, 3008, 3039, 3070, 3101, 3131, 3161, 3191, 3221,
141// 3250, 3278, 3307, 3335, 3362, 3389, 3416, 3443, 3468, 3494, 3519, 3544,
142// 3568, 3591, 3615, 3637, 3660, 3681, 3703, 3723, 3744, 3763, 3782, 3801,
143// 3819, 3837, 3854, 3870, 3886, 3902, 3917, 3931, 3944, 3958, 3970, 3982,
144// 3993, 4004, 4014, 4024, 4033, 4041, 4049, 4056, 4062, 4068, 4074, 4078,
145// 4082, 4086, 4089, 4091, 4092, 4093, 4094, 4093, 4092, 4091, 4089, 4086,
146// 4082, 4078, 4074, 4068, 4062, 4056, 4049, 4041, 4033, 4024, 4014, 4004,
147// 3993, 3982, 3970, 3958, 3944, 3931, 3917, 3902, 3886, 3870, 3854, 3837,
148// 3819, 3801, 3782, 3763, 3744, 3723, 3703, 3681, 3660, 3637, 3615, 3591,
149// 3568, 3544, 3519, 3494, 3468, 3443, 3416, 3389, 3362, 3335, 3307, 3278,
150// 3250, 3221, 3191, 3161, 3131, 3101, 3070, 3039, 3008, 2976, 2944, 2912,
151// 2879, 2846, 2813, 2780, 2747, 2713, 2679, 2645, 2611, 2576, 2542, 2507,
152// 2472, 2437, 2402, 2367, 2331, 2296, 2260, 2225, 2189, 2154, 2118, 2082,
153// 2047, 2012, 1976, 1940, 1905, 1869, 1834, 1798, 1763, 1727, 1692, 1657,
154// 1622, 1587, 1552, 1518, 1483, 1449, 1415, 1381, 1347, 1314, 1281, 1248,
155// 1215, 1182, 1150, 1118, 1086, 1055, 1024, 993, 963, 933, 903, 873,
156// 844, 816, 787, 759, 732, 705, 678, 651, 626, 600, 575, 550,
157// 526, 503, 479, 457, 434, 413, 391, 371, 350, 331, 312, 293,
158// 275, 257, 240, 224, 208, 192, 177, 163, 150, 136, 124, 112,
159// 101, 90, 80, 70, 61, 53, 45, 38, 32, 26, 20, 16,
160// 12, 8, 5, 3, 2, 1, 0, 1, 2, 3, 5, 8,
161// 12, 16, 20, 26, 32, 38, 45, 53, 61, 70, 80, 90,
162// 101, 112, 124, 136, 150, 163, 177, 192, 208, 224, 240, 257,
163// 275, 293, 312, 331, 350, 371, 391, 413, 434, 457, 479, 503,
164// 526, 550, 575, 600, 626, 651, 678, 705, 732, 759, 787, 816,
165// 844, 873, 903, 933, 963, 993, 1024, 1055, 1086, 1118, 1150, 1182,
166// 1215, 1248, 1281, 1314, 1347, 1381, 1415, 1449, 1483, 1518, 1552, 1587,
167// 1622, 1657, 1692, 1727, 1763, 1798, 1834, 1869, 1905, 1940, 1976, 2012
168// };
169
170// squarewave
171static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
172 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
173 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
174 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
175 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
176 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
177 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
178 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
179 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
180 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
181 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
182 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
183 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
184 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,
186 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
187
188 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,
190 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
191 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
192 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
193 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
194 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
195 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
196 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
197 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
198 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
199 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,
201 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
203};
204
205// squarewave
206static 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
223 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,
225 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
226 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
227 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
228 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
229 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
230 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
231 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
232 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
233 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
234 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,
236 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
238};
239
240/*
241 * DAC streaming callback.
242 */
243size_t nx = 0, ny = 0, nz = 0;
244static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
245
246 (void)dacp;
247
248 nz++;
249 if (dac_buffer == buffer) {
250 nx += n;
251 }
252 else {
253 ny += n;
254 }
255
256 if ((nz % 1000) == 0) {
257 // palTogglePad(GPIOD, GPIOD_LED3);
258 }
110} 259}
111 260
261/*
262 * DAC error callback.
263 */
264static void error_cb1(DACDriver *dacp, dacerror_t err) {
265
266 (void)dacp;
267 (void)err;
112 268
113static void gpt_cb7(GPTDriver *gptp) { 269 chSysHalt("DAC failure");
114 palTogglePad(GPIOA, 5);
115} 270}
116 271
272static const DACConfig dac1cfg1 = {
273 .init = 2047U,
274 .datamode = DAC_DHRM_12BIT_RIGHT
275};
276
277static const DACConversionGroup dacgrpcfg1 = {
278 .num_channels = 1U,
279 .end_cb = end_cb1,
280 .error_cb = error_cb1,
281 .trigger = DAC_TRG(0)
282};
283
284static const DACConfig dac1cfg2 = {
285 .init = 2047U,
286 .datamode = DAC_DHRM_12BIT_RIGHT
287};
288
289static const DACConversionGroup dacgrpcfg2 = {
290 .num_channels = 1U,
291 .end_cb = end_cb1,
292 .error_cb = error_cb1,
293 .trigger = DAC_TRG(0)
294};
295
117void audio_init() 296void audio_init()
118{ 297{
119 298
@@ -128,8 +307,30 @@ void audio_init()
128 // audio_config.raw = eeconfig_read_audio(); 307 // audio_config.raw = eeconfig_read_audio();
129 audio_config.enable = true; 308 audio_config.enable = true;
130 309
131 palSetPadMode(GPIOA, 4, PAL_MODE_OUTPUT_PUSHPULL); 310 /*
132 palSetPadMode(GPIOA, 5, PAL_MODE_OUTPUT_PUSHPULL); 311 * Starting DAC1 driver, setting up the output pin as analog as suggested
312 * by the Reference Manual.
313 */
314 palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG);
315 palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
316 dacStart(&DACD1, &dac1cfg1);
317 dacStart(&DACD2, &dac1cfg2);
318
319 /*
320 * Starting GPT6 driver, it is used for triggering the DAC.
321 */
322 START_CHANNEL_1();
323 START_CHANNEL_2();
324
325 /*
326 * Starting a continuous conversion.
327 */
328 dacStartConversion(&DACD1, &dacgrpcfg1,
329 (dacsample_t *)dac_buffer, DAC_BUFFER_SIZE);
330 dacStartConversion(&DACD2, &dacgrpcfg2,
331 (dacsample_t *)dac_buffer_2, DAC_BUFFER_SIZE);
332 // gptStartContinuous(&GPTD6, 2U);
333
133 334
134 audio_initialized = true; 335 audio_initialized = true;
135 336
@@ -193,8 +394,8 @@ void stop_note(float freq)
193 voice_place = 0; 394 voice_place = 0;
194 } 395 }
195 if (voices == 0) { 396 if (voices == 0) {
196 gptStopTimer(&GPTD6); 397 STOP_CHANNEL_1();
197 gptStopTimer(&GPTD7); 398 STOP_CHANNEL_2();
198 gptStopTimer(&GPTD8); 399 gptStopTimer(&GPTD8);
199 frequency = 0; 400 frequency = 0;
200 frequency_alt = 0; 401 frequency_alt = 0;
@@ -224,20 +425,6 @@ float vibrato(float average_freq) {
224 425
225#endif 426#endif
226 427
227static void restart_gpt6(void) {
228 // gptStopTimer(&GPTD6);
229
230 gptStart(&GPTD6, &gpt6cfg1);
231 gptStartContinuous(&GPTD6, 2U);
232}
233
234static void restart_gpt7(void) {
235 // gptStopTimer(&GPTD7);
236
237 gptStart(&GPTD7, &gpt7cfg1);
238 gptStartContinuous(&GPTD7, 2U);
239}
240
241static void gpt_cb8(GPTDriver *gptp) { 428static void gpt_cb8(GPTDriver *gptp) {
242 float freq; 429 float freq;
243 430
@@ -280,13 +467,10 @@ static void gpt_cb8(GPTDriver *gptp) {
280 freq_alt = 30.52; 467 freq_alt = 30.52;
281 } 468 }
282 469
283 if (gpt6cfg1.frequency != (uint16_t)freq_alt) { 470 if (GET_CHANNEL_2_FREQ != (uint16_t)freq_alt) {
284 gpt6cfg1.frequency = freq_alt; 471 UPDATE_CHANNEL_2_FREQ(freq_alt);
285 restart_gpt6();
286 } 472 }
287 //note_timbre; 473 //note_timbre;
288 } else {
289 // gptStopTimer(&GPTD6);
290 } 474 }
291 475
292 if (polyphony_rate > 0) { 476 if (polyphony_rate > 0) {
@@ -342,13 +526,10 @@ static void gpt_cb8(GPTDriver *gptp) {
342 } 526 }
343 527
344 528
345 if (gpt7cfg1.frequency != (uint16_t)freq) { 529 if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
346 gpt7cfg1.frequency = freq; 530 UPDATE_CHANNEL_1_FREQ(freq);
347 restart_gpt7();
348 } 531 }
349 //note_timbre; 532 //note_timbre;
350 } else {
351 // gptStopTimer(&GPTD7);
352 } 533 }
353 } 534 }
354 535
@@ -370,11 +551,9 @@ static void gpt_cb8(GPTDriver *gptp) {
370 freq = voice_envelope(freq); 551 freq = voice_envelope(freq);
371 552
372 553
373 if (gpt6cfg1.frequency != (uint16_t)freq) { 554 if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
374 gpt6cfg1.frequency = freq; 555 UPDATE_CHANNEL_1_FREQ(freq);
375 restart_gpt6(); 556 UPDATE_CHANNEL_2_FREQ(freq);
376 gpt7cfg1.frequency = freq;
377 restart_gpt7();
378 } 557 }
379 //note_timbre; 558 //note_timbre;
380 } else { 559 } else {
@@ -384,8 +563,8 @@ static void gpt_cb8(GPTDriver *gptp) {
384 563
385 note_position++; 564 note_position++;
386 bool end_of_note = false; 565 bool end_of_note = false;
387 if (gpt6cfg1.frequency > 0) { 566 if (GET_CHANNEL_1_FREQ > 0) {
388 if (!note_resting) 567 if (!note_resting)
389 end_of_note = (note_position >= (note_length*16 - 1)); 568 end_of_note = (note_position >= (note_length*16 - 1));
390 else 569 else
391 end_of_note = (note_position >= (note_length*16)); 570 end_of_note = (note_position >= (note_length*16));
@@ -399,8 +578,8 @@ static void gpt_cb8(GPTDriver *gptp) {
399 if (notes_repeat) { 578 if (notes_repeat) {
400 current_note = 0; 579 current_note = 0;
401 } else { 580 } else {
402 gptStopTimer(&GPTD6); 581 STOP_CHANNEL_1();
403 gptStopTimer(&GPTD7); 582 STOP_CHANNEL_2();
404 // gptStopTimer(&GPTD8); 583 // gptStopTimer(&GPTD8);
405 playing_notes = false; 584 playing_notes = false;
406 return; 585 return;
@@ -459,7 +638,8 @@ void play_note(float freq, int vol) {
459 638
460 gptStart(&GPTD8, &gpt8cfg1); 639 gptStart(&GPTD8, &gpt8cfg1);
461 gptStartContinuous(&GPTD8, 2U); 640 gptStartContinuous(&GPTD8, 2U);
462 641 RESTART_CHANNEL_1();
642 RESTART_CHANNEL_2();
463 } 643 }
464 644
465} 645}
@@ -492,8 +672,8 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat)
492 672
493 gptStart(&GPTD8, &gpt8cfg1); 673 gptStart(&GPTD8, &gpt8cfg1);
494 gptStartContinuous(&GPTD8, 2U); 674 gptStartContinuous(&GPTD8, 2U);
495 restart_gpt6(); 675 RESTART_CHANNEL_1();
496 restart_gpt7(); 676 RESTART_CHANNEL_2();
497 } 677 }
498 678
499} 679}