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 720
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
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
204 static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
205 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
206 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
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 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,
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 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
239 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
240 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
241 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
242 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
243 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
244 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
245 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
246 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,
248 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,
265 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
269 static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = {
271 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,
273 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
274 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
275 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
276 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
277 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
278 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
279 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
280 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
281 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,
283 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,
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
334 * DAC streaming callback.
336 size_t nx = 0, ny = 0, nz = 0;
337 static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
342 if (dac_buffer == buffer) {
349 if ((nz % 1000) == 0) {
350 // palTogglePad(GPIOD, GPIOD_LED3);
355 * DAC error callback.
357 static void error_cb1(DACDriver *dacp, dacerror_t err) {
362 chSysHalt("DAC failure");
365 static const DACConfig dac1cfg1 = {
367 .datamode = DAC_DHRM_12BIT_RIGHT
370 static const DACConversionGroup dacgrpcfg1 = {
373 .error_cb = error_cb1,
374 .trigger = DAC_TRG(0)
377 static const DACConfig dac1cfg2 = {
379 .datamode = DAC_DHRM_12BIT_RIGHT
382 static const DACConversionGroup dacgrpcfg2 = {
385 .error_cb = error_cb1,
386 .trigger = DAC_TRG(0)
392 if (audio_initialized)
396 // if (!eeconfig_is_enabled())
400 // audio_config.raw = eeconfig_read_audio();
401 audio_config.enable = true;
404 * Starting DAC1 driver, setting up the output pin as analog as suggested
405 * by the Reference Manual.
407 palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG);
408 palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
409 dacStart(&DACD1, &dac1cfg1);
410 dacStart(&DACD2, &dac1cfg2);
413 * Starting GPT6/7 driver, it is used for triggering the DAC.
419 * Starting a continuous conversion.
421 dacStartConversion(&DACD1, &dacgrpcfg1, (dacsample_t *)dac_buffer, DAC_BUFFER_SIZE);
422 dacStartConversion(&DACD2, &dacgrpcfg2, (dacsample_t *)dac_buffer_2, DAC_BUFFER_SIZE);
424 audio_initialized = true;
426 if (audio_config.enable) {
427 PLAY_SONG(startup_song);
432 void stop_all_notes()
434 dprintf("audio stop all notes");
436 if (!audio_initialized) {
441 gptStopTimer(&GPTD6);
442 gptStopTimer(&GPTD7);
443 gptStopTimer(&GPTD8);
445 playing_notes = false;
446 playing_note = false;
451 for (uint8_t i = 0; i < 8; i++)
458 void stop_note(float freq)
460 dprintf("audio stop note freq=%d", (int)freq);
463 if (!audio_initialized) {
466 for (int i = 7; i >= 0; i--) {
467 if (frequencies[i] == freq) {
470 for (int j = i; (j < 7); j++) {
471 frequencies[j] = frequencies[j+1];
472 frequencies[j+1] = 0;
473 volumes[j] = volumes[j+1];
482 if (voice_place >= voices) {
488 gptStopTimer(&GPTD8);
492 playing_note = false;
497 #ifdef VIBRATO_ENABLE
499 float mod(float a, int b)
501 float r = fmod(a, b);
502 return r < 0 ? r + b : r;
505 float vibrato(float average_freq) {
506 #ifdef VIBRATO_STRENGTH_ENABLE
507 float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
509 float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
511 vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
512 return vibrated_freq;
517 static void gpt_cb8(GPTDriver *gptp) {
525 if (polyphony_rate == 0) {
527 if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440/frequencies[voices - 2]/12/2)) {
528 frequency_alt = frequency_alt * pow(2, 440/frequency_alt/12/2);
529 } else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440/frequencies[voices - 2]/12/2)) {
530 frequency_alt = frequency_alt * pow(2, -440/frequency_alt/12/2);
532 frequency_alt = frequencies[voices - 2];
535 frequency_alt = frequencies[voices - 2];
538 #ifdef VIBRATO_ENABLE
539 if (vibrato_strength > 0) {
540 freq_alt = vibrato(frequency_alt);
542 freq_alt = frequency_alt;
545 freq_alt = frequency_alt;
549 if (envelope_index < 65535) {
553 freq_alt = voice_envelope(freq_alt);
555 if (freq_alt < 30.517578125) {
559 if (GET_CHANNEL_2_FREQ != (uint16_t)freq_alt) {
560 UPDATE_CHANNEL_2_FREQ(freq_alt);
567 if (polyphony_rate > 0) {
569 voice_place %= voices;
570 if (place++ > (frequencies[voice_place] / polyphony_rate)) {
571 voice_place = (voice_place + 1) % voices;
576 #ifdef VIBRATO_ENABLE
577 if (vibrato_strength > 0) {
578 freq = vibrato(frequencies[voice_place]);
580 freq = frequencies[voice_place];
583 freq = frequencies[voice_place];
587 if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) {
588 frequency = frequency * pow(2, 440/frequency/12/2);
589 } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) {
590 frequency = frequency * pow(2, -440/frequency/12/2);
592 frequency = frequencies[voices - 1];
595 frequency = frequencies[voices - 1];
598 #ifdef VIBRATO_ENABLE
599 if (vibrato_strength > 0) {
600 freq = vibrato(frequency);
609 if (envelope_index < 65535) {
613 freq = voice_envelope(freq);
615 if (freq < 30.517578125) {
620 if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
621 UPDATE_CHANNEL_1_FREQ(freq);
630 if (note_frequency > 0) {
631 #ifdef VIBRATO_ENABLE
632 if (vibrato_strength > 0) {
633 freq = vibrato(note_frequency);
635 freq = note_frequency;
638 freq = note_frequency;
641 if (envelope_index < 65535) {
644 freq = voice_envelope(freq);
647 if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
648 UPDATE_CHANNEL_1_FREQ(freq);
649 UPDATE_CHANNEL_2_FREQ(freq);
653 // gptStopTimer(&GPTD6);
654 // gptStopTimer(&GPTD7);
658 bool end_of_note = false;
659 if (GET_CHANNEL_1_FREQ > 0) {
661 end_of_note = (note_position >= (note_length*8 - 1));
663 end_of_note = (note_position >= (note_length*8));
665 end_of_note = (note_position >= (note_length*8));
670 if (current_note >= notes_count) {
676 // gptStopTimer(&GPTD8);
677 playing_notes = false;
684 if ((*notes_pointer)[current_note][0] == (*notes_pointer)[current_note + 1][0]) {
688 note_frequency = (*notes_pointer)[current_note][0];
692 note_resting = false;
694 note_frequency = (*notes_pointer)[current_note][0];
695 note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
702 if (!audio_config.enable) {
703 playing_notes = false;
704 playing_note = false;
708 void play_note(float freq, int vol) {
710 dprintf("audio play note freq=%d vol=%d", (int)freq, vol);
712 if (!audio_initialized) {
716 if (audio_config.enable && voices < 8) {
719 // Cancel notes if notes are playing
728 frequencies[voices] = freq;
729 volumes[voices] = vol;
733 gptStart(&GPTD8, &gpt8cfg1);
734 gptStartContinuous(&GPTD8, 2U);
741 void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat)
744 if (!audio_initialized) {
748 if (audio_config.enable) {
750 // Cancel note if a note is playing
754 playing_notes = true;
757 notes_count = n_count;
758 notes_repeat = n_repeat;
763 note_frequency = (*notes_pointer)[current_note][0];
764 note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
767 gptStart(&GPTD8, &gpt8cfg1);
768 gptStartContinuous(&GPTD8, 2U);
775 bool is_playing_notes(void) {
776 return playing_notes;
779 bool is_audio_on(void) {
780 return (audio_config.enable != 0);
783 void audio_toggle(void) {
784 audio_config.enable ^= 1;
785 eeconfig_update_audio(audio_config.raw);
786 if (audio_config.enable)
790 void audio_on(void) {
791 audio_config.enable = 1;
792 eeconfig_update_audio(audio_config.raw);
796 void audio_off(void) {
797 audio_config.enable = 0;
798 eeconfig_update_audio(audio_config.raw);
801 #ifdef VIBRATO_ENABLE
803 // Vibrato rate functions
805 void set_vibrato_rate(float rate) {
809 void increase_vibrato_rate(float change) {
810 vibrato_rate *= change;
813 void decrease_vibrato_rate(float change) {
814 vibrato_rate /= change;
817 #ifdef VIBRATO_STRENGTH_ENABLE
819 void set_vibrato_strength(float strength) {
820 vibrato_strength = strength;
823 void increase_vibrato_strength(float change) {
824 vibrato_strength *= change;
827 void decrease_vibrato_strength(float change) {
828 vibrato_strength /= change;
831 #endif /* VIBRATO_STRENGTH_ENABLE */
833 #endif /* VIBRATO_ENABLE */
835 // Polyphony functions
837 void set_polyphony_rate(float rate) {
838 polyphony_rate = rate;
841 void enable_polyphony() {
845 void disable_polyphony() {
849 void increase_polyphony_rate(float change) {
850 polyphony_rate *= change;
853 void decrease_polyphony_rate(float change) {
854 polyphony_rate /= change;
859 void set_timbre(float timbre) {
860 note_timbre = timbre;
865 void set_tempo(uint8_t tempo) {
869 void decrease_tempo(uint8_t tempo_change) {
870 note_tempo += tempo_change;
873 void increase_tempo(uint8_t tempo_change) {
874 if (note_tempo - tempo_change < 10) {
877 note_tempo -= tempo_change;