From 505b77cf2b955d01016707bd216cca1dae174c36 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 16 Jan 2024 11:13:12 +0100 Subject: Add Attack/Decay envelope to CH3 --- Makefile | 2 +- src/drawing.c | 12 ++++++++++++ src/main.c | 7 ++++--- src/sequencer.c | 14 +++++++++++++- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index d7c0b05..816b819 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS)) INC_FLAGS += -I$(LIBGBA_SRC) # Output library names and executables. -TARGET := STEPPER-v1.8-dev-16 +TARGET := STEPPER-v1.8-dev-18 ELF := $(BUILD_DIR)/$(TARGET).elf BIN := $(BUILD_DIR)/$(TARGET).gba diff --git a/src/drawing.c b/src/drawing.c index 1458a3b..a485ec4 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -1030,6 +1030,9 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { // Attack. { + if (params->wave_mode == 2) { + cols[7] = COL_OFF; + } size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 2 + 3; size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y + 5; if (params->wave_attack == 0) { @@ -1043,6 +1046,9 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { // Decay. { + if (params->wave_mode == 2) { + cols[8] = COL_OFF; + } size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 3 + 3; size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y + 5; if (params->wave_decay == 0) { @@ -1969,6 +1975,12 @@ draw_notif_bar() { case 4: { txt_drawf_small("100", x0 + 2 + 8 * 4, y0 + 1, color); txt_drawc_small('%', x0 + 2 + 11 * 4, y0 + 1, color); } break; } } break; + case 7: { + txt_drawf_small("ATTACK: %d", x0 + 2, y0 + 1, color, params->wave_attack); + } break; + case 8: { + txt_drawf_small("DECAY: %d", x0 + 2, y0 + 1, color, params->wave_decay); + } break; case 9: { draw_notif_param_edit_pan(params->pan, x0, y0, color); } break; } return; diff --git a/src/main.c b/src/main.c index a068bc8..2731b6a 100644 --- a/src/main.c +++ b/src/main.c @@ -29,15 +29,16 @@ WITH REGARD TO THIS SOFTWARE. // to key release to enable trigs. // + Fix bug with not being able to stop the sound when synced // + Add attack and decay envelope for ch3 (synced to tempo) +// + Fix A+B on ch3 +// + Make sure Attack/Decay are grey for A+B +// + Add help for attack/decay on ch3 // - Fix any bugs we currently have // - Add clipboard sharing between banks. // - Make sure transposing a sequence past the keyboard limit doesn't affect // the sequence and can be reversed. // - Study saving overhauls for bootleg cartridges. // - When putting a new trigger, make sure it uses the global parameters -// - Bad performance when selecting patterns -// - Add help for attack/decay on ch3 -// - Fix A+B on ch3 +// - Bad performance when selecting patterns? // // Low priority: // diff --git a/src/sequencer.c b/src/sequencer.c index 66f1d24..f8b4a58 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -250,6 +250,7 @@ play_step(void) { wave_env = WAV_ENV_OFF; SOUND_WAVE_MODE |= SOUND_WAVE_ENABLE; SOUND_WAVE_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note]; + wave_env_ticks = 0; } break; } wave_freq = sound_rates[trig->note]; @@ -371,6 +372,8 @@ env_start: if (wave_env_attack == 0) { memcpy32(SOUND_WAVE_RAM, wave_target, 16); SOUND_WAVE_MODE ^= SOUND_WAVE_BANK_SELECT(1); + memcpy32(SOUND_WAVE_RAM, wave_target, 16); + SOUND_WAVE_MODE ^= SOUND_WAVE_BANK_SELECT(1); } else { wave_env = WAV_ENV_ATTACK; goto env_start; @@ -399,9 +402,9 @@ env_start: if (wave_env_decay == 0) { wave_env = WAV_ENV_OFF; } else { - wave_env_prog = 0; wave_env = WAV_ENV_DECAY; } + wave_env_prog = 0; } for (size_t j = 0; j < 4; j++) { u32 next = 0; @@ -451,6 +454,7 @@ env_start: 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; @@ -491,12 +495,20 @@ env_start: SOUND_WAVE_FREQ = SOUND_FREQ_RESET; SOUND_WAVE_CTRL = SOUND_WAVE_MUTE; wave_env = WAV_ENV_END; + SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); + memcpy32(SOUND_WAVE_RAM, wave_zero, 16); + SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); + memcpy32(SOUND_WAVE_RAM, wave_zero, 16); } return; } break; case WAV_ENV_END: { SOUND_WAVE_FREQ = SOUND_FREQ_RESET; SOUND_WAVE_CTRL = SOUND_WAVE_MUTE; + SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); + memcpy32(SOUND_WAVE_RAM, wave_zero, 16); + SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); + memcpy32(SOUND_WAVE_RAM, wave_zero, 16); return; } break; } -- cgit v1.2.1