From 8fc5cc7f53ea3874bae5389f489814869d2abd04 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 22 Aug 2023 11:30:47 +0200 Subject: Update right column UI and cursor management --- src/drawing.c | 116 +++++++++++++++++++++++++++++++++----------------------- src/globals.c | 20 ++++++---- src/main.c | 41 +++++++++++++++++--- src/sequencer.c | 100 ++++++++++++++++++++++++++++++------------------ 4 files changed, 180 insertions(+), 97 deletions(-) (limited to 'src') diff --git a/src/drawing.c b/src/drawing.c index dd77803..d24307b 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -162,53 +162,75 @@ draw_trig_cursor(size_t i, u8 clr, bool dither) { void draw_right_col_cursor(int i, u8 clr) { - // TODO:... - return; - size_t x0 = 0; - size_t x1 = 0; - size_t y = 0; - switch (i) { - case R_COL_BPM: { - x0 = BPM_START_X; - x1 = x0 + R_COL_W; - y = BPM_START_Y + BPM_H + 0; - } break; - case R_COL_STOP: { - x0 = STOP_START_X; - x1 = x0 + PLAY_STOP_W; - y = STOP_START_Y + PLAY_STOP_H + 2; - } break; - case R_COL_PLAY: { - x0 = PLAY_START_X; - x1 = x0 + PLAY_STOP_W; - y = PLAY_START_Y + PLAY_STOP_H + 2; - } break; - case R_COL_SETTINGS: { - x0 = SETTINGS_START_X + 2; - x1 = x0 + R_COL_W - 4; - y = SETTINGS_START_Y + PLAY_STOP_H + 2; - } break; - case R_COL_BANK_A: { - x0 = BANK_START_X; - x1 = x0 + PAT_W; - y = BANK_START_Y + PAT_H + 2; - } break; - case R_COL_BANK_B: { - x0 = BANK_START_X; - x1 = x0 + PAT_W; - y = BANK_START_Y + PAT_H + 2 + 1 * PAT_OFFSET_Y; - } break; - case R_COL_BANK_C: { - x0 = BANK_START_X; - x1 = x0 + PAT_W; - y = BANK_START_Y + PAT_H + 2 + 2 * PAT_OFFSET_Y; - } break; - case R_COL_BANK_D: { - x0 = BANK_START_X; - x1 = x0 + PAT_W; - y = BANK_START_Y + PAT_H + 2 + 3 * PAT_OFFSET_Y; - } break; - } + size_t x0_pos[] = { + // Banks. + BANK_START_X - 7, + BANK_START_X + 9, + BANK_START_X - 7, + BANK_START_X + 9, + BANK_START_X - 7, + BANK_START_X + 9, + + // Scale. + BANK_START_X - 7, + + // BPM. + BANK_START_X - 7, + + // Settings. + BANK_START_X - 7, + + // Play/stop. + BANK_START_X - 7, + BANK_START_X + 9, + }; + size_t x1_pos[] = { + // Banks. + BANK_START_X + 5, + BANK_START_X + 21, + BANK_START_X + 5, + BANK_START_X + 21, + BANK_START_X + 5, + BANK_START_X + 21, + + // Scale. + BANK_START_X + 21, + + // BPM. + BANK_START_X + 21, + + // Settings. + BANK_START_X + 21, + + // Play/stop. + BANK_START_X + 5, + BANK_START_X + 21, + }; + size_t y_pos[] = { + // Banks. + BANK_START_Y + 12, + BANK_START_Y + 12, + BANK_START_Y + 12 + 18, + BANK_START_Y + 12 + 18, + BANK_START_Y + 12 + 18 * 2, + BANK_START_Y + 12 + 18 * 2, + + // Scale. + BANK_START_Y + 78, + + // BPM. + BANK_START_Y + 108, + + // Settings. + BANK_START_Y + 124, + + // Play/stop. + BANK_START_Y + 138, + BANK_START_Y + 138, + }; + size_t x0 = x0_pos[i]; + size_t x1 = x1_pos[i]; + size_t y = y_pos[i]; draw_line(x0, y, x1, y, clr); draw_line(x0, y + 1, x1, y + 1, clr); } diff --git a/src/globals.c b/src/globals.c index e4d1f13..23012c8 100644 --- a/src/globals.c +++ b/src/globals.c @@ -105,14 +105,18 @@ bool clear_screen = true; #define SEQ_N_CHANNELS 4 enum RIGHT_COL_LOC { - R_COL_BPM = 0, - R_COL_PLAY = 1, - R_COL_STOP = 2, - R_COL_SETTINGS = 3, - R_COL_BANK_D = 4, - R_COL_BANK_C = 5, - R_COL_BANK_B = 6, - R_COL_BANK_A = 7, + R_COL_BANK_A = 0, + R_COL_BANK_B = 1, + R_COL_BANK_C = 2, + R_COL_BANK_D = 3, + R_COL_BANK_E = 4, + R_COL_BANK_F = 5, + R_COL_SCALE = 6, + R_COL_BPM = 7, + R_COL_SETTINGS = 8, + R_COL_PLAY = 9, + R_COL_STOP = 10, + R_COL_END, }; // Input handling works using a FSM. The input handler is switched to whichever diff --git a/src/main.c b/src/main.c index 6992ac2..3ddfaac 100644 --- a/src/main.c +++ b/src/main.c @@ -37,8 +37,15 @@ WITH REGARD TO THIS SOFTWARE. // into the ROM. // // WIP (1.7) -// - Scale mode for entering notes. +// + Improve "grey" cursor with dithering instead. +// + New channel icons. +// + Update rcol UI and cursor management. // - Improve SRAM saving to make room for longer patterns and/or more banks. +// - Make sure there is an ALL notification when modifying channel params so +// that it's clear it's affecting all triggers. +// - Blank patterns could show up as empty on the pattern view for better +// separation and section organization. +// - Scale mode for entering notes. // - Add CLEAR ALL to the settings menu. // - Higher resolution clock to allow for microtiming and more accurate tempo. // - Multiple pattern chains per bank that we can toggle between, gotta study @@ -47,14 +54,36 @@ WITH REGARD TO THIS SOFTWARE. // - Add settings for "performance mode" in which banks are not saved by // default while changing patterns. // - Make sure sync works with the same cable for in/out. -// - Improve "grey" cursor with dithering instead. // - Remove thin cursor option and make the fat one default, it's just better. // - Settings page overhaul. -// - Make sure there is an ALL notification when modifying channel params so -// that it's clear it's affecting all triggers. -// - Blank patterns could show up as empty on the pattern view for better -// separation and section organization. // - Study more improvements for a "performance mode". +// - Add CREDITS to the documentation for now, should probably be a menu item +// later. +// +// BUGS +// +// - Copy/paste don't update the BMP drawing. + +// NOTE: (by catbeats) +// +// SCALES: +// +// CHRM - CHROMATIC +// MAJR - MAJOR (Ionian) +// MINR - MINOR (Aeolian) +// PMAJ - PENT MAJOR +// PMIN - PENT MINOR +// BLUE - BLUES +// DORI - DORIAN +// PHYR - PHYRGIAN +// LYDI - LYDIAN +// MIXO - MIXOLYDIAN +// LOCR - LOCRIAN +// PERS - PERSIAN +// HMIN - HUNGARIAN MINOR +// IWAT - IWATO +// INSN - IN-SEN +// HIRA - HIRAJOSHI // #include "gba/gba.h" diff --git a/src/sequencer.c b/src/sequencer.c index b3b27c6..4e3802f 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -570,42 +570,64 @@ select_bank(int i) { void handle_right_col_selection(void) { if (key_tap(KEY_LEFT)) { - if (right_col_selection_loc == R_COL_STOP) { - right_col_selection_loc = R_COL_PLAY; + switch (right_col_selection_loc) { + case R_COL_STOP: + case R_COL_BANK_B: + case R_COL_BANK_D: + case R_COL_BANK_F: { right_col_selection_loc--; } break; + case R_COL_BANK_A: + case R_COL_BANK_C: + case R_COL_BANK_E: + case R_COL_SCALE: + case R_COL_BPM: + case R_COL_SETTINGS: + case R_COL_PLAY: { + input_handler = handle_trigger_selection; + redraw_params = true; + } break; + } + if (right_col_selection_loc == R_COL_PLAY || + right_col_selection_loc == R_COL_SETTINGS) { + trig_selection_loc = 15; } else { - if (right_col_selection_loc == R_COL_BPM) { - trig_selection_loc = 15; - } else { - trig_selection_loc = 7; - } - input_handler = handle_trigger_selection; - redraw_params = true; + trig_selection_loc = 7; } } else if (key_tap(KEY_RIGHT)) { - if (right_col_selection_loc == R_COL_PLAY) { - right_col_selection_loc = R_COL_STOP; - } else { - input_handler = handle_pattern_selection; - param_selection_loc = 0; - redraw_trigs = true; + switch (right_col_selection_loc) { + case R_COL_PLAY: + case R_COL_BANK_A: + case R_COL_BANK_C: + case R_COL_BANK_E: { right_col_selection_loc++; } break; + case R_COL_BANK_B: + case R_COL_BANK_D: + case R_COL_BANK_F: + case R_COL_SCALE: + case R_COL_BPM: + case R_COL_SETTINGS: + case R_COL_STOP: { input_handler = handle_pattern_selection; } break; } } else if (key_tap(KEY_UP)) { switch (right_col_selection_loc) { - case R_COL_PLAY: - case R_COL_STOP: { right_col_selection_loc = R_COL_SETTINGS; } break; - case R_COL_SETTINGS: { right_col_selection_loc = R_COL_BANK_D; } break; - case R_COL_BPM: { right_col_selection_loc = R_COL_PLAY; } break; - case R_COL_BANK_A: { right_col_selection_loc = R_COL_BPM; } break; - default: { right_col_selection_loc++; } break; + case R_COL_BANK_A: { right_col_selection_loc = R_COL_PLAY; } break; + case R_COL_BANK_B: { right_col_selection_loc = R_COL_STOP; } break; + case R_COL_BANK_C: + case R_COL_BANK_D: + case R_COL_BANK_E: + case R_COL_BANK_F: + case R_COL_STOP: + case R_COL_SCALE: { right_col_selection_loc -= 2; } break; + default: { right_col_selection_loc--; } break; } } else if (key_tap(KEY_DOWN)) { switch (right_col_selection_loc) { - case R_COL_PLAY: - case R_COL_STOP: { right_col_selection_loc = R_COL_BPM; } break; - case R_COL_BPM: { right_col_selection_loc = R_COL_BANK_A; } break; - case R_COL_BANK_D: { right_col_selection_loc = R_COL_SETTINGS; } break; - case R_COL_SETTINGS: { right_col_selection_loc = R_COL_PLAY; } break; - default: { right_col_selection_loc--; } break; + case R_COL_BANK_A: + case R_COL_BANK_B: + case R_COL_BANK_C: + case R_COL_BANK_D: + case R_COL_BANK_E: { right_col_selection_loc += 2; } break; + case R_COL_PLAY: { right_col_selection_loc = R_COL_BANK_A; } break; + case R_COL_STOP: { right_col_selection_loc = R_COL_BANK_B; } break; + default: { right_col_selection_loc++; } break; } } else if (key_tap(KEY_L)) { switch (right_col_selection_loc) { @@ -624,6 +646,7 @@ handle_right_col_selection(void) { } redraw_bpm = true; } break; + // TODO: Scale. } } else if (key_tap(KEY_R)) { switch (right_col_selection_loc) { @@ -642,16 +665,20 @@ handle_right_col_selection(void) { } redraw_bpm = true; } break; + // TODO: Scale. } } else if (key_tap(KEY_B)) { switch (right_col_selection_loc) { case R_COL_SETTINGS: { next_scene = SCENE_SETTINGS; } break; + // case R_COL_SCALE: { stop_playing(); } break; // TODO: Should scale be toggleable? case R_COL_STOP: { stop_playing(); } break; case R_COL_PLAY: { pause_playing(); } break; case R_COL_BANK_A: { select_bank(0); } break; case R_COL_BANK_B: { select_bank(1); } break; case R_COL_BANK_C: { select_bank(2); } break; case R_COL_BANK_D: { select_bank(3); } break; + case R_COL_BANK_E: { select_bank(4); } break; + case R_COL_BANK_F: { select_bank(5); } break; } } } @@ -759,13 +786,14 @@ handle_pattern_selection(void) { input_handler = handle_right_col_selection; right_col_selection_loc = R_COL_BPM; switch (pattern_selection_loc) { - case 0: { right_col_selection_loc = R_COL_BANK_A; } break; - case 1: { right_col_selection_loc = R_COL_BANK_B; } break; - case 2: { right_col_selection_loc = R_COL_BANK_C; } break; - case 3: { right_col_selection_loc = R_COL_BANK_D; } break; - case 4: { right_col_selection_loc = R_COL_PLAY; } break; - case 5: { right_col_selection_loc = R_COL_STOP; } break; - default: { right_col_selection_loc = R_COL_BPM; } break; + case 0: { right_col_selection_loc = R_COL_BANK_B; } break; + case 1: { right_col_selection_loc = R_COL_BANK_D; } break; + case 2: { right_col_selection_loc = R_COL_BANK_F; } break; + case 3: { right_col_selection_loc = R_COL_SCALE; } break; + case 4: { right_col_selection_loc = R_COL_SCALE; } break; + case 5: { right_col_selection_loc = R_COL_BPM; } break; + case 6: { right_col_selection_loc = R_COL_SETTINGS; } break; + case 7: { right_col_selection_loc = R_COL_STOP; } break; } } if (key_tap(KEY_R)) { @@ -1233,9 +1261,9 @@ handle_trigger_selection(void) { trig_selection_loc = MIN(trig_selection_loc + 1, 15); } else if (trig_selection_loc == 7) { input_handler = handle_right_col_selection; - right_col_selection_loc = R_COL_PLAY; - } else if (trig_selection_loc == 15) { right_col_selection_loc = R_COL_BPM; + } else if (trig_selection_loc == 15) { + right_col_selection_loc = R_COL_PLAY; input_handler = handle_right_col_selection; } redraw_params = true; -- cgit v1.2.1