From 6a3a8d96327d79100455e80374f7fbe008570649 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 6 May 2021 16:17:06 +0200 Subject: Clean up parameter selection and rendering for Ch. 1-2 --- src/sequencer.c | 101 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/src/sequencer.c b/src/sequencer.c index b95a94a..c83fa5a 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -1043,12 +1043,14 @@ update_sequencer_sprites(void) { } } - // DEBUG: Hide all parameter control sprites for now. + // TODO: Hide all parameter control sprites for now, we unhide it later. + // Very inefficient but we may change the parameter rendering of all modes + // to use bitmaps instead of sprites later. for (size_t i = 34; i <= 50; ++i) { seq_sprites[i].obj_attr_0 |= OBJ_HIDDEN; } - if (channel_selection_loc == 2) { + if (current_selection == SEQ_SELECT_TRIGGER && channel_selection_loc == 2) { u8 *wave_a = sequences[channel_selection_loc][trig_selection_loc].wave_a; u8 *wave_b = sequences[channel_selection_loc][trig_selection_loc].wave_b; @@ -1059,12 +1061,28 @@ update_sequencer_sprites(void) { // Clear wave A and draw. draw_fill_rect(x, y, x + 64, y + 16, COLOR_BLACK); draw_wave_pattern(wave_a, x, y, COLOR_RED); + // Clear wave B and draw. draw_fill_rect(x + 64 + 16, y, x + 64 * 2 + 16, y + 16, COLOR_BLACK); draw_wave_pattern(wave_b, x + 64 + 16, y, COLOR_CYAN); + } else if ((current_selection == SEQ_SELECT_TRIGGER + || current_selection == SEQ_SELECT_PARAMETER) + && channel_selection_loc == 0) { + for (size_t i = 34; i <= 50; ++i) { + seq_sprites[i].obj_attr_0 &= ~OBJ_HIDDEN; + } + } else if ((current_selection == SEQ_SELECT_TRIGGER + || current_selection == SEQ_SELECT_PARAMETER) + && channel_selection_loc == 1) { + for (size_t i = 34; i < 43; ++i) { + seq_sprites[i].obj_attr_0 &= ~OBJ_HIDDEN; + } + seq_sprites[50].obj_attr_0 &= ~OBJ_HIDDEN; } else { int x = SEQ_ENV_POS_X + 8; int y = SEQ_ENV_POS_Y; + + // Clear parameters for channel 3. draw_fill_rect(x, y, x + 64, y + 16, COLOR_BLACK); draw_fill_rect(x + 64 + 16, y, x + 64 * 2 + 16, y + 16, COLOR_BLACK); } @@ -1072,29 +1090,26 @@ update_sequencer_sprites(void) { void handle_sequencer_input(void) { + SeqTrigger *trig = &sequences[channel_selection_loc][trig_selection_loc]; if (current_selection == SEQ_SELECT_TRIGGER) { if (key_pressed(KEY_LEFT)) { if (trig_selection_loc == 0 || trig_selection_loc == 8) { current_selection = SEQ_SELECT_CHANNEL; } else { - trig_selection_loc = CLAMP(trig_selection_loc - 1, 0, 15); + trig_selection_loc = MAX(trig_selection_loc - 1, 0); } } else if (key_pressed(KEY_RIGHT)) { if (trig_selection_loc != 7) { - trig_selection_loc = CLAMP(trig_selection_loc + 1, 0, 15); + trig_selection_loc = MIN(trig_selection_loc + 1, 15); } } else if (key_pressed(KEY_UP) || key_pressed(KEY_DOWN)) { trig_selection_loc = (trig_selection_loc + 8) % 16; } else if (key_pressed(KEY_B)) { - sequences[channel_selection_loc][trig_selection_loc].trigger ^= 1; + trig->trigger ^= 1; } else if (key_pressed(KEY_L)) { - sequences[channel_selection_loc][trig_selection_loc].note = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].note - 1, - NOTE_C_2, NOTE_C_8); + trig->note = MAX(trig->note - 1, NOTE_C_2); } else if (key_pressed(KEY_R)) { - sequences[channel_selection_loc][trig_selection_loc].note = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].note + 1, - NOTE_C_2, NOTE_C_8); + trig->note = MIN( trig->note + 1, NOTE_C_8); } else if (key_pressed(KEY_A)) { // Switch to parameter selection. current_selection = SEQ_SELECT_PARAMETER; @@ -1102,17 +1117,25 @@ handle_sequencer_input(void) { } else if (current_selection == SEQ_SELECT_PARAMETER) { // Move through the selected synth parameters. if (key_pressed(KEY_LEFT)) { + int max_param = 6; + if (channel_selection_loc == 1) { + max_param = 3; + } if (param_selection_loc == 0) { - param_selection_loc = 6; + param_selection_loc = max_param; } else { - param_selection_loc = CLAMP(param_selection_loc - 1, 0, 6); + param_selection_loc = MAX(param_selection_loc - 1, 0); } } if (key_pressed(KEY_RIGHT)) { - if (param_selection_loc == 6) { + int max_param = 6; + if (channel_selection_loc == 1) { + max_param = 3; + } + if (param_selection_loc == max_param) { param_selection_loc = 0; } else { - param_selection_loc = CLAMP(param_selection_loc + 1, 0, 6); + param_selection_loc = MIN(param_selection_loc + 1, max_param); } } @@ -1120,33 +1143,28 @@ handle_sequencer_input(void) { if (key_pressed(KEY_L)) { switch (param_selection_loc) { case 0: { - sequences[channel_selection_loc][trig_selection_loc].env_volume = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].env_volume - 1, 0, 15); + trig->env_volume = MAX(trig->env_volume - 1, 0); } break; case 1: { - sequences[channel_selection_loc][trig_selection_loc].env_time = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].env_time - 1, 0, 7); + trig->env_time = MAX(trig->env_time - 1, 0); } break; case 2: { - sequences[channel_selection_loc][trig_selection_loc].env_direction ^= 1; + trig->env_direction ^= 1; } break; case 3: { - sequences[channel_selection_loc][trig_selection_loc].duty_cycle = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].duty_cycle - 1, 0, 3); + trig->duty_cycle = MAX(trig->duty_cycle - 1, 0); } break; case 4: { - sequences[channel_selection_loc][trig_selection_loc].sweep_number = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].sweep_number - 1, 0, 7); + trig->sweep_number = MAX(trig->sweep_number - 1, 0); } break; case 5: { - sequences[channel_selection_loc][trig_selection_loc].sweep_time = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].sweep_time - 1, 0, 7); + trig->sweep_time = MAX(trig->sweep_time - 1, 0); } break; case 6: { - if (sequences[channel_selection_loc][trig_selection_loc].sweep_direction == 0) { - sequences[channel_selection_loc][trig_selection_loc].sweep_direction = 1; + if (trig->sweep_direction == 0) { + trig->sweep_direction = 1; } else { - sequences[channel_selection_loc][trig_selection_loc].sweep_direction = 0; + trig->sweep_direction = 0; } } break; } @@ -1154,30 +1172,25 @@ handle_sequencer_input(void) { if (key_pressed(KEY_R)) { switch (param_selection_loc) { case 0: { - sequences[channel_selection_loc][trig_selection_loc].env_volume = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].env_volume + 1, 0, 15); + trig->env_volume = MIN(trig->env_volume + 1, 15); } break; case 1: { - sequences[channel_selection_loc][trig_selection_loc].env_time = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].env_time + 1, 0, 7); + trig->env_time = MIN(trig->env_time + 1, 7); } break; case 2: { - sequences[channel_selection_loc][trig_selection_loc].env_direction ^= 1; + trig->env_direction ^= 1; } break; case 3: { - sequences[channel_selection_loc][trig_selection_loc].duty_cycle = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].duty_cycle + 1, 0, 3); + trig->duty_cycle = MIN(trig->duty_cycle + 1, 3); } break; case 4: { - sequences[channel_selection_loc][trig_selection_loc].sweep_number = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].sweep_number + 1, 0, 7); + trig->sweep_number = MIN(trig->sweep_number + 1, 7); } break; case 5: { - sequences[channel_selection_loc][trig_selection_loc].sweep_time = CLAMP( - sequences[channel_selection_loc][trig_selection_loc].sweep_time + 1, 0, 7); + trig->sweep_time = MIN(trig->sweep_time + 1, 7); } break; case 6: { - sequences[channel_selection_loc][trig_selection_loc].sweep_direction ^= 1; + trig->sweep_direction ^= 1; } break; } } @@ -1189,7 +1202,7 @@ handle_sequencer_input(void) { // Enable disable trigger. if (key_pressed(KEY_B)) { - sequences[channel_selection_loc][trig_selection_loc].trigger ^= 1; + trig->trigger ^= 1; } } else if (current_selection == SEQ_SELECT_CHANNEL) { if (key_pressed(KEY_RIGHT)) { @@ -1200,14 +1213,14 @@ handle_sequencer_input(void) { if (channel_selection_loc == 0) { channel_selection_loc = SEQ_N_CHANNELS - 1; } else { - channel_selection_loc = CLAMP(channel_selection_loc - 1, 0, SEQ_N_CHANNELS); + channel_selection_loc = MAX(channel_selection_loc - 1, 0); } } if (key_pressed(KEY_DOWN)) { if (channel_selection_loc == SEQ_N_CHANNELS - 1) { channel_selection_loc = 0; } else { - channel_selection_loc = CLAMP(channel_selection_loc + 1, 0, SEQ_N_CHANNELS); + channel_selection_loc = MIN(channel_selection_loc + 1, SEQ_N_CHANNELS); } } } -- cgit v1.2.1