ab48b21e4119 — Chris Cannam 14 days ago
Use mid-side processing in channels-together mode in R3; for a more stable stereo image, ensure transient bins are reset in mid whenever they are in side
3 files changed, 13 insertions(+), 6 deletions(-)

M src/finer/PhaseAdvance.h
M src/finer/R3Stretcher.cpp
M src/finer/R3Stretcher.h
M src/finer/PhaseAdvance.h +4 -0
@@ 94,6 94,7 @@ public:
                  const process_t *const *prevMag,
                  const Guide::Configuration &configuration,
                  const Guide::Guidance *const *guidance,
+                 bool usingMidSide,
                  int inhop,
                  int outhop) {
 

          
@@ 197,6 198,9 @@ public:
                 process_t ph = 0.0;
                 if (inRange(f, g->phaseReset) || inRange(f, g->kick)) {
                     ph = phase[c][i];
+                } else if (usingMidSide && channels == 2 &&
+                           c == 0 && inRange(f, guidance[1]->phaseReset)) {
+                    ph = phase[c][i];
                 } else if (inhop == outhop) {
                     ph = m_unlocked[c][i];
                 } else if (inRange (f, g->highUnlocked)) {

          
M src/finer/R3Stretcher.cpp +3 -6
@@ 819,9 819,7 @@ R3Stretcher::retrieve(float *const *outp
         }
     }
 
-    bool useMidSide = (m_parameters.channels == 2); //!!!
-
-    if (useMidSide) {
+    if (useMidSide()) {
         for (int i = 0; i < got; ++i) {
             float m = output[0][i];
             float s = output[1][i];

          
@@ 838,9 836,7 @@ R3Stretcher::retrieve(float *const *outp
 void
 R3Stretcher::prepareInput(const float *const *input, int ix, int n)
 {
-    bool useMidSide = (m_parameters.channels == 2); //!!!
-
-    if (useMidSide) {
+    if (useMidSide()) {
         auto &c0 = m_channelData.at(0)->mixdown;
         auto &c1 = m_channelData.at(1)->mixdown;
         for (int i = 0; i < n; ++i) {

          
@@ 971,6 967,7 @@ R3Stretcher::consume()
                  m_channelAssembly.prevMag.data(),
                  m_guideConfiguration,
                  m_channelAssembly.guidance.data(),
+                 useMidSide(),
                  m_prevInhop,
                  m_prevOuthop);
         }

          
M src/finer/R3Stretcher.h +6 -0
@@ 472,6 472,12 @@ protected:
         }
     }        
 
+    bool useMidSide() const {
+        return m_parameters.channels == 2 &&
+            (m_parameters.options &
+             RubberBandStretcher::OptionChannelsTogether);
+    }
+    
     bool isSingleWindowed() const {
         return m_parameters.options &
             RubberBandStretcher::OptionWindowShort;