From f520f1a3ec3387d0e0f9be2c06470fa88429fcfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 3 Jun 2019 00:26:49 +0200 Subject: [PATCH] Apply mixxx-changes.patch --- lib/qm-dsp/dsp/chromagram/ConstantQ.cpp | 138 ++++---- lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp | 35 ++ lib/qm-dsp/dsp/transforms/FFT.cpp | 4 +- lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c | 2 +- lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h | 2 +- lib/qm-dsp/key_rounding.patch | 253 -------------- lib/qm-dsp/mixx-changes.patch | 372 +++++++++++++++++++++ 7 files changed, 480 insertions(+), 326 deletions(-) delete mode 100644 lib/qm-dsp/key_rounding.patch create mode 100644 lib/qm-dsp/mixx-changes.patch diff --git a/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp b/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp index 4585ddc236a..d1aaef418bc 100644 --- a/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp +++ b/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp @@ -117,31 +117,29 @@ void ConstantQ::sparsekernel() FFT m_FFT(m_FFTLength); - for (unsigned k = m_uK; k--; ) - { - for (unsigned u=0; u < m_FFTLength; u++) - { + for (unsigned k = m_uK; k--;) { + for (unsigned u=0; u < m_FFTLength; u++) { hammingWindowRe[u] = 0; hammingWindowIm[u] = 0; } - // Computing a hamming window - const unsigned hammingLength = (int) ceil( m_dQ * m_FS / ( m_FMin * pow(2,((double)(k))/(double)m_BPO))); + const double samplesPerCycle = + m_FS / (m_FMin * pow(2, (double)k / (double)m_BPO)); -// cerr << "k = " << k << ", q = " << m_dQ << ", m_FMin = " << m_FMin << ", hammingLength = " << hammingLength << " (rounded up from " << (m_dQ * m_FS / ( m_FMin * pow(2,((double)(k))/(double)m_BPO))) << ")" << endl; - + // Computing a hamming window + const unsigned hammingLength = (int) ceil( + m_dQ * samplesPerCycle); unsigned origin = m_FFTLength/2 - hammingLength/2; - for (unsigned i=0; iis.push_back(j); - sk->js.push_back(k); - - // take conjugate, normalise and add to array sparkernel - sk->real.push_back( transfHammingWindowRe[ j ]/m_FFTLength); - sk->imag.push_back(-transfHammingWindowIm[ j ]/m_FFTLength); - } + //do fft of hammingWindow + m_FFT.process( 0, hammingWindowRe, hammingWindowIm, transfHammingWindowRe, transfHammingWindowIm ); + + + for (unsigned j=0; j<( m_FFTLength ); j++) { + // perform thresholding + const double squaredBin = squaredModule( transfHammingWindowRe[ j ], transfHammingWindowIm[ j ]); + if (squaredBin <= squareThreshold) { + continue; + } + // Insert non-zero position indexes + sk->is.push_back(j); + sk->js.push_back(k); + + // take conjugate, normalise and add to array sparkernel + sk->real.push_back( transfHammingWindowRe[ j ]/m_FFTLength); + sk->imag.push_back(-transfHammingWindowIm[ j ]/m_FFTLength); + } } @@ -259,10 +257,9 @@ double* ConstantQ::process( const double* fftdata ) SparseKernel *sk = m_sparseKernel; - for (unsigned row=0; row<2*m_uK; row++) - { - m_CQdata[ row ] = 0; - m_CQdata[ row+1 ] = 0; + for (unsigned row=0; row<2*m_uK; row++) { + m_CQdata[ row ] = 0; + m_CQdata[ row+1 ] = 0; } const unsigned *fftbin = &(sk->is[0]); const unsigned *cqbin = &(sk->js[0]); @@ -270,18 +267,19 @@ double* ConstantQ::process( const double* fftdata ) const double *imag = &(sk->imag[0]); const unsigned int sparseCells = sk->real.size(); - for (unsigned i = 0; i 0.66) { + std::cout << "I"; + } else if (value > 0.33) { + std::cout << "i"; + } else { + std::cout << ";"; + } + } + else + { + if (ii == 3 || ii == 9 || ii == 18 || ii == 24 || ii == 30 || + ii == 4 || ii == 10 || ii == 19 || ii == 25 || ii == 31 || + ii == 5 || ii == 11 || ii == 20 || ii == 26 || ii == 32) { + // Mark black keys + std::cout << "-"; + } + else { + std::cout << "_"; + } + } + if (ii % 3 == 2) { + std::cout << " "; + } + } +*/ + + + for( k = 0; k < kBinsPerOctave; k++ ) { // The Cromagram has the center of C at bin 0, while the major diff --git a/lib/qm-dsp/dsp/transforms/FFT.cpp b/lib/qm-dsp/dsp/transforms/FFT.cpp index da476b8a8b9..6f96b0ee47f 100644 --- a/lib/qm-dsp/dsp/transforms/FFT.cpp +++ b/lib/qm-dsp/dsp/transforms/FFT.cpp @@ -10,8 +10,8 @@ #include "maths/MathUtilities.h" -#include "kiss_fft.h" -#include "kiss_fftr.h" +#include "ext/kissfft/kiss_fft.h" +#include "ext/kissfft/tools/kiss_fftr.h" #include diff --git a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c index b8e238b1e2e..8adb0f0b747 100644 --- a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c +++ b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c @@ -13,7 +13,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND */ #include "kiss_fftr.h" -#include "_kiss_fft_guts.h" +#include "../_kiss_fft_guts.h" struct kiss_fftr_state{ kiss_fft_cfg substate; diff --git a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h index 72e5a57714d..81d8a8ec171 100644 --- a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h +++ b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h @@ -1,7 +1,7 @@ #ifndef KISS_FTR_H #define KISS_FTR_H -#include "kiss_fft.h" +#include "../kiss_fft.h" #ifdef __cplusplus extern "C" { #endif diff --git a/lib/qm-dsp/key_rounding.patch b/lib/qm-dsp/key_rounding.patch deleted file mode 100644 index c07e2d5f41e..00000000000 --- a/lib/qm-dsp/key_rounding.patch +++ /dev/null @@ -1,253 +0,0 @@ -diff --git a/lib/qm-dsp/dsp/chromagram/Chromagram.cpp b/lib/qm-dsp/dsp/chromagram/Chromagram.cpp -index a8597a5..3e83367 100644 ---- a/lib/qm-dsp/dsp/chromagram/Chromagram.cpp -+++ b/lib/qm-dsp/dsp/chromagram/Chromagram.cpp -@@ -33,8 +33,8 @@ int Chromagram::initialise( ChromaConfig Config ) - m_BPO = Config.BPO; // bins per octave - m_normalise = Config.normalise; // if frame normalisation is required - -- // No. of constant Q bins -- m_uK = ( unsigned int ) ceil( m_BPO * log(m_FMax/m_FMin)/log(2.0)); -+ // No. of constant Q bins, extended to a full cotave -+ m_uK = m_BPO * (unsigned int)ceil(log(m_FMax/m_FMin)/log(2.0)); - - // Create array for chroma result - m_chromadata = new double[ m_BPO ]; -@@ -44,7 +44,7 @@ int Chromagram::initialise( ChromaConfig Config ) - - // Populate CQ config structure with parameters - // inherited from the Chroma config -- ConstantQConfig.FS = Config.FS; -+ ConstantQConfig.FS = Config.FS; - ConstantQConfig.min = m_FMin; - ConstantQConfig.max = m_FMax; - ConstantQConfig.BPO = m_BPO; -@@ -134,7 +134,7 @@ double* Chromagram::process( const double *data ) - m_windowbuf = new double[m_frameSize]; - } - -- for (int i = 0; i < m_frameSize; ++i) { -+ for (unsigned int i = 0; i < m_frameSize; ++i) { - m_windowbuf[i] = data[i]; - } - m_window->cut(m_windowbuf); -@@ -155,20 +155,18 @@ double* Chromagram::process( const double *real, const double *imag ) - // initialise chromadata to 0 - for (unsigned i = 0; i < m_BPO; i++) m_chromadata[i] = 0; - -- double cmax = 0.0; -- double cval = 0; - // Calculate ConstantQ frame - m_ConstantQ->process( real, imag, m_CQRe, m_CQIm ); - - // add each octave of cq data into Chromagram -- const unsigned octaves = (int)floor(double( m_uK/m_BPO))-1; -- for (unsigned octave = 0; octave <= octaves; octave++) -+ const unsigned octaves = m_uK / m_BPO; -+ for (unsigned octave = 0; octave < octaves; octave++) - { -- unsigned firstBin = octave*m_BPO; -- for (unsigned i = 0; i < m_BPO; i++) -- { -- m_chromadata[i] += kabs( m_CQRe[ firstBin + i ], m_CQIm[ firstBin + i ]); -- } -+ unsigned firstBin = octave * m_BPO; -+ for (unsigned i = 0; i < m_BPO; i++) -+ { -+ m_chromadata[i] += kabs( m_CQRe[ firstBin + i ], m_CQIm[ firstBin + i ]); -+ } - } - - MathUtilities::normalise(m_chromadata, m_BPO, m_normalise); -diff --git a/lib/qm-dsp/dsp/chromagram/Chromagram.h b/lib/qm-dsp/dsp/chromagram/Chromagram.h -index bd928f5..b2ad72e 100644 ---- a/lib/qm-dsp/dsp/chromagram/Chromagram.h -+++ b/lib/qm-dsp/dsp/chromagram/Chromagram.h -@@ -21,7 +21,7 @@ - #include "ConstantQ.h" - - struct ChromaConfig{ -- unsigned int FS; -+ double FS; - double min; - double max; - unsigned int BPO; -diff --git a/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp b/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp -index b764235..aab4848 100644 ---- a/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp -+++ b/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp -@@ -125,14 +125,18 @@ void ConstantQ::sparsekernel() - hammingWindowIm[u] = 0; - } - -- // Computing a hamming window -- const unsigned hammingLength = (int) ceil( m_dQ * m_FS / ( m_FMin * pow(2,((double)(k))/(double)m_BPO))); -+ const double samplesPerCycle = -+ m_FS / (m_FMin * pow(2, (double)k / (double)m_BPO)); -+ -+ // Computing a hamming window -+ const unsigned hammingLength = (int) ceil( -+ m_dQ * samplesPerCycle); - - unsigned origin = m_FFTLength/2 - hammingLength/2; - - for (unsigned i=0; i Cmaj, key = 12 => Bmaj, key = 13 => Cmin, etc. - m_ChromaConfig.min = Pitch::getFrequencyForPitch - (48, 0, tuningFrequency); -+ // C7 (= MIDI #96) is the exclusive maximum key: - m_ChromaConfig.max = Pitch::getFrequencyForPitch - (96, 0, tuningFrequency); - -@@ -177,15 +177,14 @@ int GetKeyMode::process(double *PCMData) - - m_ChrPointer = m_Chroma->process( m_DecimatedBuffer ); - -- -- // Move bins such that the centre of the base note is in the -- // middle of its three bins : -- // Added 21.11.07 by Chris Sutton based on debugging with Katy -- // Noland + comparison with Matlab equivalent. -- MathUtilities::circShift( m_ChrPointer, m_BPO, 1); -+ // The Cromagram 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: -+ MathUtilities::circShift( m_ChrPointer, m_BPO, 2); - /* - std::cout << "raw chroma: "; -- for (int ii = 0; ii < m_BPO; ++ii) { -+ for (unsigned int ii = 0; ii < m_BPO; ++ii) { - if (ii % (m_BPO/12) == 0) std::cout << "\n"; - std::cout << m_ChrPointer[ii] << " "; - } -@@ -266,9 +265,13 @@ int GetKeyMode::process(double *PCMData) - std::cout << std::endl; - */ - double dummy; -- // '1 +' because we number keys 1-24, not 0-23. -- key = 1 + (int)ceil( (double)MathUtilities::getMax( m_Keys, 2* m_BPO, &dummy )/3 ); -+ // m_Keys[1] is C center 1 / 3 + 1 = 1 -+ // m_Keys[4] is D center 4 / 3 + 1 = 2 -+ // '+ 1' because we number keys 1-24, not 0-23. -+ int maxBin = MathUtilities::getMax( m_Keys, 2* m_BPO, &dummy ); -+ key = maxBin / 3 + 1; - -+// std::cout << "fractional key pre-sorting: " << (maxBin + 2) / 3.0 << std::endl; - // std::cout << "key pre-sorting: " << key << std::endl; - - -diff --git a/lib/qm-dsp/key_rounding.patch b/lib/qm-dsp/key_rounding.patch -new file mode 100644 -index 0000000..dd1442e ---- /dev/null -+++ b/lib/qm-dsp/key_rounding.patch -@@ -0,0 +1,34 @@ -+diff --git a/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp b/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp -+index 55a1333..cf3580e 100644 -+--- a/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp -++++ b/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp -+@@ -177,11 +177,12 @@ int GetKeyMode::process(double *PCMData) -+ -+ m_ChrPointer = m_Chroma->process( m_DecimatedBuffer ); -+ -+- // The Cromagram 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: -+- MathUtilities::circShift( m_ChrPointer, m_BPO, 2); -++ -++ // Move bins such that the centre of the base note is in the -++ // middle of its three bins : -++ // Added 21.11.07 by Chris Sutton based on debugging with Katy -++ // Noland + comparison with Matlab equivalent. -++ MathUtilities::circShift( m_ChrPointer, m_BPO, 1); -+ /* -+ std::cout << "raw chroma: "; -+ for (int ii = 0; ii < m_BPO; ++ii) { -+@@ -265,10 +266,8 @@ int GetKeyMode::process(double *PCMData) -+ std::cout << std::endl; -+ */ -+ double dummy; -+- // m_Keys[1] is C center 1 / 3 + 1 = 1 -+- // m_Keys[4] is D center 4 / 3 + 1 = 2 -+- // '+ 1' because we number keys 1-24, not 0-23. -+- key = MathUtilities::getMax( m_Keys, 2* m_BPO, &dummy ) / 3 + 1; -++ // '1 +' because we number keys 1-24, not 0-23. -++ key = 1 + (int)ceil( (double)MathUtilities::getMax( m_Keys, 2* m_BPO, &dummy )/3 ); -+ -+ // std::cout << "key pre-sorting: " << key << std::endl; diff --git a/lib/qm-dsp/mixx-changes.patch b/lib/qm-dsp/mixx-changes.patch new file mode 100644 index 00000000000..fb95209fdbb --- /dev/null +++ b/lib/qm-dsp/mixx-changes.patch @@ -0,0 +1,372 @@ +diff --git a/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp b/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp +index 4585ddc..d1aaef4 100644 +--- a/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp ++++ b/lib/qm-dsp/dsp/chromagram/ConstantQ.cpp +@@ -117,31 +117,29 @@ void ConstantQ::sparsekernel() + + FFT m_FFT(m_FFTLength); + +- for (unsigned k = m_uK; k--; ) +- { +- for (unsigned u=0; u < m_FFTLength; u++) +- { ++ for (unsigned k = m_uK; k--;) { ++ for (unsigned u=0; u < m_FFTLength; u++) { + hammingWindowRe[u] = 0; + hammingWindowIm[u] = 0; + } + +- // Computing a hamming window +- const unsigned hammingLength = (int) ceil( m_dQ * m_FS / ( m_FMin * pow(2,((double)(k))/(double)m_BPO))); ++ const double samplesPerCycle = ++ m_FS / (m_FMin * pow(2, (double)k / (double)m_BPO)); + +-// cerr << "k = " << k << ", q = " << m_dQ << ", m_FMin = " << m_FMin << ", hammingLength = " << hammingLength << " (rounded up from " << (m_dQ * m_FS / ( m_FMin * pow(2,((double)(k))/(double)m_BPO))) << ")" << endl; +- ++ // Computing a hamming window ++ const unsigned hammingLength = (int) ceil( ++ m_dQ * samplesPerCycle); + + unsigned origin = m_FFTLength/2 - hammingLength/2; + +- for (unsigned i=0; iis.push_back(j); +- sk->js.push_back(k); +- +- // take conjugate, normalise and add to array sparkernel +- sk->real.push_back( transfHammingWindowRe[ j ]/m_FFTLength); +- sk->imag.push_back(-transfHammingWindowIm[ j ]/m_FFTLength); +- } ++ //do fft of hammingWindow ++ m_FFT.process( 0, hammingWindowRe, hammingWindowIm, transfHammingWindowRe, transfHammingWindowIm ); ++ ++ ++ for (unsigned j=0; j<( m_FFTLength ); j++) { ++ // perform thresholding ++ const double squaredBin = squaredModule( transfHammingWindowRe[ j ], transfHammingWindowIm[ j ]); ++ if (squaredBin <= squareThreshold) { ++ continue; ++ } ++ // Insert non-zero position indexes ++ sk->is.push_back(j); ++ sk->js.push_back(k); ++ ++ // take conjugate, normalise and add to array sparkernel ++ sk->real.push_back( transfHammingWindowRe[ j ]/m_FFTLength); ++ sk->imag.push_back(-transfHammingWindowIm[ j ]/m_FFTLength); ++ } + + } + +@@ -259,10 +257,9 @@ double* ConstantQ::process( const double* fftdata ) + + SparseKernel *sk = m_sparseKernel; + +- for (unsigned row=0; row<2*m_uK; row++) +- { +- m_CQdata[ row ] = 0; +- m_CQdata[ row+1 ] = 0; ++ for (unsigned row=0; row<2*m_uK; row++) { ++ m_CQdata[ row ] = 0; ++ m_CQdata[ row+1 ] = 0; + } + const unsigned *fftbin = &(sk->is[0]); + const unsigned *cqbin = &(sk->js[0]); +@@ -270,18 +267,19 @@ double* ConstantQ::process( const double* fftdata ) + const double *imag = &(sk->imag[0]); + const unsigned int sparseCells = sk->real.size(); + +- for (unsigned i = 0; i 0.66) { ++ std::cout << "I"; ++ } else if (value > 0.33) { ++ std::cout << "i"; ++ } else { ++ std::cout << ";"; ++ } ++ } ++ else ++ { ++ if (ii == 3 || ii == 9 || ii == 18 || ii == 24 || ii == 30 || ++ ii == 4 || ii == 10 || ii == 19 || ii == 25 || ii == 31 || ++ ii == 5 || ii == 11 || ii == 20 || ii == 26 || ii == 32) { ++ // Mark black keys ++ std::cout << "-"; ++ } ++ else { ++ std::cout << "_"; ++ } ++ } ++ if (ii % 3 == 2) { ++ std::cout << " "; ++ } ++ } ++*/ ++ ++ ++ + for( k = 0; k < kBinsPerOctave; k++ ) + { + // The Cromagram has the center of C at bin 0, while the major +diff --git a/lib/qm-dsp/dsp/transforms/FFT.cpp b/lib/qm-dsp/dsp/transforms/FFT.cpp +index da476b8..6f96b0e 100644 +--- a/lib/qm-dsp/dsp/transforms/FFT.cpp ++++ b/lib/qm-dsp/dsp/transforms/FFT.cpp +@@ -10,8 +10,8 @@ + + #include "maths/MathUtilities.h" + +-#include "kiss_fft.h" +-#include "kiss_fftr.h" ++#include "ext/kissfft/kiss_fft.h" ++#include "ext/kissfft/tools/kiss_fftr.h" + + #include + +diff --git a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c +index b8e238b..8adb0f0 100644 +--- a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c ++++ b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c +@@ -13,7 +13,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + */ + + #include "kiss_fftr.h" +-#include "_kiss_fft_guts.h" ++#include "../_kiss_fft_guts.h" + + struct kiss_fftr_state{ + kiss_fft_cfg substate; +diff --git a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h +index 72e5a57..81d8a8e 100644 +--- a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h ++++ b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h +@@ -1,7 +1,7 @@ + #ifndef KISS_FTR_H + #define KISS_FTR_H + +-#include "kiss_fft.h" ++#include "../kiss_fft.h" + #ifdef __cplusplus + extern "C" { + #endif ++diff --git a/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp b/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp ++index cb8bc24..a4abcbc 100644 ++--- a/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp +++++ b/lib/qm-dsp/dsp/keydetection/GetKeyMode.cpp ++@@ -229,6 +229,41 @@ int GetKeyMode::process(double *PCMData) ++ } ++ ++ +++/* +++ // filtered and normalized chromagram +++ for (unsigned int ii = 0; ii < m_BPO; ++ii) { +++ double value = m_MeanHPCP[(ii+m_BPO-1) % m_BPO]; +++ if (value > 0 && maxNoteValue > 0.01) { +++ if (value > 0.99) { +++ std::cout << "Î"; +++ } else if (value > 0.66) { +++ std::cout << "I"; +++ } else if (value > 0.33) { +++ std::cout << "i"; +++ } else { +++ std::cout << ";"; +++ } +++ } +++ else +++ { +++ if (ii == 3 || ii == 9 || ii == 18 || ii == 24 || ii == 30 || +++ ii == 4 || ii == 10 || ii == 19 || ii == 25 || ii == 31 || +++ ii == 5 || ii == 11 || ii == 20 || ii == 26 || ii == 32) { +++ // Mark black keys +++ std::cout << "-"; +++ } +++ else { +++ std::cout << "_"; +++ } +++ } +++ if (ii % 3 == 2) { +++ std::cout << " "; +++ } +++ } +++*/ +++ +++ +++ ++ for( k = 0; k < kBinsPerOctave; k++ ) ++ { ++ // The Cromagram has the center of C at bin 0, while the major ++diff --git a/lib/qm-dsp/dsp/transforms/FFT.cpp b/lib/qm-dsp/dsp/transforms/FFT.cpp ++index da476b8..6f96b0e 100644 ++--- a/lib/qm-dsp/dsp/transforms/FFT.cpp +++++ b/lib/qm-dsp/dsp/transforms/FFT.cpp ++@@ -10,8 +10,8 @@ ++ ++ #include "maths/MathUtilities.h" ++ ++-#include "kiss_fft.h" ++-#include "kiss_fftr.h" +++#include "ext/kissfft/kiss_fft.h" +++#include "ext/kissfft/tools/kiss_fftr.h" ++ ++ #include ++ ++diff --git a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c ++index b8e238b..8adb0f0 100644 ++--- a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c +++++ b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.c ++@@ -13,7 +13,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ */ ++ ++ #include "kiss_fftr.h" ++-#include "_kiss_fft_guts.h" +++#include "../_kiss_fft_guts.h" ++ ++ struct kiss_fftr_state{ ++ kiss_fft_cfg substate; ++diff --git a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h ++index 72e5a57..81d8a8e 100644 ++--- a/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h +++++ b/lib/qm-dsp/ext/kissfft/tools/kiss_fftr.h ++@@ -1,7 +1,7 @@ ++ #ifndef KISS_FTR_H ++ #define KISS_FTR_H ++ ++-#include "kiss_fft.h" +++#include "../kiss_fft.h" ++ #ifdef __cplusplus ++ extern "C" { ++ #endif