aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-01-16 14:40:00 +0100
committerBad Diode <bd@badd10de.dev>2024-01-16 14:40:00 +0100
commit950b4268b6283f0eb322ba93b623988abc0d4e96 (patch)
tree4505a46639a8d07efd5c6388f81adea6e71c08b2
parent505b77cf2b955d01016707bd216cca1dae174c36 (diff)
downloadstepper-950b4268b6283f0eb322ba93b623988abc0d4e96.tar.gz
stepper-950b4268b6283f0eb322ba93b623988abc0d4e96.zip
Try to improve performance by using a multiplication table
-rw-r--r--Makefile2
-rw-r--r--src/sequencer.c89
2 files changed, 36 insertions, 55 deletions
diff --git a/Makefile b/Makefile
index 816b819..60a141c 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,7 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS))
27INC_FLAGS += -I$(LIBGBA_SRC) 27INC_FLAGS += -I$(LIBGBA_SRC)
28 28
29# Output library names and executables. 29# Output library names and executables.
30TARGET := STEPPER-v1.8-dev-18 30TARGET := STEPPER-v1.8-dev-20
31ELF := $(BUILD_DIR)/$(TARGET).elf 31ELF := $(BUILD_DIR)/$(TARGET).elf
32BIN := $(BUILD_DIR)/$(TARGET).gba 32BIN := $(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
348static int nseq_ticks = 0; 348static int nseq_ticks = 0;
349 349
350UNROLL_LOOPS
351IWRAM_CODE 350IWRAM_CODE
351UNROLL_LOOPS
352void 352void
353wave_ad_tick(void) { 353wave_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 };
358env_start: 376env_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;