From 0fbbc780d544ce1e6a026ab208cc70764be43b6e Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 4 Apr 2023 16:35:37 +0200 Subject: Add parameter control for noise channel --- src/sequencer.c | 485 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 260 insertions(+), 225 deletions(-) diff --git a/src/sequencer.c b/src/sequencer.c index b935bdd..d69c450 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -944,60 +944,22 @@ draw_params_cursor_wave(size_t i, u8 clr) { void draw_params_cursor_noise(size_t i, u8 clr) { - // TODO: Handle this. - (void)i; - (void)clr; - // u8 x_positions[] = { - // // 32 half bytes (Wave A). - // 0, 4, 8, 12, 16, 20, 24, 28, - // 34, 38, 42, 46, 50, 54, 58, 62, - // 0, 4, 8, 12, 16, 20, 24, 28, - // 34, 38, 42, 46, 50, 54, 58, 62, - // // 32 half bytes (Wave B). - // 70, 74, 78, 82, 86, 90, 94, 98, - // 104, 108, 112, 116, 120, 124, 128, 132, - // 70, 74, 78, 82, 86, 90, 94, 98, - // 104, 108, 112, 116, 120, 124, 128, 132, - // // Default wave A. - // 1, 18, 35, 52, - // // Default wave B. - // 71, 88, 105, 122, - // // Mode selection. - // 141, - // // Volume selection. - // 141, - // }; - // u8 y_positions[] = { - // // 32 half bytes (Wave A) - // 0, 0, 0, 0, 0, 0, 0, 0, - // 0, 0, 0, 0, 0, 0, 0, 0, - // 8, 8, 8, 8, 8, 8, 8, 8, - // 8, 8, 8, 8, 8, 8, 8, 8, - // // 32 half bytes (Wave B) - // 0, 0, 0, 0, 0, 0, 0, 0, - // 0, 0, 0, 0, 0, 0, 0, 0, - // 8, 8, 8, 8, 8, 8, 8, 8, - // 8, 8, 8, 8, 8, 8, 8, 8, - // // Default wave A. - // 20, 20, 20, 20, - // // Default wave B. - // 20, 20, 20, 20, - // // Mode selection. - // 20, - // // Volume selection. - // 0, - // }; - // size_t cursor_length = 0; - // if (i < 64) { - // cursor_length = 4; - // } 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 - 23 + y_positions[i]; - // draw_line(x, y, x + cursor_length, y, clr); + u8 x_positions[] = { + 0, // Bit mode. + 31, // Env. Vol. + 59, // Env. Direction. + 87, // Env. Time. + }; + u8 y_positions[] = { + 20, // Bit mode. + 20, // Env. Vol. + 20, // Env. Direction. + 20, // Env. Time. + }; + size_t cursor_length = 24; + size_t x = PARAMS_START_X + x_positions[i] + 30; + size_t y = PARAMS_START_Y + PARAMS_H - 23 + y_positions[i]; + draw_line(x, y, x + cursor_length, y, clr); } void @@ -1541,6 +1503,201 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep) { } } +void +draw_parameters_noise(void) { + size_t x_offset = 30; + Pattern *pat = &patterns[pattern_selection_loc]; + ChannelNoiseParams *params = &pat->ch4.params[trig_selection_loc]; + + // Bit mode. + { + // Param box. + { + size_t x = PARAMS_START_X + x_offset; + size_t y = PARAMS_START_Y + PARAMS_H - 25; + 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, 4, COL_FG); + + switch (params->bit_mode) { + case 0: { + txt_drawf("A", x + 9, y + 10, 6, COL_FG); + } break; + case 1: { + txt_drawf("B", x + 9, y + 10, 6, 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 - 47; + size_t x1 = x0 + 79; + size_t y1 = y0 + 21; + draw_rect(x0, y0, x1, y1, COL_CYAN); + } + + size_t x = PARAMS_START_X + 42 + x_offset; + size_t y = PARAMS_START_Y + PARAMS_H - 44; + 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_CYAN); + } else { + draw_line(x0, y0, x1, y1, COL_CYAN); + draw_line(x1, y1, x2, y2, COL_CYAN); + } + } + + // Env. volume. + { + size_t x = PARAMS_START_X + 31 + x_offset; + size_t y = PARAMS_START_Y + PARAMS_H - 25; + 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, 4, COL_FG); + + switch (params->env_volume) { + case 0: { + txt_drawf("0", x + 9, y + 10, 6, COL_FG); + } break; + case 1: { + txt_drawf("6", x + 9, y + 10, 6, COL_FG); + } break; + case 2: { + txt_drawf("13", x + 6, y + 10, 6, COL_FG); + } break; + case 3: { + txt_drawf("20", x + 6, y + 10, 6, COL_FG); + } break; + case 4: { + txt_drawf("26", x + 6, y + 10, 6, COL_FG); + } break; + case 5: { + txt_drawf("33", x + 6, y + 10, 6, COL_FG); + } break; + case 6: { + txt_drawf("40", x + 6, y + 10, 6, COL_FG); + } break; + case 7: { + txt_drawf("46", x + 6, y + 10, 6, COL_FG); + } break; + case 8: { + txt_drawf("53", x + 6, y + 10, 6, COL_FG); + } break; + case 9: { + txt_drawf("60", x + 6, y + 10, 6, COL_FG); + } break; + case 10: { + txt_drawf("66", x + 6, y + 10, 6, COL_FG); + } break; + case 11: { + txt_drawf("73", x + 6, y + 10, 6, COL_FG); + } break; + case 12: { + txt_drawf("80", x + 6, y + 10, 6, COL_FG); + } break; + case 13: { + txt_drawf("86", x + 6, y + 10, 6, COL_FG); + } break; + case 14: { + txt_drawf("93", x + 6, y + 10, 6, COL_FG); + } break; + case 15: { + txt_drawf("100", x + 3, y + 10, 6, COL_FG); + } break; + } + } + + // Env. direction + { + size_t x = PARAMS_START_X + 59 + x_offset; + size_t y = PARAMS_START_Y + PARAMS_H - 25; + 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, 4, 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, 6, COL_FG); + } break; + case 1: { + txt_drawf(arr_down, x + 9, y + 11, 6, COL_FG); + } break; + } + } + + // Env. time. + { + size_t x = PARAMS_START_X + 87 + x_offset; + size_t y = PARAMS_START_Y + PARAMS_H - 25; + 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, 4, COL_FG); + + switch (params->env_time) { + case 0: { + txt_drawf("0", x + 9, y + 10, 6, COL_FG); + } break; + case 1: { + txt_drawf("14", x + 6, y + 10, 6, COL_FG); + } break; + case 2: { + txt_drawf("28", x + 6, y + 10, 6, COL_FG); + } break; + case 3: { + txt_drawf("42", x + 6, y + 10, 6, COL_FG); + } break; + case 4: { + txt_drawf("57", x + 6, y + 10, 6, COL_FG); + } break; + case 5: { + txt_drawf("71", x + 6, y + 10, 6, COL_FG); + } break; + case 6: { + txt_drawf("85", x + 6, y + 10, 6, COL_FG); + } break; + case 7: { + txt_drawf("100", x + 3, y + 10, 6, COL_FG); + } break; + } + } + } + + // Labels. + { + size_t x = PARAMS_START_X + x_offset; + size_t y = PARAMS_START_Y + PARAMS_H - 45; + txt_drawf_small("envelope", x + 54, y - 12, 4, COL_FG); + } +} + void draw_parameters(void) { clear_parameters(); @@ -1556,6 +1713,7 @@ draw_parameters(void) { draw_parameters_wave(); } break; case 3: { + draw_parameters_noise(); } break; } } @@ -1679,7 +1837,7 @@ irq_timer(void) { SOUND_NOISE_FREQ = SOUND_FREQ_RESET | SOUND_NOISE_PRESTEP_FREQ(pre_freq[trig->note]) | SOUND_NOISE_DIV_FREQ(div_freq[trig->note]) - | SOUND_NOISE_COUNTER_STAGE(1) + | SOUND_NOISE_COUNTER_STAGE(params->bit_mode) | SOUND_NOISE_TIMED_MODE(0); } else { SOUND_NOISE_FREQ = 0; @@ -2296,176 +2454,53 @@ handle_param_selection_wave(void) { void handle_param_selection_noise(void) { // Go back to trigger selection. - // if (key_tap(KEY_A)) { - // draw_params_cursor(param_selection_loc, COL_BG); - // input_handler = handle_trigger_selection; - // draw_trig_cursor(trig_selection_loc, COL_CURSOR); - // } - - // // Cursor movement. - // if (key_tap(KEY_LEFT) || key_tap(KEY_RIGHT)) { - // int inc = 0; - // int loc = param_selection_loc; - // if (key_tap(KEY_RIGHT)) { - // if (loc == 15 || loc == 31) { - // inc = 17; - // } else if (loc == 47) { - // inc = 26; - // } else if (loc == 63) { - // inc = 9; - // } else if (loc != 47 && loc != 63 && loc < 72) { - // inc = 1; - // } - // } else { - // if (loc == 32 || loc == 48) { - // inc = -17; - // } else if (loc == 73) { - // inc = -26; - // } else if (loc != 16 && loc != 64) { - // inc = -1; - // } - // } - // draw_params_cursor(param_selection_loc, COL_BG); - // param_selection_loc = CLAMP(loc + inc, 0, 73); - // draw_params_cursor(param_selection_loc, COL_CURSOR); - // } - // if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { - // int inc = 0; - // int loc = param_selection_loc; - // if (key_tap(KEY_UP)) { - // if ((loc >= 16 && loc < 32) || (loc >= 48 && loc < 64)) { - // inc = -16; - // } else if (loc == 64) { - // inc = -48; - // } else if (loc == 65) { - // inc = -45; - // } else if (loc == 66) { - // inc = -42; - // } else if (loc == 67) { - // inc = -39; - // } else if (loc == 68) { - // inc = -20; - // } else if (loc == 69) { - // inc = -17; - // } else if (loc == 70) { - // inc = -14; - // } else if (loc == 71) { - // inc = -11; - // } else if (loc == 72) { - // inc = 1; - // } else if (loc == 73) { - // inc = -1; - // } - // } else { - // if (loc < 16 || (loc >= 32 && loc < 48)) { - // inc = 16; - // } else if (loc >= 16 && loc <= 19) { - // inc = 48 - (loc - 16); - // } else if (loc >= 20 && loc <= 23) { - // inc = 45 - (loc - 20); - // } else if (loc >= 24 && loc <= 27) { - // inc = 42 - (loc - 24); - // } else if (loc >= 28 && loc <= 31) { - // inc = 39 - (loc - 28); - // } else if (loc >= 48 && loc <= 51) { - // inc = 20 - (loc - 48); - // } else if (loc >= 52 && loc <= 55) { - // inc = 17 - (loc - 52); - // } else if (loc >= 56 && loc <= 59) { - // inc = 14 - (loc - 56); - // } else if (loc >= 60 && loc <= 63) { - // inc = 11 - (loc - 60); - // } else if (loc == 72) { - // inc = 1; - // } else if (loc == 73) { - // inc = -1; - // } - // } - // draw_params_cursor(param_selection_loc, COL_BG); - // param_selection_loc = CLAMP(loc + inc, 0, 73); - // draw_params_cursor(param_selection_loc, COL_CURSOR); - // } - - // // Adjust parameter. - // if (key_tap(KEY_R) || key_tap(KEY_L)) { - // int odd = param_selection_loc & 0x1; - // int inc; - // if (key_tap(KEY_R)) { - // inc = 1; - // } 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; - // if (odd) { - // *byte = (~0xF & *byte) | ((*byte + inc) & 0xF); - // } else { - // *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; - // if (odd) { - // *byte = (~0xF & *byte) | ((*byte + inc) & 0xF); - // } else { - // *byte = (0xF & *byte) | (((*byte >> 4) + inc) & 0xF) << 4; - // } - // } 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) { - // case 64: { - // memcpy32(wave_a, sine_wave, 16); - // } break; - // case 65: { - // memcpy32(wave_a, saw_wave, 16); - // } break; - // case 66: { - // memcpy32(wave_a, square_wave, 16); - // } break; - // case 67: { - // u32 rand_wave[4] = { - // rng32(), rng32(), rng32(), rng32(), - // }; - // memcpy32(wave_a, rand_wave, 16); - // } break; - // case 68: { - // memcpy32(wave_b, sine_wave, 16); - // } break; - // case 69: { - // memcpy32(wave_b, saw_wave, 16); - // } break; - // case 70: { - // memcpy32(wave_b, square_wave, 16); - // } break; - // case 71: { - // u32 rand_wave[4] = { - // rng32(), rng32(), rng32(), rng32(), - // }; - // memcpy32(wave_b, rand_wave, 16); - // } break; - // } - // } else if (param_selection_loc == 72) { - // u8 *wave_mode = &ch3.params[trig_selection_loc].wave_mode; - // *wave_mode = CLAMP(*wave_mode + inc, 0, 2); - // } else if (param_selection_loc == 73) { - // u8 *wave_volume = &ch3.params[trig_selection_loc].wave_volume; - // *wave_volume = CLAMP(*wave_volume + inc, 0, 4); - // } - // draw_parameters(); - // draw_params_cursor(param_selection_loc, COL_CURSOR); - // } + if (key_tap(KEY_A)) { + draw_params_cursor(param_selection_loc, COL_BG); + input_handler = handle_trigger_selection; + draw_trig_cursor(trig_selection_loc, COL_CURSOR); + } + + // Cursor movement. + if (key_tap(KEY_LEFT) || key_tap(KEY_RIGHT)) { + int inc = 0; + int loc = param_selection_loc; + if (key_tap(KEY_RIGHT)) { + inc = 1; + } else { + inc = -1; + } + draw_params_cursor(param_selection_loc, COL_BG); + param_selection_loc = CLAMP(loc + inc, 0, 3); + draw_params_cursor(param_selection_loc, COL_CURSOR); + } + + // Adjust parameter. + if (key_tap(KEY_R) || key_tap(KEY_L)) { + int inc; + if (key_tap(KEY_L)) { + inc = -1; + } else { + inc = 1; + } + Pattern *pat = &patterns[pattern_selection_loc]; + ChannelNoiseParams *params = &pat->ch4.params[trig_selection_loc]; + switch (param_selection_loc) { + case 0: { + params->bit_mode = CLAMP(params->bit_mode + inc, 0, 1); + } break; + case 1: { + params->env_volume = CLAMP(params->env_volume + inc, 0, 15); + } break; + case 2: { + params->env_direction ^= 1; + } break; + case 3: { + params->env_time = CLAMP(params->env_time + inc, 0, 7); + } break; + } + draw_parameters(); + draw_params_cursor(param_selection_loc, COL_CURSOR); + } } void -- cgit v1.2.1