aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-07-21 18:47:58 +0200
committerBad Diode <bd@badd10de.dev>2023-07-21 18:47:58 +0200
commited6f5a9dee2393a71343826eda27a97ad3d6bda4 (patch)
tree5cd83615370bc7ff8a611ca701af47e3e36c610d
parentabd10d9f6e048bb8cb21d2618f16e48ff5f781f2 (diff)
downloadstepper-ed6f5a9dee2393a71343826eda27a97ad3d6bda4.tar.gz
stepper-ed6f5a9dee2393a71343826eda27a97ad3d6bda4.zip
Add new UI for noise channel
-rw-r--r--src/drawing.c311
-rw-r--r--src/globals.c2
2 files changed, 190 insertions, 123 deletions
diff --git a/src/drawing.c b/src/drawing.c
index f843cb1..f8cacb0 100644
--- a/src/drawing.c
+++ b/src/drawing.c
@@ -896,147 +896,214 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
896 896
897void 897void
898draw_parameters_noise(ChannelNoiseParams* params, bool global) { 898draw_parameters_noise(ChannelNoiseParams* params, bool global) {
899 size_t x_offset = 30;
900 u8 col_fg = COL_FG; 899 u8 col_fg = COL_FG;
901 if (global && input_handler == handle_channel_selection) { 900 if (global && input_handler == handle_channel_selection) {
902 col_fg = COL_OFF; 901 col_fg = COL_OFF;
903 } 902 }
904 903
905 // Bit mode. 904 // Mode.
906 { 905 {
907 // Param box. 906 size_t x = PARAMS_START_X;
908 { 907 size_t y = PARAMS_START_Y;
909 size_t x = PARAMS_START_X + x_offset; 908 switch (params->bit_mode) {
910 size_t y = PARAMS_START_Y + PARAMS_H - 26; 909 case 0: { txt_drawf("A", x + 12, y + 5, col_fg); } break;
911 draw_line(x, y + 7, x + 2, y + 7, col_fg); 910 case 1: { txt_drawf("B", x + 12, y + 5, col_fg); } break;
912 draw_line(x + 22, y + 7, x + 24, y + 7, col_fg);
913 draw_line(x, y + 8, x, y + 19, col_fg);
914 draw_line(x + 24, y + 8, x + 24, y + 19, col_fg);
915 draw_line(x, y + 20, x + 24, y + 20, col_fg);
916 txt_drawf_small("mode", x + 3, y + 3, col_fg);
917
918 switch (params->bit_mode) {
919 case 0: { txt_drawf("A", x + 9, y + 10, col_fg); } break;
920 case 1: { txt_drawf("B", x + 9, y + 10, col_fg); } break;
921 }
922 } 911 }
923 } 912 }
924 913
925 // Envelope. 914 // Envelope.
926 { 915 {
927 // Env. drawing. 916 size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 1 + 1;
928 { 917 size_t y = PARAMS_START_Y + 1;
929 // Bounding box. 918 size_t x0 = x;
930 { 919 size_t y0 = y + 15 - params->env_volume;
931 size_t x0 = PARAMS_START_X + 31 + x_offset; 920 size_t x1 = x + (3 * PARAMS_BOX_OFFSET_X) * params->env_time / 8 + 7;
932 size_t y0 = PARAMS_START_Y + PARAMS_H - 46; 921 size_t y1 = params->env_direction == 0 ? y + 15 : y;
933 size_t x1 = x0 + 79; 922 size_t x2 = x + PARAMS_BOX_OFFSET_X * 3 - 5;
934 size_t y1 = y0 + 21; 923 size_t y2 = y1;
935 draw_rect(x0, y0, x1, y1, COL_ACC_2);
936 }
937
938 size_t x = PARAMS_START_X + 42 + x_offset;
939 size_t y = PARAMS_START_Y + PARAMS_H - 43;
940 size_t x0 = x;
941 size_t y0 = y + 15 - params->env_volume;
942 size_t x1 = x + 8 * params->env_time;
943 size_t y1 = params->env_direction == 0 ? y + 15 : y;
944 size_t x2 = x + 8 * 7 + 1;
945 size_t y2 = y1;
946
947 // Env.
948 if (params->env_time == 0) {
949 draw_line(x1, y0, x2, y0, COL_ACC_2);
950 } else {
951 draw_line(x0, y0, x1, y1, COL_ACC_2);
952 draw_line(x1, y1, x2, y2, COL_ACC_2);
953 }
954 }
955
956 // Env. volume.
957 {
958 size_t x = PARAMS_START_X + 31 + x_offset;
959 size_t y = PARAMS_START_Y + PARAMS_H - 26;
960 draw_line(x, y + 7, x + 4, y + 7, col_fg);
961 draw_line(x + 20, y + 7, x + 24, y + 7, col_fg);
962 draw_line(x, y + 8, x, y + 19, col_fg);
963 draw_line(x + 24, y + 8, x + 24, y + 19, col_fg);
964 draw_line(x, y + 20, x + 24, y + 20, col_fg);
965 txt_drawf_small("vol", x + 5, y + 3, col_fg);
966
967 switch (params->env_volume) {
968 case 0: { txt_drawf("0", x + 9, y + 10, col_fg); } break;
969 case 1: { txt_drawf("6", x + 9, y + 10, col_fg); } break;
970 case 2: { txt_drawf("13", x + 6, y + 10, col_fg); } break;
971 case 3: { txt_drawf("20", x + 6, y + 10, col_fg); } break;
972 case 4: { txt_drawf("26", x + 6, y + 10, col_fg); } break;
973 case 5: { txt_drawf("33", x + 6, y + 10, col_fg); } break;
974 case 6: { txt_drawf("40", x + 6, y + 10, col_fg); } break;
975 case 7: { txt_drawf("46", x + 6, y + 10, col_fg); } break;
976 case 8: { txt_drawf("53", x + 6, y + 10, col_fg); } break;
977 case 9: { txt_drawf("60", x + 6, y + 10, col_fg); } break;
978 case 10: { txt_drawf("66", x + 6, y + 10, col_fg); } break;
979 case 11: { txt_drawf("73", x + 6, y + 10, col_fg); } break;
980 case 12: { txt_drawf("80", x + 6, y + 10, col_fg); } break;
981 case 13: { txt_drawf("86", x + 6, y + 10, col_fg); } break;
982 case 14: { txt_drawf("93", x + 6, y + 10, col_fg); } break;
983 case 15: { txt_drawf("100", x + 3, y + 10, col_fg); } break;
984 }
985 }
986 924
987 // Env. direction 925 // Env.
988 { 926 if (params->env_time == 0) {
989 size_t x = PARAMS_START_X + 59 + x_offset; 927 // TODO: Time 0 vol 0 (dir) doesn't make sense (mute)
990 size_t y = PARAMS_START_Y + PARAMS_H - 26; 928 // TODO: Time 0 vol 100 doesn't make sense (constant max volume)
991 draw_line(x, y + 7, x + 4, y + 7, col_fg); 929 // NOTE: Maybe it's just a matter of handling it better on the
992 draw_line(x + 20, y + 7, x + 24, y + 7, col_fg); 930 // control? Have to check every time we change direction to swap
993 draw_line(x, y + 8, x, y + 19, col_fg); 931 // the conditions.
994 draw_line(x + 24, y + 8, x + 24, y + 19, col_fg); 932 draw_line(x0, y0, x2, y0, COL_ACC_2);
995 draw_line(x, y + 20, x + 24, y + 20, col_fg); 933 } else {
996 txt_drawf_small("dir", x + 5, y + 3, col_fg); 934 draw_line(x0, y0, x1, y1, COL_ACC_2);
997 935 draw_line(x1, y1, x2, y2, COL_ACC_2);
998 char arr_up[2] = { 0x19, 0 };
999 char arr_down[2] = { 0x18, 0 };
1000 switch (params->env_direction) {
1001 case 0: {
1002 txt_drawf(arr_up, x + 9, y + 11, col_fg);
1003 } break;
1004 case 1: {
1005 txt_drawf(arr_down, x + 9, y + 11, col_fg);
1006 } break;
1007 }
1008 } 936 }
937 }
1009 938
1010 // Env. time. 939 // TODO: Trig probability
1011 { 940 {
1012 size_t x = PARAMS_START_X + 87 + x_offset; 941 size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3;
1013 size_t y = PARAMS_START_Y + PARAMS_H - 26; 942 size_t y = PARAMS_START_Y + 5;
1014 draw_line(x, y + 7, x + 2, y + 7, col_fg); 943 txt_drawf("100", x, y, col_fg);
1015 draw_line(x + 22, y + 7, x + 24, y + 7, col_fg); 944 txt_drawc('%', x + 18, y, col_fg);
1016 draw_line(x, y + 8, x, y + 19, col_fg);
1017 draw_line(x + 24, y + 8, x + 24, y + 19, col_fg);
1018 draw_line(x, y + 20, x + 24, y + 20, col_fg);
1019 txt_drawf_small("time", x + 3, y + 3, col_fg);
1020
1021 switch (params->env_time) {
1022 case 0: { txt_drawf("0", x + 9, y + 10, col_fg); } break;
1023 case 1: { txt_drawf("14", x + 6, y + 10, col_fg); } break;
1024 case 2: { txt_drawf("28", x + 6, y + 10, col_fg); } break;
1025 case 3: { txt_drawf("42", x + 6, y + 10, col_fg); } break;
1026 case 4: { txt_drawf("57", x + 6, y + 10, col_fg); } break;
1027 case 5: { txt_drawf("71", x + 6, y + 10, col_fg); } break;
1028 case 6: { txt_drawf("85", x + 6, y + 10, col_fg); } break;
1029 case 7: { txt_drawf("100", x + 3, y + 10, col_fg); } break;
1030 }
1031 }
1032 } 945 }
1033 946
1034 // Labels. 947 // Labels.
1035 { 948 {
1036 size_t x = PARAMS_START_X + x_offset; 949 size_t x = PARAMS_START_X;
1037 size_t y = PARAMS_START_Y + PARAMS_H - 43; 950 size_t y = PARAMS_START_Y;
1038 txt_drawf_small("envelope", x + 54, y - 12, col_fg); 951 txt_drawf_small("mode", x + 6 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg);
952 txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg);
953 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg);
954 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, col_fg);
955 txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg);
956 }
957
958 // Empty spacers.
959 {
960 draw_param_stub(5, COL_OFF);
961 draw_param_stub(6, COL_OFF);
962 draw_param_stub(7, COL_OFF);
963 draw_param_stub(8, COL_OFF);
964 draw_param_stub(9, COL_OFF);
1039 } 965 }
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 // }
1040} 1107}
1041 1108
1042void 1109void
diff --git a/src/globals.c b/src/globals.c
index 758f3b5..cd9fe72 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 = 0; 8int channel_selection_loc = 3;
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;