From 950b4268b6283f0eb322ba93b623988abc0d4e96 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 16 Jan 2024 14:40:00 +0100 Subject: Try to improve performance by using a multiplication table --- src/sequencer.c | 89 +++++++++++++++++++++++---------------------------------- 1 file changed, 35 insertions(+), 54 deletions(-) (limited to 'src') 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) { static int nseq_ticks = 0; -UNROLL_LOOPS IWRAM_CODE +UNROLL_LOOPS void wave_ad_tick(void) { Wave wave_active = {0}; Wave wave_zero = { 0x77777777, 0x77777777, 0x77777777, 0x77777777, }; + const u8 mult_table[16][8] = { + {7, 5, 4, 3, 2, 1, 1, 0}, + {7, 6, 5, 4, 3, 2, 2, 1}, + {7, 6, 5, 4, 4, 3, 2, 2}, + {7, 6, 5, 5, 4, 4, 3, 3}, + {7, 6, 6, 5, 5, 5, 4, 4}, + {7, 7, 6, 6, 6, 5, 5, 5}, + {7, 7, 7, 6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7, 7, 7, 7}, + {7, 7, 7, 8, 8, 8, 8, 8}, + {7, 7, 8, 8, 8, 9, 9, 9}, + {7, 8, 8, 9, 9, 9, 10, 10}, + {7, 8, 9, 9, 10, 10, 11, 11}, + {7, 8, 9, 10, 10, 11, 12, 12}, + {7, 8, 9, 10, 11, 12, 12, 13}, + {7, 9, 10, 11, 12, 13, 13, 14}, + {7, 9, 10, 11, 13, 13, 14, 15}, + }; env_start: switch (wave_env) { case WAV_ENV_START: { @@ -394,42 +412,24 @@ env_start: wave_env_ticks = 0; // Attack. - int powers[] = { - 20, 57, 104, 143, 177, 208, 235, 256, - }; - int power = powers[wave_env_prog]; - if (++wave_env_prog >= 8) { - if (wave_env_decay == 0) { - wave_env = WAV_ENV_OFF; - } else { - wave_env = WAV_ENV_DECAY; - } - wave_env_prog = 0; - } for (size_t j = 0; j < 4; j++) { u32 next = 0; u32 prev = (*wave_target)[j]; for (size_t i = 0; i < 8; i++) { u8 val = (prev >> 4 * i) & 0xF; - // Operating in 24.8 fixed point: - if (val < 0x7) { - int tmp = 0x7 - val; - tmp *= power; - tmp >>= 8; - val = (0x7 - tmp) & 0xf; - } else if (val > 0x7) { - int tmp = (val - 0x7); - tmp *= power; - tmp >>= 8; - val = tmp + 0x7; - if (val <= 0x7) { - val = 0x7; - } - } - next |= (val << 4 * i); + u8 tmp = mult_table[val][wave_env_prog]; + next |= (tmp << 4 * i); } wave_active[j] = next; } + if (++wave_env_prog >= 8) { + if (wave_env_decay == 0) { + wave_env = WAV_ENV_OFF; + } else { + wave_env = WAV_ENV_DECAY; + } + wave_env_prog = 0; + } // DEBUG: // int x = 50; @@ -447,39 +447,20 @@ env_start: wave_env_ticks = 0; // Decay. - int powers[] = { - // Logarithmic volume range. - 256, 235, 208, 177, 143, 104, 57, 0 - }; - int power = powers[wave_env_prog]; - if (++wave_env_prog >= 8) { - wave_env = WAV_ENV_END; - wave_env_prog = 0; - } for (size_t j = 0; j < 4; j++) { u32 next = 0; u32 prev = (*wave_target)[j]; for (size_t i = 0; i < 8; i++) { u8 val = (prev >> 4 * i) & 0xF; - // Operating in 24.8 fixed point: - if (val < 0x7) { - int tmp = 0x7 - val; - tmp *= power; - tmp >>= 8; - val = (0x7 - tmp) & 0xf; - } else if (val > 0x7) { - int tmp = (val - 0x7); - tmp *= power; - tmp >>= 8; - val = tmp + 0x7; - if (val <= 0x7) { - val = 0x7; - } - } - next |= (val << 4 * i); + u8 tmp = mult_table[val][7 - wave_env_prog]; + next |= (tmp << 4 * i); } wave_active[j] = next; } + if (++wave_env_prog >= 8) { + wave_env = WAV_ENV_END; + wave_env_prog = 0; + } // DEBUG: // int x = 50; -- cgit v1.2.1