From dab077db84599aedc2a48a6114ba7b1730702a3e Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 11 Jun 2021 17:55:06 +0200 Subject: Add wave mode control on ch3 --- src/sequencer.c | 96 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 42 deletions(-) (limited to 'src/sequencer.c') diff --git a/src/sequencer.c b/src/sequencer.c index d1be12d..0f3cff7 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -135,7 +135,7 @@ static const u32 square_wave[16] = { static int bpm = 115; static int step_counter = 0; int trig_selection_loc = 0; -int param_selection_loc = 0; +int param_selection_loc = 70; int channel_selection_loc = 0; typedef struct TriggerNote { @@ -561,7 +561,7 @@ draw_piano(void) { #define PARAMS_START_Y 12 void -draw_parameters_cursor_ch3(size_t i, u8 clr) { +draw_params_cursor_ch3(size_t i, u8 clr) { u8 x_positions[] = { // 32 half bytes (Wave A). 0, 4, 8, 12, 16, 20, 24, 28, @@ -577,6 +577,8 @@ draw_parameters_cursor_ch3(size_t i, u8 clr) { 1, 18, 35, 52, // Default wave B. 71, 88, 105, 122, + // Mode selection. + 141, }; u8 y_positions[] = { // 32 half bytes (Wave A) @@ -593,12 +595,16 @@ draw_parameters_cursor_ch3(size_t i, u8 clr) { 20, 20, 20, 20, // Default wave B. 20, 20, 20, 20, + // Mode seleciton. + 20, }; size_t cursor_length = 0; if (i < 64) { cursor_length = 4; - } else { + } else if (i < 72) { cursor_length = 13; + } else { + cursor_length = 30; } size_t x = PARAMS_START_X + x_positions[i] - 1; size_t y = PARAMS_START_Y + PARAMS_H - 18 + y_positions[i]; @@ -606,14 +612,14 @@ draw_parameters_cursor_ch3(size_t i, u8 clr) { } void -draw_parameters_cursor(size_t i, u8 clr) { +draw_params_cursor(size_t i, u8 clr) { switch (channel_selection_loc) { case 0: { } break; case 1: { } break; case 2: { - draw_parameters_cursor_ch3(i, clr); + draw_params_cursor_ch3(i, clr); } break; case 3: { } break; @@ -649,14 +655,7 @@ clear_parameters(void) { IWRAM_CODE void draw_parameters_ch3(void) { - // Clear until the default parameters, since those don't change. - { - size_t x0 = PARAMS_START_X; - size_t y0 = PARAMS_START_Y; - size_t x1 = PARAMS_START_X + PARAMS_W; - size_t y1 = PARAMS_START_Y + PARAMS_H - 8; - draw_filled_rect(x0, y0, x1, y1, COL_BG); - } + clear_parameters(); // TODO: Move to VRAM and decompress at the beginning. Tile wave_tiles[4 * 2] = {0}; @@ -792,30 +791,32 @@ irq_timer(void) { TriggerNote *trig = &ch3.notes[step_counter]; ChannelWaveParams *params = &ch3.params[step_counter]; if (trig->active) { - // Update both banks. - // TODO: Actually depends on which bank is selected, no need to - // update both if only one is playing. - // TODO: Should we compare if previous and current wave are the - // same before updating? - SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); - memcpy32(SOUND_WAVE_RAM, params->wave_a, 16); - SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); - memcpy32(SOUND_WAVE_RAM, params->wave_b, 16); - switch (params->wave_mode) { case 0: { + SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); + memcpy32(SOUND_WAVE_RAM, params->wave_a, 16); SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(0) | SOUND_WAVE_BANK_SELECT(0); } break; case 1: { + SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); + memcpy32(SOUND_WAVE_RAM, params->wave_b, 16); SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(0) | SOUND_WAVE_BANK_SELECT(1); } break; case 2: { + SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); + memcpy32(SOUND_WAVE_RAM, params->wave_b, 16); + SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); + memcpy32(SOUND_WAVE_RAM, params->wave_a, 16); SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(1) | SOUND_WAVE_BANK_SELECT(0); } break; case 3: { + SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); + memcpy32(SOUND_WAVE_RAM, params->wave_a, 16); + SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); + memcpy32(SOUND_WAVE_RAM, params->wave_b, 16); SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(1) | SOUND_WAVE_BANK_SELECT(1); } break; @@ -1080,7 +1081,7 @@ void handle_param_selection_ch3(void) { if (key_tap(KEY_A)) { // Go back to trigger selection. - draw_parameters_cursor(param_selection_loc, COL_BG); + draw_params_cursor(param_selection_loc, COL_BG); input_handler = handle_trigger_selection; draw_trig_cursor(trig_selection_loc, COL_BLUE); } @@ -1090,19 +1091,23 @@ handle_param_selection_ch3(void) { if (key_tap(KEY_RIGHT)) { if (loc == 15 || loc == 31) { inc = 17; - } else if (loc != 47 && loc != 63){ + } else if (loc == 47) { + inc = 25; + } else if (loc == 63) { + inc = 9; + } else if (loc != 47 && loc != 63) { inc = 1; } } else { if (loc == 32 || loc == 48) { inc = -17; - } else if (loc != 16 && loc != 64){ + } else if (loc != 16 && loc != 64) { inc = -1; } } - draw_parameters_cursor_ch3(param_selection_loc, COL_BG); - param_selection_loc = CLAMP(loc + inc, 0, 71); - draw_parameters_cursor_ch3(param_selection_loc, COL_BLUE); + draw_params_cursor_ch3(param_selection_loc, COL_BG); + param_selection_loc = CLAMP(loc + inc, 0, 72); + draw_params_cursor_ch3(param_selection_loc, COL_BLUE); } if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { int inc = 0; @@ -1130,27 +1135,27 @@ handle_param_selection_ch3(void) { } else { if (loc < 16 || (loc >= 32 && loc < 48)) { inc = 16; - } else if (loc >= 16 && loc <= 19){ + } else if (loc >= 16 && loc <= 19) { inc = 48 - (loc - 16); - } else if (loc >= 20 && loc <= 23){ + } else if (loc >= 20 && loc <= 23) { inc = 45 - (loc - 20); - } else if (loc >= 24 && loc <= 27){ + } else if (loc >= 24 && loc <= 27) { inc = 42 - (loc - 24); - } else if (loc >= 28 && loc <= 31){ + } else if (loc >= 28 && loc <= 31) { inc = 39 - (loc - 28); - } else if (loc >= 48 && loc <= 51){ + } else if (loc >= 48 && loc <= 51) { inc = 20 - (loc - 48); - } else if (loc >= 52 && loc <= 55){ + } else if (loc >= 52 && loc <= 55) { inc = 17 - (loc - 52); - } else if (loc >= 56 && loc <= 59){ + } else if (loc >= 56 && loc <= 59) { inc = 14 - (loc - 56); - } else if (loc >= 60 && loc <= 63){ + } else if (loc >= 60 && loc <= 63) { inc = 11 - (loc - 60); } } - draw_parameters_cursor_ch3(param_selection_loc, COL_BG); + draw_params_cursor_ch3(param_selection_loc, COL_BG); param_selection_loc = CLAMP(loc + inc, 0, 71); - draw_parameters_cursor_ch3(param_selection_loc, COL_BLUE); + draw_params_cursor_ch3(param_selection_loc, COL_BLUE); } if (key_tap(KEY_R) || key_tap(KEY_L)) { int odd = param_selection_loc & 0x1; @@ -1160,11 +1165,13 @@ handle_param_selection_ch3(void) { } else { inc = -1; } + // Wave: AA BB CC DD ... // ^^ // |`- odd // `-- even if (param_selection_loc < 32) { + // Draw on wave a. u8 byte_number = param_selection_loc / 2; u8 *byte = &ch3.params[trig_selection_loc].wave_a; byte += byte_number; @@ -1174,6 +1181,7 @@ handle_param_selection_ch3(void) { *byte = (0xF & *byte) | (((*byte >> 4) + inc) & 0xF) << 4; } } else if (param_selection_loc < 64){ + // Draw on wave b. u8 byte_number = (param_selection_loc - 32) / 2; u8 *byte = &ch3.params[trig_selection_loc].wave_b; byte += byte_number; @@ -1182,7 +1190,8 @@ handle_param_selection_ch3(void) { } else { *byte = (0xF & *byte) | (((*byte >> 4) + inc) & 0xF) << 4; } - } else { + } else if (param_selection_loc < 72) { + // Copy default waves. u32 *wave_a = &ch3.params[trig_selection_loc].wave_a; u32 *wave_b = &ch3.params[trig_selection_loc].wave_b; switch (param_selection_loc) { @@ -1217,9 +1226,12 @@ handle_param_selection_ch3(void) { memcpy32(wave_b, rand_wave, 16); } break; } + } else { + u8 *wave_mode = &ch3.params[trig_selection_loc].wave_mode; + *wave_mode = CLAMP(*wave_mode + inc, 0, 3); } draw_parameters(); - draw_parameters_cursor(param_selection_loc, COL_BLUE); + draw_params_cursor(param_selection_loc, COL_BLUE); } } @@ -1300,7 +1312,7 @@ handle_trigger_selection(void) { input_handler = handle_param_selection_ch3; } break; } - draw_parameters_cursor(param_selection_loc, COL_BLUE); + draw_params_cursor(param_selection_loc, COL_BLUE); draw_trig_cursor(trig_selection_loc, COL_GREY); } } -- cgit v1.2.1