diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3f3a2fd..c4030af 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -39,6 +39,11 @@ jobs:
           wget -q https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz
           tar xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz
 
+      # Patch Synth_Dexed until the fix is merged upstream; see https://github.com/probonopd/MiniDexed/issues/889
+      - name: Patch Synth_Dexed
+        run: |
+          ( cd Synth_Dexed ; patch -p1 < ../src/patches/dx7note.patch )
+
       - name: Build for Raspberry Pi 5 (64-bit)
         run: |
           set -ex
@@ -124,6 +129,11 @@ jobs:
           wget -q https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi.tar.xz
           tar xf gcc-arm-10.3-2021.07-x86_64-arm-none-eabi.tar.xz
 
+      # Patch Synth_Dexed until the fix is merged upstream; see https://github.com/probonopd/MiniDexed/issues/889
+      - name: Patch Synth_Dexed
+        run: |
+          ( cd Synth_Dexed ; patch -p1 < ../src/patches/dx7note.patch )
+
       - name: Build for Raspberry Pi 2 (32-bit)
         run: |
           set -ex
diff --git a/src/patches/dx7note.patch b/src/patches/dx7note.patch
new file mode 100644
index 0000000..a4a151c
--- /dev/null
+++ b/src/patches/dx7note.patch
@@ -0,0 +1,81 @@
+diff --git a/src/dx7note.cpp b/src/dx7note.cpp
+index b5ed6db..2a07836 100644
+--- a/src/dx7note.cpp
++++ b/src/dx7note.cpp
+@@ -184,11 +184,14 @@ void Dx7Note::init(const uint8_t patch[156], int midinote, int velocity, int src
+     int32_t freq = osc_freq(midinote, mode, coarse, fine, detune);
+     opMode[op] = mode;
+     basepitch_[op] = freq;
+-    porta_curpitch_[op] = freq;
+     ampmodsens_[op] = ampmodsenstab[patch[off + 14] & 3];
+ 
+-    if (porta >= 0)
++    // Always set porta_curpitch_ to basepitch_ if no portamento transition
++    if (porta < 0 || porta >= 128 || srcnote == midinote) {
++      porta_curpitch_[op] = freq;
++    } else {
+       porta_curpitch_[op] = osc_freq(srcnote, mode, coarse, fine, detune);
++    }
+   }
+   for (int i = 0; i < 4; i++) {
+     rates[i] = patch[126 + i];
+@@ -253,13 +256,17 @@ void Dx7Note::compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, const Co
+ 
+       int32_t basepitch = basepitch_[op];
+ 
+-      if ( opMode[op] )
++      if (opMode[op]) {
+         params_[op].freq = Freqlut::lookup(basepitch + pitch_base);
+-      else {
+-        if ( porta_rateindex_ >= 0 ) {
+-          basepitch = porta_curpitch_[op];
+-          if ( porta_gliss_ )
+-            basepitch = logfreq_round2semi(basepitch);
++      } else {
++        // If portamento is enabled but there is no transition, use basepitch_
++        if (porta_rateindex_ >= 0) {
++          if (porta_curpitch_[op] != basepitch_[op]) {
++            basepitch = porta_curpitch_[op];
++            if (porta_gliss_)
++              basepitch = logfreq_round2semi(basepitch);
++          }
++          // else: no transition, use basepitch_ as is
+         }
+         params_[op].freq = Freqlut::lookup(basepitch + pitch_mod);
+       }
+@@ -280,7 +287,7 @@ void Dx7Note::compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, const Co
+ 
+   // ==== PORTAMENTO ====
+   int porta = porta_rateindex_;
+-  if ( porta >= 0 ) {
++  if (porta >= 0) {
+     int32_t rate = Porta::rates[porta];
+     for (int op = 0; op < 6; op++) {
+       int32_t cur = porta_curpitch_[op];
+@@ -289,7 +296,8 @@ void Dx7Note::compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, const Co
+       bool going_up = cur < dst;
+       int32_t newpitch = cur + (going_up ? +rate : -rate);
+ 
+-      if ( going_up ? (cur > dst) : (cur < dst) )
++      // Clamp to destination if we would overshoot/undershoot
++      if ((going_up && newpitch > dst) || (!going_up && newpitch < dst))
+         newpitch = dst;
+ 
+       porta_curpitch_[op] = newpitch;
+@@ -317,10 +325,15 @@ void Dx7Note::update(const uint8_t patch[156], int midinote, int velocity, int p
+     int detune = patch[off + 20];
+     int32_t freq = osc_freq(midinote, mode, coarse, fine, detune);
+     basepitch_[op] = freq;
+-    porta_curpitch_[op] = freq;
+     ampmodsens_[op] = ampmodsenstab[patch[off + 14] & 3];
+     opMode[op] = mode;
+ 
++    // Always set porta_curpitch_ to basepitch_ if no portamento transition
++    if (porta < 0 || porta >= 128) {
++      porta_curpitch_[op] = freq;
++    }
++    // else: porta_curpitch_ will be handled by portamento logic
++
+     for (int i = 0; i < 4; i++) {
+       rates[i] = patch[off + i];
+       levels[i] = patch[off + 4 + i];