--- /dev/null
+https://bugs.gentoo.org/637110
+
+Original patch by Matt Whitlock
+Forward-ported from version 2.2.0 to 2.2.2
+
+--- audacity-minsrc-2.2.2-rc1/src/AudioIO.cpp
++++ audacity-minsrc-2.2.2-rc1/src/AudioIO.cpp
+@@ -976,6 +976,7 @@
+ };
+ #endif
+
++#ifdef EXPERIMENTAL_MIDI_OUT
+ // return the system time as a double
+ static double streamStartTime = 0; // bias system time to small number
+
+@@ -995,6 +996,7 @@
+
+ return PaUtil_GetTime() - streamStartTime;
+ }
++#endif
+
+ const int AudioIO::StandardRates[] = {
+ 8000,
+@@ -1803,6 +1805,7 @@
+ }
+ #endif
+
++#ifdef EXPERIMENTAL_MIDI_OUT
+ // We use audio latency to estimate how far ahead of DACS we are writing
+ if (mPortStreamV19 != NULL && mLastPaError == paNoError) {
+ const PaStreamInfo* info = Pa_GetStreamInfo(mPortStreamV19);
+@@ -1811,6 +1814,7 @@
+ mAudioOutLatency = info->outputLatency;
+ mSystemMinusAudioTimePlusLatency += mAudioOutLatency;
+ }
++#endif
+
+ return (mLastPaError == paNoError);
+ }
+@@ -1955,8 +1959,10 @@
+
+ double playbackTime = 4.0;
+
++#ifdef EXPERIMENTAL_MIDI_OUT
+ streamStartTime = 0;
+ streamStartTime = SystemTime(mUsingAlsa);
++#endif
+
+ #ifdef EXPERIMENTAL_SCRUBBING_SUPPORT
+ bool scrubbing = (options.pScrubbingOptions != nullptr);
+@@ -2830,7 +2836,9 @@
+
+ mPlaybackTracks.clear();
+ mCaptureTracks.clear();
++#ifdef HAVE_MIDI
+ mMidiPlaybackTracks.clear();
++#endif
+
+ #ifdef EXPERIMENTAL_SCRUBBING_SUPPORT
+ mScrubQueue.reset();
+@@ -4669,13 +4677,13 @@
+ (float *)alloca(framesPerBuffer*numPlaybackChannels * sizeof(float)) :
+ (float *)outputBuffer;
+
++#ifdef EXPERIMENTAL_MIDI_OUT
+ if (gAudioIO->mCallbackCount++ == 0) {
+ // This is effectively mSystemMinusAudioTime when the buffer is empty:
+ gAudioIO->mStartTime = SystemTime(gAudioIO->mUsingAlsa) - gAudioIO->mT0;
+ // later, mStartTime - mSystemMinusAudioTime will tell us latency
+ }
+
+-#ifdef EXPERIMENTAL_MIDI_OUT
+ /* GSW: Save timeInfo in case MidiPlayback needs it */
+ gAudioIO->mAudioCallbackClockTime = PaUtil_GetTime();
+
+@@ -5051,7 +5059,9 @@
+ : gAudioIO->mTime >= gAudioIO->mT1))
+ // PRL: singalling MIDI output complete is necessary if
+ // not USE_MIDI_THREAD, otherwise it's harmlessly redundant
++#ifdef EXPERIMENTAL_MIDI_OUT
+ gAudioIO->mMidiOutputComplete = true,
++#endif
+ callbackReturn = paComplete;
+ }
+
+@@ -5114,7 +5124,9 @@
+
+ // PRL: singalling MIDI output complete is necessary if
+ // not USE_MIDI_THREAD, otherwise it's harmlessly redundant
++#ifdef EXPERIMENTAL_MIDI_OUT
+ gAudioIO->mMidiOutputComplete = true,
++#endif
+ callbackReturn = paComplete;
+ }
+ }
+--- audacity-minsrc-2.2.2-rc1/src/Project.cpp
++++ audacity-minsrc-2.2.2-rc1/src/Project.cpp
+@@ -460,10 +460,11 @@
+ } );
+
+ for (const auto &name : sortednames) {
+-
++#ifdef USE_MIDI
+ if (Importer::IsMidi(name))
+ AudacityProject::DoImportMIDI(mProject, name);
+ else
++#endif
+ mProject->Import(name);
+ }
+
+@@ -3046,9 +3047,11 @@
+ #endif
+
+ {
++#ifdef USE_MIDI
+ if (Importer::IsMidi(fileName))
+ DoImportMIDI(this, fileName);
+ else
++#endif
+ Import(fileName);
+
+ ZoomAfterImport(nullptr);
+--- audacity-minsrc-2.2.2-rc1/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp
++++ audacity-minsrc-2.2.2-rc1/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp
+@@ -9,6 +9,9 @@
+ **********************************************************************/
+
+ #include "../../../../Audacity.h"
++
++#ifdef USE_MIDI
++
+ #include "NoteTrackButtonHandle.h"
+
+ #include "../../../../HitTestResult.h"
+@@ -113,3 +116,4 @@
+ return RefreshCode::RefreshNone;
+ }
+
++#endif
+--- audacity-minsrc-2.2.2-rc1/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp
++++ audacity-minsrc-2.2.2-rc1/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp
+@@ -9,6 +9,9 @@
+ **********************************************************************/
+
+ #include "../../../../Audacity.h"
++
++#ifdef USE_MIDI
++
+ #include "NoteTrackVZoomHandle.h"
+ #include "../../../../Experimental.h"
+ #include "NoteTrackVRulerControls.h"
+@@ -332,3 +335,5 @@
+ TrackVRulerControls::DrawZooming
+ ( dc, mRect, panelRect, mZoomStart, mZoomEnd );
+ }
++
++#endif
+--- audacity-minsrc-2.2.2-rc1/src/tracks/ui/TimeShiftHandle.cpp
++++ audacity-minsrc-2.2.2-rc1/src/tracks/ui/TimeShiftHandle.cpp
+@@ -604,7 +604,7 @@
+ {
+ trySnap = true;
+ if (pTrack->GetKind() == Track::Wave) {
+- auto wt = static_cast<const WaveTrack *>(pTrack);
++ auto wt = static_cast<const WaveTrack *>(pTrack.get());
+ const double rate = wt->GetRate();
+ // set it to a sample point
+ desiredSlideAmount = rint(desiredSlideAmount * rate) / rate;