diff options
author | Bad Diode <bd@badd10de.dev> | 2024-01-16 14:40:00 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-01-16 14:40:00 +0100 |
commit | 950b4268b6283f0eb322ba93b623988abc0d4e96 (patch) | |
tree | 4505a46639a8d07efd5c6388f81adea6e71c08b2 | |
parent | 505b77cf2b955d01016707bd216cca1dae174c36 (diff) | |
download | stepper-950b4268b6283f0eb322ba93b623988abc0d4e96.tar.gz stepper-950b4268b6283f0eb322ba93b623988abc0d4e96.zip |
Try to improve performance by using a multiplication table
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/sequencer.c | 89 |
2 files changed, 36 insertions, 55 deletions
@@ -27,7 +27,7 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS)) | |||
27 | INC_FLAGS += -I$(LIBGBA_SRC) | 27 | INC_FLAGS += -I$(LIBGBA_SRC) |
28 | 28 | ||
29 | # Output library names and executables. | 29 | # Output library names and executables. |
30 | TARGET := STEPPER-v1.8-dev-18 | 30 | TARGET := STEPPER-v1.8-dev-20 |
31 | ELF := $(BUILD_DIR)/$(TARGET).elf | 31 | ELF := $(BUILD_DIR)/$(TARGET).elf |
32 | BIN := $(BUILD_DIR)/$(TARGET).gba | 32 | BIN := $(BUILD_DIR)/$(TARGET).gba |
33 | 33 | ||
diff --git a/src/sequencer.c b/src/sequencer.c index f8b4a58..45fc0e4 100644 --- a/src/sequencer.c +++ b/src/sequencer.c | |||
@@ -347,14 +347,32 @@ play_step(void) { | |||
347 | 347 | ||
348 | static int nseq_ticks = 0; | 348 | static int nseq_ticks = 0; |
349 | 349 | ||
350 | UNROLL_LOOPS | ||
351 | IWRAM_CODE | 350 | IWRAM_CODE |
351 | UNROLL_LOOPS | ||
352 | void | 352 | void |
353 | wave_ad_tick(void) { | 353 | wave_ad_tick(void) { |
354 | Wave wave_active = {0}; | 354 | Wave wave_active = {0}; |
355 | Wave wave_zero = { | 355 | Wave wave_zero = { |
356 | 0x77777777, 0x77777777, 0x77777777, 0x77777777, | 356 | 0x77777777, 0x77777777, 0x77777777, 0x77777777, |
357 | }; | 357 | }; |
358 | const u8 mult_table[16][8] = { | ||
359 | {7, 5, 4, 3, 2, 1, 1, 0}, | ||
360 | {7, 6, 5, 4, 3, 2, 2, 1}, | ||
361 | {7, 6, 5, 4, 4, 3, 2, 2}, | ||
362 | {7, 6, 5, 5, 4, 4, 3, 3}, | ||
363 | {7, 6, 6, 5, 5, 5, 4, 4}, | ||
364 | {7, 7, 6, 6, 6, 5, 5, 5}, | ||
365 | {7, 7, 7, 6, 6, 6, 6, 6}, | ||
366 | {7, 7, 7, 7, 7, 7, 7, 7}, | ||
367 | {7, 7, 7, 8, 8, 8, 8, 8}, | ||
368 | {7, 7, 8, 8, 8, 9, 9, 9}, | ||
369 | {7, 8, 8, 9, 9, 9, 10, 10}, | ||
370 | {7, 8, 9, 9, 10, 10, 11, 11}, | ||
371 | {7, 8, 9, 10, 10, 11, 12, 12}, | ||
372 | {7, 8, 9, 10, 11, 12, 12, 13}, | ||
373 | {7, 9, 10, 11, 12, 13, 13, 14}, | ||
374 | {7, 9, 10, 11, 13, 13, 14, 15}, | ||
375 | }; | ||
358 | env_start: | 376 | env_start: |
359 | switch (wave_env) { | 377 | switch (wave_env) { |
360 | case WAV_ENV_START: { | 378 | case WAV_ENV_START: { |
@@ -394,42 +412,24 @@ env_start: | |||
394 | wave_env_ticks = 0; | 412 | wave_env_ticks = 0; |
395 | 413 | ||
396 | // Attack. | 414 | // Attack. |
397 | int powers[] = { | ||
398 | 20, 57, 104, 143, 177, 208, 235, 256, | ||
399 | }; | ||
400 | int power = powers[wave_env_prog]; | ||
401 | if (++wave_env_prog >= 8) { | ||
402 | if (wave_env_decay == 0) { | ||
403 | wave_env = WAV_ENV_OFF; | ||
404 | } else { | ||
405 | wave_env = WAV_ENV_DECAY; | ||
406 | } | ||
407 | wave_env_prog = 0; | ||
408 | } | ||
409 | for (size_t j = 0; j < 4; j++) { | 415 | for (size_t j = 0; j < 4; j++) { |
410 | u32 next = 0; | 416 | u32 next = 0; |
411 | u32 prev = (*wave_target)[j]; | 417 | u32 prev = (*wave_target)[j]; |
412 | for (size_t i = 0; i < 8; i++) { | 418 | for (size_t i = 0; i < 8; i++) { |
413 | u8 val = (prev >> 4 * i) & 0xF; | 419 | u8 val = (prev >> 4 * i) & 0xF; |
414 | // Operating in 24.8 fixed point: | 420 | u8 tmp = mult_table[val][wave_env_prog]; |
415 | if (val < 0x7) { | 421 | next |= (tmp << 4 * i); |
416 | int tmp = 0x7 - val; | ||
417 | tmp *= power; | ||
418 | tmp >>= 8; | ||
419 | val = (0x7 - tmp) & 0xf; | ||
420 | } else if (val > 0x7) { | ||
421 | int tmp = (val - 0x7); | ||
422 | tmp *= power; | ||
423 | tmp >>= 8; | ||
424 | val = tmp + 0x7; | ||
425 | if (val <= 0x7) { | ||
426 | val = 0x7; | ||
427 | } | ||
428 | } | ||
429 | next |= (val << 4 * i); | ||
430 | } | 422 | } |
431 | wave_active[j] = next; | 423 | wave_active[j] = next; |
432 | } | 424 | } |
425 | if (++wave_env_prog >= 8) { | ||
426 | if (wave_env_decay == 0) { | ||
427 | wave_env = WAV_ENV_OFF; | ||
428 | } else { | ||
429 | wave_env = WAV_ENV_DECAY; | ||
430 | } | ||
431 | wave_env_prog = 0; | ||
432 | } | ||
433 | 433 | ||
434 | // DEBUG: | 434 | // DEBUG: |
435 | // int x = 50; | 435 | // int x = 50; |
@@ -447,39 +447,20 @@ env_start: | |||
447 | wave_env_ticks = 0; | 447 | wave_env_ticks = 0; |
448 | 448 | ||
449 | // Decay. | 449 | // Decay. |
450 | int powers[] = { | ||
451 | // Logarithmic volume range. | ||
452 | 256, 235, 208, 177, 143, 104, 57, 0 | ||
453 | }; | ||
454 | int power = powers[wave_env_prog]; | ||
455 | if (++wave_env_prog >= 8) { | ||
456 | wave_env = WAV_ENV_END; | ||
457 | wave_env_prog = 0; | ||
458 | } | ||
459 | for (size_t j = 0; j < 4; j++) { | 450 | for (size_t j = 0; j < 4; j++) { |
460 | u32 next = 0; | 451 | u32 next = 0; |
461 | u32 prev = (*wave_target)[j]; | 452 | u32 prev = (*wave_target)[j]; |
462 | for (size_t i = 0; i < 8; i++) { | 453 | for (size_t i = 0; i < 8; i++) { |
463 | u8 val = (prev >> 4 * i) & 0xF; | 454 | u8 val = (prev >> 4 * i) & 0xF; |
464 | // Operating in 24.8 fixed point: | 455 | u8 tmp = mult_table[val][7 - wave_env_prog]; |
465 | if (val < 0x7) { | 456 | next |= (tmp << 4 * i); |
466 | int tmp = 0x7 - val; | ||
467 | tmp *= power; | ||
468 | tmp >>= 8; | ||
469 | val = (0x7 - tmp) & 0xf; | ||
470 | } else if (val > 0x7) { | ||
471 | int tmp = (val - 0x7); | ||
472 | tmp *= power; | ||
473 | tmp >>= 8; | ||
474 | val = tmp + 0x7; | ||
475 | if (val <= 0x7) { | ||
476 | val = 0x7; | ||
477 | } | ||
478 | } | ||
479 | next |= (val << 4 * i); | ||
480 | } | 457 | } |
481 | wave_active[j] = next; | 458 | wave_active[j] = next; |
482 | } | 459 | } |
460 | if (++wave_env_prog >= 8) { | ||
461 | wave_env = WAV_ENV_END; | ||
462 | wave_env_prog = 0; | ||
463 | } | ||
483 | 464 | ||
484 | // DEBUG: | 465 | // DEBUG: |
485 | // int x = 50; | 466 | // int x = 50; |