From 502565156b9ff0ca8e7c9707ba24ed8532d5f832 Mon Sep 17 00:00:00 2001 From: Armin Date: Thu, 13 Aug 2026 03:47:46 +0200 Subject: [PATCH] Fix arp INVERT dropping an octave; invert Stab/Pinky patterns --- Source/DSP/Arpeggiator.h | 49 +++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/Source/DSP/Arpeggiator.h b/Source/DSP/Arpeggiator.h index 21478c2..2e689f7 100644 --- a/Source/DSP/Arpeggiator.h +++ b/Source/DSP/Arpeggiator.h @@ -188,8 +188,7 @@ private: if (pattern == AsPlayed) { for (int n : heldNotes) { for (int k = 0; k < octaves; ++k) { - int off = (direction == DirectionUp ? 12 * k : -12 * k); - addPitch(n + off, velocities[n]); + addPitch(n + 12 * k, velocities[n]); } } } else { @@ -197,8 +196,7 @@ private: std::sort(sorted.begin(), sorted.end()); for (int n : sorted) { for (int k = 0; k < octaves; ++k) { - int off = (direction == DirectionUp ? 12 * k : -12 * k); - addPitch(n + off, velocities[n]); + addPitch(n + 12 * k, velocities[n]); } } } @@ -288,13 +286,15 @@ private: up = up > 127 ? 127 : up; float vel = heldNotes.empty() ? 0.9f : velocities[heldNotes.back()]; NotePitch rest{restNote, vel}; + int lo = (direction == DirectionDown) ? up : anchor; + int hi = (direction == DirectionDown) ? anchor : up; order.clear(); if (pattern == PinkyUp) { - order = {{anchor, vel}, rest, {up, vel}, {anchor, vel}, - rest, {up, vel}, {anchor, vel}, {anchor, vel}}; + order = {{lo, vel}, rest, {hi, vel}, {lo, vel}, + rest, {hi, vel}, {lo, vel}, {lo, vel}}; } else { - order = {{up, vel}, rest, {anchor, vel}, {up, vel}, - rest, {anchor, vel}, {up, vel}, {up, vel}}; + order = {{hi, vel}, rest, {lo, vel}, {hi, vel}, + rest, {lo, vel}, {hi, vel}, {hi, vel}}; } break; } @@ -311,27 +311,30 @@ private: up = up > 127 ? 127 : up; float vel = heldNotes.empty() ? 0.9f : velocities[heldNotes.back()]; NotePitch rest{restNote, vel}; + // Invert swaps the lower/upper notes (C3 <-> C4) so the Stab + // patterns play upside down when direction is Down. + int lo = (direction == DirectionDown) ? up : anchor; + int hi = (direction == DirectionDown) ? anchor : up; order.clear(); if (pattern == C3C4A) { - order = {{anchor, vel}, {anchor, vel}, {up, vel}, {anchor, vel}, - {up, vel}, {anchor, vel}, rest, {up, vel}}; + order = {{lo, vel}, {lo, vel}, {hi, vel}, {lo, vel}, + {hi, vel}, {lo, vel}, rest, {hi, vel}}; } else if (pattern == C3C4B) { - order = {{up, vel}, {anchor, vel}, rest, {anchor, vel}, - {anchor, vel}, {anchor, vel}, rest, {anchor, vel}}; + order = {{hi, vel}, {lo, vel}, rest, {lo, vel}, + {lo, vel}, {lo, vel}, rest, {lo, vel}}; } else if (pattern == C3C4C) { - order = {{anchor, vel}, {anchor, vel}, rest, {up, vel}, - rest, {anchor, vel}, rest, {anchor, vel}}; + order = {{lo, vel}, {lo, vel}, rest, {hi, vel}, + rest, {lo, vel}, rest, {lo, vel}}; } else if (pattern == C3C4D) { - order = {{anchor, vel}, {anchor, vel}, {up, vel}, {anchor, vel}, - {anchor, vel}, {up, vel}, {anchor, vel}, {anchor, vel}, - {up, vel}, {anchor, vel}, {anchor, vel}, {up, vel}, - {anchor, vel}, {anchor, vel}, {anchor, vel}, {anchor, vel}}; + order = {{lo, vel}, {lo, vel}, {hi, vel}, {lo, vel}, + {lo, vel}, {hi, vel}, {lo, vel}, {lo, vel}, + {hi, vel}, {lo, vel}, {lo, vel}, {hi, vel}, + {lo, vel}, {lo, vel}, {lo, vel}, {lo, vel}}; } else { - NotePitch rest{restNote, vel}; - order = {{anchor, vel}, {anchor, vel}, rest, {anchor, vel}, - {anchor, vel}, rest, {anchor, vel}, {anchor, vel}, - rest, {anchor, vel}, {anchor, vel}, rest, - {anchor, vel}, {anchor, vel}, {anchor, vel}, {anchor, vel}}; + order = {{lo, vel}, {lo, vel}, rest, {lo, vel}, + {lo, vel}, rest, {lo, vel}, {lo, vel}, + rest, {lo, vel}, {lo, vel}, rest, + {lo, vel}, {lo, vel}, {lo, vel}, {lo, vel}}; } break; }