aboutsummaryrefslogtreecommitdiffstats
path: root/src/drawing.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drawing.c')
-rw-r--r--src/drawing.c225
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
1037void 1069void
1038draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { 1070draw_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
1272void
1273draw_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 {