summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-05-06 16:17:06 +0200
committerBad Diode <bd@badd10de.dev>2021-05-06 16:17:06 +0200
commit6a3a8d96327d79100455e80374f7fbe008570649 (patch)
tree23f7e0184729bb08679c377efad635534fe6e723
parentfb00cfba1c80f64be48fa543b94d626c958e20e6 (diff)
downloadgba-experiments-6a3a8d96327d79100455e80374f7fbe008570649.tar.gz
gba-experiments-6a3a8d96327d79100455e80374f7fbe008570649.zip
Clean up parameter selection and rendering for Ch. 1-2
-rw-r--r--src/sequencer.c101
1 files changed, 57 insertions, 44 deletions
diff --git a/src/sequencer.c b/src/sequencer.c
index b95a94a..c83fa5a 100644
--- a/src/sequencer.c
+++ b/src/sequencer.c
@@ -1043,12 +1043,14 @@ update_sequencer_sprites(void) {
1043 } 1043 }
1044 } 1044 }
1045 1045
1046 // DEBUG: Hide all parameter control sprites for now. 1046 // TODO: Hide all parameter control sprites for now, we unhide it later.
1047 // Very inefficient but we may change the parameter rendering of all modes
1048 // to use bitmaps instead of sprites later.
1047 for (size_t i = 34; i <= 50; ++i) { 1049 for (size_t i = 34; i <= 50; ++i) {
1048 seq_sprites[i].obj_attr_0 |= OBJ_HIDDEN; 1050 seq_sprites[i].obj_attr_0 |= OBJ_HIDDEN;
1049 } 1051 }
1050 1052
1051 if (channel_selection_loc == 2) { 1053 if (current_selection == SEQ_SELECT_TRIGGER && channel_selection_loc == 2) {
1052 u8 *wave_a = sequences[channel_selection_loc][trig_selection_loc].wave_a; 1054 u8 *wave_a = sequences[channel_selection_loc][trig_selection_loc].wave_a;
1053 u8 *wave_b = sequences[channel_selection_loc][trig_selection_loc].wave_b; 1055 u8 *wave_b = sequences[channel_selection_loc][trig_selection_loc].wave_b;
1054 1056
@@ -1059,12 +1061,28 @@ update_sequencer_sprites(void) {
1059 // Clear wave A and draw. 1061 // Clear wave A and draw.
1060 draw_fill_rect(x, y, x + 64, y + 16, COLOR_BLACK); 1062 draw_fill_rect(x, y, x + 64, y + 16, COLOR_BLACK);
1061 draw_wave_pattern(wave_a, x, y, COLOR_RED); 1063 draw_wave_pattern(wave_a, x, y, COLOR_RED);
1064
1062 // Clear wave B and draw. 1065 // Clear wave B and draw.
1063 draw_fill_rect(x + 64 + 16, y, x + 64 * 2 + 16, y + 16, COLOR_BLACK); 1066 draw_fill_rect(x + 64 + 16, y, x + 64 * 2 + 16, y + 16, COLOR_BLACK);
1064 draw_wave_pattern(wave_b, x + 64 + 16, y, COLOR_CYAN); 1067 draw_wave_pattern(wave_b, x + 64 + 16, y, COLOR_CYAN);
1068 } else if ((current_selection == SEQ_SELECT_TRIGGER
1069 || current_selection == SEQ_SELECT_PARAMETER)
1070 && channel_selection_loc == 0) {
1071 for (size_t i = 34; i <= 50; ++i) {
1072 seq_sprites[i].obj_attr_0 &= ~OBJ_HIDDEN;
1073 }
1074 } else if ((current_selection == SEQ_SELECT_TRIGGER
1075 || current_selection == SEQ_SELECT_PARAMETER)
1076 && channel_selection_loc == 1) {
1077 for (size_t i = 34; i < 43; ++i) {
1078 seq_sprites[i].obj_attr_0 &= ~OBJ_HIDDEN;
1079 }
1080 seq_sprites[50].obj_attr_0 &= ~OBJ_HIDDEN;
1065 } else { 1081 } else {
1066 int x = SEQ_ENV_POS_X + 8; 1082 int x = SEQ_ENV_POS_X + 8;
1067 int y = SEQ_ENV_POS_Y; 1083 int y = SEQ_ENV_POS_Y;
1084
1085 // Clear parameters for channel 3.
1068 draw_fill_rect(x, y, x + 64, y + 16, COLOR_BLACK); 1086 draw_fill_rect(x, y, x + 64, y + 16, COLOR_BLACK);
1069 draw_fill_rect(x + 64 + 16, y, x + 64 * 2 + 16, y + 16, COLOR_BLACK); 1087 draw_fill_rect(x + 64 + 16, y, x + 64 * 2 + 16, y + 16, COLOR_BLACK);
1070 } 1088 }
@@ -1072,29 +1090,26 @@ update_sequencer_sprites(void) {
1072 1090
1073void 1091void
1074handle_sequencer_input(void) { 1092handle_sequencer_input(void) {
1093 SeqTrigger *trig = &sequences[channel_selection_loc][trig_selection_loc];
1075 if (current_selection == SEQ_SELECT_TRIGGER) { 1094 if (current_selection == SEQ_SELECT_TRIGGER) {
1076 if (key_pressed(KEY_LEFT)) { 1095 if (key_pressed(KEY_LEFT)) {
1077 if (trig_selection_loc == 0 || trig_selection_loc == 8) { 1096 if (trig_selection_loc == 0 || trig_selection_loc == 8) {
1078 current_selection = SEQ_SELECT_CHANNEL; 1097 current_selection = SEQ_SELECT_CHANNEL;
1079 } else { 1098 } else {
1080 trig_selection_loc = CLAMP(trig_selection_loc - 1, 0, 15); 1099 trig_selection_loc = MAX(trig_selection_loc - 1, 0);
1081 } 1100 }
1082 } else if (key_pressed(KEY_RIGHT)) { 1101 } else if (key_pressed(KEY_RIGHT)) {
1083 if (trig_selection_loc != 7) { 1102 if (trig_selection_loc != 7) {
1084 trig_selection_loc = CLAMP(trig_selection_loc + 1, 0, 15); 1103 trig_selection_loc = MIN(trig_selection_loc + 1, 15);
1085 } 1104 }
1086 } else if (key_pressed(KEY_UP) || key_pressed(KEY_DOWN)) { 1105 } else if (key_pressed(KEY_UP) || key_pressed(KEY_DOWN)) {
1087 trig_selection_loc = (trig_selection_loc + 8) % 16; 1106 trig_selection_loc = (trig_selection_loc + 8) % 16;
1088 } else if (key_pressed(KEY_B)) { 1107 } else if (key_pressed(KEY_B)) {
1089 sequences[channel_selection_loc][trig_selection_loc].trigger ^= 1; 1108 trig->trigger ^= 1;
1090 } else if (key_pressed(KEY_L)) { 1109 } else if (key_pressed(KEY_L)) {
1091 sequences[channel_selection_loc][trig_selection_loc].note = CLAMP( 1110 trig->note = MAX(trig->note - 1, NOTE_C_2);
1092 sequences[channel_selection_loc][trig_selection_loc].note - 1,
1093 NOTE_C_2, NOTE_C_8);
1094 } else if (key_pressed(KEY_R)) { 1111 } else if (key_pressed(KEY_R)) {
1095 sequences[channel_selection_loc][trig_selection_loc].note = CLAMP( 1112 trig->note = MIN( trig->note + 1, NOTE_C_8);
1096 sequences[channel_selection_loc][trig_selection_loc].note + 1,
1097 NOTE_C_2, NOTE_C_8);
1098 } else if (key_pressed(KEY_A)) { 1113 } else if (key_pressed(KEY_A)) {
1099 // Switch to parameter selection. 1114 // Switch to parameter selection.
1100 current_selection = SEQ_SELECT_PARAMETER; 1115 current_selection = SEQ_SELECT_PARAMETER;
@@ -1102,17 +1117,25 @@ handle_sequencer_input(void) {
1102 } else if (current_selection == SEQ_SELECT_PARAMETER) { 1117 } else if (current_selection == SEQ_SELECT_PARAMETER) {
1103 // Move through the selected synth parameters. 1118 // Move through the selected synth parameters.
1104 if (key_pressed(KEY_LEFT)) { 1119 if (key_pressed(KEY_LEFT)) {
1120 int max_param = 6;
1121 if (channel_selection_loc == 1) {
1122 max_param = 3;
1123 }
1105 if (param_selection_loc == 0) { 1124 if (param_selection_loc == 0) {
1106 param_selection_loc = 6; 1125 param_selection_loc = max_param;
1107 } else { 1126 } else {
1108 param_selection_loc = CLAMP(param_selection_loc - 1, 0, 6); 1127 param_selection_loc = MAX(param_selection_loc - 1, 0);
1109 } 1128 }
1110 } 1129 }
1111 if (key_pressed(KEY_RIGHT)) { 1130 if (key_pressed(KEY_RIGHT)) {
1112 if (param_selection_loc == 6) { 1131 int max_param = 6;
1132 if (channel_selection_loc == 1) {
1133 max_param = 3;
1134 }
1135 if (param_selection_loc == max_param) {
1113 param_selection_loc = 0; 1136 param_selection_loc = 0;
1114 } else { 1137 } else {
1115 param_selection_loc = CLAMP(param_selection_loc + 1, 0, 6); 1138 param_selection_loc = MIN(param_selection_loc + 1, max_param);
1116 } 1139 }
1117 } 1140 }
1118 1141
@@ -1120,33 +1143,28 @@ handle_sequencer_input(void) {
1120 if (key_pressed(KEY_L)) { 1143 if (key_pressed(KEY_L)) {
1121 switch (param_selection_loc) { 1144 switch (param_selection_loc) {
1122 case 0: { 1145 case 0: {
1123 sequences[channel_selection_loc][trig_selection_loc].env_volume = CLAMP( 1146 trig->env_volume = MAX(trig->env_volume - 1, 0);
1124 sequences[channel_selection_loc][trig_selection_loc].env_volume - 1, 0, 15);
1125 } break; 1147 } break;
1126 case 1: { 1148 case 1: {
1127 sequences[channel_selection_loc][trig_selection_loc].env_time = CLAMP( 1149 trig->env_time = MAX(trig->env_time - 1, 0);
1128 sequences[channel_selection_loc][trig_selection_loc].env_time - 1, 0, 7);
1129 } break; 1150 } break;
1130 case 2: { 1151 case 2: {
1131 sequences[channel_selection_loc][trig_selection_loc].env_direction ^= 1; 1152 trig->env_direction ^= 1;
1132 } break; 1153 } break;
1133 case 3: { 1154 case 3: {
1134 sequences[channel_selection_loc][trig_selection_loc].duty_cycle = CLAMP( 1155 trig->duty_cycle = MAX(trig->duty_cycle - 1, 0);
1135 sequences[channel_selection_loc][trig_selection_loc].duty_cycle - 1, 0, 3);
1136 } break; 1156 } break;
1137 case 4: { 1157 case 4: {
1138 sequences[channel_selection_loc][trig_selection_loc].sweep_number = CLAMP( 1158 trig->sweep_number = MAX(trig->sweep_number - 1, 0);
1139 sequences[channel_selection_loc][trig_selection_loc].sweep_number - 1, 0, 7);
1140 } break; 1159 } break;
1141 case 5: { 1160 case 5: {
1142 sequences[channel_selection_loc][trig_selection_loc].sweep_time = CLAMP( 1161 trig->sweep_time = MAX(trig->sweep_time - 1, 0);
1143 sequences[channel_selection_loc][trig_selection_loc].sweep_time - 1, 0, 7);
1144 } break; 1162 } break;
1145 case 6: { 1163 case 6: {
1146 if (sequences[channel_selection_loc][trig_selection_loc].sweep_direction == 0) { 1164 if (trig->sweep_direction == 0) {
1147 sequences[channel_selection_loc][trig_selection_loc].sweep_direction = 1; 1165 trig->sweep_direction = 1;
1148 } else { 1166 } else {
1149 sequences[channel_selection_loc][trig_selection_loc].sweep_direction = 0; 1167 trig->sweep_direction = 0;
1150 } 1168 }
1151 } break; 1169 } break;
1152 } 1170 }
@@ -1154,30 +1172,25 @@ handle_sequencer_input(void) {
1154 if (key_pressed(KEY_R)) { 1172 if (key_pressed(KEY_R)) {
1155 switch (param_selection_loc) { 1173 switch (param_selection_loc) {
1156 case 0: { 1174 case 0: {
1157 sequences[channel_selection_loc][trig_selection_loc].env_volume = CLAMP( 1175 trig->env_volume = MIN(trig->env_volume + 1, 15);
1158 sequences[channel_selection_loc][trig_selection_loc].env_volume + 1, 0, 15);
1159 } break; 1176 } break;
1160 case 1: { 1177 case 1: {
1161 sequences[channel_selection_loc][trig_selection_loc].env_time = CLAMP( 1178 trig->env_time = MIN(trig->env_time + 1, 7);
1162 sequences[channel_selection_loc][trig_selection_loc].env_time + 1, 0, 7);
1163 } break; 1179 } break;
1164 case 2: { 1180 case 2: {
1165 sequences[channel_selection_loc][trig_selection_loc].env_direction ^= 1; 1181 trig->env_direction ^= 1;
1166 } break; 1182 } break;
1167 case 3: { 1183 case 3: {
1168 sequences[channel_selection_loc][trig_selection_loc].duty_cycle = CLAMP( 1184 trig->duty_cycle = MIN(trig->duty_cycle + 1, 3);
1169 sequences[channel_selection_loc][trig_selection_loc].duty_cycle + 1, 0, 3);
1170 } break; 1185 } break;
1171 case 4: { 1186 case 4: {
1172 sequences[channel_selection_loc][trig_selection_loc].sweep_number = CLAMP( 1187 trig->sweep_number = MIN(trig->sweep_number + 1, 7);
1173 sequences[channel_selection_loc][trig_selection_loc].sweep_number + 1, 0, 7);
1174 } break; 1188 } break;
1175 case 5: { 1189 case 5: {
1176 sequences[channel_selection_loc][trig_selection_loc].sweep_time = CLAMP( 1190 trig->sweep_time = MIN(trig->sweep_time + 1, 7);
1177 sequences[channel_selection_loc][trig_selection_loc].sweep_time + 1, 0, 7);
1178 } break; 1191 } break;
1179 case 6: { 1192 case 6: {
1180 sequences[channel_selection_loc][trig_selection_loc].sweep_direction ^= 1; 1193 trig->sweep_direction ^= 1;
1181 } break; 1194 } break;
1182 } 1195 }
1183 } 1196 }
@@ -1189,7 +1202,7 @@ handle_sequencer_input(void) {
1189 1202
1190 // Enable disable trigger. 1203 // Enable disable trigger.
1191 if (key_pressed(KEY_B)) { 1204 if (key_pressed(KEY_B)) {
1192 sequences[channel_selection_loc][trig_selection_loc].trigger ^= 1; 1205 trig->trigger ^= 1;
1193 } 1206 }
1194 } else if (current_selection == SEQ_SELECT_CHANNEL) { 1207 } else if (current_selection == SEQ_SELECT_CHANNEL) {
1195 if (key_pressed(KEY_RIGHT)) { 1208 if (key_pressed(KEY_RIGHT)) {
@@ -1200,14 +1213,14 @@ handle_sequencer_input(void) {
1200 if (channel_selection_loc == 0) { 1213 if (channel_selection_loc == 0) {
1201 channel_selection_loc = SEQ_N_CHANNELS - 1; 1214 channel_selection_loc = SEQ_N_CHANNELS - 1;
1202 } else { 1215 } else {
1203 channel_selection_loc = CLAMP(channel_selection_loc - 1, 0, SEQ_N_CHANNELS); 1216 channel_selection_loc = MAX(channel_selection_loc - 1, 0);
1204 } 1217 }
1205 } 1218 }
1206 if (key_pressed(KEY_DOWN)) { 1219 if (key_pressed(KEY_DOWN)) {
1207 if (channel_selection_loc == SEQ_N_CHANNELS - 1) { 1220 if (channel_selection_loc == SEQ_N_CHANNELS - 1) {
1208 channel_selection_loc = 0; 1221 channel_selection_loc = 0;
1209 } else { 1222 } else {
1210 channel_selection_loc = CLAMP(channel_selection_loc + 1, 0, SEQ_N_CHANNELS); 1223 channel_selection_loc = MIN(channel_selection_loc + 1, SEQ_N_CHANNELS);
1211 } 1224 }
1212 } 1225 }
1213 } 1226 }