Skip to content

Commit 11ffed6

Browse files
committed
Fix pinky & thumb arp mode
1 parent babd9f6 commit 11ffed6

1 file changed

Lines changed: 50 additions & 58 deletions

File tree

Applications/Note/Arpeggiator.cpp

Lines changed: 50 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)