From f6efcdd98b32f1cd0d5a4a52abb333437c04b44f Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 15 Jan 2024 16:06:05 +0100 Subject: [WIP] Add decay control and attack/decay params on ch3 --- src/drawing.c | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 194 insertions(+), 31 deletions(-) (limited to 'src/drawing.c') diff --git a/src/drawing.c b/src/drawing.c index 2368627..f18f094 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -681,6 +681,16 @@ draw_params_cursor_wave(size_t i, u8 clr) { y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; txt_drawf_small("vol", x, y, COL_BG); } break; + case 7: { + x += 2 + PARAMS_BOX_OFFSET_X * 2; + y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; + txt_drawf_small("attack", x, y, COL_BG); + } break; + case 8: { + x += 4 + PARAMS_BOX_OFFSET_X * 3; + y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; + txt_drawf_small("decay", x, y, COL_BG); + } break; case 9: { x += 8 + PARAMS_BOX_OFFSET_X * 4; y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; @@ -1012,6 +1022,32 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { } } + // Attack. + { + 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) { + txt_drawf("OFF", x + 3, y, cols[6]); + } else if (params->wave_attack < 10) { + txt_drawf("%d", x + 8, y, cols[6], params->wave_attack); + } else { + txt_drawf("%d", x + 6, y, cols[6], params->wave_attack); + } + } + + // Decay. + { + 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) { + txt_drawf("OFF", x + 3, y, cols[6]); + } else if (params->wave_decay < 10) { + txt_drawf("%d", x + 8, y, cols[6], params->wave_decay); + } else { + txt_drawf("%d", x + 6, y, cols[6], params->wave_decay); + } + } + // Labels. { size_t x = PARAMS_START_X; @@ -1024,18 +1060,14 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { y += PARAMS_BOX_OFFSET_Y; 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("attack", x + 2 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[7]); + txt_drawf_small("decay", x + 4 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[8]); txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]); } - - // Empty spacers. - { - draw_param_stub(7, COL_OFF); - draw_param_stub(8, COL_OFF); - } } void -draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { +draw_parameters_square1(ChannelSquare1Params *params, bool global) { u8 cols[10] = { COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, @@ -1044,12 +1076,8 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { // Adjust colors for global trigger parameters. if (global && input_handler == handle_channel_selection) { 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]; - } + ChannelSquare1Params *trig_params; + trig_params = &patterns[pattern_selection_loc].ch1.params[i]; if (params->duty_cycle != trig_params->duty_cycle) { cols[0] = COL_OFF; } @@ -1168,7 +1196,7 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { draw_panning(params->pan, cols[9]); // Sweep. - if (sweep) { + { size_t x = PARAMS_START_X; size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y; @@ -1229,21 +1257,156 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { 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, 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("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, cols[9]); } // Empty spacers. { - if (!sweep) { - draw_param_stub(5, COL_OFF); - draw_param_stub(6, COL_OFF); - draw_param_stub(7, COL_OFF); + draw_param_stub(8, COL_OFF); + } +} + +void +draw_parameters_square2(ChannelSquare2Params *params, bool global) { + 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) { + for (size_t i = 0; i < 16; i++) { + ChannelSquare2Params *trig_params; + 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->pan != trig_params->pan) { + cols[9] = COL_OFF; + } } + } + + // Duty cycle / shape. + { + size_t x = PARAMS_START_X + 3; + size_t y = PARAMS_START_Y + 1; + + size_t x0 = x + 2; + size_t x1 = x0; + size_t x2 = x0; + size_t x3 = x0; + size_t x4 = x0; + size_t x5 = x0; + size_t y0 = y + 14; + size_t y1 = y + 2; + + switch (params->duty_cycle) { + case 0: { + x1 += 4; + x2 += 6; + x3 += 13; + x4 += 15; + x5 += 20; + } break; + case 1: { + x1 += 4; + x2 += 7; + x3 += 13; + x4 += 16; + x5 += 20; + } break; + case 2: { + x1 += 3; + x2 += 8; + x3 += 12; + x4 += 17; + x5 += 20; + } break; + case 3: { + x1 += 2; + x2 += 9; + x3 += 11; + x4 += 18; + x5 += 20; + } break; + } + 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); + draw_line(x2, y1, x2, y0, col_shape); + draw_line(x2, y0, x3, y0, col_shape); + draw_line(x3, y1, x3, y0, col_shape); + draw_line(x3, y1, x4, y1, col_shape); + draw_line(x4, y1, x4, y0, col_shape); + draw_line(x4, y0, x5, y0, col_shape); + } + + // Envelope. + { + 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. + 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 { + draw_line(x0, y0, x1, y1, col_env); + draw_line(x1, y1, x2, y2, col_env); + } + } + + // Trig probability. + draw_prob(params->prob, cols[4]); + + // Trig pannning. + draw_panning(params->pan, cols[9]); + + // Labels. + { + 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, 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, cols[9]); + } + + // 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); } } @@ -1358,15 +1521,15 @@ draw_parameters(void) { input_handler == handle_param_selection_noise) { if (!pat->empty) { switch (channel_selection_loc) { - case 0: { draw_parameters_square(&pat->ch1.params[trig_selection_loc], true, false); } break; - case 1: { draw_parameters_square(&pat->ch2.params[trig_selection_loc], false, false); } break; + case 0: { draw_parameters_square1(&pat->ch1.params[trig_selection_loc], false); } break; + case 1: { draw_parameters_square2(&pat->ch2.params[trig_selection_loc], false); } break; case 2: { draw_parameters_wave(&pat->ch3.params[trig_selection_loc], false); } break; case 3: { draw_parameters_noise(&pat->ch4.params[trig_selection_loc], false); } break; } } else { switch (channel_selection_loc) { - case 0: { draw_parameters_square(&default_ch1.params, true, false); } break; - case 1: { draw_parameters_square(&default_ch2.params, false, false); } break; + case 0: { draw_parameters_square1(&default_ch1.params, false); } break; + case 1: { draw_parameters_square2(&default_ch2.params, false); } break; case 2: { draw_parameters_wave(&default_ch3.params, true); } break; case 3: { draw_parameters_noise(&default_ch4.params, true); } break; } @@ -1379,8 +1542,8 @@ draw_parameters(void) { input_handler == handle_param_selection_ch3 || input_handler == handle_param_selection_ch4) { switch (channel_selection_loc) { - case 0: { draw_parameters_square(&ch1_params, true, true); } break; - case 1: { draw_parameters_square(&ch2_params, false, true); } break; + case 0: { draw_parameters_square1(&ch1_params, true); } break; + case 1: { draw_parameters_square2(&ch2_params, true); } break; case 2: { draw_parameters_wave(&ch3_params, true); } break; case 3: { draw_parameters_noise(&ch4_params, true); } break; } @@ -1640,7 +1803,7 @@ draw_notif_bar() { Pattern *pat = &patterns[pattern_selection_loc]; if (input_handler == handle_param_selection_sq1 || input_handler == handle_param_selection_ch1) { - ChannelSquareParams *params; + ChannelSquare1Params *params; if (input_handler == handle_param_selection_sq1) { params = &pat->ch1.params[trig_selection_loc]; } else { @@ -1704,7 +1867,7 @@ draw_notif_bar() { if (input_handler == handle_param_selection_sq2 || input_handler == handle_param_selection_ch2) { - ChannelSquareParams *params; + ChannelSquare2Params *params; if (input_handler == handle_param_selection_sq2) { params = &pat->ch2.params[trig_selection_loc]; } else { -- cgit v1.2.1