1 /* Copyright 2016 Jack Humbert
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.
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.
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/>.
27 // -----------------------------------------------------------------------------
32 float frequency_alt = 0;
36 float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
37 int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
43 uint16_t sample_length = 0;
45 bool playing_notes = false;
46 bool playing_note = false;
47 float note_frequency = 0;
48 float note_length = 0;
49 uint8_t note_tempo = TEMPO_DEFAULT;
50 float note_timbre = TIMBRE_DEFAULT;
51 uint16_t note_position = 0;
52 float (* notes_pointer)[][2];
55 bool note_resting = false;
57 uint8_t current_note = 0;
58 uint8_t rest_counter = 0;
61 float vibrato_counter = 0;
62 float vibrato_strength = .5;
63 float vibrato_rate = 0.125;
66 float polyphony_rate = 0;
68 static bool audio_initialized = false;
70 audio_config_t audio_config;
72 uint16_t envelope_index = 0;
73 bool glissando = true;
76 #define STARTUP_SONG SONG(STARTUP_SOUND)
78 float startup_song[][2] = STARTUP_SONG;
80 static void gpt_cb8(GPTDriver *gptp);
82 #define DAC_BUFFER_SIZE 360
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(); \
92 #define RESTART_CHANNEL_2() STOP_CHANNEL_2(); \
94 #define UPDATE_CHANNEL_1_FREQ(freq) gpt6cfg1.frequency = freq * DAC_BUFFER_SIZE; \
96 #define UPDATE_CHANNEL_2_FREQ(freq) gpt7cfg1.frequency = freq * DAC_BUFFER_SIZE; \
98 #define GET_CHANNEL_1_FREQ gpt6cfg1.frequency
99 #define GET_CHANNEL_2_FREQ gpt7cfg1.frequency
103 * GPT6 configuration.
105 // static const GPTConfig gpt6cfg1 = {
106 // .frequency = 1000000U,
108 // .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
112 GPTConfig gpt6cfg1 = {
113 .frequency = 440U*DAC_BUFFER_SIZE,
115 .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
119 GPTConfig gpt7cfg1 = {
120 .frequency = 440U*DAC_BUFFER_SIZE,
122 .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
126 GPTConfig gpt8cfg1 = {
129 .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
135 * DAC test buffer (sine wave).
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
171 static 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,
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
206 static 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,
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
241 * DAC streaming callback.
243 size_t nx = 0, ny = 0, nz = 0;
244 static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
249 if (dac_buffer == buffer) {
256 if ((nz % 1000) == 0) {
257 // palTogglePad(GPIOD, GPIOD_LED3);
262 * DAC error callback.
264 static void error_cb1(DACDriver *dacp, dacerror_t err) {
269 chSysHalt("DAC failure");
272 static const DACConfig dac1cfg1 = {
274 .datamode = DAC_DHRM_12BIT_RIGHT
277 static const DACConversionGroup dacgrpcfg1 = {
280 .error_cb = error_cb1,
281 .trigger = DAC_TRG(0)
284 static const DACConfig dac1cfg2 = {
286 .datamode = DAC_DHRM_12BIT_RIGHT
289 static const DACConversionGroup dacgrpcfg2 = {
292 .error_cb = error_cb1,
293 .trigger = DAC_TRG(0)
299 if (audio_initialized)
303 // if (!eeconfig_is_enabled())
307 // audio_config.raw = eeconfig_read_audio();
308 audio_config.enable = true;
311 * Starting DAC1 driver, setting up the output pin as analog as suggested
312 * by the Reference Manual.
314 palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG);
315 palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
316 dacStart(&DACD1, &dac1cfg1);
317 dacStart(&DACD2, &dac1cfg2);
320 * Starting GPT6 driver, it is used for triggering the DAC.
326 * Starting a continuous conversion.
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);
335 audio_initialized = true;
337 if (audio_config.enable) {
338 PLAY_SONG(startup_song);
343 void stop_all_notes()
345 dprintf("audio stop all notes");
347 if (!audio_initialized) {
352 gptStopTimer(&GPTD6);
353 gptStopTimer(&GPTD7);
354 gptStopTimer(&GPTD8);
356 playing_notes = false;
357 playing_note = false;
362 for (uint8_t i = 0; i < 8; i++)
369 void stop_note(float freq)
371 dprintf("audio stop note freq=%d", (int)freq);
374 if (!audio_initialized) {
377 for (int i = 7; i >= 0; i--) {
378 if (frequencies[i] == freq) {
381 for (int j = i; (j < 7); j++) {
382 frequencies[j] = frequencies[j+1];
383 frequencies[j+1] = 0;
384 volumes[j] = volumes[j+1];
393 if (voice_place >= voices) {
399 gptStopTimer(&GPTD8);
403 playing_note = false;
408 #ifdef VIBRATO_ENABLE
410 float mod(float a, int b)
412 float r = fmod(a, b);
413 return r < 0 ? r + b : r;
416 float vibrato(float average_freq) {
417 #ifdef VIBRATO_STRENGTH_ENABLE
418 float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
420 float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
422 vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
423 return vibrated_freq;
428 static void gpt_cb8(GPTDriver *gptp) {
436 if (polyphony_rate == 0) {
438 if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440/frequencies[voices - 2]/12/2)) {
439 frequency_alt = frequency_alt * pow(2, 440/frequency_alt/12/2);
440 } else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440/frequencies[voices - 2]/12/2)) {
441 frequency_alt = frequency_alt * pow(2, -440/frequency_alt/12/2);
443 frequency_alt = frequencies[voices - 2];
446 frequency_alt = frequencies[voices - 2];
449 #ifdef VIBRATO_ENABLE
450 if (vibrato_strength > 0) {
451 freq_alt = vibrato(frequency_alt);
453 freq_alt = frequency_alt;
456 freq_alt = frequency_alt;
460 if (envelope_index < 65535) {
464 freq_alt = voice_envelope(freq_alt);
466 if (freq_alt < 30.517578125) {
470 if (GET_CHANNEL_2_FREQ != (uint16_t)freq_alt) {
471 UPDATE_CHANNEL_2_FREQ(freq_alt);
476 if (polyphony_rate > 0) {
478 voice_place %= voices;
479 if (place++ > (frequencies[voice_place] / polyphony_rate)) {
480 voice_place = (voice_place + 1) % voices;
485 #ifdef VIBRATO_ENABLE
486 if (vibrato_strength > 0) {
487 freq = vibrato(frequencies[voice_place]);
489 freq = frequencies[voice_place];
492 freq = frequencies[voice_place];
496 if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) {
497 frequency = frequency * pow(2, 440/frequency/12/2);
498 } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) {
499 frequency = frequency * pow(2, -440/frequency/12/2);
501 frequency = frequencies[voices - 1];
504 frequency = frequencies[voices - 1];
507 #ifdef VIBRATO_ENABLE
508 if (vibrato_strength > 0) {
509 freq = vibrato(frequency);
518 if (envelope_index < 65535) {
522 freq = voice_envelope(freq);
524 if (freq < 30.517578125) {
529 if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
530 UPDATE_CHANNEL_1_FREQ(freq);
537 if (note_frequency > 0) {
538 #ifdef VIBRATO_ENABLE
539 if (vibrato_strength > 0) {
540 freq = vibrato(note_frequency);
542 freq = note_frequency;
545 freq = note_frequency;
548 if (envelope_index < 65535) {
551 freq = voice_envelope(freq);
554 if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
555 UPDATE_CHANNEL_1_FREQ(freq);
556 UPDATE_CHANNEL_2_FREQ(freq);
560 // gptStopTimer(&GPTD6);
561 // gptStopTimer(&GPTD7);
565 bool end_of_note = false;
566 if (GET_CHANNEL_1_FREQ > 0) {
568 end_of_note = (note_position >= (note_length*16 - 1));
570 end_of_note = (note_position >= (note_length*16));
572 end_of_note = (note_position >= (note_length*16));
577 if (current_note >= notes_count) {
583 // gptStopTimer(&GPTD8);
584 playing_notes = false;
591 if ((*notes_pointer)[current_note][0] == (*notes_pointer)[current_note + 1][0]) {
595 note_frequency = (*notes_pointer)[current_note][0];
599 note_resting = false;
601 note_frequency = (*notes_pointer)[current_note][0];
602 note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
609 if (!audio_config.enable) {
610 playing_notes = false;
611 playing_note = false;
615 void play_note(float freq, int vol) {
617 dprintf("audio play note freq=%d vol=%d", (int)freq, vol);
619 if (!audio_initialized) {
623 if (audio_config.enable && voices < 8) {
625 // Cancel notes if notes are playing
634 frequencies[voices] = freq;
635 volumes[voices] = vol;
639 gptStart(&GPTD8, &gpt8cfg1);
640 gptStartContinuous(&GPTD8, 2U);
647 void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat)
650 if (!audio_initialized) {
654 if (audio_config.enable) {
656 // Cancel note if a note is playing
660 playing_notes = true;
663 notes_count = n_count;
664 notes_repeat = n_repeat;
669 note_frequency = (*notes_pointer)[current_note][0];
670 note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
673 gptStart(&GPTD8, &gpt8cfg1);
674 gptStartContinuous(&GPTD8, 2U);
681 bool is_playing_notes(void) {
682 return playing_notes;
685 bool is_audio_on(void) {
686 return (audio_config.enable != 0);
689 void audio_toggle(void) {
690 audio_config.enable ^= 1;
691 eeconfig_update_audio(audio_config.raw);
692 if (audio_config.enable)
696 void audio_on(void) {
697 audio_config.enable = 1;
698 eeconfig_update_audio(audio_config.raw);
702 void audio_off(void) {
703 audio_config.enable = 0;
704 eeconfig_update_audio(audio_config.raw);
707 #ifdef VIBRATO_ENABLE
709 // Vibrato rate functions
711 void set_vibrato_rate(float rate) {
715 void increase_vibrato_rate(float change) {
716 vibrato_rate *= change;
719 void decrease_vibrato_rate(float change) {
720 vibrato_rate /= change;
723 #ifdef VIBRATO_STRENGTH_ENABLE
725 void set_vibrato_strength(float strength) {
726 vibrato_strength = strength;
729 void increase_vibrato_strength(float change) {
730 vibrato_strength *= change;
733 void decrease_vibrato_strength(float change) {
734 vibrato_strength /= change;
737 #endif /* VIBRATO_STRENGTH_ENABLE */
739 #endif /* VIBRATO_ENABLE */
741 // Polyphony functions
743 void set_polyphony_rate(float rate) {
744 polyphony_rate = rate;
747 void enable_polyphony() {
751 void disable_polyphony() {
755 void increase_polyphony_rate(float change) {
756 polyphony_rate *= change;
759 void decrease_polyphony_rate(float change) {
760 polyphony_rate /= change;
765 void set_timbre(float timbre) {
766 note_timbre = timbre;
771 void set_tempo(uint8_t tempo) {
775 void decrease_tempo(uint8_t tempo_change) {
776 note_tempo += tempo_change;
779 void increase_tempo(uint8_t tempo_change) {
780 if (note_tempo - tempo_change < 10) {
783 note_tempo -= tempo_change;