From ed6f5a9dee2393a71343826eda27a97ad3d6bda4 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 21 Jul 2023 18:47:58 +0200 Subject: Add new UI for noise channel --- src/drawing.c | 311 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 189 insertions(+), 122 deletions(-) (limited to 'src/drawing.c') diff --git a/src/drawing.c b/src/drawing.c index f843cb1..f8cacb0 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -896,147 +896,214 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { void draw_parameters_noise(ChannelNoiseParams* params, bool global) { - size_t x_offset = 30; u8 col_fg = COL_FG; if (global && input_handler == handle_channel_selection) { col_fg = COL_OFF; } - // Bit mode. + // Mode. { - // Param box. - { - size_t x = PARAMS_START_X + x_offset; - size_t y = PARAMS_START_Y + PARAMS_H - 26; - draw_line(x, y + 7, x + 2, y + 7, col_fg); - draw_line(x + 22, y + 7, x + 24, y + 7, col_fg); - draw_line(x, y + 8, x, y + 19, col_fg); - draw_line(x + 24, y + 8, x + 24, y + 19, col_fg); - draw_line(x, y + 20, x + 24, y + 20, col_fg); - txt_drawf_small("mode", x + 3, y + 3, col_fg); - - switch (params->bit_mode) { - case 0: { txt_drawf("A", x + 9, y + 10, col_fg); } break; - case 1: { txt_drawf("B", x + 9, y + 10, col_fg); } break; - } + 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; } } // Envelope. { - // Env. drawing. - { - // Bounding box. - { - size_t x0 = PARAMS_START_X + 31 + x_offset; - size_t y0 = PARAMS_START_Y + PARAMS_H - 46; - size_t x1 = x0 + 79; - size_t y1 = y0 + 21; - draw_rect(x0, y0, x1, y1, COL_ACC_2); - } - - size_t x = PARAMS_START_X + 42 + x_offset; - size_t y = PARAMS_START_Y + PARAMS_H - 43; - size_t x0 = x; - size_t y0 = y + 15 - params->env_volume; - size_t x1 = x + 8 * params->env_time; - size_t y1 = params->env_direction == 0 ? y + 15 : y; - size_t x2 = x + 8 * 7 + 1; - size_t y2 = y1; - - // Env. - if (params->env_time == 0) { - draw_line(x1, y0, x2, y0, COL_ACC_2); - } else { - draw_line(x0, y0, x1, y1, COL_ACC_2); - draw_line(x1, y1, x2, y2, COL_ACC_2); - } - } - - // Env. volume. - { - size_t x = PARAMS_START_X + 31 + x_offset; - size_t y = PARAMS_START_Y + PARAMS_H - 26; - draw_line(x, y + 7, x + 4, y + 7, col_fg); - draw_line(x + 20, y + 7, x + 24, y + 7, col_fg); - draw_line(x, y + 8, x, y + 19, col_fg); - draw_line(x + 24, y + 8, x + 24, y + 19, col_fg); - draw_line(x, y + 20, x + 24, y + 20, col_fg); - txt_drawf_small("vol", x + 5, y + 3, col_fg); - - switch (params->env_volume) { - case 0: { txt_drawf("0", x + 9, y + 10, col_fg); } break; - case 1: { txt_drawf("6", x + 9, y + 10, col_fg); } break; - case 2: { txt_drawf("13", x + 6, y + 10, col_fg); } break; - case 3: { txt_drawf("20", x + 6, y + 10, col_fg); } break; - case 4: { txt_drawf("26", x + 6, y + 10, col_fg); } break; - case 5: { txt_drawf("33", x + 6, y + 10, col_fg); } break; - case 6: { txt_drawf("40", x + 6, y + 10, col_fg); } break; - case 7: { txt_drawf("46", x + 6, y + 10, col_fg); } break; - case 8: { txt_drawf("53", x + 6, y + 10, col_fg); } break; - case 9: { txt_drawf("60", x + 6, y + 10, col_fg); } break; - case 10: { txt_drawf("66", x + 6, y + 10, col_fg); } break; - case 11: { txt_drawf("73", x + 6, y + 10, col_fg); } break; - case 12: { txt_drawf("80", x + 6, y + 10, col_fg); } break; - case 13: { txt_drawf("86", x + 6, y + 10, col_fg); } break; - case 14: { txt_drawf("93", x + 6, y + 10, col_fg); } break; - case 15: { txt_drawf("100", x + 3, y + 10, col_fg); } break; - } - } + size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 1 + 1; + size_t y = PARAMS_START_Y + 1; + size_t x0 = x; + size_t y0 = y + 15 - params->env_volume; + size_t x1 = x + (3 * PARAMS_BOX_OFFSET_X) * params->env_time / 8 + 7; + size_t y1 = params->env_direction == 0 ? y + 15 : y; + size_t x2 = x + PARAMS_BOX_OFFSET_X * 3 - 5; + size_t y2 = y1; - // Env. direction - { - size_t x = PARAMS_START_X + 59 + x_offset; - size_t y = PARAMS_START_Y + PARAMS_H - 26; - draw_line(x, y + 7, x + 4, y + 7, col_fg); - draw_line(x + 20, y + 7, x + 24, y + 7, col_fg); - draw_line(x, y + 8, x, y + 19, col_fg); - draw_line(x + 24, y + 8, x + 24, y + 19, col_fg); - draw_line(x, y + 20, x + 24, y + 20, col_fg); - txt_drawf_small("dir", x + 5, y + 3, col_fg); - - char arr_up[2] = { 0x19, 0 }; - char arr_down[2] = { 0x18, 0 }; - switch (params->env_direction) { - case 0: { - txt_drawf(arr_up, x + 9, y + 11, col_fg); - } break; - case 1: { - txt_drawf(arr_down, x + 9, y + 11, col_fg); - } break; - } + // Env. + if (params->env_time == 0) { + // TODO: Time 0 vol 0 (dir) doesn't make sense (mute) + // TODO: Time 0 vol 100 doesn't make sense (constant max volume) + // NOTE: Maybe it's just a matter of handling it better on the + // control? Have to check every time we change direction to swap + // the conditions. + draw_line(x0, y0, x2, y0, COL_ACC_2); + } else { + draw_line(x0, y0, x1, y1, COL_ACC_2); + draw_line(x1, y1, x2, y2, COL_ACC_2); } + } - // Env. time. - { - size_t x = PARAMS_START_X + 87 + x_offset; - size_t y = PARAMS_START_Y + PARAMS_H - 26; - draw_line(x, y + 7, x + 2, y + 7, col_fg); - draw_line(x + 22, y + 7, x + 24, y + 7, col_fg); - draw_line(x, y + 8, x, y + 19, col_fg); - draw_line(x + 24, y + 8, x + 24, y + 19, col_fg); - draw_line(x, y + 20, x + 24, y + 20, col_fg); - txt_drawf_small("time", x + 3, y + 3, col_fg); - - switch (params->env_time) { - case 0: { txt_drawf("0", x + 9, y + 10, col_fg); } break; - case 1: { txt_drawf("14", x + 6, y + 10, col_fg); } break; - case 2: { txt_drawf("28", x + 6, y + 10, col_fg); } break; - case 3: { txt_drawf("42", x + 6, y + 10, col_fg); } break; - case 4: { txt_drawf("57", x + 6, y + 10, col_fg); } break; - case 5: { txt_drawf("71", x + 6, y + 10, col_fg); } break; - case 6: { txt_drawf("85", x + 6, y + 10, col_fg); } break; - case 7: { txt_drawf("100", x + 3, y + 10, col_fg); } break; - } - } + // TODO: Trig probability + { + size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3; + size_t y = PARAMS_START_Y + 5; + txt_drawf("100", x, y, col_fg); + txt_drawc('%', x + 18, y, col_fg); } // Labels. { - size_t x = PARAMS_START_X + x_offset; - size_t y = PARAMS_START_Y + PARAMS_H - 43; - txt_drawf_small("envelope", x + 54, y - 12, col_fg); + 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); + } + + // Empty spacers. + { + draw_param_stub(5, COL_OFF); + draw_param_stub(6, COL_OFF); + draw_param_stub(7, COL_OFF); + draw_param_stub(8, COL_OFF); + draw_param_stub(9, COL_OFF); } + // size_t x_offset = 30; + // u8 col_fg = COL_FG; + // if (global && input_handler == handle_channel_selection) { + // col_fg = COL_OFF; + // } + + // // Bit mode. + // { + // // Param box. + // { + // size_t x = PARAMS_START_X + x_offset; + // size_t y = PARAMS_START_Y + PARAMS_H - 26; + // draw_line(x, y + 7, x + 2, y + 7, col_fg); + // draw_line(x + 22, y + 7, x + 24, y + 7, col_fg); + // draw_line(x, y + 8, x, y + 19, col_fg); + // draw_line(x + 24, y + 8, x + 24, y + 19, col_fg); + // draw_line(x, y + 20, x + 24, y + 20, col_fg); + // txt_drawf_small("mode", x + 3, y + 3, col_fg); + + // switch (params->bit_mode) { + // case 0: { txt_drawf("A", x + 9, y + 10, col_fg); } break; + // case 1: { txt_drawf("B", x + 9, y + 10, col_fg); } break; + // } + // } + // } + + // // Envelope. + // { + // // Env. drawing. + // { + // // Bounding box. + // { + // size_t x0 = PARAMS_START_X + 31 + x_offset; + // size_t y0 = PARAMS_START_Y + PARAMS_H - 46; + // size_t x1 = x0 + 79; + // size_t y1 = y0 + 21; + // draw_rect(x0, y0, x1, y1, COL_ACC_2); + // } + + // size_t x = PARAMS_START_X + 42 + x_offset; + // size_t y = PARAMS_START_Y + PARAMS_H - 43; + // size_t x0 = x; + // size_t y0 = y + 15 - params->env_volume; + // size_t x1 = x + 8 * params->env_time; + // size_t y1 = params->env_direction == 0 ? y + 15 : y; + // size_t x2 = x + 8 * 7 + 1; + // size_t y2 = y1; + + // // Env. + // if (params->env_time == 0) { + // draw_line(x1, y0, x2, y0, COL_ACC_2); + // } else { + // draw_line(x0, y0, x1, y1, COL_ACC_2); + // draw_line(x1, y1, x2, y2, COL_ACC_2); + // } + // } + + // // Env. volume. + // { + // size_t x = PARAMS_START_X + 31 + x_offset; + // size_t y = PARAMS_START_Y + PARAMS_H - 26; + // draw_line(x, y + 7, x + 4, y + 7, col_fg); + // draw_line(x + 20, y + 7, x + 24, y + 7, col_fg); + // draw_line(x, y + 8, x, y + 19, col_fg); + // draw_line(x + 24, y + 8, x + 24, y + 19, col_fg); + // draw_line(x, y + 20, x + 24, y + 20, col_fg); + // txt_drawf_small("vol", x + 5, y + 3, col_fg); + + // switch (params->env_volume) { + // case 0: { txt_drawf("0", x + 9, y + 10, col_fg); } break; + // case 1: { txt_drawf("6", x + 9, y + 10, col_fg); } break; + // case 2: { txt_drawf("13", x + 6, y + 10, col_fg); } break; + // case 3: { txt_drawf("20", x + 6, y + 10, col_fg); } break; + // case 4: { txt_drawf("26", x + 6, y + 10, col_fg); } break; + // case 5: { txt_drawf("33", x + 6, y + 10, col_fg); } break; + // case 6: { txt_drawf("40", x + 6, y + 10, col_fg); } break; + // case 7: { txt_drawf("46", x + 6, y + 10, col_fg); } break; + // case 8: { txt_drawf("53", x + 6, y + 10, col_fg); } break; + // case 9: { txt_drawf("60", x + 6, y + 10, col_fg); } break; + // case 10: { txt_drawf("66", x + 6, y + 10, col_fg); } break; + // case 11: { txt_drawf("73", x + 6, y + 10, col_fg); } break; + // case 12: { txt_drawf("80", x + 6, y + 10, col_fg); } break; + // case 13: { txt_drawf("86", x + 6, y + 10, col_fg); } break; + // case 14: { txt_drawf("93", x + 6, y + 10, col_fg); } break; + // case 15: { txt_drawf("100", x + 3, y + 10, col_fg); } break; + // } + // } + + // // Env. direction + // { + // size_t x = PARAMS_START_X + 59 + x_offset; + // size_t y = PARAMS_START_Y + PARAMS_H - 26; + // draw_line(x, y + 7, x + 4, y + 7, col_fg); + // draw_line(x + 20, y + 7, x + 24, y + 7, col_fg); + // draw_line(x, y + 8, x, y + 19, col_fg); + // draw_line(x + 24, y + 8, x + 24, y + 19, col_fg); + // draw_line(x, y + 20, x + 24, y + 20, col_fg); + // txt_drawf_small("dir", x + 5, y + 3, col_fg); + + // char arr_up[2] = { 0x19, 0 }; + // char arr_down[2] = { 0x18, 0 }; + // switch (params->env_direction) { + // case 0: { + // txt_drawf(arr_up, x + 9, y + 11, col_fg); + // } break; + // case 1: { + // txt_drawf(arr_down, x + 9, y + 11, col_fg); + // } break; + // } + // } + + // // Env. time. + // { + // size_t x = PARAMS_START_X + 87 + x_offset; + // size_t y = PARAMS_START_Y + PARAMS_H - 26; + // draw_line(x, y + 7, x + 2, y + 7, col_fg); + // draw_line(x + 22, y + 7, x + 24, y + 7, col_fg); + // draw_line(x, y + 8, x, y + 19, col_fg); + // draw_line(x + 24, y + 8, x + 24, y + 19, col_fg); + // draw_line(x, y + 20, x + 24, y + 20, col_fg); + // txt_drawf_small("time", x + 3, y + 3, col_fg); + + // switch (params->env_time) { + // case 0: { txt_drawf("0", x + 9, y + 10, col_fg); } break; + // case 1: { txt_drawf("14", x + 6, y + 10, col_fg); } break; + // case 2: { txt_drawf("28", x + 6, y + 10, col_fg); } break; + // case 3: { txt_drawf("42", x + 6, y + 10, col_fg); } break; + // case 4: { txt_drawf("57", x + 6, y + 10, col_fg); } break; + // case 5: { txt_drawf("71", x + 6, y + 10, col_fg); } break; + // case 6: { txt_drawf("85", x + 6, y + 10, col_fg); } break; + // case 7: { txt_drawf("100", x + 3, y + 10, col_fg); } break; + // } + // } + // } + + // // Labels. + // { + // size_t x = PARAMS_START_X + x_offset; + // size_t y = PARAMS_START_Y + PARAMS_H - 43; + // txt_drawf_small("envelope", x + 54, y - 12, col_fg); + // } } void -- cgit v1.2.1