aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-01-08 11:05:05 +0100
committerBad Diode <bd@badd10de.dev>2024-01-08 11:05:05 +0100
commit666135619b653accd72e940d4405871c6c5f453b (patch)
tree358a9ec4798eb2be6716111a497f62a34319dc4f
parentd9f6f7f7636cb989470282370800aa23d80c432e (diff)
downloadstepper-666135619b653accd72e940d4405871c6c5f453b.tar.gz
stepper-666135619b653accd72e940d4405871c6c5f453b.zip
Fix channel params behaviour to be as expected
-rw-r--r--src/drawing.c255
-rw-r--r--src/main.c4
-rw-r--r--src/sequencer.c103
-rw-r--r--src/settings.c1
4 files changed, 280 insertions, 83 deletions
diff --git a/src/drawing.c b/src/drawing.c
index 048b4de..2368627 100644
--- a/src/drawing.c
+++ b/src/drawing.c
@@ -921,9 +921,38 @@ draw_panning(s8 pan, u8 clr) {
921IWRAM_CODE 921IWRAM_CODE
922void 922void
923draw_parameters_wave(ChannelWaveParams *params, bool global) { 923draw_parameters_wave(ChannelWaveParams *params, bool global) {
924 u8 col_fg = COL_FG; 924 u8 cols[10] = {
925 COL_FG, COL_FG, COL_FG, COL_FG, COL_FG,
926 COL_FG, COL_FG, COL_FG, COL_FG, COL_FG,
927 };
925 if (global && input_handler == handle_channel_selection) { 928 if (global && input_handler == handle_channel_selection) {
926 col_fg = COL_OFF; 929 for (size_t i = 0; i < 16; i++) {
930 ChannelWaveParams *trig_params = &patterns[pattern_selection_loc].ch3.params[i];
931 if (params->shape_a != trig_params->shape_a) {
932 cols[0] = COL_OFF;
933 }
934 if (params->type_a != trig_params->type_a) {
935 cols[1] = COL_OFF;
936 }
937 if (params->shape_b != trig_params->shape_b) {
938 cols[2] = COL_OFF;
939 }
940 if (params->type_b != trig_params->type_b) {
941 cols[3] = COL_OFF;
942 }
943 if (params->prob != trig_params->prob) {
944 cols[4] = COL_OFF;
945 }
946 if (params->wave_mode != trig_params->wave_mode) {
947 cols[5] = COL_OFF;
948 }
949 if (params->wave_volume != trig_params->wave_volume) {
950 cols[6] = COL_OFF;
951 }
952 if (params->pan != trig_params->pan) {
953 cols[9] = COL_OFF;
954 }
955 }
927 } 956 }
928 957
929 // Draw current wave data. 958 // Draw current wave data.
@@ -932,26 +961,26 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) {
932 size_t y = PARAMS_START_Y; 961 size_t y = PARAMS_START_Y;
933 962
934 // Wave Patterns. 963 // Wave Patterns.
935 u8 col_wave_a = col_fg != COL_OFF && (params->wave_mode == 0 || params->wave_mode == 2) ? COL_ACC_1 : COL_OFF; 964 u8 col_wave_a = cols[0] != COL_OFF && cols[1] != COL_OFF && (params->wave_mode == 0 || params->wave_mode == 2) ? COL_ACC_1 : COL_OFF;
936 u8 col_wave_b = col_fg != COL_OFF && (params->wave_mode == 1 || params->wave_mode == 2) ? COL_ACC_2 : COL_OFF; 965 u8 col_wave_b = cols[2] != COL_OFF && cols[3] != COL_OFF && (params->wave_mode == 1 || params->wave_mode == 2) ? COL_ACC_2 : COL_OFF;
937 draw_wave_pattern(waves[params->shape_a][params->type_a], x, y, col_wave_a); 966 draw_wave_pattern(waves[params->shape_a][params->type_a], x, y, col_wave_a);
938 draw_wave_pattern(waves[params->shape_b][params->type_b], x + PARAMS_BOX_OFFSET_X * 2, y, col_wave_b); 967 draw_wave_pattern(waves[params->shape_b][params->type_b], x + PARAMS_BOX_OFFSET_X * 2, y, col_wave_b);
939 } 968 }
940 969
941 // Trig probability. 970 // Trig probability.
942 draw_prob(params->prob, col_fg); 971 draw_prob(params->prob, cols[4]);
943 972
944 // Trig pannning. 973 // Trig pannning.
945 draw_panning(params->pan, col_fg); 974 draw_panning(params->pan, cols[9]);
946 975
947 // Mode selection. 976 // Mode selection.
948 { 977 {
949 size_t x = PARAMS_START_X; 978 size_t x = PARAMS_START_X;
950 size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y; 979 size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y;
951 switch (params->wave_mode) { 980 switch (params->wave_mode) {
952 case 0: { txt_drawf("A", x + 12, y + 5, col_fg); } break; 981 case 0: { txt_drawf("A", x + 12, y + 5, cols[5]); } break;
953 case 1: { txt_drawf("B", x + 12, y + 5, col_fg); } break; 982 case 1: { txt_drawf("B", x + 12, y + 5, cols[5]); } break;
954 case 2: { txt_drawf("A+B", x + 6, y + 5, col_fg); } break; 983 case 2: { txt_drawf("A+B", x + 6, y + 5, cols[5]); } break;
955 } 984 }
956 } 985 }
957 986
@@ -961,24 +990,24 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) {
961 size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y + 5; 990 size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y + 5;
962 switch (params->wave_volume) { 991 switch (params->wave_volume) {
963 case 0: { 992 case 0: {
964 txt_drawf("0", x + 6, y, col_fg); 993 txt_drawf("0", x + 6, y, cols[6]);
965 txt_drawc('%', x + 12, y, col_fg); 994 txt_drawc('%', x + 12, y, cols[6]);
966 } break; 995 } break;
967 case 1: { 996 case 1: {
968 txt_drawf("25", x + 3, y, col_fg); 997 txt_drawf("25", x + 3, y, cols[6]);
969 txt_drawc('%', x + 15, y, col_fg); 998 txt_drawc('%', x + 15, y, cols[6]);
970 } break; 999 } break;
971 case 2: { 1000 case 2: {
972 txt_drawf("50", x + 3, y, col_fg); 1001 txt_drawf("50", x + 3, y, cols[6]);
973 txt_drawc('%', x + 15, y, col_fg); 1002 txt_drawc('%', x + 15, y, cols[6]);
974 } break; 1003 } break;
975 case 3: { 1004 case 3: {
976 txt_drawf("75", x + 3, y, col_fg); 1005 txt_drawf("75", x + 3, y, cols[6]);
977 txt_drawc('%', x + 15, y, col_fg); 1006 txt_drawc('%', x + 15, y, cols[6]);
978 } break; 1007 } break;
979 case 4: { 1008 case 4: {
980 txt_drawf("100", x, y, col_fg); 1009 txt_drawf("100", x, y, cols[6]);
981 txt_drawc('%', x + 18, y, col_fg); 1010 txt_drawc('%', x + 18, y, cols[6]);
982 } break; 1011 } break;
983 } 1012 }
984 } 1013 }
@@ -987,15 +1016,15 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) {
987 { 1016 {
988 size_t x = PARAMS_START_X; 1017 size_t x = PARAMS_START_X;
989 size_t y = PARAMS_START_Y; 1018 size_t y = PARAMS_START_Y;
990 txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); 1019 txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[0]);
991 txt_drawf_small("type", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); 1020 txt_drawf_small("type", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[1]);
992 txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg); 1021 txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[2]);
993 txt_drawf_small("type", x + 6 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, col_fg); 1022 txt_drawf_small("type", x + 6 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[3]);
994 txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); 1023 txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[4]);
995 y += PARAMS_BOX_OFFSET_Y; 1024 y += PARAMS_BOX_OFFSET_Y;
996 txt_drawf_small("voice", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); 1025 txt_drawf_small("voice", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[5]);
997 txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); 1026 txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[6]);
998 txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); 1027 txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]);
999 } 1028 }
1000 1029
1001 // Empty spacers. 1030 // Empty spacers.
@@ -1007,9 +1036,51 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) {
1007 1036
1008void 1037void
1009draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { 1038draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
1010 u8 col_fg = COL_FG; 1039 u8 cols[10] = {
1040 COL_FG, COL_FG, COL_FG, COL_FG, COL_FG,
1041 COL_FG, COL_FG, COL_FG, COL_FG, COL_FG,
1042 };
1043
1044 // Adjust colors for global trigger parameters.
1011 if (global && input_handler == handle_channel_selection) { 1045 if (global && input_handler == handle_channel_selection) {
1012 col_fg = COL_OFF; 1046 for (size_t i = 0; i < 16; i++) {
1047 ChannelSquareParams *trig_params;
1048 if (sweep) {
1049 trig_params = &patterns[pattern_selection_loc].ch1.params[i];
1050 } else {
1051 trig_params = &patterns[pattern_selection_loc].ch2.params[i];
1052 }
1053 if (params->duty_cycle != trig_params->duty_cycle) {
1054 cols[0] = COL_OFF;
1055 }
1056 if (params->env_volume != trig_params->env_volume) {
1057 cols[1] = COL_OFF;
1058 }
1059 if (params->env_time != trig_params->env_time) {
1060 cols[2] = COL_OFF;
1061 }
1062 if (params->env_direction != trig_params->env_direction) {
1063 cols[3] = COL_OFF;
1064 }
1065 if (params->env_direction != trig_params->env_direction) {
1066 cols[3] = COL_OFF;
1067 }
1068 if (params->prob != trig_params->prob) {
1069 cols[4] = COL_OFF;
1070 }
1071 if (params->sweep_number != trig_params->sweep_number) {
1072 cols[5] = COL_OFF;
1073 }
1074 if (params->sweep_time != trig_params->sweep_time) {
1075 cols[6] = COL_OFF;
1076 }
1077 if (params->sweep_direction != trig_params->sweep_direction) {
1078 cols[7] = COL_OFF;
1079 }
1080 if (params->pan != trig_params->pan) {
1081 cols[9] = COL_OFF;
1082 }
1083 }
1013 } 1084 }
1014 1085
1015 // Duty cycle / shape. 1086 // Duty cycle / shape.
@@ -1056,7 +1127,7 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
1056 x5 += 20; 1127 x5 += 20;
1057 } break; 1128 } break;
1058 } 1129 }
1059 u8 col_shape = col_fg != COL_OFF ? COL_ACC_1 : COL_OFF; 1130 u8 col_shape = cols[0] != COL_OFF ? COL_ACC_1 : COL_OFF;
1060 draw_line(x0, y0, x1, y0, col_shape); 1131 draw_line(x0, y0, x1, y0, col_shape);
1061 draw_line(x1, y1, x1, y0, col_shape); 1132 draw_line(x1, y1, x1, y0, col_shape);
1062 draw_line(x1, y1, x2, y1, col_shape); 1133 draw_line(x1, y1, x2, y1, col_shape);
@@ -1080,7 +1151,8 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
1080 size_t y2 = y1; 1151 size_t y2 = y1;
1081 1152
1082 // Env. 1153 // Env.
1083 u8 col_env = col_fg != COL_OFF ? COL_ACC_2 : COL_OFF; 1154 u8 col_env = cols[1] != COL_OFF && cols[2] != COL_OFF && cols[3] != COL_OFF
1155 ? COL_ACC_2 : COL_OFF;
1084 if (params->env_time == 0) { 1156 if (params->env_time == 0) {
1085 draw_line(x0, y0, x2, y0, col_env); 1157 draw_line(x0, y0, x2, y0, col_env);
1086 } else { 1158 } else {
@@ -1090,10 +1162,10 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
1090 } 1162 }
1091 1163
1092 // Trig probability. 1164 // Trig probability.
1093 draw_prob(params->prob, col_fg); 1165 draw_prob(params->prob, cols[4]);
1094 1166
1095 // Trig pannning. 1167 // Trig pannning.
1096 draw_panning(params->pan, col_fg); 1168 draw_panning(params->pan, cols[9]);
1097 1169
1098 // Sweep. 1170 // Sweep.
1099 if (sweep) { 1171 if (sweep) {
@@ -1105,34 +1177,36 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
1105 u8 x1 = x + PARAMS_BOX_OFFSET_X * 3 - 5; 1177 u8 x1 = x + PARAMS_BOX_OFFSET_X * 3 - 5;
1106 u8 y0 = y + 2; 1178 u8 y0 = y + 2;
1107 u8 y1 = y + PARAMS_BOX_H - 8; 1179 u8 y1 = y + PARAMS_BOX_H - 8;
1108 draw_line(x0, y0, x1, y0, col_fg); 1180 u8 col_box = cols[5] != COL_OFF && cols[6] != COL_OFF && cols[7] != COL_OFF
1109 draw_line(x0, y1, x1, y1, col_fg); 1181 ? COL_FG : COL_OFF;
1110 draw_line(x0 - 1, y0 + 1, x0 - 1, y1 - 1, col_fg); 1182 draw_line(x0, y0, x1, y0, col_box);
1111 draw_line(x1 + 1, y0 + 1, x1 + 1, y1 - 1, col_fg); 1183 draw_line(x0, y1, x1, y1, col_box);
1184 draw_line(x0 - 1, y0 + 1, x0 - 1, y1 - 1, col_box);
1185 draw_line(x1 + 1, y0 + 1, x1 + 1, y1 - 1, col_box);
1112 1186
1113 // Number. 1187 // Number.
1114 switch (params->sweep_number) { 1188 switch (params->sweep_number) {
1115 case 0: { txt_drawf("0", x + 12, y + 5, col_fg); } break; 1189 case 0: { txt_drawf("0", x + 12, y + 5, cols[5]); } break;
1116 case 1: { txt_drawf("1", x + 12, y + 5, col_fg); } break; 1190 case 1: { txt_drawf("1", x + 12, y + 5, cols[5]); } break;
1117 case 2: { txt_drawf("2", x + 12, y + 5, col_fg); } break; 1191 case 2: { txt_drawf("2", x + 12, y + 5, cols[5]); } break;
1118 case 3: { txt_drawf("3", x + 12, y + 5, col_fg); } break; 1192 case 3: { txt_drawf("3", x + 12, y + 5, cols[5]); } break;
1119 case 4: { txt_drawf("4", x + 12, y + 5, col_fg); } break; 1193 case 4: { txt_drawf("4", x + 12, y + 5, cols[5]); } break;
1120 case 5: { txt_drawf("5", x + 12, y + 5, col_fg); } break; 1194 case 5: { txt_drawf("5", x + 12, y + 5, cols[5]); } break;
1121 case 6: { txt_drawf("6", x + 12, y + 5, col_fg); } break; 1195 case 6: { txt_drawf("6", x + 12, y + 5, cols[5]); } break;
1122 case 7: { txt_drawf("7", x + 12, y + 5, col_fg); } break; 1196 case 7: { txt_drawf("7", x + 12, y + 5, cols[5]); } break;
1123 } 1197 }
1124 1198
1125 // Time. 1199 // Time.
1126 x += PARAMS_BOX_OFFSET_X; 1200 x += PARAMS_BOX_OFFSET_X;
1127 switch (params->sweep_time) { 1201 switch (params->sweep_time) {
1128 case 0: { txt_drawf("Off", x + 6, y + 5, col_fg); } break; 1202 case 0: { txt_drawf("Off", x + 6, y + 5, cols[6]); } break;
1129 case 1: { txt_drawf("7ms", x + 6, y + 5, col_fg); } break; 1203 case 1: { txt_drawf("7ms", x + 6, y + 5, cols[6]); } break;
1130 case 2: { txt_drawf("15ms", x + 3, y + 5, col_fg); } break; 1204 case 2: { txt_drawf("15ms", x + 3, y + 5, cols[6]); } break;
1131 case 3: { txt_drawf("23ms", x + 3, y + 5, col_fg); } break; 1205 case 3: { txt_drawf("23ms", x + 3, y + 5, cols[6]); } break;
1132 case 4: { txt_drawf("31ms", x + 3, y + 5, col_fg); } break; 1206 case 4: { txt_drawf("31ms", x + 3, y + 5, cols[6]); } break;
1133 case 5: { txt_drawf("39ms", x + 3, y + 5, col_fg); } break; 1207 case 5: { txt_drawf("39ms", x + 3, y + 5, cols[6]); } break;
1134 case 6: { txt_drawf("46ms", x + 3, y + 5, col_fg); } break; 1208 case 6: { txt_drawf("46ms", x + 3, y + 5, cols[6]); } break;
1135 case 7: { txt_drawf("54ms", x + 3, y + 5, col_fg); } break; 1209 case 7: { txt_drawf("54ms", x + 3, y + 5, cols[6]); } break;
1136 } 1210 }
1137 1211
1138 // Direction. 1212 // Direction.
@@ -1140,8 +1214,8 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
1140 char arr_down[2] = { 0x19, 0 }; 1214 char arr_down[2] = { 0x19, 0 };
1141 char arr_up[2] = { 0x18, 0 }; 1215 char arr_up[2] = { 0x18, 0 };
1142 switch (params->sweep_direction) { 1216 switch (params->sweep_direction) {
1143 case 0: { txt_drawf(arr_up, x + 12, y + 5, col_fg); } break; 1217 case 0: { txt_drawf(arr_up, x + 12, y + 5, cols[7]); } break;
1144 case 1: { txt_drawf(arr_down, x + 12, y + 5, col_fg); } break; 1218 case 1: { txt_drawf(arr_down, x + 12, y + 5, cols[7]); } break;
1145 } 1219 }
1146 } 1220 }
1147 1221
@@ -1149,18 +1223,18 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
1149 { 1223 {
1150 size_t x = PARAMS_START_X; 1224 size_t x = PARAMS_START_X;
1151 size_t y = PARAMS_START_Y; 1225 size_t y = PARAMS_START_Y;
1152 txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); 1226 txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[0]);
1153 txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); 1227 txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[1]);
1154 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg); 1228 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[2]);
1155 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, col_fg); 1229 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[3]);
1156 txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); 1230 txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[4]);
1157 y += PARAMS_BOX_OFFSET_Y; 1231 y += PARAMS_BOX_OFFSET_Y;
1158 if (sweep) { 1232 if (sweep) {
1159 txt_drawf_small("sweep", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); 1233 txt_drawf_small("sweep", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[5]);
1160 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); 1234 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[6]);
1161 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg); 1235 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[7]);
1162 } 1236 }
1163 txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); 1237 txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]);
1164 } 1238 }
1165 1239
1166 // Empty spacers. 1240 // Empty spacers.
@@ -1176,9 +1250,35 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
1176 1250
1177void 1251void
1178draw_parameters_noise(ChannelNoiseParams* params, bool global) { 1252draw_parameters_noise(ChannelNoiseParams* params, bool global) {
1179 u8 col_fg = COL_FG; 1253 u8 cols[10] = {
1254 COL_FG, COL_FG, COL_FG, COL_FG, COL_FG,
1255 COL_FG, COL_FG, COL_FG, COL_FG, COL_FG,
1256 };
1180 if (global && input_handler == handle_channel_selection) { 1257 if (global && input_handler == handle_channel_selection) {
1181 col_fg = COL_OFF; 1258 for (size_t i = 0; i < 16; i++) {
1259 ChannelNoiseParams *trig_params = &patterns[pattern_selection_loc].ch4.params[i];
1260 if (params->bit_mode != trig_params->bit_mode) {
1261 cols[0] = COL_OFF;
1262 }
1263 if (params->env_volume != trig_params->env_volume) {
1264 cols[1] = COL_OFF;
1265 }
1266 if (params->env_time != trig_params->env_time) {
1267 cols[2] = COL_OFF;
1268 }
1269 if (params->env_direction != trig_params->env_direction) {
1270 cols[3] = COL_OFF;
1271 }
1272 if (params->env_direction != trig_params->env_direction) {
1273 cols[3] = COL_OFF;
1274 }
1275 if (params->prob != trig_params->prob) {
1276 cols[4] = COL_OFF;
1277 }
1278 if (params->pan != trig_params->pan) {
1279 cols[9] = COL_OFF;
1280 }
1281 }
1182 } 1282 }
1183 1283
1184 // Mode. 1284 // Mode.
@@ -1186,8 +1286,8 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) {
1186 size_t x = PARAMS_START_X; 1286 size_t x = PARAMS_START_X;
1187 size_t y = PARAMS_START_Y; 1287 size_t y = PARAMS_START_Y;
1188 switch (params->bit_mode) { 1288 switch (params->bit_mode) {
1189 case 0: { txt_drawf("A", x + 12, y + 5, col_fg); } break; 1289 case 0: { txt_drawf("A", x + 12, y + 5, cols[0]); } break;
1190 case 1: { txt_drawf("B", x + 12, y + 5, col_fg); } break; 1290 case 1: { txt_drawf("B", x + 12, y + 5, cols[0]); } break;
1191 } 1291 }
1192 } 1292 }
1193 1293
@@ -1203,7 +1303,8 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) {
1203 size_t y2 = y1; 1303 size_t y2 = y1;
1204 1304
1205 // Env. 1305 // Env.
1206 u8 col_env = col_fg != COL_OFF ? COL_ACC_2 : COL_OFF; 1306 u8 col_env = cols[1] != COL_OFF && cols[2] != COL_OFF && cols[3] != COL_OFF
1307 ? COL_ACC_2 : COL_OFF;
1207 if (params->env_time == 0) { 1308 if (params->env_time == 0) {
1208 draw_line(x0, y0, x2, y0, col_env); 1309 draw_line(x0, y0, x2, y0, col_env);
1209 } else { 1310 } else {
@@ -1213,22 +1314,22 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) {
1213 } 1314 }
1214 1315
1215 // Trig probability. 1316 // Trig probability.
1216 draw_prob(params->prob, col_fg); 1317 draw_prob(params->prob, cols[4]);
1217 1318
1218 // Trig pannning. 1319 // Trig pannning.
1219 draw_panning(params->pan, col_fg); 1320 draw_panning(params->pan, cols[9]);
1220 1321
1221 // Labels. 1322 // Labels.
1222 { 1323 {
1223 size_t x = PARAMS_START_X; 1324 size_t x = PARAMS_START_X;
1224 size_t y = PARAMS_START_Y; 1325 size_t y = PARAMS_START_Y;
1225 txt_drawf_small("mode", x + 6 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); 1326 txt_drawf_small("mode", x + 6 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[0]);
1226 txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); 1327 txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[1]);
1227 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg); 1328 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[2]);
1228 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, col_fg); 1329 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[3]);
1229 txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); 1330 txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[4]);
1230 y += PARAMS_BOX_OFFSET_Y; 1331 y += PARAMS_BOX_OFFSET_Y;
1231 txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); 1332 txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]);
1232 } 1333 }
1233 1334
1234 // Empty spacers. 1335 // Empty spacers.
diff --git a/src/main.c b/src/main.c
index 5907a30..597f01d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -18,8 +18,10 @@ WITH REGARD TO THIS SOFTWARE.
18// + Fix bank switching behaviour (bug) 18// + Fix bank switching behaviour (bug)
19// + Add more sync options 19// + Add more sync options
20// + When switching sync, play status acts wonky (bug) 20// + When switching sync, play status acts wonky (bug)
21// - Channel params should show if there are some already on all triggers and 21// + Channel params should show if there are some already on all triggers and
22// modify only the selected parameter, not all of them. 22// modify only the selected parameter, not all of them.
23// + Channel params (ALL) editing should only copy the value under the cursor.
24// - Fix scale being active for noise channel (makes no sense)
23// - Should scale mode be toggleable? 25// - Should scale mode be toggleable?
24// - Save scale on the bank 26// - Save scale on the bank
25// - Hold L/R retriggers at short intervals? 27// - Hold L/R retriggers at short intervals?
diff --git a/src/sequencer.c b/src/sequencer.c
index e452822..fed33cb 100644
--- a/src/sequencer.c
+++ b/src/sequencer.c
@@ -1316,7 +1316,36 @@ handle_param_selection_ch1() {
1316 Pattern *pat = &patterns[pattern_selection_loc]; 1316 Pattern *pat = &patterns[pattern_selection_loc];
1317 if (set_param_selection_sq1(&ch1_params, handle_channel_selection)) { 1317 if (set_param_selection_sq1(&ch1_params, handle_channel_selection)) {
1318 for (size_t i = 0; i < 16; i++) { 1318 for (size_t i = 0; i < 16; i++) {
1319 pat->ch1.params[i] = ch1_params; 1319 switch (param_selection_loc) {
1320 case 0: {
1321 pat->ch1.params[i].duty_cycle = ch1_params.duty_cycle;
1322 } break;
1323 case 1: {
1324 pat->ch1.params[i].env_volume = ch1_params.env_volume;
1325 } break;
1326 case 2: {
1327 pat->ch1.params[i].env_time = ch1_params.env_time;
1328 } break;
1329 case 3: {
1330 pat->ch1.params[i].env_direction = ch1_params.env_direction;
1331 } break;
1332 case 4: {
1333 pat->ch1.params[i].prob = ch1_params.prob;
1334 } break;
1335 case 5: {
1336 pat->ch1.params[i].sweep_number = ch1_params.sweep_number;
1337 } break;
1338 case 6: {
1339 pat->ch1.params[i].sweep_time = ch1_params.sweep_time;
1340 } break;
1341 case 7: {
1342 pat->ch1.params[i].sweep_direction = ch1_params.sweep_direction;
1343 } break;
1344 case 9: {
1345 pat->ch1.params[i].pan = ch1_params.pan;
1346 } break;
1347 default: break;
1348 }
1320 } 1349 }
1321 } 1350 }
1322} 1351}
@@ -1326,7 +1355,27 @@ handle_param_selection_ch2() {
1326 Pattern *pat = &patterns[pattern_selection_loc]; 1355 Pattern *pat = &patterns[pattern_selection_loc];
1327 if (set_param_selection_sq2(&ch2_params, handle_channel_selection)) { 1356 if (set_param_selection_sq2(&ch2_params, handle_channel_selection)) {
1328 for (size_t i = 0; i < 16; i++) { 1357 for (size_t i = 0; i < 16; i++) {
1329 pat->ch2.params[i] = ch2_params; 1358 switch (param_selection_loc) {
1359 case 0: {
1360 pat->ch2.params[i].duty_cycle = ch2_params.duty_cycle;
1361 } break;
1362 case 1: {
1363 pat->ch2.params[i].env_volume = ch2_params.env_volume;
1364 } break;
1365 case 2: {
1366 pat->ch2.params[i].env_time = ch2_params.env_time;
1367 } break;
1368 case 3: {
1369 pat->ch2.params[i].env_direction = ch2_params.env_direction;
1370 } break;
1371 case 4: {
1372 pat->ch2.params[i].prob = ch2_params.prob;
1373 } break;
1374 case 9: {
1375 pat->ch2.params[i].pan = ch2_params.pan;
1376 } break;
1377 default: break;
1378 }
1330 } 1379 }
1331 } 1380 }
1332} 1381}
@@ -1336,7 +1385,33 @@ handle_param_selection_ch3() {
1336 Pattern *pat = &patterns[pattern_selection_loc]; 1385 Pattern *pat = &patterns[pattern_selection_loc];
1337 if (set_param_selection_wave(&ch3_params, handle_channel_selection)) { 1386 if (set_param_selection_wave(&ch3_params, handle_channel_selection)) {
1338 for (size_t i = 0; i < 16; i++) { 1387 for (size_t i = 0; i < 16; i++) {
1339 pat->ch3.params[i] = ch3_params; 1388 switch (param_selection_loc) {
1389 case 0: {
1390 pat->ch3.params[i].shape_a = ch3_params.shape_a;
1391 } break;
1392 case 1: {
1393 pat->ch3.params[i].type_a = ch3_params.type_a;
1394 } break;
1395 case 2: {
1396 pat->ch3.params[i].shape_b = ch3_params.shape_b;
1397 } break;
1398 case 3: {
1399 pat->ch3.params[i].type_b = ch3_params.type_b;
1400 } break;
1401 case 4: {
1402 pat->ch3.params[i].prob = ch3_params.prob;
1403 } break;
1404 case 5: {
1405 pat->ch3.params[i].wave_mode = ch3_params.wave_mode;
1406 } break;
1407 case 6: {
1408 pat->ch3.params[i].wave_volume = ch3_params.wave_volume;
1409 } break;
1410 case 9: {
1411 pat->ch3.params[i].pan = ch3_params.pan;
1412 } break;
1413 default: break;
1414 }
1340 } 1415 }
1341 } 1416 }
1342} 1417}
@@ -1346,7 +1421,27 @@ handle_param_selection_ch4() {
1346 Pattern *pat = &patterns[pattern_selection_loc]; 1421 Pattern *pat = &patterns[pattern_selection_loc];
1347 if (set_param_selection_noise(&ch4_params, handle_channel_selection)) { 1422 if (set_param_selection_noise(&ch4_params, handle_channel_selection)) {
1348 for (size_t i = 0; i < 16; i++) { 1423 for (size_t i = 0; i < 16; i++) {
1349 pat->ch4.params[i] = ch4_params; 1424 switch (param_selection_loc) {
1425 case 0: {
1426 pat->ch4.params[i].bit_mode = ch4_params.bit_mode;
1427 } break;
1428 case 1: {
1429 pat->ch4.params[i].env_volume = ch4_params.env_volume;
1430 } break;
1431 case 2: {
1432 pat->ch4.params[i].env_time = ch4_params.env_time;
1433 } break;
1434 case 3: {
1435 pat->ch4.params[i].env_direction = ch4_params.env_direction;
1436 } break;
1437 case 4: {
1438 pat->ch4.params[i].prob = ch4_params.prob;
1439 } break;
1440 case 9: {
1441 pat->ch4.params[i].pan = ch4_params.pan;
1442 } break;
1443 default: break;
1444 }
1350 } 1445 }
1351 } 1446 }
1352} 1447}
diff --git a/src/settings.c b/src/settings.c
index 0ed3905..7e86be7 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -13,7 +13,6 @@ void sync_in_48(void);
13void sync_in_24(void); 13void sync_in_24(void);
14void sync_in_12(void); 14void sync_in_12(void);
15void sync_in_4(void); 15void sync_in_4(void);
16void stop_sound(void);
17void toggle_playing(void); 16void toggle_playing(void);
18void stop_playing(void); 17void stop_playing(void);
19 18