diff options
author | Bad Diode <bd@badd10de.dev> | 2023-08-22 11:30:47 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-08-22 11:30:47 +0200 |
commit | 8fc5cc7f53ea3874bae5389f489814869d2abd04 (patch) | |
tree | 9d01ef11a0618a6377d07058c2cd704562827bb7 | |
parent | c888455af3ea5b9e8d2087a57df104c14ffac09e (diff) | |
download | stepper-8fc5cc7f53ea3874bae5389f489814869d2abd04.tar.gz stepper-8fc5cc7f53ea3874bae5389f489814869d2abd04.zip |
Update right column UI and cursor management
-rw-r--r-- | src/drawing.c | 116 | ||||
-rw-r--r-- | src/globals.c | 20 | ||||
-rw-r--r-- | src/main.c | 41 | ||||
-rw-r--r-- | src/sequencer.c | 100 |
4 files changed, 180 insertions, 97 deletions
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) { | |||
162 | 162 | ||
163 | void | 163 | void |
164 | draw_right_col_cursor(int i, u8 clr) { | 164 | draw_right_col_cursor(int i, u8 clr) { |
165 | // TODO:... | 165 | size_t x0_pos[] = { |
166 | return; | 166 | // Banks. |
167 | size_t x0 = 0; | 167 | BANK_START_X - 7, |
168 | size_t x1 = 0; | 168 | BANK_START_X + 9, |
169 | size_t y = 0; | 169 | BANK_START_X - 7, |
170 | switch (i) { | 170 | BANK_START_X + 9, |
171 | case R_COL_BPM: { | 171 | BANK_START_X - 7, |
172 | x0 = BPM_START_X; | 172 | BANK_START_X + 9, |
173 | x1 = x0 + R_COL_W; | 173 | |
174 | y = BPM_START_Y + BPM_H + 0; | 174 | // Scale. |
175 | } break; | 175 | BANK_START_X - 7, |
176 | case R_COL_STOP: { | 176 | |
177 | x0 = STOP_START_X; | 177 | // BPM. |
178 | x1 = x0 + PLAY_STOP_W; | 178 | BANK_START_X - 7, |
179 | y = STOP_START_Y + PLAY_STOP_H + 2; | 179 | |
180 | } break; | 180 | // Settings. |
181 | case R_COL_PLAY: { | 181 | BANK_START_X - 7, |
182 | x0 = PLAY_START_X; | 182 | |
183 | x1 = x0 + PLAY_STOP_W; | 183 | // Play/stop. |
184 | y = PLAY_START_Y + PLAY_STOP_H + 2; | 184 | BANK_START_X - 7, |
185 | } break; | 185 | BANK_START_X + 9, |
186 | case R_COL_SETTINGS: { | 186 | }; |
187 | x0 = SETTINGS_START_X + 2; | 187 | size_t x1_pos[] = { |
188 | x1 = x0 + R_COL_W - 4; | 188 | // Banks. |
189 | y = SETTINGS_START_Y + PLAY_STOP_H + 2; | 189 | BANK_START_X + 5, |
190 | } break; | 190 | BANK_START_X + 21, |
191 | case R_COL_BANK_A: { | 191 | BANK_START_X + 5, |
192 | x0 = BANK_START_X; | 192 | BANK_START_X + 21, |
193 | x1 = x0 + PAT_W; | 193 | BANK_START_X + 5, |
194 | y = BANK_START_Y + PAT_H + 2; | 194 | BANK_START_X + 21, |
195 | } break; | 195 | |
196 | case R_COL_BANK_B: { | 196 | // Scale. |
197 | x0 = BANK_START_X; | 197 | BANK_START_X + 21, |
198 | x1 = x0 + PAT_W; | 198 | |
199 | y = BANK_START_Y + PAT_H + 2 + 1 * PAT_OFFSET_Y; | 199 | // BPM. |
200 | } break; | 200 | BANK_START_X + 21, |
201 | case R_COL_BANK_C: { | 201 | |
202 | x0 = BANK_START_X; | 202 | // Settings. |
203 | x1 = x0 + PAT_W; | 203 | BANK_START_X + 21, |
204 | y = BANK_START_Y + PAT_H + 2 + 2 * PAT_OFFSET_Y; | 204 | |
205 | } break; | 205 | // Play/stop. |
206 | case R_COL_BANK_D: { | 206 | BANK_START_X + 5, |
207 | x0 = BANK_START_X; | 207 | BANK_START_X + 21, |
208 | x1 = x0 + PAT_W; | 208 | }; |
209 | y = BANK_START_Y + PAT_H + 2 + 3 * PAT_OFFSET_Y; | 209 | size_t y_pos[] = { |
210 | } break; | 210 | // Banks. |
211 | } | 211 | BANK_START_Y + 12, |
212 | BANK_START_Y + 12, | ||
213 | BANK_START_Y + 12 + 18, | ||
214 | BANK_START_Y + 12 + 18, | ||
215 | BANK_START_Y + 12 + 18 * 2, | ||
216 | BANK_START_Y + 12 + 18 * 2, | ||
217 | |||
218 | // Scale. | ||
219 | BANK_START_Y + 78, | ||
220 | |||
221 | // BPM. | ||
222 | BANK_START_Y + 108, | ||
223 | |||
224 | // Settings. | ||
225 | BANK_START_Y + 124, | ||
226 | |||
227 | // Play/stop. | ||
228 | BANK_START_Y + 138, | ||
229 | BANK_START_Y + 138, | ||
230 | }; | ||
231 | size_t x0 = x0_pos[i]; | ||
232 | size_t x1 = x1_pos[i]; | ||
233 | size_t y = y_pos[i]; | ||
212 | draw_line(x0, y, x1, y, clr); | 234 | draw_line(x0, y, x1, y, clr); |
213 | draw_line(x0, y + 1, x1, y + 1, clr); | 235 | draw_line(x0, y + 1, x1, y + 1, clr); |
214 | } | 236 | } |
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; | |||
105 | #define SEQ_N_CHANNELS 4 | 105 | #define SEQ_N_CHANNELS 4 |
106 | 106 | ||
107 | enum RIGHT_COL_LOC { | 107 | enum RIGHT_COL_LOC { |
108 | R_COL_BPM = 0, | 108 | R_COL_BANK_A = 0, |
109 | R_COL_PLAY = 1, | 109 | R_COL_BANK_B = 1, |
110 | R_COL_STOP = 2, | 110 | R_COL_BANK_C = 2, |
111 | R_COL_SETTINGS = 3, | 111 | R_COL_BANK_D = 3, |
112 | R_COL_BANK_D = 4, | 112 | R_COL_BANK_E = 4, |
113 | R_COL_BANK_C = 5, | 113 | R_COL_BANK_F = 5, |
114 | R_COL_BANK_B = 6, | 114 | R_COL_SCALE = 6, |
115 | R_COL_BANK_A = 7, | 115 | R_COL_BPM = 7, |
116 | R_COL_SETTINGS = 8, | ||
117 | R_COL_PLAY = 9, | ||
118 | R_COL_STOP = 10, | ||
119 | R_COL_END, | ||
116 | }; | 120 | }; |
117 | 121 | ||
118 | // Input handling works using a FSM. The input handler is switched to whichever | 122 | // Input handling works using a FSM. The input handler is switched to whichever |
@@ -37,8 +37,15 @@ WITH REGARD TO THIS SOFTWARE. | |||
37 | // into the ROM. | 37 | // into the ROM. |
38 | // | 38 | // |
39 | // WIP (1.7) | 39 | // WIP (1.7) |
40 | // - Scale mode for entering notes. | 40 | // + Improve "grey" cursor with dithering instead. |
41 | // + New channel icons. | ||
42 | // + Update rcol UI and cursor management. | ||
41 | // - Improve SRAM saving to make room for longer patterns and/or more banks. | 43 | // - Improve SRAM saving to make room for longer patterns and/or more banks. |
44 | // - Make sure there is an ALL notification when modifying channel params so | ||
45 | // that it's clear it's affecting all triggers. | ||
46 | // - Blank patterns could show up as empty on the pattern view for better | ||
47 | // separation and section organization. | ||
48 | // - Scale mode for entering notes. | ||
42 | // - Add CLEAR ALL to the settings menu. | 49 | // - Add CLEAR ALL to the settings menu. |
43 | // - Higher resolution clock to allow for microtiming and more accurate tempo. | 50 | // - Higher resolution clock to allow for microtiming and more accurate tempo. |
44 | // - Multiple pattern chains per bank that we can toggle between, gotta study | 51 | // - Multiple pattern chains per bank that we can toggle between, gotta study |
@@ -47,14 +54,36 @@ WITH REGARD TO THIS SOFTWARE. | |||
47 | // - Add settings for "performance mode" in which banks are not saved by | 54 | // - Add settings for "performance mode" in which banks are not saved by |
48 | // default while changing patterns. | 55 | // default while changing patterns. |
49 | // - Make sure sync works with the same cable for in/out. | 56 | // - Make sure sync works with the same cable for in/out. |
50 | // - Improve "grey" cursor with dithering instead. | ||
51 | // - Remove thin cursor option and make the fat one default, it's just better. | 57 | // - Remove thin cursor option and make the fat one default, it's just better. |
52 | // - Settings page overhaul. | 58 | // - Settings page overhaul. |
53 | // - Make sure there is an ALL notification when modifying channel params so | ||
54 | // that it's clear it's affecting all triggers. | ||
55 | // - Blank patterns could show up as empty on the pattern view for better | ||
56 | // separation and section organization. | ||
57 | // - Study more improvements for a "performance mode". | 59 | // - Study more improvements for a "performance mode". |
60 | // - Add CREDITS to the documentation for now, should probably be a menu item | ||
61 | // later. | ||
62 | // | ||
63 | // BUGS | ||
64 | // | ||
65 | // - Copy/paste don't update the BMP drawing. | ||
66 | |||
67 | // NOTE: (by catbeats) | ||
68 | // | ||
69 | // SCALES: | ||
70 | // | ||
71 | // CHRM - CHROMATIC | ||
72 | // MAJR - MAJOR (Ionian) | ||
73 | // MINR - MINOR (Aeolian) | ||
74 | // PMAJ - PENT MAJOR | ||
75 | // PMIN - PENT MINOR | ||
76 | // BLUE - BLUES | ||
77 | // DORI - DORIAN | ||
78 | // PHYR - PHYRGIAN | ||
79 | // LYDI - LYDIAN | ||
80 | // MIXO - MIXOLYDIAN | ||
81 | // LOCR - LOCRIAN | ||
82 | // PERS - PERSIAN | ||
83 | // HMIN - HUNGARIAN MINOR | ||
84 | // IWAT - IWATO | ||
85 | // INSN - IN-SEN | ||
86 | // HIRA - HIRAJOSHI | ||
58 | // | 87 | // |
59 | 88 | ||
60 | #include "gba/gba.h" | 89 | #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) { | |||
570 | void | 570 | void |
571 | handle_right_col_selection(void) { | 571 | handle_right_col_selection(void) { |
572 | if (key_tap(KEY_LEFT)) { | 572 | if (key_tap(KEY_LEFT)) { |
573 | if (right_col_selection_loc == R_COL_STOP) { | 573 | switch (right_col_selection_loc) { |
574 | right_col_selection_loc = R_COL_PLAY; | 574 | case R_COL_STOP: |
575 | case R_COL_BANK_B: | ||
576 | case R_COL_BANK_D: | ||
577 | case R_COL_BANK_F: { right_col_selection_loc--; } break; | ||
578 | case R_COL_BANK_A: | ||
579 | case R_COL_BANK_C: | ||
580 | case R_COL_BANK_E: | ||
581 | case R_COL_SCALE: | ||
582 | case R_COL_BPM: | ||
583 | case R_COL_SETTINGS: | ||
584 | case R_COL_PLAY: { | ||
585 | input_handler = handle_trigger_selection; | ||
586 | redraw_params = true; | ||
587 | } break; | ||
588 | } | ||
589 | if (right_col_selection_loc == R_COL_PLAY || | ||
590 | right_col_selection_loc == R_COL_SETTINGS) { | ||
591 | trig_selection_loc = 15; | ||
575 | } else { | 592 | } else { |
576 | if (right_col_selection_loc == R_COL_BPM) { | 593 | trig_selection_loc = 7; |
577 | trig_selection_loc = 15; | ||
578 | } else { | ||
579 | trig_selection_loc = 7; | ||
580 | } | ||
581 | input_handler = handle_trigger_selection; | ||
582 | redraw_params = true; | ||
583 | } | 594 | } |
584 | } else if (key_tap(KEY_RIGHT)) { | 595 | } else if (key_tap(KEY_RIGHT)) { |
585 | if (right_col_selection_loc == R_COL_PLAY) { | 596 | switch (right_col_selection_loc) { |
586 | right_col_selection_loc = R_COL_STOP; | 597 | case R_COL_PLAY: |
587 | } else { | 598 | case R_COL_BANK_A: |
588 | input_handler = handle_pattern_selection; | 599 | case R_COL_BANK_C: |
589 | param_selection_loc = 0; | 600 | case R_COL_BANK_E: { right_col_selection_loc++; } break; |
590 | redraw_trigs = true; | 601 | case R_COL_BANK_B: |
602 | case R_COL_BANK_D: | ||
603 | case R_COL_BANK_F: | ||
604 | case R_COL_SCALE: | ||
605 | case R_COL_BPM: | ||
606 | case R_COL_SETTINGS: | ||
607 | case R_COL_STOP: { input_handler = handle_pattern_selection; } break; | ||
591 | } | 608 | } |
592 | } else if (key_tap(KEY_UP)) { | 609 | } else if (key_tap(KEY_UP)) { |
593 | switch (right_col_selection_loc) { | 610 | switch (right_col_selection_loc) { |
594 | case R_COL_PLAY: | 611 | case R_COL_BANK_A: { right_col_selection_loc = R_COL_PLAY; } break; |
595 | case R_COL_STOP: { right_col_selection_loc = R_COL_SETTINGS; } break; | 612 | case R_COL_BANK_B: { right_col_selection_loc = R_COL_STOP; } break; |
596 | case R_COL_SETTINGS: { right_col_selection_loc = R_COL_BANK_D; } break; | 613 | case R_COL_BANK_C: |
597 | case R_COL_BPM: { right_col_selection_loc = R_COL_PLAY; } break; | 614 | case R_COL_BANK_D: |
598 | case R_COL_BANK_A: { right_col_selection_loc = R_COL_BPM; } break; | 615 | case R_COL_BANK_E: |
599 | default: { right_col_selection_loc++; } break; | 616 | case R_COL_BANK_F: |
617 | case R_COL_STOP: | ||
618 | case R_COL_SCALE: { right_col_selection_loc -= 2; } break; | ||
619 | default: { right_col_selection_loc--; } break; | ||
600 | } | 620 | } |
601 | } else if (key_tap(KEY_DOWN)) { | 621 | } else if (key_tap(KEY_DOWN)) { |
602 | switch (right_col_selection_loc) { | 622 | switch (right_col_selection_loc) { |
603 | case R_COL_PLAY: | 623 | case R_COL_BANK_A: |
604 | case R_COL_STOP: { right_col_selection_loc = R_COL_BPM; } break; | 624 | case R_COL_BANK_B: |
605 | case R_COL_BPM: { right_col_selection_loc = R_COL_BANK_A; } break; | 625 | case R_COL_BANK_C: |
606 | case R_COL_BANK_D: { right_col_selection_loc = R_COL_SETTINGS; } break; | 626 | case R_COL_BANK_D: |
607 | case R_COL_SETTINGS: { right_col_selection_loc = R_COL_PLAY; } break; | 627 | case R_COL_BANK_E: { right_col_selection_loc += 2; } break; |
608 | default: { right_col_selection_loc--; } break; | 628 | case R_COL_PLAY: { right_col_selection_loc = R_COL_BANK_A; } break; |
629 | case R_COL_STOP: { right_col_selection_loc = R_COL_BANK_B; } break; | ||
630 | default: { right_col_selection_loc++; } break; | ||
609 | } | 631 | } |
610 | } else if (key_tap(KEY_L)) { | 632 | } else if (key_tap(KEY_L)) { |
611 | switch (right_col_selection_loc) { | 633 | switch (right_col_selection_loc) { |
@@ -624,6 +646,7 @@ handle_right_col_selection(void) { | |||
624 | } | 646 | } |
625 | redraw_bpm = true; | 647 | redraw_bpm = true; |
626 | } break; | 648 | } break; |
649 | // TODO: Scale. | ||
627 | } | 650 | } |
628 | } else if (key_tap(KEY_R)) { | 651 | } else if (key_tap(KEY_R)) { |
629 | switch (right_col_selection_loc) { | 652 | switch (right_col_selection_loc) { |
@@ -642,16 +665,20 @@ handle_right_col_selection(void) { | |||
642 | } | 665 | } |
643 | redraw_bpm = true; | 666 | redraw_bpm = true; |
644 | } break; | 667 | } break; |
668 | // TODO: Scale. | ||
645 | } | 669 | } |
646 | } else if (key_tap(KEY_B)) { | 670 | } else if (key_tap(KEY_B)) { |
647 | switch (right_col_selection_loc) { | 671 | switch (right_col_selection_loc) { |
648 | case R_COL_SETTINGS: { next_scene = SCENE_SETTINGS; } break; | 672 | case R_COL_SETTINGS: { next_scene = SCENE_SETTINGS; } break; |
673 | // case R_COL_SCALE: { stop_playing(); } break; // TODO: Should scale be toggleable? | ||
649 | case R_COL_STOP: { stop_playing(); } break; | 674 | case R_COL_STOP: { stop_playing(); } break; |
650 | case R_COL_PLAY: { pause_playing(); } break; | 675 | case R_COL_PLAY: { pause_playing(); } break; |
651 | case R_COL_BANK_A: { select_bank(0); } break; | 676 | case R_COL_BANK_A: { select_bank(0); } break; |
652 | case R_COL_BANK_B: { select_bank(1); } break; | 677 | case R_COL_BANK_B: { select_bank(1); } break; |
653 | case R_COL_BANK_C: { select_bank(2); } break; | 678 | case R_COL_BANK_C: { select_bank(2); } break; |
654 | case R_COL_BANK_D: { select_bank(3); } break; | 679 | case R_COL_BANK_D: { select_bank(3); } break; |
680 | case R_COL_BANK_E: { select_bank(4); } break; | ||
681 | case R_COL_BANK_F: { select_bank(5); } break; | ||
655 | } | 682 | } |
656 | } | 683 | } |
657 | } | 684 | } |
@@ -759,13 +786,14 @@ handle_pattern_selection(void) { | |||
759 | input_handler = handle_right_col_selection; | 786 | input_handler = handle_right_col_selection; |
760 | right_col_selection_loc = R_COL_BPM; | 787 | right_col_selection_loc = R_COL_BPM; |
761 | switch (pattern_selection_loc) { | 788 | switch (pattern_selection_loc) { |
762 | case 0: { right_col_selection_loc = R_COL_BANK_A; } break; | 789 | case 0: { right_col_selection_loc = R_COL_BANK_B; } break; |
763 | case 1: { right_col_selection_loc = R_COL_BANK_B; } break; | 790 | case 1: { right_col_selection_loc = R_COL_BANK_D; } break; |
764 | case 2: { right_col_selection_loc = R_COL_BANK_C; } break; | 791 | case 2: { right_col_selection_loc = R_COL_BANK_F; } break; |
765 | case 3: { right_col_selection_loc = R_COL_BANK_D; } break; | 792 | case 3: { right_col_selection_loc = R_COL_SCALE; } break; |
766 | case 4: { right_col_selection_loc = R_COL_PLAY; } break; | 793 | case 4: { right_col_selection_loc = R_COL_SCALE; } break; |
767 | case 5: { right_col_selection_loc = R_COL_STOP; } break; | 794 | case 5: { right_col_selection_loc = R_COL_BPM; } break; |
768 | default: { right_col_selection_loc = R_COL_BPM; } break; | 795 | case 6: { right_col_selection_loc = R_COL_SETTINGS; } break; |
796 | case 7: { right_col_selection_loc = R_COL_STOP; } break; | ||
769 | } | 797 | } |
770 | } | 798 | } |
771 | if (key_tap(KEY_R)) { | 799 | if (key_tap(KEY_R)) { |
@@ -1233,9 +1261,9 @@ handle_trigger_selection(void) { | |||
1233 | trig_selection_loc = MIN(trig_selection_loc + 1, 15); | 1261 | trig_selection_loc = MIN(trig_selection_loc + 1, 15); |
1234 | } else if (trig_selection_loc == 7) { | 1262 | } else if (trig_selection_loc == 7) { |
1235 | input_handler = handle_right_col_selection; | 1263 | input_handler = handle_right_col_selection; |
1236 | right_col_selection_loc = R_COL_PLAY; | ||
1237 | } else if (trig_selection_loc == 15) { | ||
1238 | right_col_selection_loc = R_COL_BPM; | 1264 | right_col_selection_loc = R_COL_BPM; |
1265 | } else if (trig_selection_loc == 15) { | ||
1266 | right_col_selection_loc = R_COL_PLAY; | ||
1239 | input_handler = handle_right_col_selection; | 1267 | input_handler = handle_right_col_selection; |
1240 | } | 1268 | } |
1241 | redraw_params = true; | 1269 | redraw_params = true; |