summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDaniel Schürmann <daschuer@mixxx.org>2019-06-07 22:25:18 +0200
committerDaniel Schürmann <daschuer@mixxx.org>2019-06-09 08:28:35 +0200
commitd94c702974e16a1b8a84d152b42c83ee42b6eb03 (patch)
tree07107432f803e21dd8671e5199571f624535b35a /lib
parent8496c318729358aa9bf00f77af21c4c575a914cc (diff)
shift chroma one bin, to have always three bins per note
Diffstat (limited to 'lib')
-rw-r--r--lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp19
-rw-r--r--lib/qm-dsp/mixxx-changes.patch44
2 files changed, 53 insertions, 10 deletions
diff --git a/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp b/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp
index 879f8a8c89..7d62253909 100644
--- a/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp
+++ b/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp
@@ -76,10 +76,11 @@ GetKeyMode::GetKeyMode(Config config) :
// Set C3 (= MIDI #48) as our base:
// This implies that key = 1 => Cmaj, key = 12 => Bmaj, key = 13 => Cmin, etc.
+ const float centsOffset = -12.0f / kBinsPerOctave * 100; // 3 bins per note, start with the first
chromaConfig.min =
- Pitch::getFrequencyForPitch( 48, 0, config.tuningFrequency );
+ Pitch::getFrequencyForPitch( 48, centsOffset, config.tuningFrequency );
chromaConfig.max =
- Pitch::getFrequencyForPitch( 96, 0, config.tuningFrequency );
+ Pitch::getFrequencyForPitch( 96, centsOffset, config.tuningFrequency );
chromaConfig.BPO = kBinsPerOctave;
chromaConfig.CQThresh = 0.0054;
@@ -232,14 +233,11 @@ int GetKeyMode::process(double *pcmData)
}
for (k = 0; k < kBinsPerOctave; k++) {
- // The Chromagram has the center of C at bin 0, while the major
- // and minor profiles have the center of C at 1. We want to have
- // the correlation for C result also at 1.
- // To achieve this we have to shift two times:
- m_majCorr[k] = krumCorr
- (m_meanHPCP, m_majProfileNorm, k - 2, kBinsPerOctave);
- m_minCorr[k] = krumCorr
- (m_meanHPCP, m_minProfileNorm, k - 2, kBinsPerOctave);
+ // The cromagram and the major and minor profiles have the has the
+ // center of C at bin 1. We want to have the correlation for C result
+ // also at 1. To achieve this we have to shift by one:
+ m_majCorr[k] = krumCorr(m_meanHPCP, m_majProfileNorm, (int)k - 1, kBinsPerOctave);
+ m_minCorr[k] = krumCorr(m_meanHPCP, m_minProfileNorm, (int)k - 1, kBinsPerOctave);
}
// m_MajCorr[1] is C center 1 / 3 + 1 = 1
@@ -314,3 +312,4 @@ double* GetKeyMode::getKeyStrengths() {
return m_keyStrengths;
}
+
diff --git a/lib/qm-dsp/mixxx-changes.patch b/lib/qm-dsp/mixxx-changes.patch
index 07f921bd41..964e4a39ff 100644
--- a/lib/qm-dsp/mixxx-changes.patch
+++ b/lib/qm-dsp/mixxx-changes.patch
@@ -64,3 +64,47 @@ index 72e5a57..81d8a8e 100644
extern "C" {
#endif
+diff --git a/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp b/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp
+index 879f8a8..7d62253 100644
+--- a/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp
++++ b/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp
+@@ -76,10 +76,11 @@ GetKeyMode::GetKeyMode(Config config) :
+
+ // Set C3 (= MIDI #48) as our base:
+ // This implies that key = 1 => Cmaj, key = 12 => Bmaj, key = 13 => Cmin, etc.
++ const float centsOffset = -12.0f / kBinsPerOctave * 100; // 3 bins per note, start with the first
+ chromaConfig.min =
+- Pitch::getFrequencyForPitch( 48, 0, config.tuningFrequency );
++ Pitch::getFrequencyForPitch( 48, centsOffset, config.tuningFrequency );
+ chromaConfig.max =
+- Pitch::getFrequencyForPitch( 96, 0, config.tuningFrequency );
++ Pitch::getFrequencyForPitch( 96, centsOffset, config.tuningFrequency );
+
+ chromaConfig.BPO = kBinsPerOctave;
+ chromaConfig.CQThresh = 0.0054;
+@@ -232,14 +233,11 @@ int GetKeyMode::process(double *pcmData)
+ }
+
+ for (k = 0; k < kBinsPerOctave; k++) {
+- // The Chromagram has the center of C at bin 0, while the major
+- // and minor profiles have the center of C at 1. We want to have
+- // the correlation for C result also at 1.
+- // To achieve this we have to shift two times:
+- m_majCorr[k] = krumCorr
+- (m_meanHPCP, m_majProfileNorm, k - 2, kBinsPerOctave);
+- m_minCorr[k] = krumCorr
+- (m_meanHPCP, m_minProfileNorm, k - 2, kBinsPerOctave);
++ // The cromagram and the major and minor profiles have the has the
++ // center of C at bin 1. We want to have the correlation for C result
++ // also at 1. To achieve this we have to shift by one:
++ m_majCorr[k] = krumCorr(m_meanHPCP, m_majProfileNorm, (int)k - 1, kBinsPerOctave);
++ m_minCorr[k] = krumCorr(m_meanHPCP, m_minProfileNorm, (int)k - 1, kBinsPerOctave);
+ }
+
+ // m_MajCorr[1] is C center 1 / 3 + 1 = 1
+@@ -314,3 +312,4 @@ double* GetKeyMode::getKeyStrengths() {
+
+ return m_keyStrengths;
+ }
++
+