aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-07-22 09:30:13 +0200
committerBad Diode <bd@badd10de.dev>2023-07-22 09:30:13 +0200
commit2c4b3648075cc5faa24b859685426b208ccb3a80 (patch)
tree2a14278186211478923f2607c283ced8377af507
parentbac16fa2662f61cfa3b56111649685b4eb397442 (diff)
downloadstepper-2c4b3648075cc5faa24b859685426b208ccb3a80.tar.gz
stepper-2c4b3648075cc5faa24b859685426b208ccb3a80.zip
Add probability handling and drawing
-rw-r--r--src/drawing.c80
-rw-r--r--src/globals.c20
-rw-r--r--src/sequencer.c21
3 files changed, 82 insertions, 39 deletions
diff --git a/src/drawing.c b/src/drawing.c
index 653351d..8fef74f 100644
--- a/src/drawing.c
+++ b/src/drawing.c
@@ -667,6 +667,49 @@ clear_parameters(void) {
667 draw_filled_rect(x0, y0, x1, y1, COL_BG); 667 draw_filled_rect(x0, y0, x1, y1, COL_BG);
668} 668}
669 669
670void
671draw_prob(u8 prob, u8 clr) {
672 size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3;
673 size_t y = PARAMS_START_Y + 5;
674 switch (prob) {
675 case PROB_100: {
676 txt_drawf("100", x, y, clr);
677 txt_drawc('%', x + 18, y, clr);
678 } break;
679 case PROB_80: {
680 txt_drawf("80", x + 3, y, clr);
681 txt_drawc('%', x + 15, y, clr);
682 } break;
683 case PROB_60: {
684 txt_drawf("60", x + 3, y, clr);
685 txt_drawc('%', x + 15, y, clr);
686 } break;
687 case PROB_40: {
688 txt_drawf("40", x + 3, y, clr);
689 txt_drawc('%', x + 15, y, clr);
690 } break;
691 case PROB_20: {
692 txt_drawf("20", x + 3, y, clr);
693 txt_drawc('%', x + 15, y, clr);
694 } break;
695 case PROB_FIRST: { txt_drawf("1st", x + 3, y, clr); } break;
696 case PROB_NOT_FIRST: {
697 txt_drawf("1st", x + 3, y, clr);
698 draw_line(x + 3, y - 1, x + 21, y - 1, clr);
699 } break;
700 case PROB_ONE_TWO: { txt_drawf("1:2", x + 3, y, clr); } break;
701 case PROB_TWO_TWO: { txt_drawf("2:2", x + 3, y, clr); } break;
702 case PROB_ONE_THREE: { txt_drawf("1:3", x + 3, y, clr); } break;
703 case PROB_TWO_THREE: { txt_drawf("2:3", x + 3, y, clr); } break;
704 case PROB_THREE_THREE: { txt_drawf("3:3", x + 3, y, clr); } break;
705 case PROB_ONE_FOUR: { txt_drawf("1:4", x + 3, y, clr); } break;
706 case PROB_TWO_FOUR: { txt_drawf("2:4", x + 3, y, clr); } break;
707 case PROB_THREE_FOUR: { txt_drawf("3:4", x + 3, y, clr); } break;
708 case PROB_FOUR_FOUR: { txt_drawf("4:4", x + 3, y, clr); } break;
709 default: break;
710 }
711}
712
670IWRAM_CODE 713IWRAM_CODE
671void 714void
672draw_parameters_wave(ChannelWaveParams *params, bool global) { 715draw_parameters_wave(ChannelWaveParams *params, bool global) {
@@ -685,13 +728,8 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) {
685 draw_wave_pattern(waves[params->shape_b][params->phase_b], x + PARAMS_BOX_OFFSET_X * 2, y, COL_ACC_2); 728 draw_wave_pattern(waves[params->shape_b][params->phase_b], x + PARAMS_BOX_OFFSET_X * 2, y, COL_ACC_2);
686 } 729 }
687 730
688 // TODO: Trig probability 731 // Trig probability.
689 { 732 draw_prob(params->prob, col_fg);
690 size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3;
691 size_t y = PARAMS_START_Y + 5;
692 txt_drawf("100", x, y, col_fg);
693 txt_drawc('%', x + 18, y, col_fg);
694 }
695 733
696 // Mode selection. 734 // Mode selection.
697 { 735 {
@@ -814,11 +852,6 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
814 852
815 // Env. 853 // Env.
816 if (params->env_time == 0) { 854 if (params->env_time == 0) {
817 // TODO: Time 0 vol 0 (dir) doesn't make sense (mute)
818 // TODO: Time 0 vol 100 doesn't make sense (constant max volume)
819 // NOTE: Maybe it's just a matter of handling it better on the
820 // control? Have to check every time we change direction to swap
821 // the conditions.
822 draw_line(x0, y0, x2, y0, COL_ACC_2); 855 draw_line(x0, y0, x2, y0, COL_ACC_2);
823 } else { 856 } else {
824 draw_line(x0, y0, x1, y1, COL_ACC_2); 857 draw_line(x0, y0, x1, y1, COL_ACC_2);
@@ -826,13 +859,8 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
826 } 859 }
827 } 860 }
828 861
829 // TODO: Trig probability 862 // Trig probability.
830 { 863 draw_prob(params->prob, col_fg);
831 size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3;
832 size_t y = PARAMS_START_Y + 5;
833 txt_drawf("100", x, y, col_fg);
834 txt_drawc('%', x + 18, y, col_fg);
835 }
836 864
837 // Sweep. 865 // Sweep.
838 if (sweep) { 866 if (sweep) {
@@ -943,11 +971,6 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) {
943 971
944 // Env. 972 // Env.
945 if (params->env_time == 0) { 973 if (params->env_time == 0) {
946 // TODO: Time 0 vol 0 (dir) doesn't make sense (mute)
947 // TODO: Time 0 vol 100 doesn't make sense (constant max volume)
948 // NOTE: Maybe it's just a matter of handling it better on the
949 // control? Have to check every time we change direction to swap
950 // the conditions.
951 draw_line(x0, y0, x2, y0, COL_ACC_2); 974 draw_line(x0, y0, x2, y0, COL_ACC_2);
952 } else { 975 } else {
953 draw_line(x0, y0, x1, y1, COL_ACC_2); 976 draw_line(x0, y0, x1, y1, COL_ACC_2);
@@ -955,13 +978,8 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) {
955 } 978 }
956 } 979 }
957 980
958 // TODO: Trig probability 981 // Trig probability.
959 { 982 draw_prob(params->prob, col_fg);
960 size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3;
961 size_t y = PARAMS_START_Y + 5;
962 txt_drawf("100", x, y, col_fg);
963 txt_drawc('%', x + 18, y, col_fg);
964 }
965 983
966 // Labels. 984 // Labels.
967 { 985 {
diff --git a/src/globals.c b/src/globals.c
index 758f3b5..51ef292 100644
--- a/src/globals.c
+++ b/src/globals.c
@@ -160,3 +160,23 @@ typedef struct Chain {
160} Chain; 160} Chain;
161 161
162static Chain chain = {0}; 162static Chain chain = {0};
163
164typedef enum Prob {
165 PROB_100,
166 PROB_80,
167 PROB_60,
168 PROB_40,
169 PROB_20,
170 PROB_FIRST,
171 PROB_NOT_FIRST,
172 PROB_ONE_TWO,
173 PROB_TWO_TWO,
174 PROB_ONE_THREE,
175 PROB_TWO_THREE,
176 PROB_THREE_THREE,
177 PROB_ONE_FOUR,
178 PROB_TWO_FOUR,
179 PROB_THREE_FOUR,
180 PROB_FOUR_FOUR,
181 PROB_NUM,
182} Prob;
diff --git a/src/sequencer.c b/src/sequencer.c
index 04153aa..00baebb 100644
--- a/src/sequencer.c
+++ b/src/sequencer.c
@@ -71,6 +71,11 @@ find_prev_pattern(void) {
71 return idx; 71 return idx;
72} 72}
73 73
74bool
75should_play(u8 prob) {
76 return true;
77}
78
74void 79void
75play_step(void) { 80play_step(void) {
76 Pattern *pat = &patterns[current_pattern]; 81 Pattern *pat = &patterns[current_pattern];
@@ -94,7 +99,7 @@ play_step(void) {
94 if (pat->ch1.active) { 99 if (pat->ch1.active) {
95 TriggerNote *trig = &pat->ch1.notes[step_counter]; 100 TriggerNote *trig = &pat->ch1.notes[step_counter];
96 ChannelSquareParams *params = &pat->ch1.params[step_counter]; 101 ChannelSquareParams *params = &pat->ch1.params[step_counter];
97 if (trig->active) { 102 if (trig->active && should_play(params->prob)) {
98 if (params->sweep_time == 0) { 103 if (params->sweep_time == 0) {
99 SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1); 104 SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1);
100 } else { 105 } else {
@@ -128,7 +133,7 @@ play_step(void) {
128 if (pat->ch2.active) { 133 if (pat->ch2.active) {
129 TriggerNote *trig = &pat->ch2.notes[step_counter]; 134 TriggerNote *trig = &pat->ch2.notes[step_counter];
130 ChannelSquareParams *params = &pat->ch2.params[step_counter]; 135 ChannelSquareParams *params = &pat->ch2.params[step_counter];
131 if (trig->active) { 136 if (trig->active && should_play(params->prob)) {
132 SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) 137 SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume)
133 | SOUND_SQUARE_ENV_TIME(params->env_time) 138 | SOUND_SQUARE_ENV_TIME(params->env_time)
134 | SOUND_SQUARE_ENV_DIR(params->env_direction) 139 | SOUND_SQUARE_ENV_DIR(params->env_direction)
@@ -147,7 +152,7 @@ play_step(void) {
147 if (pat->ch3.active) { 152 if (pat->ch3.active) {
148 TriggerNote *trig = &pat->ch3.notes[step_counter]; 153 TriggerNote *trig = &pat->ch3.notes[step_counter];
149 ChannelWaveParams *params = &pat->ch3.params[step_counter]; 154 ChannelWaveParams *params = &pat->ch3.params[step_counter];
150 if (trig->active) { 155 if (trig->active && should_play(params->prob)) {
151 switch (params->wave_mode) { 156 switch (params->wave_mode) {
152 case 0: { 157 case 0: {
153 SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); 158 SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1);
@@ -195,7 +200,7 @@ play_step(void) {
195 if (pat->ch4.active) { 200 if (pat->ch4.active) {
196 TriggerNote *trig = &pat->ch4.notes[step_counter]; 201 TriggerNote *trig = &pat->ch4.notes[step_counter];
197 ChannelNoiseParams *params = &pat->ch4.params[step_counter]; 202 ChannelNoiseParams *params = &pat->ch4.params[step_counter];
198 if (trig->active) { 203 if (trig->active && should_play(params->prob)) {
199 static const u8 div_freq[] = { 204 static const u8 div_freq[] = {
200 7, 6, 5, 4, 7, 6, 5, 4, 7, 6, 5, 4, 205 7, 6, 5, 4, 7, 6, 5, 4, 7, 6, 5, 4,
201 7, 6, 5, 4, 7, 6, 5, 4, 7, 6, 5, 4, 206 7, 6, 5, 4, 7, 6, 5, 4, 7, 6, 5, 4,
@@ -778,7 +783,7 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler
778 } 783 }
779 } break; 784 } break;
780 case 3: { params->env_direction ^= 1; } break; 785 case 3: { params->env_direction ^= 1; } break;
781 case 4: { /* TODO: probability */ } break; 786 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break;
782 case 5: { params->sweep_number = CLAMP(params->sweep_number + inc, 0, 7); } break; 787 case 5: { params->sweep_number = CLAMP(params->sweep_number + inc, 0, 7); } break;
783 case 6: { params->sweep_time = CLAMP(params->sweep_time + inc, 0, 7); } break; 788 case 6: { params->sweep_time = CLAMP(params->sweep_time + inc, 0, 7); } break;
784 case 7: { params->sweep_direction ^= 1; } break; 789 case 7: { params->sweep_direction ^= 1; } break;
@@ -843,7 +848,7 @@ set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler
843 } 848 }
844 } break; 849 } break;
845 case 3: { params->env_direction ^= 1; } break; 850 case 3: { params->env_direction ^= 1; } break;
846 case 4: { /* TODO: probability */ } break; 851 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break;
847 } 852 }
848 redraw_params = true; 853 redraw_params = true;
849 return true; 854 return true;
@@ -907,7 +912,7 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler)
907 case 1: { params->phase_a = CLAMP(params->phase_a + inc, 0, WAVE_VARS - 1); } break; 912 case 1: { params->phase_a = CLAMP(params->phase_a + inc, 0, WAVE_VARS - 1); } break;
908 case 2: { params->shape_b = CLAMP(params->shape_a + inc, 0, WAVE_MAX - 1); } break; 913 case 2: { params->shape_b = CLAMP(params->shape_a + inc, 0, WAVE_MAX - 1); } break;
909 case 3: { params->phase_b = CLAMP(params->phase_b + inc, 0, WAVE_VARS - 1); } break; 914 case 3: { params->phase_b = CLAMP(params->phase_b + inc, 0, WAVE_VARS - 1); } break;
910 case 4: { /* TODO: probability */ } break; 915 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break;
911 case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break; 916 case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break;
912 case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break; 917 case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break;
913 } 918 }
@@ -971,7 +976,7 @@ set_param_selection_noise(ChannelNoiseParams *params, InputHandler return_handle
971 } 976 }
972 } break; 977 } break;
973 case 3: { params->env_direction ^= 1; } break; 978 case 3: { params->env_direction ^= 1; } break;
974 case 4: { /* TODO: probability */ } break; 979 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break;
975 } 980 }
976 redraw_params = true; 981 redraw_params = true;
977 return true; 982 return true;