diff options
author | Bad Diode <bd@badd10de.dev> | 2024-01-16 15:21:47 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-01-16 15:21:47 +0100 |
commit | bda8ac3969d40b28c4c14683c1f722647fd17aec (patch) | |
tree | 17473683aa917a5aced51fc35e8c0866eb00595f /src/sequencer.c | |
parent | 950b4268b6283f0eb322ba93b623988abc0d4e96 (diff) | |
download | stepper-bda8ac3969d40b28c4c14683c1f722647fd17aec.tar.gz stepper-bda8ac3969d40b28c4c14683c1f722647fd17aec.zip |
Further performance improvements
Diffstat (limited to 'src/sequencer.c')
-rw-r--r-- | src/sequencer.c | 81 |
1 files changed, 41 insertions, 40 deletions
diff --git a/src/sequencer.c b/src/sequencer.c index 45fc0e4..c01f905 100644 --- a/src/sequencer.c +++ b/src/sequencer.c | |||
@@ -376,12 +376,37 @@ wave_ad_tick(void) { | |||
376 | env_start: | 376 | env_start: |
377 | switch (wave_env) { | 377 | switch (wave_env) { |
378 | case WAV_ENV_START: { | 378 | case WAV_ENV_START: { |
379 | // Calculate all 8 transitions for the current target wave. | ||
380 | for (size_t k = 0; k < 8; k++) { | ||
381 | for (size_t j = 0; j < 4; j++) { | ||
382 | u32 next = 0; | ||
383 | u32 prev = (*wave_target)[j]; | ||
384 | for (size_t i = 0; i < 8; i++) { | ||
385 | u8 val = (prev >> 4 * i) & 0xF; | ||
386 | u8 tmp = mult_table[val][k]; | ||
387 | next |= (tmp << 4 * i); | ||
388 | } | ||
389 | current_wave[k][j] = next; | ||
390 | } | ||
391 | // DEBUG: | ||
392 | // if (k < 4) { | ||
393 | // int x = 0; | ||
394 | // int y = 18 * k; | ||
395 | // draw_filled_rect(x, y, 100 + x, 16 + y, COL_BG); | ||
396 | // draw_wave_pattern(¤t_wave[k], 0 + x, 0 + y, 1); | ||
397 | // } else { | ||
398 | // int x = 100; | ||
399 | // int y = 18 * (k - 4); | ||
400 | // draw_filled_rect(x, y, 100 + x, 16 + y, COL_BG); | ||
401 | // draw_wave_pattern(¤t_wave[k], 0 + x, 0 + y, 1); | ||
402 | // } | ||
403 | } | ||
379 | wave_env_ticks = 0; | 404 | wave_env_ticks = 0; |
380 | wave_env_prog = 0; | 405 | wave_env_prog = 0; |
381 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); | 406 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); |
382 | memcpy32(SOUND_WAVE_RAM, wave_zero, 16); | 407 | memcpy32(SOUND_WAVE_RAM, current_wave[0], 16); |
383 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); | 408 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); |
384 | memcpy32(SOUND_WAVE_RAM, wave_zero, 16); | 409 | memcpy32(SOUND_WAVE_RAM, current_wave[0], 16); |
385 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(0) | 410 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(0) |
386 | | SOUND_WAVE_BANK_SELECT(0); | 411 | | SOUND_WAVE_BANK_SELECT(0); |
387 | SOUND_WAVE_MODE |= SOUND_WAVE_ENABLE; | 412 | SOUND_WAVE_MODE |= SOUND_WAVE_ENABLE; |
@@ -411,17 +436,14 @@ env_start: | |||
411 | } | 436 | } |
412 | wave_env_ticks = 0; | 437 | wave_env_ticks = 0; |
413 | 438 | ||
414 | // Attack. | 439 | // DEBUG: |
415 | for (size_t j = 0; j < 4; j++) { | 440 | // int x = 50; |
416 | u32 next = 0; | 441 | // int y = 50; |
417 | u32 prev = (*wave_target)[j]; | 442 | // draw_filled_rect(0 + x, 0 + y, 100 + x, 32 + y, COL_BG); |
418 | for (size_t i = 0; i < 8; i++) { | 443 | // draw_wave_pattern(¤t_wave[wave_env_prog], 0 + x, 0 + y, 1); |
419 | u8 val = (prev >> 4 * i) & 0xF; | 444 | |
420 | u8 tmp = mult_table[val][wave_env_prog]; | 445 | memcpy32(SOUND_WAVE_RAM, current_wave[wave_env_prog], 16); |
421 | next |= (tmp << 4 * i); | 446 | SOUND_WAVE_MODE ^= SOUND_WAVE_BANK_SELECT(1); |
422 | } | ||
423 | wave_active[j] = next; | ||
424 | } | ||
425 | if (++wave_env_prog >= 8) { | 447 | if (++wave_env_prog >= 8) { |
426 | if (wave_env_decay == 0) { | 448 | if (wave_env_decay == 0) { |
427 | wave_env = WAV_ENV_OFF; | 449 | wave_env = WAV_ENV_OFF; |
@@ -430,15 +452,6 @@ env_start: | |||
430 | } | 452 | } |
431 | wave_env_prog = 0; | 453 | wave_env_prog = 0; |
432 | } | 454 | } |
433 | |||
434 | // DEBUG: | ||
435 | // int x = 50; | ||
436 | // int y = 50; | ||
437 | // draw_filled_rect(0 + x, 0 + y, 100 + x, 32 + y, COL_BG); | ||
438 | // draw_wave_pattern(&wave_active, 0 + x, 0 + y, 1); | ||
439 | |||
440 | memcpy32(SOUND_WAVE_RAM, wave_active, 16); | ||
441 | SOUND_WAVE_MODE ^= SOUND_WAVE_BANK_SELECT(1); | ||
442 | } break; | 455 | } break; |
443 | case WAV_ENV_DECAY: { | 456 | case WAV_ENV_DECAY: { |
444 | if (wave_env_ticks++ < wave_env_decay) { | 457 | if (wave_env_ticks++ < wave_env_decay) { |
@@ -446,30 +459,18 @@ env_start: | |||
446 | } | 459 | } |
447 | wave_env_ticks = 0; | 460 | wave_env_ticks = 0; |
448 | 461 | ||
449 | // Decay. | ||
450 | for (size_t j = 0; j < 4; j++) { | ||
451 | u32 next = 0; | ||
452 | u32 prev = (*wave_target)[j]; | ||
453 | for (size_t i = 0; i < 8; i++) { | ||
454 | u8 val = (prev >> 4 * i) & 0xF; | ||
455 | u8 tmp = mult_table[val][7 - wave_env_prog]; | ||
456 | next |= (tmp << 4 * i); | ||
457 | } | ||
458 | wave_active[j] = next; | ||
459 | } | ||
460 | if (++wave_env_prog >= 8) { | ||
461 | wave_env = WAV_ENV_END; | ||
462 | wave_env_prog = 0; | ||
463 | } | ||
464 | |||
465 | // DEBUG: | 462 | // DEBUG: |
466 | // int x = 50; | 463 | // int x = 50; |
467 | // int y = 50; | 464 | // int y = 50; |
468 | // draw_filled_rect(0 + x, 0 + y, 100 + x, 32 + y, COL_BG); | 465 | // draw_filled_rect(0 + x, 0 + y, 100 + x, 32 + y, COL_BG); |
469 | // draw_wave_pattern(&wave_active, 0 + x, 0 + y, 1); | 466 | // draw_wave_pattern(¤t_wave[7-wave_env_prog], 0 + x, 0 + y, 1); |
470 | 467 | ||
471 | memcpy32(SOUND_WAVE_RAM, wave_active, 16); | 468 | memcpy32(SOUND_WAVE_RAM, current_wave[7 - wave_env_prog], 16); |
472 | SOUND_WAVE_MODE ^= SOUND_WAVE_BANK_SELECT(1); | 469 | SOUND_WAVE_MODE ^= SOUND_WAVE_BANK_SELECT(1); |
470 | if (++wave_env_prog >= 8) { | ||
471 | wave_env = WAV_ENV_END; | ||
472 | wave_env_prog = 0; | ||
473 | } | ||
473 | } break; | 474 | } break; |
474 | case WAV_ENV_OFF: { | 475 | case WAV_ENV_OFF: { |
475 | if (wave_env_ticks++ == 24) { | 476 | if (wave_env_ticks++ == 24) { |