aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-04 16:35:37 +0200
committerBad Diode <bd@badd10de.dev>2023-04-04 16:35:37 +0200
commit0fbbc780d544ce1e6a026ab208cc70764be43b6e (patch)
tree5369b07d2071d9f282ab5cdddcae490d3b36c69a
parent10f51ece3e266c98ac1d3646e890a1cb616677a0 (diff)
downloadstepper-0fbbc780d544ce1e6a026ab208cc70764be43b6e.tar.gz
stepper-0fbbc780d544ce1e6a026ab208cc70764be43b6e.zip
Add parameter control for noise channel
-rw-r--r--src/sequencer.c485
1 files changed, 260 insertions, 225 deletions
diff --git a/src/sequencer.c b/src/sequencer.c
index b935bdd..d69c450 100644
--- a/src/sequencer.c
+++ b/src/sequencer.c
@@ -944,60 +944,22 @@ draw_params_cursor_wave(size_t i, u8 clr) {
944 944
945void 945void
946draw_params_cursor_noise(size_t i, u8 clr) { 946draw_params_cursor_noise(size_t i, u8 clr) {
947 // TODO: Handle this. 947 u8 x_positions[] = {
948 (void)i; 948 0, // Bit mode.
949 (void)clr; 949 31, // Env. Vol.
950 // u8 x_positions[] = { 950 59, // Env. Direction.
951 // // 32 half bytes (Wave A). 951 87, // Env. Time.
952 // 0, 4, 8, 12, 16, 20, 24, 28, 952 };
953 // 34, 38, 42, 46, 50, 54, 58, 62, 953 u8 y_positions[] = {
954 // 0, 4, 8, 12, 16, 20, 24, 28, 954 20, // Bit mode.
955 // 34, 38, 42, 46, 50, 54, 58, 62, 955 20, // Env. Vol.
956 // // 32 half bytes (Wave B). 956 20, // Env. Direction.
957 // 70, 74, 78, 82, 86, 90, 94, 98, 957 20, // Env. Time.
958 // 104, 108, 112, 116, 120, 124, 128, 132, 958 };
959 // 70, 74, 78, 82, 86, 90, 94, 98, 959 size_t cursor_length = 24;
960 // 104, 108, 112, 116, 120, 124, 128, 132, 960 size_t x = PARAMS_START_X + x_positions[i] + 30;
961 // // Default wave A. 961 size_t y = PARAMS_START_Y + PARAMS_H - 23 + y_positions[i];
962 // 1, 18, 35, 52, 962 draw_line(x, y, x + cursor_length, y, clr);
963 // // Default wave B.
964 // 71, 88, 105, 122,
965 // // Mode selection.
966 // 141,
967 // // Volume selection.
968 // 141,
969 // };
970 // u8 y_positions[] = {
971 // // 32 half bytes (Wave A)
972 // 0, 0, 0, 0, 0, 0, 0, 0,
973 // 0, 0, 0, 0, 0, 0, 0, 0,
974 // 8, 8, 8, 8, 8, 8, 8, 8,
975 // 8, 8, 8, 8, 8, 8, 8, 8,
976 // // 32 half bytes (Wave B)
977 // 0, 0, 0, 0, 0, 0, 0, 0,
978 // 0, 0, 0, 0, 0, 0, 0, 0,
979 // 8, 8, 8, 8, 8, 8, 8, 8,
980 // 8, 8, 8, 8, 8, 8, 8, 8,
981 // // Default wave A.
982 // 20, 20, 20, 20,
983 // // Default wave B.
984 // 20, 20, 20, 20,
985 // // Mode selection.
986 // 20,
987 // // Volume selection.
988 // 0,
989 // };
990 // size_t cursor_length = 0;
991 // if (i < 64) {
992 // cursor_length = 4;
993 // } else if (i < 72) {
994 // cursor_length = 13;
995 // } else {
996 // cursor_length = 30;
997 // }
998 // size_t x = PARAMS_START_X + x_positions[i] - 1;
999 // size_t y = PARAMS_START_Y + PARAMS_H - 23 + y_positions[i];
1000 // draw_line(x, y, x + cursor_length, y, clr);
1001} 963}
1002 964
1003void 965void
@@ -1542,6 +1504,201 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep) {
1542} 1504}
1543 1505
1544void 1506void
1507draw_parameters_noise(void) {
1508 size_t x_offset = 30;
1509 Pattern *pat = &patterns[pattern_selection_loc];
1510 ChannelNoiseParams *params = &pat->ch4.params[trig_selection_loc];
1511
1512 // Bit mode.
1513 {
1514 // Param box.
1515 {
1516 size_t x = PARAMS_START_X + x_offset;
1517 size_t y = PARAMS_START_Y + PARAMS_H - 25;
1518 draw_line(x, y + 7, x + 2, y + 7, COL_FG);
1519 draw_line(x + 22, y + 7, x + 24, y + 7, COL_FG);
1520 draw_line(x, y + 8, x, y + 19, COL_FG);
1521 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
1522 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
1523 txt_drawf_small("mode", x + 3, y + 3, 4, COL_FG);
1524
1525 switch (params->bit_mode) {
1526 case 0: {
1527 txt_drawf("A", x + 9, y + 10, 6, COL_FG);
1528 } break;
1529 case 1: {
1530 txt_drawf("B", x + 9, y + 10, 6, COL_FG);
1531 } break;
1532 }
1533 }
1534 }
1535
1536 // Envelope.
1537 {
1538 // Env. drawing.
1539 {
1540 // Bounding box.
1541 {
1542 size_t x0 = PARAMS_START_X + 31 + x_offset;
1543 size_t y0 = PARAMS_START_Y + PARAMS_H - 47;
1544 size_t x1 = x0 + 79;
1545 size_t y1 = y0 + 21;
1546 draw_rect(x0, y0, x1, y1, COL_CYAN);
1547 }
1548
1549 size_t x = PARAMS_START_X + 42 + x_offset;
1550 size_t y = PARAMS_START_Y + PARAMS_H - 44;
1551 size_t x0 = x;
1552 size_t y0 = y + 15 - params->env_volume;
1553 size_t x1 = x + 8 * params->env_time;
1554 size_t y1 = params->env_direction == 0 ? y + 15 : y;
1555 size_t x2 = x + 8 * 7 + 1;
1556 size_t y2 = y1;
1557
1558 // Env.
1559 if (params->env_time == 0) {
1560 draw_line(x1, y0, x2, y0, COL_CYAN);
1561 } else {
1562 draw_line(x0, y0, x1, y1, COL_CYAN);
1563 draw_line(x1, y1, x2, y2, COL_CYAN);
1564 }
1565 }
1566
1567 // Env. volume.
1568 {
1569 size_t x = PARAMS_START_X + 31 + x_offset;
1570 size_t y = PARAMS_START_Y + PARAMS_H - 25;
1571 draw_line(x, y + 7, x + 4, y + 7, COL_FG);
1572 draw_line(x + 20, y + 7, x + 24, y + 7, COL_FG);
1573 draw_line(x, y + 8, x, y + 19, COL_FG);
1574 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
1575 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
1576 txt_drawf_small("vol", x + 5, y + 3, 4, COL_FG);
1577
1578 switch (params->env_volume) {
1579 case 0: {
1580 txt_drawf("0", x + 9, y + 10, 6, COL_FG);
1581 } break;
1582 case 1: {
1583 txt_drawf("6", x + 9, y + 10, 6, COL_FG);
1584 } break;
1585 case 2: {
1586 txt_drawf("13", x + 6, y + 10, 6, COL_FG);
1587 } break;
1588 case 3: {
1589 txt_drawf("20", x + 6, y + 10, 6, COL_FG);
1590 } break;
1591 case 4: {
1592 txt_drawf("26", x + 6, y + 10, 6, COL_FG);
1593 } break;
1594 case 5: {
1595 txt_drawf("33", x + 6, y + 10, 6, COL_FG);
1596 } break;
1597 case 6: {
1598 txt_drawf("40", x + 6, y + 10, 6, COL_FG);
1599 } break;
1600 case 7: {
1601 txt_drawf("46", x + 6, y + 10, 6, COL_FG);
1602 } break;
1603 case 8: {
1604 txt_drawf("53", x + 6, y + 10, 6, COL_FG);
1605 } break;
1606 case 9: {
1607 txt_drawf("60", x + 6, y + 10, 6, COL_FG);
1608 } break;
1609 case 10: {
1610 txt_drawf("66", x + 6, y + 10, 6, COL_FG);
1611 } break;
1612 case 11: {
1613 txt_drawf("73", x + 6, y + 10, 6, COL_FG);
1614 } break;
1615 case 12: {
1616 txt_drawf("80", x + 6, y + 10, 6, COL_FG);
1617 } break;
1618 case 13: {
1619 txt_drawf("86", x + 6, y + 10, 6, COL_FG);
1620 } break;
1621 case 14: {
1622 txt_drawf("93", x + 6, y + 10, 6, COL_FG);
1623 } break;
1624 case 15: {
1625 txt_drawf("100", x + 3, y + 10, 6, COL_FG);
1626 } break;
1627 }
1628 }
1629
1630 // Env. direction
1631 {
1632 size_t x = PARAMS_START_X + 59 + x_offset;
1633 size_t y = PARAMS_START_Y + PARAMS_H - 25;
1634 draw_line(x, y + 7, x + 4, y + 7, COL_FG);
1635 draw_line(x + 20, y + 7, x + 24, y + 7, COL_FG);
1636 draw_line(x, y + 8, x, y + 19, COL_FG);
1637 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
1638 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
1639 txt_drawf_small("dir", x + 5, y + 3, 4, COL_FG);
1640
1641 char arr_up[2] = { 0x19, 0 };
1642 char arr_down[2] = { 0x18, 0 };
1643 switch (params->env_direction) {
1644 case 0: {
1645 txt_drawf(arr_up, x + 9, y + 11, 6, COL_FG);
1646 } break;
1647 case 1: {
1648 txt_drawf(arr_down, x + 9, y + 11, 6, COL_FG);
1649 } break;
1650 }
1651 }
1652
1653 // Env. time.
1654 {
1655 size_t x = PARAMS_START_X + 87 + x_offset;
1656 size_t y = PARAMS_START_Y + PARAMS_H - 25;
1657 draw_line(x, y + 7, x + 2, y + 7, COL_FG);
1658 draw_line(x + 22, y + 7, x + 24, y + 7, COL_FG);
1659 draw_line(x, y + 8, x, y + 19, COL_FG);
1660 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
1661 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
1662 txt_drawf_small("time", x + 3, y + 3, 4, COL_FG);
1663
1664 switch (params->env_time) {
1665 case 0: {
1666 txt_drawf("0", x + 9, y + 10, 6, COL_FG);
1667 } break;
1668 case 1: {
1669 txt_drawf("14", x + 6, y + 10, 6, COL_FG);
1670 } break;
1671 case 2: {
1672 txt_drawf("28", x + 6, y + 10, 6, COL_FG);
1673 } break;
1674 case 3: {
1675 txt_drawf("42", x + 6, y + 10, 6, COL_FG);
1676 } break;
1677 case 4: {
1678 txt_drawf("57", x + 6, y + 10, 6, COL_FG);
1679 } break;
1680 case 5: {
1681 txt_drawf("71", x + 6, y + 10, 6, COL_FG);
1682 } break;
1683 case 6: {
1684 txt_drawf("85", x + 6, y + 10, 6, COL_FG);
1685 } break;
1686 case 7: {
1687 txt_drawf("100", x + 3, y + 10, 6, COL_FG);
1688 } break;
1689 }
1690 }
1691 }
1692
1693 // Labels.
1694 {
1695 size_t x = PARAMS_START_X + x_offset;
1696 size_t y = PARAMS_START_Y + PARAMS_H - 45;
1697 txt_drawf_small("envelope", x + 54, y - 12, 4, COL_FG);
1698 }
1699}
1700
1701void
1545draw_parameters(void) { 1702draw_parameters(void) {
1546 clear_parameters(); 1703 clear_parameters();
1547 Pattern *pat = &patterns[pattern_selection_loc]; 1704 Pattern *pat = &patterns[pattern_selection_loc];
@@ -1556,6 +1713,7 @@ draw_parameters(void) {
1556 draw_parameters_wave(); 1713 draw_parameters_wave();
1557 } break; 1714 } break;
1558 case 3: { 1715 case 3: {
1716 draw_parameters_noise();
1559 } break; 1717 } break;
1560 } 1718 }
1561} 1719}
@@ -1679,7 +1837,7 @@ irq_timer(void) {
1679 SOUND_NOISE_FREQ = SOUND_FREQ_RESET 1837 SOUND_NOISE_FREQ = SOUND_FREQ_RESET
1680 | SOUND_NOISE_PRESTEP_FREQ(pre_freq[trig->note]) 1838 | SOUND_NOISE_PRESTEP_FREQ(pre_freq[trig->note])
1681 | SOUND_NOISE_DIV_FREQ(div_freq[trig->note]) 1839 | SOUND_NOISE_DIV_FREQ(div_freq[trig->note])
1682 | SOUND_NOISE_COUNTER_STAGE(1) 1840 | SOUND_NOISE_COUNTER_STAGE(params->bit_mode)
1683 | SOUND_NOISE_TIMED_MODE(0); 1841 | SOUND_NOISE_TIMED_MODE(0);
1684 } else { 1842 } else {
1685 SOUND_NOISE_FREQ = 0; 1843 SOUND_NOISE_FREQ = 0;
@@ -2296,176 +2454,53 @@ handle_param_selection_wave(void) {
2296void 2454void
2297handle_param_selection_noise(void) { 2455handle_param_selection_noise(void) {
2298 // Go back to trigger selection. 2456 // Go back to trigger selection.
2299 // if (key_tap(KEY_A)) { 2457 if (key_tap(KEY_A)) {
2300 // draw_params_cursor(param_selection_loc, COL_BG); 2458 draw_params_cursor(param_selection_loc, COL_BG);
2301 // input_handler = handle_trigger_selection; 2459 input_handler = handle_trigger_selection;
2302 // draw_trig_cursor(trig_selection_loc, COL_CURSOR); 2460 draw_trig_cursor(trig_selection_loc, COL_CURSOR);
2303 // } 2461 }
2304 2462
2305 // // Cursor movement. 2463 // Cursor movement.
2306 // if (key_tap(KEY_LEFT) || key_tap(KEY_RIGHT)) { 2464 if (key_tap(KEY_LEFT) || key_tap(KEY_RIGHT)) {
2307 // int inc = 0; 2465 int inc = 0;
2308 // int loc = param_selection_loc; 2466 int loc = param_selection_loc;
2309 // if (key_tap(KEY_RIGHT)) { 2467 if (key_tap(KEY_RIGHT)) {
2310 // if (loc == 15 || loc == 31) { 2468 inc = 1;
2311 // inc = 17; 2469 } else {
2312 // } else if (loc == 47) { 2470 inc = -1;
2313 // inc = 26; 2471 }
2314 // } else if (loc == 63) { 2472 draw_params_cursor(param_selection_loc, COL_BG);
2315 // inc = 9; 2473 param_selection_loc = CLAMP(loc + inc, 0, 3);
2316 // } else if (loc != 47 && loc != 63 && loc < 72) { 2474 draw_params_cursor(param_selection_loc, COL_CURSOR);
2317 // inc = 1; 2475 }
2318 // } 2476
2319 // } else { 2477 // Adjust parameter.
2320 // if (loc == 32 || loc == 48) { 2478 if (key_tap(KEY_R) || key_tap(KEY_L)) {
2321 // inc = -17; 2479 int inc;
2322 // } else if (loc == 73) { 2480 if (key_tap(KEY_L)) {
2323 // inc = -26; 2481 inc = -1;
2324 // } else if (loc != 16 && loc != 64) { 2482 } else {
2325 // inc = -1; 2483 inc = 1;
2326 // } 2484 }
2327 // } 2485 Pattern *pat = &patterns[pattern_selection_loc];
2328 // draw_params_cursor(param_selection_loc, COL_BG); 2486 ChannelNoiseParams *params = &pat->ch4.params[trig_selection_loc];
2329 // param_selection_loc = CLAMP(loc + inc, 0, 73); 2487 switch (param_selection_loc) {
2330 // draw_params_cursor(param_selection_loc, COL_CURSOR); 2488 case 0: {
2331 // } 2489 params->bit_mode = CLAMP(params->bit_mode + inc, 0, 1);
2332 // if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { 2490 } break;
2333 // int inc = 0; 2491 case 1: {
2334 // int loc = param_selection_loc; 2492 params->env_volume = CLAMP(params->env_volume + inc, 0, 15);
2335 // if (key_tap(KEY_UP)) { 2493 } break;
2336 // if ((loc >= 16 && loc < 32) || (loc >= 48 && loc < 64)) { 2494 case 2: {
2337 // inc = -16; 2495 params->env_direction ^= 1;
2338 // } else if (loc == 64) { 2496 } break;
2339 // inc = -48; 2497 case 3: {
2340 // } else if (loc == 65) { 2498 params->env_time = CLAMP(params->env_time + inc, 0, 7);
2341 // inc = -45; 2499 } break;
2342 // } else if (loc == 66) { 2500 }
2343 // inc = -42; 2501 draw_parameters();
2344 // } else if (loc == 67) { 2502 draw_params_cursor(param_selection_loc, COL_CURSOR);
2345 // inc = -39; 2503 }
2346 // } else if (loc == 68) {
2347 // inc = -20;
2348 // } else if (loc == 69) {
2349 // inc = -17;
2350 // } else if (loc == 70) {
2351 // inc = -14;
2352 // } else if (loc == 71) {
2353 // inc = -11;
2354 // } else if (loc == 72) {
2355 // inc = 1;
2356 // } else if (loc == 73) {
2357 // inc = -1;
2358 // }
2359 // } else {
2360 // if (loc < 16 || (loc >= 32 && loc < 48)) {
2361 // inc = 16;
2362 // } else if (loc >= 16 && loc <= 19) {
2363 // inc = 48 - (loc - 16);
2364 // } else if (loc >= 20 && loc <= 23) {
2365 // inc = 45 - (loc - 20);
2366 // } else if (loc >= 24 && loc <= 27) {
2367 // inc = 42 - (loc - 24);
2368 // } else if (loc >= 28 && loc <= 31) {
2369 // inc = 39 - (loc - 28);
2370 // } else if (loc >= 48 && loc <= 51) {
2371 // inc = 20 - (loc - 48);
2372 // } else if (loc >= 52 && loc <= 55) {
2373 // inc = 17 - (loc - 52);
2374 // } else if (loc >= 56 && loc <= 59) {
2375 // inc = 14 - (loc - 56);
2376 // } else if (loc >= 60 && loc <= 63) {
2377 // inc = 11 - (loc - 60);
2378 // } else if (loc == 72) {
2379 // inc = 1;
2380 // } else if (loc == 73) {
2381 // inc = -1;
2382 // }
2383 // }
2384 // draw_params_cursor(param_selection_loc, COL_BG);
2385 // param_selection_loc = CLAMP(loc + inc, 0, 73);
2386 // draw_params_cursor(param_selection_loc, COL_CURSOR);
2387 // }
2388
2389 // // Adjust parameter.
2390 // if (key_tap(KEY_R) || key_tap(KEY_L)) {
2391 // int odd = param_selection_loc & 0x1;
2392 // int inc;
2393 // if (key_tap(KEY_R)) {
2394 // inc = 1;
2395 // } else {
2396 // inc = -1;
2397 // }
2398
2399 // // Wave: AA BB CC DD ...
2400 // // ^^
2401 // // |`- odd
2402 // // `-- even
2403 // if (param_selection_loc < 32) {
2404 // // Draw on wave a.
2405 // u8 byte_number = param_selection_loc / 2;
2406 // u8 *byte = &ch3.params[trig_selection_loc].wave_a;
2407 // byte += byte_number;
2408 // if (odd) {
2409 // *byte = (~0xF & *byte) | ((*byte + inc) & 0xF);
2410 // } else {
2411 // *byte = (0xF & *byte) | (((*byte >> 4) + inc) & 0xF) << 4;
2412 // }
2413 // } else if (param_selection_loc < 64){
2414 // // Draw on wave b.
2415 // u8 byte_number = (param_selection_loc - 32) / 2;
2416 // u8 *byte = &ch3.params[trig_selection_loc].wave_b;
2417 // byte += byte_number;
2418 // if (odd) {
2419 // *byte = (~0xF & *byte) | ((*byte + inc) & 0xF);
2420 // } else {
2421 // *byte = (0xF & *byte) | (((*byte >> 4) + inc) & 0xF) << 4;
2422 // }
2423 // } else if (param_selection_loc < 72) {
2424 // // Copy default waves.
2425 // u32 *wave_a = &ch3.params[trig_selection_loc].wave_a;
2426 // u32 *wave_b = &ch3.params[trig_selection_loc].wave_b;
2427 // switch (param_selection_loc) {
2428 // case 64: {
2429 // memcpy32(wave_a, sine_wave, 16);
2430 // } break;
2431 // case 65: {
2432 // memcpy32(wave_a, saw_wave, 16);
2433 // } break;
2434 // case 66: {
2435 // memcpy32(wave_a, square_wave, 16);
2436 // } break;
2437 // case 67: {
2438 // u32 rand_wave[4] = {
2439 // rng32(), rng32(), rng32(), rng32(),
2440 // };
2441 // memcpy32(wave_a, rand_wave, 16);
2442 // } break;
2443 // case 68: {
2444 // memcpy32(wave_b, sine_wave, 16);
2445 // } break;
2446 // case 69: {
2447 // memcpy32(wave_b, saw_wave, 16);
2448 // } break;
2449 // case 70: {
2450 // memcpy32(wave_b, square_wave, 16);
2451 // } break;
2452 // case 71: {
2453 // u32 rand_wave[4] = {
2454 // rng32(), rng32(), rng32(), rng32(),
2455 // };
2456 // memcpy32(wave_b, rand_wave, 16);
2457 // } break;
2458 // }
2459 // } else if (param_selection_loc == 72) {
2460 // u8 *wave_mode = &ch3.params[trig_selection_loc].wave_mode;
2461 // *wave_mode = CLAMP(*wave_mode + inc, 0, 2);
2462 // } else if (param_selection_loc == 73) {
2463 // u8 *wave_volume = &ch3.params[trig_selection_loc].wave_volume;
2464 // *wave_volume = CLAMP(*wave_volume + inc, 0, 4);
2465 // }
2466 // draw_parameters();
2467 // draw_params_cursor(param_selection_loc, COL_CURSOR);
2468 // }
2469} 2504}
2470 2505
2471void 2506void