aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-07-21 19:09:18 +0200
committerBad Diode <bd@badd10de.dev>2023-07-21 19:09:18 +0200
commitf6b1834fd0cae56a125c7ea65b6e5bf15d553dd3 (patch)
tree8b676edb21fc0e93b8c50a4714cc380db66653a5
parented6f5a9dee2393a71343826eda27a97ad3d6bda4 (diff)
downloadstepper-f6b1834fd0cae56a125c7ea65b6e5bf15d553dd3.tar.gz
stepper-f6b1834fd0cae56a125c7ea65b6e5bf15d553dd3.zip
Add new UI for wave channel parameters
-rw-r--r--src/drawing.c244
-rw-r--r--src/globals.c2
-rw-r--r--src/main.c12
3 files changed, 46 insertions, 212 deletions
diff --git a/src/drawing.c b/src/drawing.c
index f8cacb0..78021c0 100644
--- a/src/drawing.c
+++ b/src/drawing.c
@@ -638,86 +638,65 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) {
638 u8 *wave_b = params->wave_b; 638 u8 *wave_b = params->wave_b;
639 639
640 size_t x = PARAMS_START_X; 640 size_t x = PARAMS_START_X;
641 size_t y = PARAMS_START_Y + 8; 641 size_t y = PARAMS_START_Y;
642 642
643 // Wave Patterns. 643 // Wave Patterns.
644 draw_wave_pattern(wave_a, x, y + 1, COL_ACC_1); 644 draw_wave_pattern(wave_a, x, y, COL_ACC_1);
645 draw_wave_pattern(wave_b, x + 70, y + 1, COL_ACC_2); 645 draw_wave_pattern(wave_b, x + PARAMS_BOX_OFFSET_X * 2, y, COL_ACC_2);
646
647 // Wave text.
648 x -= 2;
649 txt_drawf_small("%02x%02x%02x%02x", x, y + 19, col_fg,
650 wave_a[0], wave_a[1], wave_a[2], wave_a[3]);
651 txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 19, col_fg,
652 wave_a[4], wave_a[5], wave_a[6], wave_a[7]);
653 txt_drawf_small("%02x%02x%02x%02x", x, y + 28, col_fg,
654 wave_a[8], wave_a[9], wave_a[10], wave_a[11]);
655 txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 28, col_fg,
656 wave_a[12], wave_a[13], wave_a[14], wave_a[15]);
657
658 x += 70;
659 txt_drawf_small("%02x%02x%02x%02x", x, y + 19, col_fg,
660 wave_b[0], wave_b[1], wave_b[2], wave_b[3]);
661 txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 19, col_fg,
662 wave_b[4], wave_b[5], wave_b[6], wave_b[7]);
663 txt_drawf_small("%02x%02x%02x%02x", x, y + 28, col_fg,
664 wave_b[8], wave_b[9], wave_b[10], wave_b[11]);
665 txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 28, col_fg,
666 wave_b[12], wave_b[13], wave_b[14], wave_b[15]);
667 } 646 }
668 647
669 // Draw default wave buttons. 648 // TODO: Trig probability
670 { 649 {
671 const u32 *tile = default_wave_buttons; 650 size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3;
672 size_t x = PARAMS_START_X; 651 size_t y = PARAMS_START_Y + 5;
673 size_t y = PARAMS_START_Y + PARAMS_H - 13; 652 txt_drawf("100", x, y, col_fg);
674 for (size_t i = 0, k = 0; i < 4 * 2; i += 2, k++) { 653 txt_drawc('%', x + 18, y, col_fg);
675 draw_icn(x + 17 * k , y, &tile[i * 2 + 0], col_fg, 1, 0);
676 draw_icn(x + 17 * k + 8, y, &tile[i * 2 + 2], col_fg, 1, 0);
677 }
678 for (size_t i = 0, k = 0; i < 4 * 2; i += 2, k++) {
679 draw_icn(x + 70 + 17 * k , y, &tile[i * 2 + 0], col_fg, 1, 0);
680 draw_icn(x + 70 + 17 * k + 8, y, &tile[i * 2 + 2], col_fg, 1, 0);
681 }
682 } 654 }
683 655
684 // Mode selection. 656 // Mode selection.
685 { 657 {
686 size_t x = PARAMS_START_X + 140; 658 size_t x = PARAMS_START_X;
687 size_t y = PARAMS_START_Y + PARAMS_H - 23; 659 size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y;
688 draw_line(x, y + 4, x + 5, y + 4, col_fg);
689 draw_line(x + 25, y + 4, x + 30, y + 4, col_fg);
690 draw_line(x, y + 5, x, y + 16, col_fg);
691 draw_line(x + 30, y + 5, x + 30, y + 17, col_fg);
692 draw_line(x, y + 17, x + 30, y + 17, col_fg);
693 txt_drawf_small("mode", x + 6, y, col_fg);
694
695 switch (params->wave_mode) { 660 switch (params->wave_mode) {
696 case 0: { txt_drawf("A", x + 12, y + 7, col_fg); } break; 661 case 0: { txt_drawf("A", x + 12, y + 5, col_fg); } break;
697 case 1: { txt_drawf("B", x + 12, y + 7, col_fg); } break; 662 case 1: { txt_drawf("B", x + 12, y + 5, col_fg); } break;
698 case 2: { txt_drawf("A+B", x + 6, y + 7, col_fg); } break; 663 case 2: { txt_drawf("A+B", x + 6, y + 5, col_fg); } break;
699 } 664 }
700 } 665 }
701 666
702 // Wave volume. 667 // Wave volume.
703 { 668 {
704 size_t x = PARAMS_START_X + 140; 669 size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X;
705 size_t y = PARAMS_START_Y + PARAMS_H - 46; 670 size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y;
706 draw_line(x, y + 7, x + 7, y + 7, col_fg);
707 draw_line(x + 23, y + 7, x + 30, y + 7, col_fg);
708 draw_line(x, y + 8, x, y + 19, col_fg);
709 draw_line(x + 30, y + 8, x + 30, y + 19, col_fg);
710 draw_line(x, y + 20, x + 30, y + 20, col_fg);
711 txt_drawf_small("vol", x + 8, y + 3, col_fg);
712
713 switch (params->wave_volume) { 671 switch (params->wave_volume) {
714 case 0: { txt_drawf("0", x + 12, y + 10, col_fg); } break; 672 case 0: { txt_drawf("0", x + 12, y + 5, col_fg); } break;
715 case 1: { txt_drawf("25", x + 9, y + 10, col_fg); } break; 673 case 1: { txt_drawf("25", x + 9, y + 5, col_fg); } break;
716 case 2: { txt_drawf("50", x + 9, y + 10, col_fg); } break; 674 case 2: { txt_drawf("50", x + 9, y + 5, col_fg); } break;
717 case 3: { txt_drawf("75", x + 9, y + 10, col_fg); } break; 675 case 3: { txt_drawf("75", x + 9, y + 5, col_fg); } break;
718 case 4: { txt_drawf("100", x + 6, y + 10, col_fg); } break; 676 case 4: { txt_drawf("100", x + 6, y + 5, col_fg); } break;
719 } 677 }
720 } 678 }
679
680 // Labels.
681 {
682 size_t x = PARAMS_START_X;
683 size_t y = PARAMS_START_Y;
684 txt_drawf_small("sin", x + 8 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg);
685 txt_drawf_small("phase", x + 4 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg);
686 txt_drawf_small("saw", x + 8 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg);
687 txt_drawf_small("phase", x + 4 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, col_fg);
688 txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg);
689 y += PARAMS_BOX_OFFSET_Y;
690 txt_drawf_small("mode", x + 6 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg);
691 txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg);
692 }
693
694 // Empty spacers.
695 {
696 draw_param_stub(7, COL_OFF);
697 draw_param_stub(8, COL_OFF);
698 draw_param_stub(9, COL_OFF);
699 }
721} 700}
722 701
723void 702void
@@ -963,147 +942,6 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) {
963 draw_param_stub(8, COL_OFF); 942 draw_param_stub(8, COL_OFF);
964 draw_param_stub(9, COL_OFF); 943 draw_param_stub(9, COL_OFF);
965 } 944 }
966 // size_t x_offset = 30;
967 // u8 col_fg = COL_FG;
968 // if (global && input_handler == handle_channel_selection) {
969 // col_fg = COL_OFF;
970 // }
971
972 // // Bit mode.
973 // {
974 // // Param box.
975 // {
976 // size_t x = PARAMS_START_X + x_offset;
977 // size_t y = PARAMS_START_Y + PARAMS_H - 26;
978 // draw_line(x, y + 7, x + 2, y + 7, col_fg);
979 // draw_line(x + 22, y + 7, x + 24, y + 7, col_fg);
980 // draw_line(x, y + 8, x, y + 19, col_fg);
981 // draw_line(x + 24, y + 8, x + 24, y + 19, col_fg);
982 // draw_line(x, y + 20, x + 24, y + 20, col_fg);
983 // txt_drawf_small("mode", x + 3, y + 3, col_fg);
984
985 // switch (params->bit_mode) {
986 // case 0: { txt_drawf("A", x + 9, y + 10, col_fg); } break;
987 // case 1: { txt_drawf("B", x + 9, y + 10, col_fg); } break;
988 // }
989 // }
990 // }
991
992 // // Envelope.
993 // {
994 // // Env. drawing.
995 // {
996 // // Bounding box.
997 // {
998 // size_t x0 = PARAMS_START_X + 31 + x_offset;
999 // size_t y0 = PARAMS_START_Y + PARAMS_H - 46;
1000 // size_t x1 = x0 + 79;
1001 // size_t y1 = y0 + 21;
1002 // draw_rect(x0, y0, x1, y1, COL_ACC_2);
1003 // }
1004
1005 // size_t x = PARAMS_START_X + 42 + x_offset;
1006 // size_t y = PARAMS_START_Y + PARAMS_H - 43;
1007 // size_t x0 = x;
1008 // size_t y0 = y + 15 - params->env_volume;
1009 // size_t x1 = x + 8 * params->env_time;
1010 // size_t y1 = params->env_direction == 0 ? y + 15 : y;
1011 // size_t x2 = x + 8 * 7 + 1;
1012 // size_t y2 = y1;
1013
1014 // // Env.
1015 // if (params->env_time == 0) {
1016 // draw_line(x1, y0, x2, y0, COL_ACC_2);
1017 // } else {
1018 // draw_line(x0, y0, x1, y1, COL_ACC_2);
1019 // draw_line(x1, y1, x2, y2, COL_ACC_2);
1020 // }
1021 // }
1022
1023 // // Env. volume.
1024 // {
1025 // size_t x = PARAMS_START_X + 31 + x_offset;
1026 // size_t y = PARAMS_START_Y + PARAMS_H - 26;
1027 // draw_line(x, y + 7, x + 4, y + 7, col_fg);
1028 // draw_line(x + 20, y + 7, x + 24, y + 7, col_fg);
1029 // draw_line(x, y + 8, x, y + 19, col_fg);
1030 // draw_line(x + 24, y + 8, x + 24, y + 19, col_fg);
1031 // draw_line(x, y + 20, x + 24, y + 20, col_fg);
1032 // txt_drawf_small("vol", x + 5, y + 3, col_fg);
1033
1034 // switch (params->env_volume) {
1035 // case 0: { txt_drawf("0", x + 9, y + 10, col_fg); } break;
1036 // case 1: { txt_drawf("6", x + 9, y + 10, col_fg); } break;
1037 // case 2: { txt_drawf("13", x + 6, y + 10, col_fg); } break;
1038 // case 3: { txt_drawf("20", x + 6, y + 10, col_fg); } break;
1039 // case 4: { txt_drawf("26", x + 6, y + 10, col_fg); } break;
1040 // case 5: { txt_drawf("33", x + 6, y + 10, col_fg); } break;
1041 // case 6: { txt_drawf("40", x + 6, y + 10, col_fg); } break;
1042 // case 7: { txt_drawf("46", x + 6, y + 10, col_fg); } break;
1043 // case 8: { txt_drawf("53", x + 6, y + 10, col_fg); } break;
1044 // case 9: { txt_drawf("60", x + 6, y + 10, col_fg); } break;
1045 // case 10: { txt_drawf("66", x + 6, y + 10, col_fg); } break;
1046 // case 11: { txt_drawf("73", x + 6, y + 10, col_fg); } break;
1047 // case 12: { txt_drawf("80", x + 6, y + 10, col_fg); } break;
1048 // case 13: { txt_drawf("86", x + 6, y + 10, col_fg); } break;
1049 // case 14: { txt_drawf("93", x + 6, y + 10, col_fg); } break;
1050 // case 15: { txt_drawf("100", x + 3, y + 10, col_fg); } break;
1051 // }
1052 // }
1053
1054 // // Env. direction
1055 // {
1056 // size_t x = PARAMS_START_X + 59 + x_offset;
1057 // size_t y = PARAMS_START_Y + PARAMS_H - 26;
1058 // draw_line(x, y + 7, x + 4, y + 7, col_fg);
1059 // draw_line(x + 20, y + 7, x + 24, y + 7, col_fg);
1060 // draw_line(x, y + 8, x, y + 19, col_fg);
1061 // draw_line(x + 24, y + 8, x + 24, y + 19, col_fg);
1062 // draw_line(x, y + 20, x + 24, y + 20, col_fg);
1063 // txt_drawf_small("dir", x + 5, y + 3, col_fg);
1064
1065 // char arr_up[2] = { 0x19, 0 };
1066 // char arr_down[2] = { 0x18, 0 };
1067 // switch (params->env_direction) {
1068 // case 0: {
1069 // txt_drawf(arr_up, x + 9, y + 11, col_fg);
1070 // } break;
1071 // case 1: {
1072 // txt_drawf(arr_down, x + 9, y + 11, col_fg);
1073 // } break;
1074 // }
1075 // }
1076
1077 // // Env. time.
1078 // {
1079 // size_t x = PARAMS_START_X + 87 + x_offset;
1080 // size_t y = PARAMS_START_Y + PARAMS_H - 26;
1081 // draw_line(x, y + 7, x + 2, y + 7, col_fg);
1082 // draw_line(x + 22, y + 7, x + 24, y + 7, col_fg);
1083 // draw_line(x, y + 8, x, y + 19, col_fg);
1084 // draw_line(x + 24, y + 8, x + 24, y + 19, col_fg);
1085 // draw_line(x, y + 20, x + 24, y + 20, col_fg);
1086 // txt_drawf_small("time", x + 3, y + 3, col_fg);
1087
1088 // switch (params->env_time) {
1089 // case 0: { txt_drawf("0", x + 9, y + 10, col_fg); } break;
1090 // case 1: { txt_drawf("14", x + 6, y + 10, col_fg); } break;
1091 // case 2: { txt_drawf("28", x + 6, y + 10, col_fg); } break;
1092 // case 3: { txt_drawf("42", x + 6, y + 10, col_fg); } break;
1093 // case 4: { txt_drawf("57", x + 6, y + 10, col_fg); } break;
1094 // case 5: { txt_drawf("71", x + 6, y + 10, col_fg); } break;
1095 // case 6: { txt_drawf("85", x + 6, y + 10, col_fg); } break;
1096 // case 7: { txt_drawf("100", x + 3, y + 10, col_fg); } break;
1097 // }
1098 // }
1099 // }
1100
1101 // // Labels.
1102 // {
1103 // size_t x = PARAMS_START_X + x_offset;
1104 // size_t y = PARAMS_START_Y + PARAMS_H - 43;
1105 // txt_drawf_small("envelope", x + 54, y - 12, col_fg);
1106 // }
1107} 945}
1108 946
1109void 947void
diff --git a/src/globals.c b/src/globals.c
index cd9fe72..758f3b5 100644
--- a/src/globals.c
+++ b/src/globals.c
@@ -5,7 +5,7 @@
5static int step_counter = 0; 5static int step_counter = 0;
6int trig_selection_loc = 0; 6int trig_selection_loc = 0;
7int param_selection_loc = 0; 7int param_selection_loc = 0;
8int channel_selection_loc = 3; 8int channel_selection_loc = 0;
9int pattern_selection_loc = 0; 9int pattern_selection_loc = 0;
10int right_col_selection_loc = 0; 10int right_col_selection_loc = 0;
11int play_status = 0; 11int play_status = 0;
diff --git a/src/main.c b/src/main.c
index 61e26e7..a81e9d9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -13,22 +13,18 @@ WITH REGARD TO THIS SOFTWARE.
13// 13//
14// UI tweaks. 14// UI tweaks.
15// - Add custom user themes 15// - Add custom user themes
16// + Notification support for feedback when doing some operations
17// (copying/pasting)
18// - Animations for cursor movement/current step highlight. (A fade out maybe?) 16// - Animations for cursor movement/current step highlight. (A fade out maybe?)
19// - Add panning support. 17// - Add panning support.
18// + Add new UI for the parameter pages
19// - Change cursor drawing for new parameter pages
20// - Change cursor behaviour for new parameter pages
21// - Allow prob control (% based or 1:2, etc.)
20// 22//
21// Quality of life improvements. 23// Quality of life improvements.
22// - When not on play mode, adjusting a note or a parameter triggers the sound. 24// - When not on play mode, adjusting a note or a parameter triggers the sound.
23// This could get annoying, so maybe it should be a configuration option to 25// This could get annoying, so maybe it should be a configuration option to
24// enable it? 26// enable it?
25// - Pattern chaining for more than 1 queue and/or song mode.
26// - L: Remove from chain
27// - R: Add to chain
28// - Loop?
29// - Undo/Redo. 27// - Undo/Redo.
30// - Select + up/down to queue the next pattern as we move to it?
31// - Option to show help on the notification bar?
32// 28//
33// Advanced 29// Advanced
34// - Add tap tempo for BPM. 30// - Add tap tempo for BPM.