@@ -404,109 +404,101 @@ void Arpeggiator::UpdateSequence() {
404404 break ;
405405
406406 case ARP_PINKY_UP:
407- // Play lowest note, then rest ascending
407+ // Play each note ascending with highest note in between: 1 4 2 4 3 4
408408 for (uint8_t stepNum = 0 ; stepNum < actualSteps; stepNum++) {
409- bool first = true ;
409+ vector<ArpNote> stepNotes ;
410410 for (const ArpNote& note : sortedNotes) {
411411 ArpNote stepNote = note;
412412 stepNote.note += stepNum * config->stepOffset ;
413413 if (stepNote.note < 128 && stepNote.note >= 0 ) {
414- if (first) {
415- arpSequence.push_back (stepNote);
416- first = false ;
417- }
414+ stepNotes.push_back (stepNote);
418415 }
419416 }
420- for (size_t i = 1 ; i < sortedNotes.size (); i++) {
421- ArpNote stepNote = sortedNotes[i];
422- stepNote.note += stepNum * config->stepOffset ;
423- if (stepNote.note < 128 && stepNote.note >= 0 ) {
424- arpSequence.push_back (stepNote);
417+ if (stepNotes.size () > 0 ) {
418+ for (size_t i = 0 ; i < stepNotes.size () - 1 ; i++) {
419+ arpSequence.push_back (stepNotes[i]); // Lower note
420+ arpSequence.push_back (stepNotes[stepNotes.size () - 1 ]); // Highest note (pinky)
425421 }
426422 }
427423 }
428424 break ;
429425
430426 case ARP_PINKY_UP_DOWN:
431- // Play lowest, then up, then down
427+ // Play pinky up then pinky down: 1 4 2 4 3 4 2 4
432428 {
433- vector<ArpNote> baseSeq ;
429+ vector<ArpNote> upSeq ;
434430 for (uint8_t stepNum = 0 ; stepNum < actualSteps; stepNum++) {
435- bool first = true ;
431+ vector<ArpNote> stepNotes ;
436432 for (const ArpNote& note : sortedNotes) {
437433 ArpNote stepNote = note;
438434 stepNote.note += stepNum * config->stepOffset ;
439435 if (stepNote.note < 128 && stepNote.note >= 0 ) {
440- if (first) {
441- baseSeq.push_back (stepNote);
442- first = false ;
443- }
436+ stepNotes.push_back (stepNote);
444437 }
445438 }
446- for ( size_t i = 1 ; i < sortedNotes .size (); i++ ) {
447- ArpNote stepNote = sortedNotes[i];
448- stepNote. note += stepNum * config-> stepOffset ;
449- if (stepNote. note < 128 && stepNote. note >= 0 ) {
450- baseSeq .push_back (stepNote );
439+ if (stepNotes .size () > 0 ) {
440+ // Ascending with pinky in between
441+ for ( size_t i = 0 ; i < stepNotes. size () - 1 ; i++) {
442+ upSeq. push_back (stepNotes[i]);
443+ upSeq .push_back (stepNotes[stepNotes. size () - 1 ] );
451444 }
452445 }
453446 }
454- arpSequence = baseSeq;
455- // Add reverse without endpoints
456- for (int i = baseSeq.size () - 2 ; i > 0 ; i--) {
457- arpSequence.push_back (baseSeq[i]);
447+ arpSequence = upSeq;
448+ // Add descending (reverse without first and last pairs to avoid duplication)
449+ for (int i = upSeq.size () - 4 ; i >= 2 ; i -= 2 ) {
450+ arpSequence.push_back (upSeq[i]);
451+ arpSequence.push_back (upSeq[i + 1 ]);
458452 }
459453 }
460454 break ;
461455
462456 case ARP_THUMB_UP:
463- // Play highest note, then rest ascending from lowest
457+ // Play each note ascending with lowest note in between: 1 2 1 3 1 4
464458 for (uint8_t stepNum = 0 ; stepNum < actualSteps; stepNum++) {
465- // Add highest note first
466- if (!sortedNotes.empty ()) {
467- ArpNote highNote = sortedNotes.back ();
468- highNote.note += stepNum * config->stepOffset ;
469- if (highNote.note < 128 && highNote.note >= 0 ) {
470- arpSequence.push_back (highNote);
471- }
472- }
473- // Add rest ascending except the highest
474- for (size_t i = 0 ; i < sortedNotes.size () - 1 ; i++) {
475- ArpNote stepNote = sortedNotes[i];
459+ vector<ArpNote> stepNotes;
460+ for (const ArpNote& note : sortedNotes) {
461+ ArpNote stepNote = note;
476462 stepNote.note += stepNum * config->stepOffset ;
477463 if (stepNote.note < 128 && stepNote.note >= 0 ) {
478- arpSequence.push_back (stepNote);
464+ stepNotes.push_back (stepNote);
465+ }
466+ }
467+ if (stepNotes.size () > 0 ) {
468+ for (size_t i = 1 ; i < stepNotes.size (); i++) {
469+ arpSequence.push_back (stepNotes[0 ]); // Lowest note (thumb)
470+ arpSequence.push_back (stepNotes[i]); // Higher note
479471 }
480472 }
481473 }
482474 break ;
483475
484476 case ARP_THUMB_UP_DOWN:
485- // Play highest, then up from lowest, then down
477+ // Play thumb up then thumb down: 1 2 1 3 1 4 1 3
486478 {
487- vector<ArpNote> baseSeq ;
479+ vector<ArpNote> upSeq ;
488480 for (uint8_t stepNum = 0 ; stepNum < actualSteps; stepNum++) {
489- // Add highest note first
490- if (!sortedNotes.empty ()) {
491- ArpNote highNote = sortedNotes.back ();
492- highNote.note += stepNum * config->stepOffset ;
493- if (highNote.note < 128 && highNote.note >= 0 ) {
494- baseSeq.push_back (highNote);
495- }
496- }
497- // Add rest ascending except the highest
498- for (size_t i = 0 ; i < sortedNotes.size () - 1 ; i++) {
499- ArpNote stepNote = sortedNotes[i];
481+ vector<ArpNote> stepNotes;
482+ for (const ArpNote& note : sortedNotes) {
483+ ArpNote stepNote = note;
500484 stepNote.note += stepNum * config->stepOffset ;
501485 if (stepNote.note < 128 && stepNote.note >= 0 ) {
502- baseSeq.push_back (stepNote);
486+ stepNotes.push_back (stepNote);
487+ }
488+ }
489+ if (stepNotes.size () > 0 ) {
490+ // Ascending with thumb in between
491+ for (size_t i = 1 ; i < stepNotes.size (); i++) {
492+ upSeq.push_back (stepNotes[0 ]);
493+ upSeq.push_back (stepNotes[i]);
503494 }
504495 }
505496 }
506- arpSequence = baseSeq;
507- // Add reverse without endpoints
508- for (int i = baseSeq.size () - 2 ; i > 0 ; i--) {
509- arpSequence.push_back (baseSeq[i]);
497+ arpSequence = upSeq;
498+ // Add descending (reverse without first and last pairs to avoid duplication)
499+ for (int i = upSeq.size () - 4 ; i >= 2 ; i -= 2 ) {
500+ arpSequence.push_back (upSeq[i]);
501+ arpSequence.push_back (upSeq[i + 1 ]);
510502 }
511503 }
512504 break ;
0 commit comments