Skip to content

Commit 3ccec8a

Browse files
committed
added UI step sequencer grid support for 256 steps on 303 engines
1 parent c0d1622 commit 3ccec8a

File tree

13 files changed

+74
-75
lines changed

13 files changed

+74
-75
lines changed

v2/AciduinoV2/0_hardware_setup.ino

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
#if defined (USE_CUSTOM_PINOUT)
1919

2020
// going to use changer encoder?
21-
#define NAV_ENCODER_DEC_PIN 24
22-
#define NAV_ENCODER_INC_PIN 25
21+
//#define NAV_ENCODER_DEC_PIN 24
22+
//#define NAV_ENCODER_INC_PIN 25
2323

2424
#define NAV_SHIFT_PIN 4
2525

@@ -28,7 +28,7 @@
2828
#define NAV_GENERAL1_PIN 3
2929
#define NAV_GENERAL2_PIN 5
3030
#define NAV_RIGHT_PIN 15
31-
#define NAV_UP_PIN 14
31+
#define NAV_UP_PIN 17
3232
#define NAV_DOWN_PIN 9
3333
#define NAV_LEFT_PIN 16
3434

@@ -59,7 +59,7 @@
5959
#define NAV_GENERAL1_PIN 3
6060
#define NAV_GENERAL2_PIN 5
6161
#define NAV_RIGHT_PIN 15
62-
#define NAV_UP_PIN 17
62+
#define NAV_UP_PIN 14
6363
#define NAV_DOWN_PIN 9
6464
#define NAV_LEFT_PIN 16
6565

v2/AciduinoV2/acid_ui_components.ino

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ struct StepSequencer : PageComponent {
447447
uint8_t locator_current = 0;
448448
uint8_t selected_step = 0;
449449
uint8_t curr_step = 0;
450-
uint8_t step_size = 0;
450+
uint16_t step_size = 0;
451451
uint8_t pot_last_note = 36;
452452
bool full_size_view = false;
453453
// rec and preview function helpers
@@ -468,25 +468,26 @@ struct StepSequencer : PageComponent {
468468
void setViewMode(bool full_size) {
469469
if (full_size != full_size_view) {
470470
full_size_view = full_size;
471-
line_size = full_size_view ? ceil((float)step_size/16) + 1 : 2;
472-
selected_locator = selected_step / (full_size_view ? step_size : 16);
471+
selected_locator = selected_step / (full_size_view ? 64 : 16);
472+
step_size = AcidSequencer.getTrackLength(_selected_track);
473+
line_size = full_size_view ? (selected_locator == locator_length-1 ? ceil((step_size - (selected_locator * 64)) / 16) : 4) + 1 : 2;
473474
}
474475
}
475476

476477
void view() {
477478
uint8_t steps_line = line + 1;
478-
uint8_t idx = 0, step_on = 0;
479+
uint8_t line_idx = 0, step_on = 0;
479480
uint8_t max_steps_per_view = full_size_view ? 64 : 16;
480481

481482
curr_step = AcidSequencer.getCurrentStep(_selected_track);
482483
step_size = AcidSequencer.getTrackLength(_selected_track);
483-
locator_current = curr_step == 0 ? 0 : ceil((float)curr_step/max_steps_per_view) - 1;
484+
locator_current = curr_step == 0 ? 0 : curr_step / max_steps_per_view;
484485
locator_length = ceil((float)step_size/max_steps_per_view);
485486
// fix selected step changes on tracks with different track length
486487
selected_step = selected_step >= step_size ? step_size - 1 : selected_step;
487488
selected_locator = selected_locator >= locator_length ? locator_current : selected_locator;
488489
// force it again in case track length change
489-
line_size = full_size_view ? ceil((float)step_size/16) + 1 : 2;
490+
line_size = full_size_view ? (selected_locator == locator_length-1 ? ceil((step_size - (selected_locator * 64)) / 16) : 4) + 1 : 2;
490491

491492
#if defined(USE_LED_8) || defined(USE_LED_16) || defined(USE_LED_24)
492493
// locator leds
@@ -503,18 +504,18 @@ struct StepSequencer : PageComponent {
503504
// step locators
504505
uint8_t bar_size = locator_length > 1 ? 128 / locator_length : 0;
505506
for (uint8_t i=0; i < locator_length; i++) {
506-
uCtrl.oled->drawBox(y+(locator_current == i ? 2 : 3), x+(bar_size*i)+2, (locator_current == i ? 3 : 1), bar_size-4, (selected_locator == i && (selected_line == 1 || selected_line >= 2) && selected));
507+
uCtrl.oled->drawBox(y+(locator_current == i ? 3 : 4), x+(bar_size*i)+2, (locator_current == i ? 3 : 1), bar_size-4, (selected_locator == i && (selected_line == 1 || selected_line >= 2) && selected));
507508
}
508509

509510
// steps
510-
uint8_t first_step = (selected_line == 1 || selected_line >= 2) && selected ? selected_locator * max_steps_per_view : locator_current*max_steps_per_view;
511-
uint8_t last_step = first_step + max_steps_per_view > step_size ? step_size : first_step + max_steps_per_view;
512-
for (uint8_t i=first_step; i < last_step; i++) {
513-
step_on = AcidSequencer.stepOn(_selected_track, i);
514-
idx = i % 16;
511+
uint16_t first_step = selected ? selected_locator * max_steps_per_view : locator_current * max_steps_per_view;
512+
uint16_t last_step = first_step + max_steps_per_view > step_size ? step_size : first_step + max_steps_per_view;
513+
for (uint16_t step_idx=first_step; step_idx < last_step; step_idx++) {
514+
step_on = AcidSequencer.stepOn(_selected_track, step_idx);
515+
line_idx = step_idx % 16;
515516

516517
// only use this in full sized mode
517-
if (idx == 0 && i != 0 && full_size_view) {
518+
if (line_idx == 0 && step_idx%64 != 0 && full_size_view) {
518519
steps_line++;
519520
}
520521

@@ -525,38 +526,38 @@ struct StepSequencer : PageComponent {
525526
if (step_on) {
526527
uCtrl.oled->mergeBitmap(step_asset, (uint8_t*)STEP_ON);
527528
#if defined(USE_LED_16) || defined(USE_LED_24)
528-
uCtrl.dout->write(idx+STEP_LED_1, HIGH);
529+
uCtrl.dout->write(line_idx+STEP_LED_1, HIGH);
529530
#endif
530531
} else {
531532
uCtrl.oled->mergeBitmap(step_asset, (uint8_t*)STEP_OFF);
532533
}
533534

534535
// step time signature mark?
535-
if (i % 4 == 0) {
536+
if (step_idx % 4 == 0) {
536537
uCtrl.oled->mergeBitmap(step_asset, (uint8_t*)STEP_TIME_SIGNATURE_MARK);
537538
}
538539

539540
// step current?
540-
if (curr_step == i && _playing) {
541+
if (curr_step == step_idx && _playing) {
541542
uCtrl.oled->mergeBitmap(step_asset, (uint8_t*)STEP_SELECTED);
542543
#if defined(USE_LED_16) || defined(USE_LED_24)
543-
uCtrl.dout->write(idx+STEP_LED_1, step_on ? LOW : HIGH);
544+
uCtrl.dout->write(line_idx+STEP_LED_1, step_on ? LOW : HIGH);
544545
#endif
545546
}
546547

547548
// step selected?
548-
if (selected_step == i && selected && selected_line >= 2) {
549+
if (selected_step == step_idx && selected && selected_line >= 2) {
549550
uCtrl.oled->mergeBitmap(step_asset, (uint8_t*)STEP_SELECTED, true);
550551
#if defined(USE_LED_16) || defined(USE_LED_24)
551-
uCtrl.dout->write(idx+STEP_LED_1, uCtrl.dout->blink() ? LOW : HIGH);
552+
uCtrl.dout->write(line_idx+STEP_LED_1, uCtrl.dout->blink() ? LOW : HIGH);
552553
#endif
553554
}
554555

555-
uCtrl.oled->print(step_asset, steps_line, idx+1);
556+
uCtrl.oled->print(step_asset, steps_line, line_idx+1);
556557
}
557558

558559
// step info
559-
uint8_t info_line_idx = full_size_view ? ceil((float)step_size/16) + 1 : 2;
560+
uint8_t info_line_idx = full_size_view ? 5 : 2;
560561
// 303
561562
if (AcidSequencer.is303(_selected_track)) {
562563
if (selected_line >= 2) {
@@ -603,18 +604,25 @@ struct StepSequencer : PageComponent {
603604

604605
switch (dir) {
605606
case UP:
606-
if (full_size_view && selected_line != 1) {
607-
selected_step = selected_step >= 16 ? selected_step - 16 : step_size - (16 - selected_step);
608-
selected_locator = selected_step / (full_size_view ? step_size : 16);
609-
selected_line = ceil((float)selected_step/16) + 1;
607+
if (full_size_view && selected_line > 1) {
608+
if (selected_line == 5) {
609+
selected_step = (selected_step % 16) + (16*3) + (selected_locator*64);
610+
} else {
611+
selected_step = selected_step >= 16 ? selected_step - 16 : step_size - (16 - selected_step);
612+
}
613+
selected_locator = selected_step / 64;
614+
selected_line = ((selected_step % 64) / 16) + 2;
610615
}
611616
break;
612617
case DOWN:
613-
if (full_size_view && selected_line != 1) {
614-
selected_step = (selected_step + 16) % step_size;
615-
//selected_step = (selected_step + 16) > step_size ? step_size - 1 : (selected_step + 16) % step_size;
616-
selected_locator = selected_step / (full_size_view ? step_size : 16);
617-
selected_line = ceil((float)selected_step/16) + 1;
618+
if (full_size_view && selected_line > 1) {
619+
if (selected_line == 2) {
620+
selected_step = (selected_step % 16) + (selected_locator*64);
621+
} else {
622+
selected_step = (selected_step + 16) % step_size;
623+
}
624+
selected_locator = selected_step / 64;
625+
selected_line = ((selected_step % 64) / 16) + 2;
618626
}
619627
break;
620628
case LEFT:
@@ -637,15 +645,16 @@ struct StepSequencer : PageComponent {
637645
selected_locator = locator_length-1;
638646
} else {
639647
--selected_step;
640-
selected_locator = selected_step / (full_size_view ? step_size : 16);
648+
selected_locator = selected_step / (full_size_view ? 64 : 16);
641649
}
642650
// update the selected line if is full_size_view
643651
if (full_size_view && selected_line != 1) {
644-
selected_line = (selected_step / 16) + 2;
652+
selected_line = ((selected_step % 64) / 16) + 2;
645653
}
646654
}
647655
break;
648656
case RIGHT:
657+
// step locator
649658
if (selected_line == 1) {
650659
if (selected_locator == locator_length-1) {
651660
selected_locator = 0;
@@ -657,25 +666,26 @@ struct StepSequencer : PageComponent {
657666
++selected_locator;
658667
selected_step += 16;
659668
}
669+
// steps
660670
} else if(selected_line > 1) {
661671
if (selected_step == step_size-1) {
662672
selected_step = 0;
663673
selected_locator = 0;
664674
} else {
665675
++selected_step;
666-
selected_locator = selected_step / (full_size_view ? step_size : 16);
676+
selected_locator = selected_step / (full_size_view ? 64 : 16);
667677
}
668678
// update the selected line if is full_size_view
669679
if (full_size_view && selected_line != 1) {
670-
selected_line = (selected_step / 16) + 2;
680+
selected_line = ((selected_step % 64) / 16) + 2;
671681
}
672682
}
673683
break;
674684
}
675685

676686
// keep grid nav aligned for user best ux experience
677-
selected_grid = (float)((float)(selected_locator+1)/(float)locator_length) > 0.5 ? 2 : 1;
678-
selected_grid = selected_step%16 >= 8 ? 2 : 1;
687+
//selected_grid = (float)(selected_locator+1) / locator_length > 0.5 ? 2 : 1;
688+
//selected_grid = selected_step % 16 >= 8 ? 2 : 1;
679689

680690
}
681691

v2/AciduinoV2/page_sequencer.ino

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,26 +46,14 @@ void step_sequencer_page_refresh(uint8_t subpage)
4646
uCtrl.page->component(voiceConfigComponent, 4, 1);
4747
uCtrl.page->component(rollTypeComponent, 4, 2);
4848
}
49-
50-
// seq divider!
5149

5250
// step edit
5351
uCtrl.page->component(stepSequencerComponent, 5, 1);
5452
} else if (subpage == 1) {
5553
// set step sequencer mode view as full size view
5654
stepSequencerComponent.setViewMode(true);
57-
// generative
58-
// ...
59-
// 303
60-
// low range, high range
61-
// tones num
62-
// notes num
63-
64-
// 808
65-
66-
// _bjorklund size(length?), _bjorklund (fill)
67-
//
6855

56+
// step edit full view mode
6957
uCtrl.page->component(stepSequencerComponent, 2, 1, true);
7058
}
7159

v2/AciduinoV2/src/sequencer/acid_sequencer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ bool AcidSequencerClass::is303(uint8_t track)
244244
return false;
245245
}
246246

247-
uint8_t AcidSequencerClass::getTrackMaxLength(uint8_t track)
247+
uint16_t AcidSequencerClass::getTrackMaxLength(uint8_t track)
248248
{
249249
// 303 request
250250
if(track < TRACK_NUMBER_303)
@@ -254,7 +254,7 @@ uint8_t AcidSequencerClass::getTrackMaxLength(uint8_t track)
254254
return STEP_MAX_SIZE_808;
255255
}
256256

257-
uint8_t AcidSequencerClass::getTrackLength(uint8_t track)
257+
uint16_t AcidSequencerClass::getTrackLength(uint8_t track)
258258
{
259259
// 303 request
260260
if(track < TRACK_NUMBER_303)

v2/AciduinoV2/src/sequencer/acid_sequencer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ class AcidSequencerClass
8585
uint8_t getTrackChannel(uint8_t track);
8686
uint8_t getTrackPort(uint8_t track) { return 0; };
8787
uint8_t getTrackNumber();
88-
uint8_t getTrackMaxLength(uint8_t track);
89-
uint8_t getTrackLength(uint8_t track);
88+
uint16_t getTrackMaxLength(uint8_t track);
89+
uint16_t getTrackLength(uint8_t track);
9090
void setTrackLength(uint8_t track, uint16_t length);
9191
void clearTrack(uint8_t track);
9292
void acidRandomize(uint8_t track, uint8_t fill, uint8_t param_1 = 0, uint8_t param_2 = 0, uint8_t param_3 = 0, uint8_t param_4 = 0, uint8_t param_5 = 0, uint8_t param_6 = 0);

v2/AciduinoV2/src/sequencer/engine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class Engine
5959
virtual void setTrackChannel(uint8_t track, uint8_t channel) {}
6060

6161
virtual void setTrackLength(uint8_t track, uint16_t length) {}
62-
virtual uint8_t getTrackLength(uint8_t track) {}
62+
virtual uint16_t getTrackLength(uint8_t track) {}
6363

6464
virtual void rest(uint8_t track, uint8_t step, bool state) {}
6565

v2/AciduinoV2/src/sequencer/engine_303.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ void Engine303::init()
6060

6161
_sequencer[track].channel = track;
6262
_sequencer[track].data.shift = 0;
63-
_sequencer[track].data.step_length = STEP_MAX_SIZE_303;
63+
_sequencer[track].data.step_length = STEP_MAX_SIZE_303-1;
6464
_sequencer[track].data.transpose = 0;
6565
_sequencer[track].data.tune = 0;
6666
_sequencer[track].step_location = 0;
@@ -100,7 +100,7 @@ void Engine303::setTie(uint8_t track, uint8_t step, bool state)
100100

101101
bool Engine303::stepOn(uint8_t track, uint8_t step)
102102
{
103-
//int8_t relative_step = uint8_t(step - _sequencer[track].data.shift) % _sequencer[track].data.step_length;
103+
//int8_t relative_step = uint8_t(step - _sequencer[track].data.shift) % _sequencer[track].data.step_length+1;
104104
return !_sequencer[track].data.step[step].rest;
105105
}
106106

@@ -209,16 +209,16 @@ void Engine303::clearTrack(uint8_t track)
209209
ATOMIC(_sequencer[track].mute = false);
210210
}
211211

212-
uint8_t Engine303::getTrackLength(uint8_t track)
212+
uint16_t Engine303::getTrackLength(uint8_t track)
213213
{
214-
static uint8_t length;
215-
ATOMIC(length = _sequencer[track].data.step_length)
214+
static uint16_t length;
215+
ATOMIC(length = _sequencer[track].data.step_length+1)
216216
return length;
217217
}
218218

219219
void Engine303::setTrackLength(uint8_t track, uint16_t length)
220220
{
221-
ATOMIC(_sequencer[track].data.step_length = length);
221+
ATOMIC(_sequencer[track].data.step_length = length-1);
222222
}
223223

224224
void Engine303::setMute(uint8_t track, uint8_t mute)
@@ -313,7 +313,7 @@ void Engine303::acidRandomize(uint8_t track, uint8_t fill, uint8_t accent_probab
313313
void Engine303::onStepCall(uint32_t tick)
314314
{
315315
uint8_t step, next_step;
316-
uint16_t length;
316+
uint16_t length, step_length;
317317
int8_t note;
318318

319319
for ( uint8_t track = 0; track < TRACK_NUMBER_303; track++ ) {
@@ -333,8 +333,9 @@ void Engine303::onStepCall(uint32_t tick)
333333
// check for slide or tie event ahead of _sequencer[track].step_location
334334
step = _sequencer[track].step_location;
335335
next_step = step;
336-
for ( uint8_t i = 1; i < _sequencer[track].data.step_length; i++ ) {
337-
next_step = ++next_step % _sequencer[track].data.step_length;
336+
step_length = _sequencer[track].data.step_length + 1;
337+
for ( uint8_t i = 1; i < step_length; i++ ) {
338+
next_step = ++next_step % step_length;
338339
if (_sequencer[track].data.step[step].slide == 1 && _sequencer[track].data.step[next_step].rest == 0) {
339340
length = NOTE_LENGTH_303 + 5;
340341
break;

v2/AciduinoV2/src/sequencer/engine_303.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ typedef struct
5555
{
5656
SEQUENCER_STEP_DATA_303 step[STEP_MAX_SIZE_303];
5757
int8_t shift;
58-
uint8_t step_length;
58+
uint16_t step_length;
5959
uint8_t tune;
6060
int8_t transpose;
6161
} SEQUENCER_TRACK_DATA_303;
@@ -87,7 +87,7 @@ class Engine303 : public Engine
8787
void setStepData(uint8_t track, uint8_t step, uint8_t data);
8888
uint8_t getStepData(uint8_t track, uint8_t step);
8989
uint8_t getCurrentStep(uint8_t track);
90-
uint8_t getTrackLength(uint8_t track);
90+
uint16_t getTrackLength(uint8_t track);
9191
uint8_t getTrackChannel(uint8_t track);
9292
void setShiftPos(uint8_t track, int8_t shift);
9393
int8_t getShiftPos(uint8_t track);

v2/AciduinoV2/src/sequencer/engine_808.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,9 +342,9 @@ void Engine808::clearTrack(uint8_t track, uint8_t mode)
342342
}
343343
}
344344

345-
uint8_t Engine808::getTrackLength(uint8_t track)
345+
uint16_t Engine808::getTrackLength(uint8_t track)
346346
{
347-
static uint8_t length;
347+
static uint16_t length;
348348
ATOMIC(length = _sequencer[track].voice[_voice].step_length)
349349
return length;
350350
}

v2/AciduinoV2/src/sequencer/engine_808.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class Engine808 : public Engine
120120
void setStepData(uint8_t track, uint8_t step, uint8_t data);
121121
uint8_t getStepData(uint8_t track, uint8_t step);
122122
uint8_t getCurrentStep(uint8_t track);
123-
uint8_t getTrackLength(uint8_t track);
123+
uint16_t getTrackLength(uint8_t track);
124124
uint8_t getTrackChannel(uint8_t track);
125125
void setShiftPos(uint8_t track, int8_t shift);
126126
int8_t getShiftPos(uint8_t track);

0 commit comments

Comments
 (0)