diff options
Diffstat (limited to 'src/drawing.c')
-rw-r--r-- | src/drawing.c | 225 |
1 files changed, 194 insertions, 31 deletions
diff --git a/src/drawing.c b/src/drawing.c index 2368627..f18f094 100644 --- a/src/drawing.c +++ b/src/drawing.c | |||
@@ -681,6 +681,16 @@ draw_params_cursor_wave(size_t i, u8 clr) { | |||
681 | y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; | 681 | y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; |
682 | txt_drawf_small("vol", x, y, COL_BG); | 682 | txt_drawf_small("vol", x, y, COL_BG); |
683 | } break; | 683 | } break; |
684 | case 7: { | ||
685 | x += 2 + PARAMS_BOX_OFFSET_X * 2; | ||
686 | y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; | ||
687 | txt_drawf_small("attack", x, y, COL_BG); | ||
688 | } break; | ||
689 | case 8: { | ||
690 | x += 4 + PARAMS_BOX_OFFSET_X * 3; | ||
691 | y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; | ||
692 | txt_drawf_small("decay", x, y, COL_BG); | ||
693 | } break; | ||
684 | case 9: { | 694 | case 9: { |
685 | x += 8 + PARAMS_BOX_OFFSET_X * 4; | 695 | x += 8 + PARAMS_BOX_OFFSET_X * 4; |
686 | y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; | 696 | y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; |
@@ -1012,6 +1022,32 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { | |||
1012 | } | 1022 | } |
1013 | } | 1023 | } |
1014 | 1024 | ||
1025 | // Attack. | ||
1026 | { | ||
1027 | size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 2 + 3; | ||
1028 | size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y + 5; | ||
1029 | if (params->wave_attack == 0) { | ||
1030 | txt_drawf("OFF", x + 3, y, cols[6]); | ||
1031 | } else if (params->wave_attack < 10) { | ||
1032 | txt_drawf("%d", x + 8, y, cols[6], params->wave_attack); | ||
1033 | } else { | ||
1034 | txt_drawf("%d", x + 6, y, cols[6], params->wave_attack); | ||
1035 | } | ||
1036 | } | ||
1037 | |||
1038 | // Decay. | ||
1039 | { | ||
1040 | size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 3 + 3; | ||
1041 | size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y + 5; | ||
1042 | if (params->wave_decay == 0) { | ||
1043 | txt_drawf("OFF", x + 3, y, cols[6]); | ||
1044 | } else if (params->wave_decay < 10) { | ||
1045 | txt_drawf("%d", x + 8, y, cols[6], params->wave_decay); | ||
1046 | } else { | ||
1047 | txt_drawf("%d", x + 6, y, cols[6], params->wave_decay); | ||
1048 | } | ||
1049 | } | ||
1050 | |||
1015 | // Labels. | 1051 | // Labels. |
1016 | { | 1052 | { |
1017 | size_t x = PARAMS_START_X; | 1053 | size_t x = PARAMS_START_X; |
@@ -1024,18 +1060,14 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { | |||
1024 | y += PARAMS_BOX_OFFSET_Y; | 1060 | y += PARAMS_BOX_OFFSET_Y; |
1025 | txt_drawf_small("voice", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[5]); | 1061 | txt_drawf_small("voice", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[5]); |
1026 | txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[6]); | 1062 | txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[6]); |
1063 | txt_drawf_small("attack", x + 2 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[7]); | ||
1064 | txt_drawf_small("decay", x + 4 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[8]); | ||
1027 | txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]); | 1065 | txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]); |
1028 | } | 1066 | } |
1029 | |||
1030 | // Empty spacers. | ||
1031 | { | ||
1032 | draw_param_stub(7, COL_OFF); | ||
1033 | draw_param_stub(8, COL_OFF); | ||
1034 | } | ||
1035 | } | 1067 | } |
1036 | 1068 | ||
1037 | void | 1069 | void |
1038 | draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { | 1070 | draw_parameters_square1(ChannelSquare1Params *params, bool global) { |
1039 | u8 cols[10] = { | 1071 | u8 cols[10] = { |
1040 | COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, | 1072 | COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, |
1041 | COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, | 1073 | COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, |
@@ -1044,12 +1076,8 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { | |||
1044 | // Adjust colors for global trigger parameters. | 1076 | // Adjust colors for global trigger parameters. |
1045 | if (global && input_handler == handle_channel_selection) { | 1077 | if (global && input_handler == handle_channel_selection) { |
1046 | for (size_t i = 0; i < 16; i++) { | 1078 | for (size_t i = 0; i < 16; i++) { |
1047 | ChannelSquareParams *trig_params; | 1079 | ChannelSquare1Params *trig_params; |
1048 | if (sweep) { | 1080 | trig_params = &patterns[pattern_selection_loc].ch1.params[i]; |
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) { | 1081 | if (params->duty_cycle != trig_params->duty_cycle) { |
1054 | cols[0] = COL_OFF; | 1082 | cols[0] = COL_OFF; |
1055 | } | 1083 | } |
@@ -1168,7 +1196,7 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { | |||
1168 | draw_panning(params->pan, cols[9]); | 1196 | draw_panning(params->pan, cols[9]); |
1169 | 1197 | ||
1170 | // Sweep. | 1198 | // Sweep. |
1171 | if (sweep) { | 1199 | { |
1172 | size_t x = PARAMS_START_X; | 1200 | size_t x = PARAMS_START_X; |
1173 | size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y; | 1201 | size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y; |
1174 | 1202 | ||
@@ -1229,21 +1257,156 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { | |||
1229 | txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[3]); | 1257 | txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[3]); |
1230 | txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[4]); | 1258 | txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[4]); |
1231 | y += PARAMS_BOX_OFFSET_Y; | 1259 | y += PARAMS_BOX_OFFSET_Y; |
1232 | if (sweep) { | 1260 | txt_drawf_small("sweep", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[5]); |
1233 | txt_drawf_small("sweep", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[5]); | 1261 | txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[6]); |
1234 | txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[6]); | 1262 | txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[7]); |
1235 | txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[7]); | ||
1236 | } | ||
1237 | txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]); | 1263 | txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]); |
1238 | } | 1264 | } |
1239 | 1265 | ||
1240 | // Empty spacers. | 1266 | // Empty spacers. |
1241 | { | 1267 | { |
1242 | if (!sweep) { | 1268 | draw_param_stub(8, COL_OFF); |
1243 | draw_param_stub(5, COL_OFF); | 1269 | } |
1244 | draw_param_stub(6, COL_OFF); | 1270 | } |
1245 | draw_param_stub(7, COL_OFF); | 1271 | |
1272 | void | ||
1273 | draw_parameters_square2(ChannelSquare2Params *params, bool global) { | ||
1274 | u8 cols[10] = { | ||
1275 | COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, | ||
1276 | COL_FG, COL_FG, COL_FG, COL_FG, COL_FG, | ||
1277 | }; | ||
1278 | |||
1279 | // Adjust colors for global trigger parameters. | ||
1280 | if (global && input_handler == handle_channel_selection) { | ||
1281 | for (size_t i = 0; i < 16; i++) { | ||
1282 | ChannelSquare2Params *trig_params; | ||
1283 | trig_params = &patterns[pattern_selection_loc].ch2.params[i]; | ||
1284 | if (params->duty_cycle != trig_params->duty_cycle) { | ||
1285 | cols[0] = COL_OFF; | ||
1286 | } | ||
1287 | if (params->env_volume != trig_params->env_volume) { | ||
1288 | cols[1] = COL_OFF; | ||
1289 | } | ||
1290 | if (params->env_time != trig_params->env_time) { | ||
1291 | cols[2] = COL_OFF; | ||
1292 | } | ||
1293 | if (params->env_direction != trig_params->env_direction) { | ||
1294 | cols[3] = COL_OFF; | ||
1295 | } | ||
1296 | if (params->env_direction != trig_params->env_direction) { | ||
1297 | cols[3] = COL_OFF; | ||
1298 | } | ||
1299 | if (params->prob != trig_params->prob) { | ||
1300 | cols[4] = COL_OFF; | ||
1301 | } | ||
1302 | if (params->pan != trig_params->pan) { | ||
1303 | cols[9] = COL_OFF; | ||
1304 | } | ||
1246 | } | 1305 | } |
1306 | } | ||
1307 | |||
1308 | // Duty cycle / shape. | ||
1309 | { | ||
1310 | size_t x = PARAMS_START_X + 3; | ||
1311 | size_t y = PARAMS_START_Y + 1; | ||
1312 | |||
1313 | size_t x0 = x + 2; | ||
1314 | size_t x1 = x0; | ||
1315 | size_t x2 = x0; | ||
1316 | size_t x3 = x0; | ||
1317 | size_t x4 = x0; | ||
1318 | size_t x5 = x0; | ||
1319 | size_t y0 = y + 14; | ||
1320 | size_t y1 = y + 2; | ||
1321 | |||
1322 | switch (params->duty_cycle) { | ||
1323 | case 0: { | ||
1324 | x1 += 4; | ||
1325 | x2 += 6; | ||
1326 | x3 += 13; | ||
1327 | x4 += 15; | ||
1328 | x5 += 20; | ||
1329 | } break; | ||
1330 | case 1: { | ||
1331 | x1 += 4; | ||
1332 | x2 += 7; | ||
1333 | x3 += 13; | ||
1334 | x4 += 16; | ||
1335 | x5 += 20; | ||
1336 | } break; | ||
1337 | case 2: { | ||
1338 | x1 += 3; | ||
1339 | x2 += 8; | ||
1340 | x3 += 12; | ||
1341 | x4 += 17; | ||
1342 | x5 += 20; | ||
1343 | } break; | ||
1344 | case 3: { | ||
1345 | x1 += 2; | ||
1346 | x2 += 9; | ||
1347 | x3 += 11; | ||
1348 | x4 += 18; | ||
1349 | x5 += 20; | ||
1350 | } break; | ||
1351 | } | ||
1352 | u8 col_shape = cols[0] != COL_OFF ? COL_ACC_1 : COL_OFF; | ||
1353 | draw_line(x0, y0, x1, y0, col_shape); | ||
1354 | draw_line(x1, y1, x1, y0, col_shape); | ||
1355 | draw_line(x1, y1, x2, y1, col_shape); | ||
1356 | draw_line(x2, y1, x2, y0, col_shape); | ||
1357 | draw_line(x2, y0, x3, y0, col_shape); | ||
1358 | draw_line(x3, y1, x3, y0, col_shape); | ||
1359 | draw_line(x3, y1, x4, y1, col_shape); | ||
1360 | draw_line(x4, y1, x4, y0, col_shape); | ||
1361 | draw_line(x4, y0, x5, y0, col_shape); | ||
1362 | } | ||
1363 | |||
1364 | // Envelope. | ||
1365 | { | ||
1366 | size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 1 + 1; | ||
1367 | size_t y = PARAMS_START_Y + 1; | ||
1368 | size_t x0 = x; | ||
1369 | size_t y0 = y + 15 - params->env_volume; | ||
1370 | size_t x1 = x + (3 * PARAMS_BOX_OFFSET_X) * params->env_time / 8 + 7; | ||
1371 | size_t y1 = params->env_direction == 0 ? y + 15 : y; | ||
1372 | size_t x2 = x + PARAMS_BOX_OFFSET_X * 3 - 5; | ||
1373 | size_t y2 = y1; | ||
1374 | |||
1375 | // Env. | ||
1376 | u8 col_env = cols[1] != COL_OFF && cols[2] != COL_OFF && cols[3] != COL_OFF | ||
1377 | ? COL_ACC_2 : COL_OFF; | ||
1378 | if (params->env_time == 0) { | ||
1379 | draw_line(x0, y0, x2, y0, col_env); | ||
1380 | } else { | ||
1381 | draw_line(x0, y0, x1, y1, col_env); | ||
1382 | draw_line(x1, y1, x2, y2, col_env); | ||
1383 | } | ||
1384 | } | ||
1385 | |||
1386 | // Trig probability. | ||
1387 | draw_prob(params->prob, cols[4]); | ||
1388 | |||
1389 | // Trig pannning. | ||
1390 | draw_panning(params->pan, cols[9]); | ||
1391 | |||
1392 | // Labels. | ||
1393 | { | ||
1394 | size_t x = PARAMS_START_X; | ||
1395 | size_t y = PARAMS_START_Y; | ||
1396 | txt_drawf_small("shape", x + 4 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, cols[0]); | ||
1397 | txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, cols[1]); | ||
1398 | txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, cols[2]); | ||
1399 | txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, cols[3]); | ||
1400 | txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[4]); | ||
1401 | y += PARAMS_BOX_OFFSET_Y; | ||
1402 | txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, cols[9]); | ||
1403 | } | ||
1404 | |||
1405 | // Empty spacers. | ||
1406 | { | ||
1407 | draw_param_stub(5, COL_OFF); | ||
1408 | draw_param_stub(6, COL_OFF); | ||
1409 | draw_param_stub(7, COL_OFF); | ||
1247 | draw_param_stub(8, COL_OFF); | 1410 | draw_param_stub(8, COL_OFF); |
1248 | } | 1411 | } |
1249 | } | 1412 | } |
@@ -1358,15 +1521,15 @@ draw_parameters(void) { | |||
1358 | input_handler == handle_param_selection_noise) { | 1521 | input_handler == handle_param_selection_noise) { |
1359 | if (!pat->empty) { | 1522 | if (!pat->empty) { |
1360 | switch (channel_selection_loc) { | 1523 | switch (channel_selection_loc) { |
1361 | case 0: { draw_parameters_square(&pat->ch1.params[trig_selection_loc], true, false); } break; | 1524 | case 0: { draw_parameters_square1(&pat->ch1.params[trig_selection_loc], false); } break; |
1362 | case 1: { draw_parameters_square(&pat->ch2.params[trig_selection_loc], false, false); } break; | 1525 | case 1: { draw_parameters_square2(&pat->ch2.params[trig_selection_loc], false); } break; |
1363 | case 2: { draw_parameters_wave(&pat->ch3.params[trig_selection_loc], false); } break; | 1526 | case 2: { draw_parameters_wave(&pat->ch3.params[trig_selection_loc], false); } break; |
1364 | case 3: { draw_parameters_noise(&pat->ch4.params[trig_selection_loc], false); } break; | 1527 | case 3: { draw_parameters_noise(&pat->ch4.params[trig_selection_loc], false); } break; |
1365 | } | 1528 | } |
1366 | } else { | 1529 | } else { |
1367 | switch (channel_selection_loc) { | 1530 | switch (channel_selection_loc) { |
1368 | case 0: { draw_parameters_square(&default_ch1.params, true, false); } break; | 1531 | case 0: { draw_parameters_square1(&default_ch1.params, false); } break; |
1369 | case 1: { draw_parameters_square(&default_ch2.params, false, false); } break; | 1532 | case 1: { draw_parameters_square2(&default_ch2.params, false); } break; |
1370 | case 2: { draw_parameters_wave(&default_ch3.params, true); } break; | 1533 | case 2: { draw_parameters_wave(&default_ch3.params, true); } break; |
1371 | case 3: { draw_parameters_noise(&default_ch4.params, true); } break; | 1534 | case 3: { draw_parameters_noise(&default_ch4.params, true); } break; |
1372 | } | 1535 | } |
@@ -1379,8 +1542,8 @@ draw_parameters(void) { | |||
1379 | input_handler == handle_param_selection_ch3 || | 1542 | input_handler == handle_param_selection_ch3 || |
1380 | input_handler == handle_param_selection_ch4) { | 1543 | input_handler == handle_param_selection_ch4) { |
1381 | switch (channel_selection_loc) { | 1544 | switch (channel_selection_loc) { |
1382 | case 0: { draw_parameters_square(&ch1_params, true, true); } break; | 1545 | case 0: { draw_parameters_square1(&ch1_params, true); } break; |
1383 | case 1: { draw_parameters_square(&ch2_params, false, true); } break; | 1546 | case 1: { draw_parameters_square2(&ch2_params, true); } break; |
1384 | case 2: { draw_parameters_wave(&ch3_params, true); } break; | 1547 | case 2: { draw_parameters_wave(&ch3_params, true); } break; |
1385 | case 3: { draw_parameters_noise(&ch4_params, true); } break; | 1548 | case 3: { draw_parameters_noise(&ch4_params, true); } break; |
1386 | } | 1549 | } |
@@ -1640,7 +1803,7 @@ draw_notif_bar() { | |||
1640 | Pattern *pat = &patterns[pattern_selection_loc]; | 1803 | Pattern *pat = &patterns[pattern_selection_loc]; |
1641 | if (input_handler == handle_param_selection_sq1 | 1804 | if (input_handler == handle_param_selection_sq1 |
1642 | || input_handler == handle_param_selection_ch1) { | 1805 | || input_handler == handle_param_selection_ch1) { |
1643 | ChannelSquareParams *params; | 1806 | ChannelSquare1Params *params; |
1644 | if (input_handler == handle_param_selection_sq1) { | 1807 | if (input_handler == handle_param_selection_sq1) { |
1645 | params = &pat->ch1.params[trig_selection_loc]; | 1808 | params = &pat->ch1.params[trig_selection_loc]; |
1646 | } else { | 1809 | } else { |
@@ -1704,7 +1867,7 @@ draw_notif_bar() { | |||
1704 | 1867 | ||
1705 | if (input_handler == handle_param_selection_sq2 | 1868 | if (input_handler == handle_param_selection_sq2 |
1706 | || input_handler == handle_param_selection_ch2) { | 1869 | || input_handler == handle_param_selection_ch2) { |
1707 | ChannelSquareParams *params; | 1870 | ChannelSquare2Params *params; |
1708 | if (input_handler == handle_param_selection_sq2) { | 1871 | if (input_handler == handle_param_selection_sq2) { |
1709 | params = &pat->ch2.params[trig_selection_loc]; | 1872 | params = &pat->ch2.params[trig_selection_loc]; |
1710 | } else { | 1873 | } else { |