diff options
author | Bad Diode <bd@badd10de.dev> | 2021-05-06 16:17:06 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-05-06 16:17:06 +0200 |
commit | 6a3a8d96327d79100455e80374f7fbe008570649 (patch) | |
tree | 23f7e0184729bb08679c377efad635534fe6e723 | |
parent | fb00cfba1c80f64be48fa543b94d626c958e20e6 (diff) | |
download | gba-experiments-6a3a8d96327d79100455e80374f7fbe008570649.tar.gz gba-experiments-6a3a8d96327d79100455e80374f7fbe008570649.zip |
Clean up parameter selection and rendering for Ch. 1-2
-rw-r--r-- | src/sequencer.c | 101 |
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 | ||
1073 | void | 1091 | void |
1074 | handle_sequencer_input(void) { | 1092 | handle_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 | } |