@@ -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
0 commit comments