summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/sequencer.c113
1 files changed, 57 insertions, 56 deletions
diff --git a/src/sequencer.c b/src/sequencer.c
index 9baab49..1f66f68 100644
--- a/src/sequencer.c
+++ b/src/sequencer.c
@@ -266,14 +266,14 @@ u32 sprite_channels_selector[] = {
266 0x00000000, 0x00000000, 0x0008080e, 0x00000000, 266 0x00000000, 0x00000000, 0x0008080e, 0x00000000,
267}; 267};
268 268
269static u8 sine_wave[] = { 269u8 sine_wave[] = {
270 0x89, 0xBC, 0xDE, 0xEF, 270 0x89, 0xBC, 0xDE, 0xEF,
271 0xFE, 0xED, 0xCB, 0x98, 271 0xFE, 0xED, 0xCB, 0x98,
272 0x76, 0x43, 0x21, 0x10, 272 0x76, 0x43, 0x21, 0x10,
273 0x01, 0x12, 0x34, 0x67, 273 0x01, 0x12, 0x34, 0x67,
274}; 274};
275 275
276static u8 saw_wave[16] = { 276u8 saw_wave[16] = {
277 0x01, 0x23, 0x45, 0x67, 277 0x01, 0x23, 0x45, 0x67,
278 0x89, 0xab, 0xcd, 0xef, 278 0x89, 0xab, 0xcd, 0xef,
279 0x01, 0x23, 0x45, 0x67, 279 0x01, 0x23, 0x45, 0x67,
@@ -294,68 +294,67 @@ typedef struct SeqTrigger {
294 u8 sweep_direction; 294 u8 sweep_direction;
295 u8 wave_volume; 295 u8 wave_volume;
296 u8 wave_mode; 296 u8 wave_mode;
297 u8 *wave_a; 297 u8 wave_a[16];
298 u8 *wave_b; 298 u8 wave_b[16];
299 // TODO: Do we need other fields?
300} SeqTrigger; 299} SeqTrigger;
301 300
302static SeqTrigger sequences[3][16] = { 301static SeqTrigger sequences[3][16] = {
303 // Synth 1 302 // Synth 1.
304 { 303 {
305 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 304 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
306 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 305 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
307 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 306 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
308 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 307 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
309 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 308 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
310 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 309 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
311 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 310 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
312 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 311 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
313 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 312 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
314 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 313 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
315 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 314 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
316 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 315 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
317 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 316 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
318 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 317 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
319 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 318 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
320 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 319 {false, NOTE_C_4, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
321 }, 320 },
322 // Synth 2 321 // Synth 2.
323 { 322 {
324 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 323 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
325 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 324 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
326 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 325 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
327 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 326 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
328 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 327 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
329 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 328 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
330 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 329 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
331 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 330 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
332 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 331 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
333 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 332 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
334 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 333 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
335 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 334 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
336 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 335 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
337 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 336 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
338 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 337 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
339 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0}, 338 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 0, 0, {0}, {0}},
340 }, 339 },
341 // Synth 3 340 // Synth 3.
342 { 341 {
343 {true, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &sine_wave, &saw_wave}, 342 {true, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
344 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &saw_wave, &saw_wave}, 343 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
345 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &sine_wave, &sine_wave}, 344 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
346 {false, NOTE_C_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &saw_wave, &sine_wave}, 345 {false, NOTE_C_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
347 {true, NOTE_D_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &sine_wave, &sine_wave}, 346 {true, NOTE_D_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
348 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &sine_wave, &saw_wave}, 347 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
349 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &saw_wave, &saw_wave}, 348 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
350 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &sine_wave, &sine_wave}, 349 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
351 {true, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &saw_wave, &sine_wave}, 350 {true, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
352 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &sine_wave, &sine_wave}, 351 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
353 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &sine_wave, &saw_wave}, 352 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
354 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &saw_wave, &saw_wave}, 353 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
355 {true, NOTE_D_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &sine_wave, &sine_wave}, 354 {true, NOTE_D_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
356 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &saw_wave, &sine_wave}, 355 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
357 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &sine_wave, &sine_wave}, 356 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
358 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, &sine_wave, &sine_wave}, 357 {false, NOTE_G_5, 8, 4, 0, 2, 0, 0, 0, 3, 0, {0}, {0}},
359 }, 358 },
360}; 359};
361 360
@@ -373,6 +372,8 @@ static SeqTrigger sequences[3][16] = {
373// TODO: Research a way of having pattern chains. 372// TODO: Research a way of having pattern chains.
374// TODO: Enable control on channels 3-4. 373// TODO: Enable control on channels 3-4.
375// TODO: Study how to save patterns and chains. 374// TODO: Study how to save patterns and chains.
375// TODO: Wave channel should have a default (sine, saw, square) and/or maybe
376// some buttons for set those values.
376 377
377static int bpm = 115; 378static int bpm = 115;
378static int step_counter = 0; 379static int step_counter = 0;