From 666135619b653accd72e940d4405871c6c5f453b Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 8 Jan 2024 11:05:05 +0100 Subject: Fix channel params behaviour to be as expected --- src/drawing.c | 255 ++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 178 insertions(+), 77 deletions(-) (limited to 'src/drawing.c') diff --git a/src/drawing.c b/src/drawing.c index 048b4de..2368627 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -921,9 +921,38 @@ draw_panning(s8 pan, u8 clr) { IWRAM_CODE void draw_parameters_wave(ChannelWaveParams *params, bool global) { - u8 col_fg = COL_FG; + u8 cols[10] = { + COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, + COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, + }; if (global && input_handler == handle_channel_selection) { - col_fg = COL_OFF; + for (size_t i = 0; i < 16; i++) { + ChannelWaveParams *trig_params = &patterns[pattern_selection_loc].ch3.params[i]; + if (params->shape_a != trig_params->shape_a) { + cols[0] = COL_OFF; + } + if (params->type_a != trig_params->type_a) { + cols[1] = COL_OFF; + } + if (params->shape_b != trig_params->shape_b) { + cols[2] = COL_OFF; + } + if (params->type_b != trig_params->type_b) { + cols[3] = COL_OFF; + } + if (params->prob != trig_params->prob) { + cols[4] = COL_OFF; + } + if (params->wave_mode != trig_params->wave_mode) { + cols[5] = COL_OFF; + } + if (params->wave_volume != trig_params->wave_volume) { + cols[6] = COL_OFF; + } + if (params->pan != trig_params->pan) { + cols[9] = COL_OFF; + } + } } // Draw current wave data. @@ -932,26 +961,26 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { size_t y = PARAMS_START_Y; // Wave Patterns. - u8 col_wave_a = col_fg != COL_OFF && (params->wave_mode == 0 || params->wave_mode == 2) ? COL_ACC_1 : COL_OFF; - u8 col_wave_b = col_fg != COL_OFF && (params->wave_mode == 1 || params->wave_mode == 2) ? COL_ACC_2 : COL_OFF; + u8 col_wave_a = cols[0] != COL_OFF && cols[1] != COL_OFF && (params->wave_mode == 0 || params->wave_mode == 2) ? COL_ACC_1 : COL_OFF; + u8 col_wave_b = cols[2] != COL_OFF && cols[3] != COL_OFF && (params->wave_mode == 1 || params->wave_mode == 2) ? COL_ACC_2 : COL_OFF; draw_wave_pattern(waves[params->shape_a][params->type_a], x, y, col_wave_a); draw_wave_pattern(waves[params->shape_b][params->type_b], x + PARAMS_BOX_OFFSET_X * 2, y, col_wave_b); } // Trig probability. - draw_prob(params->prob, col_fg); + draw_prob(params->prob, cols[4]); // Trig pannning. - draw_panning(params->pan, col_fg); + draw_panning(params->pan, cols[9]); // Mode selection. { size_t x = PARAMS_START_X; size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y; switch (params->wave_mode) { - case 0: { txt_drawf("A", x + 12, y + 5, col_fg); } break; - case 1: { txt_drawf("B", x + 12, y + 5, col_fg); } break; - case 2: { txt_drawf("A+B", x + 6, y + 5, col_fg); } break; + case 0: { txt_drawf("A", x + 12, y + 5, cols[5]); } break; + case 1: { txt_drawf("B", x + 12, y + 5, cols[5]); } break; + case 2: { txt_drawf("A+B", x + 6, y + 5, cols[5]); } break; } } @@ -961,24 +990,24 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y + 5; switch (params->wave_volume) { case 0: { - txt_drawf("0", x + 6, y, col_fg); - txt_drawc('%', x + 12, y, col_fg); + txt_drawf("0", x + 6, y, cols[6]); + txt_drawc('%', x + 12, y, cols[6]); } break; case 1: { - txt_drawf("25", x + 3, y, col_fg); - txt_drawc('%', x + 15, y, col_fg); + txt_drawf("25", x + 3, y, cols[6]); + txt_drawc('%', x + 15, y, cols[6]); } break; case 2: { - txt_drawf("50", x + 3, y, col_fg); - txt_drawc('%', x + 15, y, col_fg); + txt_drawf("50", x + 3, y, cols[6]); + txt_drawc('%', x + 15, y, cols[6]); } break; case 3: { - txt_drawf("75", x + 3, y, col_fg); - txt_drawc('%', x + 15, y, col_fg); + txt_drawf("75", x + 3, y, cols[6]); + txt_drawc('%', x + 15, y, cols[6]); } break; case 4: { - txt_drawf("100", x, y, col_fg); - txt_drawc('%', x + 18, y, col_fg); + txt_drawf("100", x, y, cols[6]); + txt_drawc('%', x + 18, y, cols[6]); } break; } } @@ -987,15 +1016,15 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { { size_t x = PARAMS_START_X; size_t y = PARAMS_START_Y; - txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("type", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("type", x + 6 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); + txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[0]); + txt_drawf_small("type", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[1]); + txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[2]); + txt_drawf_small("type", x + 6 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[3]); + txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[4]); y += PARAMS_BOX_OFFSET_Y; - txt_drawf_small("voice", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); + txt_drawf_small("voice", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[5]); + txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[6]); + txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]); } // Empty spacers. @@ -1007,9 +1036,51 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { void draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { - u8 col_fg = COL_FG; + u8 cols[10] = { + COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, + COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, + }; + + // Adjust colors for global trigger parameters. if (global && input_handler == handle_channel_selection) { - col_fg = COL_OFF; + for (size_t i = 0; i < 16; i++) { + ChannelSquareParams *trig_params; + if (sweep) { + trig_params = &patterns[pattern_selection_loc].ch1.params[i]; + } else { + trig_params = &patterns[pattern_selection_loc].ch2.params[i]; + } + if (params->duty_cycle != trig_params->duty_cycle) { + cols[0] = COL_OFF; + } + if (params->env_volume != trig_params->env_volume) { + cols[1] = COL_OFF; + } + if (params->env_time != trig_params->env_time) { + cols[2] = COL_OFF; + } + if (params->env_direction != trig_params->env_direction) { + cols[3] = COL_OFF; + } + if (params->env_direction != trig_params->env_direction) { + cols[3] = COL_OFF; + } + if (params->prob != trig_params->prob) { + cols[4] = COL_OFF; + } + if (params->sweep_number != trig_params->sweep_number) { + cols[5] = COL_OFF; + } + if (params->sweep_time != trig_params->sweep_time) { + cols[6] = COL_OFF; + } + if (params->sweep_direction != trig_params->sweep_direction) { + cols[7] = COL_OFF; + } + if (params->pan != trig_params->pan) { + cols[9] = COL_OFF; + } + } } // Duty cycle / shape. @@ -1056,7 +1127,7 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { x5 += 20; } break; } - u8 col_shape = col_fg != COL_OFF ? COL_ACC_1 : COL_OFF; + u8 col_shape = cols[0] != COL_OFF ? COL_ACC_1 : COL_OFF; draw_line(x0, y0, x1, y0, col_shape); draw_line(x1, y1, x1, y0, col_shape); draw_line(x1, y1, x2, y1, col_shape); @@ -1080,7 +1151,8 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { size_t y2 = y1; // Env. - u8 col_env = col_fg != COL_OFF ? COL_ACC_2 : COL_OFF; + u8 col_env = cols[1] != COL_OFF && cols[2] != COL_OFF && cols[3] != COL_OFF + ? COL_ACC_2 : COL_OFF; if (params->env_time == 0) { draw_line(x0, y0, x2, y0, col_env); } else { @@ -1090,10 +1162,10 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { } // Trig probability. - draw_prob(params->prob, col_fg); + draw_prob(params->prob, cols[4]); // Trig pannning. - draw_panning(params->pan, col_fg); + draw_panning(params->pan, cols[9]); // Sweep. if (sweep) { @@ -1105,34 +1177,36 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { u8 x1 = x + PARAMS_BOX_OFFSET_X * 3 - 5; u8 y0 = y + 2; u8 y1 = y + PARAMS_BOX_H - 8; - draw_line(x0, y0, x1, y0, col_fg); - draw_line(x0, y1, x1, y1, col_fg); - draw_line(x0 - 1, y0 + 1, x0 - 1, y1 - 1, col_fg); - draw_line(x1 + 1, y0 + 1, x1 + 1, y1 - 1, col_fg); + u8 col_box = cols[5] != COL_OFF && cols[6] != COL_OFF && cols[7] != COL_OFF + ? COL_FG : COL_OFF; + draw_line(x0, y0, x1, y0, col_box); + draw_line(x0, y1, x1, y1, col_box); + draw_line(x0 - 1, y0 + 1, x0 - 1, y1 - 1, col_box); + draw_line(x1 + 1, y0 + 1, x1 + 1, y1 - 1, col_box); // Number. switch (params->sweep_number) { - case 0: { txt_drawf("0", x + 12, y + 5, col_fg); } break; - case 1: { txt_drawf("1", x + 12, y + 5, col_fg); } break; - case 2: { txt_drawf("2", x + 12, y + 5, col_fg); } break; - case 3: { txt_drawf("3", x + 12, y + 5, col_fg); } break; - case 4: { txt_drawf("4", x + 12, y + 5, col_fg); } break; - case 5: { txt_drawf("5", x + 12, y + 5, col_fg); } break; - case 6: { txt_drawf("6", x + 12, y + 5, col_fg); } break; - case 7: { txt_drawf("7", x + 12, y + 5, col_fg); } break; + case 0: { txt_drawf("0", x + 12, y + 5, cols[5]); } break; + case 1: { txt_drawf("1", x + 12, y + 5, cols[5]); } break; + case 2: { txt_drawf("2", x + 12, y + 5, cols[5]); } break; + case 3: { txt_drawf("3", x + 12, y + 5, cols[5]); } break; + case 4: { txt_drawf("4", x + 12, y + 5, cols[5]); } break; + case 5: { txt_drawf("5", x + 12, y + 5, cols[5]); } break; + case 6: { txt_drawf("6", x + 12, y + 5, cols[5]); } break; + case 7: { txt_drawf("7", x + 12, y + 5, cols[5]); } break; } // Time. x += PARAMS_BOX_OFFSET_X; switch (params->sweep_time) { - case 0: { txt_drawf("Off", x + 6, y + 5, col_fg); } break; - case 1: { txt_drawf("7ms", x + 6, y + 5, col_fg); } break; - case 2: { txt_drawf("15ms", x + 3, y + 5, col_fg); } break; - case 3: { txt_drawf("23ms", x + 3, y + 5, col_fg); } break; - case 4: { txt_drawf("31ms", x + 3, y + 5, col_fg); } break; - case 5: { txt_drawf("39ms", x + 3, y + 5, col_fg); } break; - case 6: { txt_drawf("46ms", x + 3, y + 5, col_fg); } break; - case 7: { txt_drawf("54ms", x + 3, y + 5, col_fg); } break; + case 0: { txt_drawf("Off", x + 6, y + 5, cols[6]); } break; + case 1: { txt_drawf("7ms", x + 6, y + 5, cols[6]); } break; + case 2: { txt_drawf("15ms", x + 3, y + 5, cols[6]); } break; + case 3: { txt_drawf("23ms", x + 3, y + 5, cols[6]); } break; + case 4: { txt_drawf("31ms", x + 3, y + 5, cols[6]); } break; + case 5: { txt_drawf("39ms", x + 3, y + 5, cols[6]); } break; + case 6: { txt_drawf("46ms", x + 3, y + 5, cols[6]); } break; + case 7: { txt_drawf("54ms", x + 3, y + 5, cols[6]); } break; } // Direction. @@ -1140,8 +1214,8 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { char arr_down[2] = { 0x19, 0 }; char arr_up[2] = { 0x18, 0 }; switch (params->sweep_direction) { - case 0: { txt_drawf(arr_up, x + 12, y + 5, col_fg); } break; - case 1: { txt_drawf(arr_down, x + 12, y + 5, col_fg); } break; + case 0: { txt_drawf(arr_up, x + 12, y + 5, cols[7]); } break; + case 1: { txt_drawf(arr_down, x + 12, y + 5, cols[7]); } break; } } @@ -1149,18 +1223,18 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { { size_t x = PARAMS_START_X; size_t y = PARAMS_START_Y; - txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); + txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[0]); + txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[1]); + txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[2]); + txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[3]); + txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[4]); y += PARAMS_BOX_OFFSET_Y; if (sweep) { - txt_drawf_small("sweep", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg); + txt_drawf_small("sweep", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[5]); + txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[6]); + txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[7]); } - txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); + txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]); } // Empty spacers. @@ -1176,9 +1250,35 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { void draw_parameters_noise(ChannelNoiseParams* params, bool global) { - u8 col_fg = COL_FG; + u8 cols[10] = { + COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, + COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, + }; if (global && input_handler == handle_channel_selection) { - col_fg = COL_OFF; + for (size_t i = 0; i < 16; i++) { + ChannelNoiseParams *trig_params = &patterns[pattern_selection_loc].ch4.params[i]; + if (params->bit_mode != trig_params->bit_mode) { + cols[0] = COL_OFF; + } + if (params->env_volume != trig_params->env_volume) { + cols[1] = COL_OFF; + } + if (params->env_time != trig_params->env_time) { + cols[2] = COL_OFF; + } + if (params->env_direction != trig_params->env_direction) { + cols[3] = COL_OFF; + } + if (params->env_direction != trig_params->env_direction) { + cols[3] = COL_OFF; + } + if (params->prob != trig_params->prob) { + cols[4] = COL_OFF; + } + if (params->pan != trig_params->pan) { + cols[9] = COL_OFF; + } + } } // Mode. @@ -1186,8 +1286,8 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) { size_t x = PARAMS_START_X; size_t y = PARAMS_START_Y; switch (params->bit_mode) { - case 0: { txt_drawf("A", x + 12, y + 5, col_fg); } break; - case 1: { txt_drawf("B", x + 12, y + 5, col_fg); } break; + case 0: { txt_drawf("A", x + 12, y + 5, cols[0]); } break; + case 1: { txt_drawf("B", x + 12, y + 5, cols[0]); } break; } } @@ -1203,7 +1303,8 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) { size_t y2 = y1; // Env. - u8 col_env = col_fg != COL_OFF ? COL_ACC_2 : COL_OFF; + u8 col_env = cols[1] != COL_OFF && cols[2] != COL_OFF && cols[3] != COL_OFF + ? COL_ACC_2 : COL_OFF; if (params->env_time == 0) { draw_line(x0, y0, x2, y0, col_env); } else { @@ -1213,22 +1314,22 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) { } // Trig probability. - draw_prob(params->prob, col_fg); + draw_prob(params->prob, cols[4]); // Trig pannning. - draw_panning(params->pan, col_fg); + draw_panning(params->pan, cols[9]); // Labels. { size_t x = PARAMS_START_X; size_t y = PARAMS_START_Y; - txt_drawf_small("mode", x + 6 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, col_fg); - txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); + txt_drawf_small("mode", x + 6 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[0]); + txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[1]); + txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[2]); + txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[3]); + txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[4]); y += PARAMS_BOX_OFFSET_Y; - txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); + txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]); } // Empty spacers. -- cgit v1.2.1