diff --git a/src/finer/Guide.h b/src/finer/Guide.h index 8f01c95..bfc5788 100644 --- a/src/finer/Guide.h +++ b/src/finer/Guide.h @@ -208,6 +208,7 @@ public: int unityCount, bool realtime, bool tighterChannelLock, + bool resetOnSilence, Guidance &guidance) const { Profiler profiler("Guide::updateGuidance"); @@ -282,7 +283,7 @@ public: // the band ranges as well - in normal multi-window mode we // still have to do that, but we should do these first - if (meanMagnitude < 1.0e-6) { + if (resetOnSilence && meanMagnitude < 1.0e-6) { updateForSilence(guidance); return; } diff --git a/src/finer/R3Stretcher.cpp b/src/finer/R3Stretcher.cpp index 2608585..9055bb2 100644 --- a/src/finer/R3Stretcher.cpp +++ b/src/finer/R3Stretcher.cpp @@ -1303,6 +1303,15 @@ R3Stretcher::analyseChannel(int c, int inhop, int prevInhop, int prevOuthop) m_parameters.options & RubberBandStretcher::OptionChannelsTogether; double magMean = v_mean(classifyScale->mag.data() + 1, classify/2); + + bool resetOnSilence = true; + if (useMidSide() && c == 1) { + // Do not phase reset on silence in the side channel - the + // reset is propagated across to the mid channel, giving + // constant resets for e.g. mono material in a stereo + // configuration + resetOnSilence = false; + } if (m_useReadahead) { m_guide.updateGuidance(ratio, @@ -1317,6 +1326,7 @@ R3Stretcher::analyseChannel(int c, int inhop, int prevInhop, int prevOuthop) m_unityCount, isRealTime(), tighterChannelLock, + resetOnSilence, cd->guidance); } else { m_guide.updateGuidance(ratio, @@ -1331,6 +1341,7 @@ R3Stretcher::analyseChannel(int c, int inhop, int prevInhop, int prevOuthop) m_unityCount, isRealTime(), tighterChannelLock, + resetOnSilence, cd->guidance); }