aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-08-22 11:30:47 +0200
committerBad Diode <bd@badd10de.dev>2023-08-22 11:30:47 +0200
commit8fc5cc7f53ea3874bae5389f489814869d2abd04 (patch)
tree9d01ef11a0618a6377d07058c2cd704562827bb7
parentc888455af3ea5b9e8d2087a57df104c14ffac09e (diff)
downloadstepper-8fc5cc7f53ea3874bae5389f489814869d2abd04.tar.gz
stepper-8fc5cc7f53ea3874bae5389f489814869d2abd04.zip
Update right column UI and cursor management
-rw-r--r--src/drawing.c116
-rw-r--r--src/globals.c20
-rw-r--r--src/main.c41
-rw-r--r--src/sequencer.c100
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
163void 163void
164draw_right_col_cursor(int i, u8 clr) { 164draw_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
107enum RIGHT_COL_LOC { 107enum 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
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.
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) {
570void 570void
571handle_right_col_selection(void) { 571handle_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;