|
@@ -21,17 +21,26 @@
|
21
|
21
|
#include <math.h>
|
22
|
22
|
#include "pico/stdlib.h"
|
23
|
23
|
|
|
24
|
+#include "config.h"
|
24
|
25
|
#include "adc.h"
|
25
|
26
|
#include "buttons.h"
|
26
|
27
|
#include "lcd.h"
|
27
|
28
|
#include "led.h"
|
|
29
|
+#include "log.h"
|
28
|
30
|
#include "pulse.h"
|
29
|
31
|
#include "sequence.h"
|
30
|
32
|
#include "usb.h"
|
31
|
33
|
#include "usb_midi.h"
|
32
|
34
|
#include "ui.h"
|
33
|
35
|
|
34
|
|
-#define BAT_FETCH_MS 66
|
|
36
|
+#define KEEP_IN_RANGE(val, min, len) { \
|
|
37
|
+ while (val > (len - min)) { \
|
|
38
|
+ val -= len; \
|
|
39
|
+ } \
|
|
40
|
+ while (val < min) { \
|
|
41
|
+ val += len; \
|
|
42
|
+ } \
|
|
43
|
+}
|
35
|
44
|
|
36
|
45
|
enum ui_settings {
|
37
|
46
|
SETTING_MODE = 0,
|
|
@@ -41,8 +50,9 @@ enum ui_settings {
|
41
|
50
|
|
42
|
51
|
// drum machine
|
43
|
52
|
SETTING_BPM,
|
44
|
|
- SETTING_BANK,
|
45
|
53
|
SETTING_LENGTH,
|
|
54
|
+ SETTING_BANK,
|
|
55
|
+ SETTING_CHANNEL,
|
46
|
56
|
|
47
|
57
|
// midi
|
48
|
58
|
SETTING_CH_RX,
|
|
@@ -54,22 +64,25 @@ enum ui_settings {
|
54
|
64
|
static bool allowed_settings[MACHINE_NUM_MODES][SETTING_NUM_MODES] = {
|
55
|
65
|
// MODE_LOOPSTATION
|
56
|
66
|
{
|
57
|
|
- true, true,
|
58
|
|
- false, false, false,
|
|
67
|
+ true, // SETTING_MODE
|
|
68
|
+ true,
|
|
69
|
+ false, false, false, false,
|
59
|
70
|
false, false,
|
60
|
71
|
},
|
61
|
72
|
|
62
|
73
|
// MODE_DRUMMACHINE
|
63
|
74
|
{
|
64
|
|
- true, false,
|
65
|
|
- true, true, true,
|
|
75
|
+ true, // SETTING_MODE
|
|
76
|
+ false,
|
|
77
|
+ true, true, true, true,
|
66
|
78
|
false, false,
|
67
|
79
|
},
|
68
|
80
|
|
69
|
81
|
// MODE_MIDI
|
70
|
82
|
{
|
71
|
|
- true, false,
|
72
|
|
- false, false, false,
|
|
83
|
+ true, // SETTING_MODE
|
|
84
|
+ false,
|
|
85
|
+ false, false, false, false,
|
73
|
86
|
true, true,
|
74
|
87
|
},
|
75
|
88
|
};
|
|
@@ -94,15 +107,9 @@ static void ui_redraw(void) {
|
94
|
107
|
char bat[64] = {0};
|
95
|
108
|
|
96
|
109
|
switch (ui_setting) {
|
97
|
|
- case SETTING_BPM: {
|
98
|
|
- snprintf(mode, sizeof(mode) - 1, "BPM:");
|
99
|
|
- snprintf(val, sizeof(val) - 1, "%"PRIu32, sequence_get_bpm());
|
100
|
|
- break;
|
101
|
|
- }
|
102
|
|
-
|
103
|
110
|
case SETTING_MODE: {
|
104
|
|
- if ((machine_mode == MODE_LOOPSTATION) && (sequence_get_ms() != 0)) {
|
105
|
|
- snprintf(mode, sizeof(mode) - 1, "Mode: %"PRIu32"ms", sequence_get_ms());
|
|
111
|
+ if ((machine_mode == MODE_LOOPSTATION) && (sequence_get_us() != 0)) {
|
|
112
|
+ snprintf(mode, sizeof(mode) - 1, "Mode: %"PRIu64"ms", sequence_get_us() / 1000);
|
106
|
113
|
} else {
|
107
|
114
|
snprintf(mode, sizeof(mode) - 1, "Mode:");
|
108
|
115
|
}
|
|
@@ -134,6 +141,17 @@ static void ui_redraw(void) {
|
134
|
141
|
break;
|
135
|
142
|
}
|
136
|
143
|
|
|
144
|
+ case SETTING_SPEED:
|
|
145
|
+ case SETTING_BPM: {
|
|
146
|
+ if ((machine_mode == MODE_LOOPSTATION) && (sequence_get_us() != 0)) {
|
|
147
|
+ snprintf(mode, sizeof(mode) - 1, "BPM: %"PRIu64"ms", sequence_get_us() / 1000);
|
|
148
|
+ } else {
|
|
149
|
+ snprintf(mode, sizeof(mode) - 1, "BPM:");
|
|
150
|
+ }
|
|
151
|
+ snprintf(val, sizeof(val) - 1, "%"PRIu32, sequence_get_bpm());
|
|
152
|
+ break;
|
|
153
|
+ }
|
|
154
|
+
|
137
|
155
|
case SETTING_LENGTH: {
|
138
|
156
|
snprintf(mode, sizeof(mode) - 1, "Length:");
|
139
|
157
|
snprintf(val, sizeof(val) - 1, "%"PRIu32, sequence_get_beats());
|
|
@@ -142,13 +160,7 @@ static void ui_redraw(void) {
|
142
|
160
|
|
143
|
161
|
case SETTING_BANK: {
|
144
|
162
|
snprintf(mode, sizeof(mode) - 1, "Bank:");
|
145
|
|
- snprintf(val, sizeof(val) - 1, "%"PRIu32, sequence_get_bank());
|
146
|
|
- break;
|
147
|
|
- }
|
148
|
|
-
|
149
|
|
- case SETTING_SPEED: {
|
150
|
|
- snprintf(mode, sizeof(mode) - 1, "Speed:");
|
151
|
|
- snprintf(val, sizeof(val) - 1, "%"PRIu32, sequence_get_ms());
|
|
163
|
+ snprintf(val, sizeof(val) - 1, "%"PRIu32, sequence_get_bank() + 1);
|
152
|
164
|
break;
|
153
|
165
|
}
|
154
|
166
|
|
|
@@ -164,8 +176,14 @@ static void ui_redraw(void) {
|
164
|
176
|
break;
|
165
|
177
|
}
|
166
|
178
|
|
|
179
|
+ case SETTING_CHANNEL: {
|
|
180
|
+ snprintf(mode, sizeof(mode) - 1, "Channel:");
|
|
181
|
+ snprintf(val, sizeof(val) - 1, "todo");
|
|
182
|
+ break;
|
|
183
|
+ }
|
|
184
|
+
|
167
|
185
|
default: {
|
168
|
|
- printf("%s: invalid setting: %d\n", __func__, ui_setting);
|
|
186
|
+ debug("invalid setting: %d", ui_setting);
|
169
|
187
|
ui_setting = 0;
|
170
|
188
|
ui_redraw();
|
171
|
189
|
return;
|
|
@@ -208,7 +226,7 @@ static void ui_buttons_loopstation(enum buttons btn, bool val) {
|
208
|
226
|
}
|
209
|
227
|
|
210
|
228
|
default: {
|
211
|
|
- printf("%s: invalid btn: %d\n", __func__, btn);
|
|
229
|
+ debug("invalid btn: %d", btn);
|
212
|
230
|
break;
|
213
|
231
|
}
|
214
|
232
|
}
|
|
@@ -232,7 +250,7 @@ static void ui_buttons_drummachine(enum buttons btn, bool val) {
|
232
|
250
|
}
|
233
|
251
|
|
234
|
252
|
default: {
|
235
|
|
- printf("%s: invalid btn: %d\n", __func__, btn);
|
|
253
|
+ debug("invalid btn: %d", btn);
|
236
|
254
|
break;
|
237
|
255
|
}
|
238
|
256
|
}
|
|
@@ -291,7 +309,7 @@ static void ui_buttons(enum buttons btn, bool val) {
|
291
|
309
|
}
|
292
|
310
|
|
293
|
311
|
default: {
|
294
|
|
- printf("%s: invalid mode: %d\n", __func__, machine_mode);
|
|
312
|
+ debug("invalid mode: %d", machine_mode);
|
295
|
313
|
machine_mode = 0;
|
296
|
314
|
ui_buttons(btn, val);
|
297
|
315
|
break;
|
|
@@ -308,20 +326,9 @@ void ui_encoder(int32_t val) {
|
308
|
326
|
}
|
309
|
327
|
|
310
|
328
|
switch (ui_setting) {
|
311
|
|
- case SETTING_BPM: {
|
312
|
|
- sequence_set_bpm(sequence_get_bpm() + val);
|
313
|
|
- break;
|
314
|
|
- }
|
315
|
|
-
|
316
|
329
|
case SETTING_MODE: {
|
317
|
330
|
int32_t tmp = machine_mode + val;
|
318
|
|
-
|
319
|
|
- while (tmp < 0) {
|
320
|
|
- tmp += MACHINE_NUM_MODES;
|
321
|
|
- }
|
322
|
|
- while (tmp >= MACHINE_NUM_MODES) {
|
323
|
|
- tmp -= MACHINE_NUM_MODES;
|
324
|
|
- }
|
|
331
|
+ KEEP_IN_RANGE(tmp, 0, MACHINE_NUM_MODES);
|
325
|
332
|
|
326
|
333
|
// midi only when connected to pc
|
327
|
334
|
if ((tmp == MODE_MIDI) && !usb_is_connected()) {
|
|
@@ -331,8 +338,6 @@ void ui_encoder(int32_t val) {
|
331
|
338
|
enum machine_modes prev_mode = machine_mode;
|
332
|
339
|
machine_mode = tmp;
|
333
|
340
|
|
334
|
|
- printf("mode add %"PRIi32" now %d\n", val, machine_mode);
|
335
|
|
-
|
336
|
341
|
if (prev_mode != machine_mode) {
|
337
|
342
|
// reset sequence
|
338
|
343
|
sequence_init();
|
|
@@ -350,38 +355,55 @@ void ui_encoder(int32_t val) {
|
350
|
355
|
led_set(NUM_CHANNELS + 4, true);
|
351
|
356
|
} else if (machine_mode == MODE_DRUMMACHINE) {
|
352
|
357
|
sequence_set_beats(LED_COUNT);
|
|
358
|
+ sequence_set_bpm(120);
|
353
|
359
|
}
|
354
|
360
|
}
|
355
|
361
|
break;
|
356
|
362
|
}
|
357
|
363
|
|
358
|
|
- case SETTING_LENGTH: {
|
359
|
|
- sequence_set_beats(sequence_get_beats() + val);
|
|
364
|
+ case SETTING_SPEED:
|
|
365
|
+ case SETTING_BPM: {
|
|
366
|
+ int32_t tmp = sequence_get_bpm() + val;
|
|
367
|
+ KEEP_IN_RANGE(tmp, 1, MAX_BPM);
|
|
368
|
+ sequence_set_bpm(tmp);
|
360
|
369
|
break;
|
361
|
370
|
}
|
362
|
371
|
|
363
|
|
- case SETTING_BANK: {
|
364
|
|
- sequence_set_bank(sequence_get_bank() + val);
|
|
372
|
+ case SETTING_LENGTH: {
|
|
373
|
+ int32_t tmp = sequence_get_beats() + val;
|
|
374
|
+ KEEP_IN_RANGE(tmp, 1, MAX_BEATS);
|
|
375
|
+ sequence_set_beats(tmp);
|
365
|
376
|
break;
|
366
|
377
|
}
|
367
|
378
|
|
368
|
|
- case SETTING_SPEED: {
|
369
|
|
- sequence_set_ms(sequence_get_ms() + val);
|
|
379
|
+ case SETTING_BANK: {
|
|
380
|
+ int32_t tmp = sequence_get_bank() + val;
|
|
381
|
+ KEEP_IN_RANGE(tmp, 0, (int32_t)sequence_get_max_banks());
|
|
382
|
+ sequence_set_bank(tmp);
|
370
|
383
|
break;
|
371
|
384
|
}
|
372
|
385
|
|
373
|
386
|
case SETTING_CH_RX: {
|
374
|
|
- midi_rx = (uint8_t)(midi_rx + val) % MIDI_MAX_CH;
|
|
387
|
+ int32_t tmp = midi_rx + val;
|
|
388
|
+ KEEP_IN_RANGE(tmp, 0, MIDI_MAX_CH);
|
|
389
|
+ midi_rx = tmp;
|
375
|
390
|
break;
|
376
|
391
|
}
|
377
|
392
|
|
378
|
393
|
case SETTING_CH_TX: {
|
379
|
|
- midi_tx = (uint8_t)(midi_tx + val) % MIDI_MAX_CH;
|
|
394
|
+ int32_t tmp = midi_tx + val;
|
|
395
|
+ KEEP_IN_RANGE(tmp, 0, MIDI_MAX_CH);
|
|
396
|
+ midi_tx = tmp;
|
|
397
|
+ break;
|
|
398
|
+ }
|
|
399
|
+
|
|
400
|
+ case SETTING_CHANNEL: {
|
|
401
|
+ // TODO
|
380
|
402
|
break;
|
381
|
403
|
}
|
382
|
404
|
|
383
|
405
|
default: {
|
384
|
|
- printf("%s: invalid setting: %d\n", __func__, ui_setting);
|
|
406
|
+ debug("invalid setting: %d", ui_setting);
|
385
|
407
|
ui_setting = 0;
|
386
|
408
|
ui_encoder(val);
|
387
|
409
|
return;
|