diff options
author | Bad Diode <bd@badd10de.dev> | 2024-01-08 11:05:05 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-01-08 11:05:05 +0100 |
commit | 666135619b653accd72e940d4405871c6c5f453b (patch) | |
tree | 358a9ec4798eb2be6716111a497f62a34319dc4f | |
parent | d9f6f7f7636cb989470282370800aa23d80c432e (diff) | |
download | stepper-666135619b653accd72e940d4405871c6c5f453b.tar.gz stepper-666135619b653accd72e940d4405871c6c5f453b.zip |
Fix channel params behaviour to be as expected
-rw-r--r-- | src/drawing.c | 255 | ||||
-rw-r--r-- | src/main.c | 4 | ||||
-rw-r--r-- | src/sequencer.c | 103 | ||||
-rw-r--r-- | src/settings.c | 1 |
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) { | |||
921 | IWRAM_CODE | 921 | IWRAM_CODE |
922 | void | 922 | void |
923 | draw_parameters_wave(ChannelWaveParams *params, bool global) { | 923 | draw_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 | ||
1008 | void | 1037 | void |
1009 | draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { | 1038 | draw_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 | ||
1177 | void | 1251 | void |
1178 | draw_parameters_noise(ChannelNoiseParams* params, bool global) { | 1252 | draw_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. |
@@ -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); | |||
13 | void sync_in_24(void); | 13 | void sync_in_24(void); |
14 | void sync_in_12(void); | 14 | void sync_in_12(void); |
15 | void sync_in_4(void); | 15 | void sync_in_4(void); |
16 | void stop_sound(void); | ||
17 | void toggle_playing(void); | 16 | void toggle_playing(void); |
18 | void stop_playing(void); | 17 | void stop_playing(void); |
19 | 18 | ||