├── README.md ├── CQTKit ├── CQTKit.h ├── Info.plist ├── CQT.hpp └── CQT.cpp ├── CQTKitTests ├── Info.plist └── CQTKitTests.mm └── CQTKit.xcodeproj └── project.pbxproj /README.md: -------------------------------------------------------------------------------- 1 | # CQTKit 2 | A fast implementation of the Constant Q Transform on top of the Accelerate framework. 3 | 4 | ## Usage 5 | 6 | Either include the Xcode project as a sub-project and add the framework target as a dependency, or just drop in the CQT.hpp/.cpp source files into your project and link against the Accelerate framework. 7 | -------------------------------------------------------------------------------- /CQTKit/CQTKit.h: -------------------------------------------------------------------------------- 1 | // 2 | // CQTKit.h 3 | // CQTKit 4 | // 5 | // Created by Matt on 12/14/16. 6 | // Copyright © 2016 MattRajca. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for CQTKit. 12 | FOUNDATION_EXPORT double CQTKitVersionNumber; 13 | 14 | //! Project version string for CQTKit. 15 | FOUNDATION_EXPORT const unsigned char CQTKitVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | #import 20 | -------------------------------------------------------------------------------- /CQTKitTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /CQTKit/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2016 MattRajca. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /CQTKit/CQT.hpp: -------------------------------------------------------------------------------- 1 | // 2 | // CQT.hpp 3 | // CQTKit 4 | // 5 | // Created by Matt on 12/14/16. 6 | // Copyright © 2016 MattRajca. All rights reserved. 7 | // 8 | 9 | #ifndef CQT_hpp 10 | #define CQT_hpp 11 | 12 | namespace CQTKit { 13 | 14 | enum class WindowFunction { 15 | Hamming 16 | }; 17 | 18 | class CQT { 19 | public: 20 | /// Sets up a CQT with a min/max frequency, a fixed number of bins (usually 12), 21 | /// a given sampling frequency, and a windowing function (currently only Hamming is supported). 22 | CQT(float minFreq, float maxFreq, int bins, float sampleFreq, WindowFunction); 23 | 24 | /// Runs the CQT forward, taking vector `x` of length `N` from the time domain to the 25 | /// frequency domain. 26 | /// 27 | /// The returned vector is of length `k()` and must be freed by the caller. 28 | float *forward(float *x, int N) const; 29 | 30 | inline int k() const { 31 | return m_K; 32 | } 33 | 34 | virtual ~CQT(); 35 | 36 | private: 37 | float m_minFreq; 38 | float m_maxFreq; 39 | int m_bins; 40 | float m_sampleFreq; 41 | WindowFunction m_windowFunction; 42 | 43 | float m_Q; 44 | void *m_fftSetup; 45 | int m_fftLength; 46 | int m_fftLogLength; 47 | float *m_fftLengthMatrixReal; 48 | float *m_fftLengthMatrixImag; 49 | float *m_kernelReal; 50 | float *m_kernelImag; 51 | int m_K; 52 | float *m_KVectorReal; 53 | float *m_KVectorImag; 54 | }; 55 | 56 | } // namespace CQTKit 57 | 58 | #endif /* CQT_hpp */ 59 | -------------------------------------------------------------------------------- /CQTKitTests/CQTKitTests.mm: -------------------------------------------------------------------------------- 1 | // 2 | // CQTKitTests.m 3 | // CQTKitTests 4 | // 5 | // Created by Matt on 12/14/16. 6 | // Copyright © 2016 MattRajca. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import 12 | 13 | @interface CQTKitTests : XCTestCase 14 | @end 15 | 16 | @implementation CQTKitTests 17 | 18 | using namespace CQTKit; 19 | 20 | static constexpr int sampleRate = 44100; 21 | static constexpr int duration = 1; 22 | 23 | - (void)testBasics 24 | { 25 | // Sets things up to correspond to a 88-key piano keyboard with 12 bins, a sample rate 26 | // of 44100 Hz, and a Hamming window function. 27 | CQT qt(27.5, 4434.92, 12, sampleRate, WindowFunction::Hamming); 28 | 29 | XCTAssertEqual(qt.k(), 88); 30 | 31 | // Generates a tone at 440 Hz. 32 | float *x = new float[sampleRate * duration]; 33 | for (int i = 0; i < sampleRate * duration; i++) { 34 | x[i] = sinf(2 * M_PI * i * (440.0f / sampleRate)); 35 | } 36 | 37 | // Runs the CQT forward (from the time to frequency domain). 38 | float *results = qt.forward(x, 44100); 39 | delete[] x; 40 | 41 | // Finds the most likely tone. 42 | float max = results[0]; 43 | int idx = 0; 44 | for (int i = 1; i < qt.k(); i++) { 45 | if (results[i] > max) { 46 | max = results[i]; 47 | idx = i; 48 | } 49 | } 50 | 51 | delete[] results; 52 | 53 | // Ensures we have the highest response at A4. The offset is due to us starting at 27.5 Hz. 54 | XCTAssertEqual(idx + 21, 69 /* A4 */); 55 | } 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /CQTKit/CQT.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // CQT.cpp 3 | // CQTKit 4 | // 5 | // Created by Matt on 12/14/16. 6 | // Copyright © 2016 MattRajca. All rights reserved. 7 | // 8 | 9 | #include "CQT.hpp" 10 | 11 | #include 12 | 13 | namespace CQTKit { 14 | 15 | CQT::CQT(float minFreq, float maxFreq, int bins, float sampleFreq, WindowFunction func) : m_minFreq(minFreq), m_maxFreq(maxFreq), m_bins(bins), m_sampleFreq(sampleFreq), m_windowFunction(func) 16 | { 17 | const int K = static_cast(ceilf(bins * log2f(maxFreq / minFreq))); 18 | m_K = K; 19 | m_Q = 1 / (powf(2, 1.0f / bins) - 1); 20 | m_fftLogLength = static_cast(ceilf(log2f(m_Q * sampleFreq / minFreq))); 21 | m_fftLength = static_cast(powf(2, m_fftLogLength)); 22 | 23 | DSPSplitComplex kernel; 24 | kernel.realp = new float[K * m_fftLength]; 25 | kernel.imagp = new float[K * m_fftLength]; 26 | bzero(kernel.realp, sizeof(float) * K * m_fftLength); 27 | bzero(kernel.imagp, sizeof(float) * K * m_fftLength); 28 | m_kernelReal = kernel.realp; 29 | m_kernelImag = kernel.imagp; 30 | 31 | FFTSetup setup = vDSP_create_fftsetup(m_fftLogLength, FFT_RADIX2); 32 | m_fftSetup = reinterpret_cast(setup); 33 | 34 | const int maxN = static_cast(ceilf(m_Q * m_sampleFreq / minFreq)); 35 | 36 | DSPSplitComplex window; 37 | window.realp = new float[maxN]; 38 | window.imagp = new float[maxN]; 39 | 40 | DSPSplitComplex exps; 41 | exps.realp = new float[maxN]; 42 | exps.imagp = new float[maxN]; 43 | 44 | for (int k = K; k > 0; --k) { 45 | const int N = static_cast(ceilf(m_Q * m_sampleFreq / (minFreq * pow(2, static_cast(k - 1) / bins)))); 46 | assert(N <= maxN); 47 | 48 | bzero(window.imagp, sizeof(float) * N); 49 | 50 | switch (m_windowFunction) { 51 | case WindowFunction::Hamming: 52 | vDSP_hamm_window(window.realp, N, 0); 53 | break; 54 | } 55 | 56 | for (int i = 0; i < N; ++i) { 57 | float inner = 2 * M_PI * m_Q * static_cast(i) / N; 58 | exps.realp[i] = inner; 59 | exps.imagp[i] = inner; 60 | } 61 | 62 | vvcosf(exps.realp, exps.realp, &N); 63 | vvsinf(exps.imagp, exps.imagp, &N); 64 | 65 | const float nFloat = static_cast(N); 66 | vDSP_vsdiv(exps.realp, 1, &nFloat, exps.realp, 1, N); 67 | vDSP_vsdiv(exps.imagp, 1, &nFloat, exps.imagp, 1, N); 68 | 69 | DSPSplitComplex complexPointer; 70 | complexPointer.realp = &kernel.realp[(k-1) * m_fftLength]; 71 | complexPointer.imagp = &kernel.imagp[(k-1) * m_fftLength]; 72 | 73 | vDSP_zvmul(&window, 1, &exps, 1, &complexPointer, 1, N < m_fftLength ? N : m_fftLength, 1); 74 | vDSP_fft_zip(setup, &complexPointer, 1, m_fftLogLength, FFT_FORWARD); 75 | } 76 | 77 | delete[] window.realp; 78 | delete[] window.imagp; 79 | 80 | delete[] exps.realp; 81 | delete[] exps.imagp; 82 | 83 | vDSP_mtrans(kernel.realp, 1, kernel.realp, 1, m_fftLength, K); 84 | vDSP_mtrans(kernel.imagp, 1, kernel.imagp, 1, m_fftLength, K); 85 | 86 | vDSP_zvconj(&kernel, 1, &kernel, 1, m_fftLength * K); 87 | 88 | const float lengthFloat = static_cast(m_fftLength); 89 | vDSP_vsdiv(kernel.realp, 1, &lengthFloat, kernel.realp, 1, m_fftLength * K); 90 | vDSP_vsdiv(kernel.imagp, 1, &lengthFloat, kernel.imagp, 1, m_fftLength * K); 91 | 92 | m_fftLengthMatrixReal = new float[m_fftLength]; 93 | m_fftLengthMatrixImag = new float[m_fftLength]; 94 | 95 | m_KVectorReal = new float[m_K]; 96 | m_KVectorImag = new float[m_K]; 97 | } 98 | 99 | CQT::~CQT() 100 | { 101 | delete[] m_fftLengthMatrixReal; 102 | delete[] m_fftLengthMatrixImag; 103 | 104 | delete[] m_KVectorReal; 105 | delete[] m_KVectorImag; 106 | 107 | vDSP_destroy_fftsetup(reinterpret_cast(m_fftSetup)); 108 | } 109 | 110 | float *CQT::forward(float *x, int length) const 111 | { 112 | DSPSplitComplex xMatrix; 113 | xMatrix.realp = m_fftLengthMatrixReal; 114 | xMatrix.imagp = m_fftLengthMatrixImag; 115 | 116 | if (length < m_fftLength) { 117 | bzero(xMatrix.realp, sizeof(float) * m_fftLength); 118 | } 119 | 120 | memcpy(xMatrix.realp, x, sizeof(float) * (length > m_fftLength ? m_fftLength : length)); 121 | bzero(xMatrix.imagp, sizeof(float) * m_fftLength); 122 | 123 | vDSP_fft_zip(reinterpret_cast(m_fftSetup), &xMatrix, 1, m_fftLogLength, FFT_FORWARD); 124 | 125 | DSPSplitComplex result; 126 | result.realp = m_KVectorReal; 127 | result.imagp = m_KVectorImag; 128 | 129 | DSPSplitComplex existing; 130 | existing.realp = m_kernelReal; 131 | existing.imagp = m_kernelImag; 132 | vDSP_zmmul(&xMatrix, 1, &existing, 1, &result, 1, 1, m_K, m_fftLength); 133 | 134 | float *mags = new float[m_K]; 135 | vDSP_zvmags(&result, 1, mags, 1, m_K); 136 | 137 | return mags; 138 | } 139 | 140 | } // namespace CQTKit 141 | -------------------------------------------------------------------------------- /CQTKit.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | C97B39871E01C5B9005426F4 /* CQTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C97B397D1E01C5B9005426F4 /* CQTKit.framework */; }; 11 | C97B398C1E01C5B9005426F4 /* CQTKitTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = C97B398B1E01C5B9005426F4 /* CQTKitTests.mm */; }; 12 | C97B398E1E01C5B9005426F4 /* CQTKit.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B39801E01C5B9005426F4 /* CQTKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | C97B39991E01C5D8005426F4 /* CQT.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C97B39971E01C5D8005426F4 /* CQT.cpp */; }; 14 | C97B399A1E01C5D8005426F4 /* CQT.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C97B39981E01C5D8005426F4 /* CQT.hpp */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | C97B399D1E01F635005426F4 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C97B399C1E01F635005426F4 /* Accelerate.framework */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXContainerItemProxy section */ 19 | C97B39881E01C5B9005426F4 /* PBXContainerItemProxy */ = { 20 | isa = PBXContainerItemProxy; 21 | containerPortal = C97B39741E01C5B9005426F4 /* Project object */; 22 | proxyType = 1; 23 | remoteGlobalIDString = C97B397C1E01C5B9005426F4; 24 | remoteInfo = CQTKit; 25 | }; 26 | /* End PBXContainerItemProxy section */ 27 | 28 | /* Begin PBXFileReference section */ 29 | C97B397D1E01C5B9005426F4 /* CQTKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CQTKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | C97B39801E01C5B9005426F4 /* CQTKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CQTKit.h; sourceTree = ""; }; 31 | C97B39811E01C5B9005426F4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 32 | C97B39861E01C5B9005426F4 /* CQTKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CQTKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | C97B398B1E01C5B9005426F4 /* CQTKitTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CQTKitTests.mm; sourceTree = ""; }; 34 | C97B398D1E01C5B9005426F4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35 | C97B39971E01C5D8005426F4 /* CQT.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CQT.cpp; sourceTree = ""; }; 36 | C97B39981E01C5D8005426F4 /* CQT.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CQT.hpp; sourceTree = ""; }; 37 | C97B399C1E01F635005426F4 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; 38 | /* End PBXFileReference section */ 39 | 40 | /* Begin PBXFrameworksBuildPhase section */ 41 | C97B39791E01C5B9005426F4 /* Frameworks */ = { 42 | isa = PBXFrameworksBuildPhase; 43 | buildActionMask = 2147483647; 44 | files = ( 45 | C97B399D1E01F635005426F4 /* Accelerate.framework in Frameworks */, 46 | ); 47 | runOnlyForDeploymentPostprocessing = 0; 48 | }; 49 | C97B39831E01C5B9005426F4 /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | C97B39871E01C5B9005426F4 /* CQTKit.framework in Frameworks */, 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | /* End PBXFrameworksBuildPhase section */ 58 | 59 | /* Begin PBXGroup section */ 60 | C97B39731E01C5B9005426F4 = { 61 | isa = PBXGroup; 62 | children = ( 63 | C97B397F1E01C5B9005426F4 /* CQTKit */, 64 | C97B398A1E01C5B9005426F4 /* CQTKitTests */, 65 | C97B397E1E01C5B9005426F4 /* Products */, 66 | C97B399B1E01F635005426F4 /* Frameworks */, 67 | ); 68 | sourceTree = ""; 69 | }; 70 | C97B397E1E01C5B9005426F4 /* Products */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | C97B397D1E01C5B9005426F4 /* CQTKit.framework */, 74 | C97B39861E01C5B9005426F4 /* CQTKitTests.xctest */, 75 | ); 76 | name = Products; 77 | sourceTree = ""; 78 | }; 79 | C97B397F1E01C5B9005426F4 /* CQTKit */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | C97B39971E01C5D8005426F4 /* CQT.cpp */, 83 | C97B39981E01C5D8005426F4 /* CQT.hpp */, 84 | C97B39801E01C5B9005426F4 /* CQTKit.h */, 85 | C97B39811E01C5B9005426F4 /* Info.plist */, 86 | ); 87 | path = CQTKit; 88 | sourceTree = ""; 89 | }; 90 | C97B398A1E01C5B9005426F4 /* CQTKitTests */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | C97B398B1E01C5B9005426F4 /* CQTKitTests.mm */, 94 | C97B398D1E01C5B9005426F4 /* Info.plist */, 95 | ); 96 | path = CQTKitTests; 97 | sourceTree = ""; 98 | }; 99 | C97B399B1E01F635005426F4 /* Frameworks */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | C97B399C1E01F635005426F4 /* Accelerate.framework */, 103 | ); 104 | name = Frameworks; 105 | sourceTree = ""; 106 | }; 107 | /* End PBXGroup section */ 108 | 109 | /* Begin PBXHeadersBuildPhase section */ 110 | C97B397A1E01C5B9005426F4 /* Headers */ = { 111 | isa = PBXHeadersBuildPhase; 112 | buildActionMask = 2147483647; 113 | files = ( 114 | C97B398E1E01C5B9005426F4 /* CQTKit.h in Headers */, 115 | C97B399A1E01C5D8005426F4 /* CQT.hpp in Headers */, 116 | ); 117 | runOnlyForDeploymentPostprocessing = 0; 118 | }; 119 | /* End PBXHeadersBuildPhase section */ 120 | 121 | /* Begin PBXNativeTarget section */ 122 | C97B397C1E01C5B9005426F4 /* CQTKit */ = { 123 | isa = PBXNativeTarget; 124 | buildConfigurationList = C97B39911E01C5B9005426F4 /* Build configuration list for PBXNativeTarget "CQTKit" */; 125 | buildPhases = ( 126 | C97B39781E01C5B9005426F4 /* Sources */, 127 | C97B39791E01C5B9005426F4 /* Frameworks */, 128 | C97B397A1E01C5B9005426F4 /* Headers */, 129 | C97B397B1E01C5B9005426F4 /* Resources */, 130 | ); 131 | buildRules = ( 132 | ); 133 | dependencies = ( 134 | ); 135 | name = CQTKit; 136 | productName = CQTKit; 137 | productReference = C97B397D1E01C5B9005426F4 /* CQTKit.framework */; 138 | productType = "com.apple.product-type.framework"; 139 | }; 140 | C97B39851E01C5B9005426F4 /* CQTKitTests */ = { 141 | isa = PBXNativeTarget; 142 | buildConfigurationList = C97B39941E01C5B9005426F4 /* Build configuration list for PBXNativeTarget "CQTKitTests" */; 143 | buildPhases = ( 144 | C97B39821E01C5B9005426F4 /* Sources */, 145 | C97B39831E01C5B9005426F4 /* Frameworks */, 146 | C97B39841E01C5B9005426F4 /* Resources */, 147 | ); 148 | buildRules = ( 149 | ); 150 | dependencies = ( 151 | C97B39891E01C5B9005426F4 /* PBXTargetDependency */, 152 | ); 153 | name = CQTKitTests; 154 | productName = CQTKitTests; 155 | productReference = C97B39861E01C5B9005426F4 /* CQTKitTests.xctest */; 156 | productType = "com.apple.product-type.bundle.unit-test"; 157 | }; 158 | /* End PBXNativeTarget section */ 159 | 160 | /* Begin PBXProject section */ 161 | C97B39741E01C5B9005426F4 /* Project object */ = { 162 | isa = PBXProject; 163 | attributes = { 164 | LastUpgradeCheck = 0810; 165 | ORGANIZATIONNAME = MattRajca; 166 | TargetAttributes = { 167 | C97B397C1E01C5B9005426F4 = { 168 | CreatedOnToolsVersion = 8.1; 169 | DevelopmentTeam = RJKYY38TY2; 170 | ProvisioningStyle = Automatic; 171 | }; 172 | C97B39851E01C5B9005426F4 = { 173 | CreatedOnToolsVersion = 8.1; 174 | DevelopmentTeam = RJKYY38TY2; 175 | ProvisioningStyle = Automatic; 176 | }; 177 | }; 178 | }; 179 | buildConfigurationList = C97B39771E01C5B9005426F4 /* Build configuration list for PBXProject "CQTKit" */; 180 | compatibilityVersion = "Xcode 3.2"; 181 | developmentRegion = English; 182 | hasScannedForEncodings = 0; 183 | knownRegions = ( 184 | en, 185 | ); 186 | mainGroup = C97B39731E01C5B9005426F4; 187 | productRefGroup = C97B397E1E01C5B9005426F4 /* Products */; 188 | projectDirPath = ""; 189 | projectRoot = ""; 190 | targets = ( 191 | C97B397C1E01C5B9005426F4 /* CQTKit */, 192 | C97B39851E01C5B9005426F4 /* CQTKitTests */, 193 | ); 194 | }; 195 | /* End PBXProject section */ 196 | 197 | /* Begin PBXResourcesBuildPhase section */ 198 | C97B397B1E01C5B9005426F4 /* Resources */ = { 199 | isa = PBXResourcesBuildPhase; 200 | buildActionMask = 2147483647; 201 | files = ( 202 | ); 203 | runOnlyForDeploymentPostprocessing = 0; 204 | }; 205 | C97B39841E01C5B9005426F4 /* Resources */ = { 206 | isa = PBXResourcesBuildPhase; 207 | buildActionMask = 2147483647; 208 | files = ( 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXResourcesBuildPhase section */ 213 | 214 | /* Begin PBXSourcesBuildPhase section */ 215 | C97B39781E01C5B9005426F4 /* Sources */ = { 216 | isa = PBXSourcesBuildPhase; 217 | buildActionMask = 2147483647; 218 | files = ( 219 | C97B39991E01C5D8005426F4 /* CQT.cpp in Sources */, 220 | ); 221 | runOnlyForDeploymentPostprocessing = 0; 222 | }; 223 | C97B39821E01C5B9005426F4 /* Sources */ = { 224 | isa = PBXSourcesBuildPhase; 225 | buildActionMask = 2147483647; 226 | files = ( 227 | C97B398C1E01C5B9005426F4 /* CQTKitTests.mm in Sources */, 228 | ); 229 | runOnlyForDeploymentPostprocessing = 0; 230 | }; 231 | /* End PBXSourcesBuildPhase section */ 232 | 233 | /* Begin PBXTargetDependency section */ 234 | C97B39891E01C5B9005426F4 /* PBXTargetDependency */ = { 235 | isa = PBXTargetDependency; 236 | target = C97B397C1E01C5B9005426F4 /* CQTKit */; 237 | targetProxy = C97B39881E01C5B9005426F4 /* PBXContainerItemProxy */; 238 | }; 239 | /* End PBXTargetDependency section */ 240 | 241 | /* Begin XCBuildConfiguration section */ 242 | C97B398F1E01C5B9005426F4 /* Debug */ = { 243 | isa = XCBuildConfiguration; 244 | buildSettings = { 245 | ALWAYS_SEARCH_USER_PATHS = NO; 246 | CLANG_ANALYZER_NONNULL = YES; 247 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 248 | CLANG_CXX_LIBRARY = "libc++"; 249 | CLANG_ENABLE_MODULES = YES; 250 | CLANG_ENABLE_OBJC_ARC = YES; 251 | CLANG_WARN_BOOL_CONVERSION = YES; 252 | CLANG_WARN_CONSTANT_CONVERSION = YES; 253 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 254 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 255 | CLANG_WARN_EMPTY_BODY = YES; 256 | CLANG_WARN_ENUM_CONVERSION = YES; 257 | CLANG_WARN_INFINITE_RECURSION = YES; 258 | CLANG_WARN_INT_CONVERSION = YES; 259 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 260 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 261 | CLANG_WARN_UNREACHABLE_CODE = YES; 262 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 263 | CODE_SIGN_IDENTITY = "-"; 264 | COPY_PHASE_STRIP = NO; 265 | CURRENT_PROJECT_VERSION = 1; 266 | DEBUG_INFORMATION_FORMAT = dwarf; 267 | ENABLE_STRICT_OBJC_MSGSEND = YES; 268 | ENABLE_TESTABILITY = YES; 269 | GCC_C_LANGUAGE_STANDARD = gnu99; 270 | GCC_DYNAMIC_NO_PIC = NO; 271 | GCC_NO_COMMON_BLOCKS = YES; 272 | GCC_OPTIMIZATION_LEVEL = 0; 273 | GCC_PREPROCESSOR_DEFINITIONS = ( 274 | "DEBUG=1", 275 | "$(inherited)", 276 | ); 277 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 278 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 279 | GCC_WARN_UNDECLARED_SELECTOR = YES; 280 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 281 | GCC_WARN_UNUSED_FUNCTION = YES; 282 | GCC_WARN_UNUSED_VARIABLE = YES; 283 | MACOSX_DEPLOYMENT_TARGET = 10.12; 284 | MTL_ENABLE_DEBUG_INFO = YES; 285 | ONLY_ACTIVE_ARCH = YES; 286 | SDKROOT = macosx; 287 | VERSIONING_SYSTEM = "apple-generic"; 288 | VERSION_INFO_PREFIX = ""; 289 | }; 290 | name = Debug; 291 | }; 292 | C97B39901E01C5B9005426F4 /* Release */ = { 293 | isa = XCBuildConfiguration; 294 | buildSettings = { 295 | ALWAYS_SEARCH_USER_PATHS = NO; 296 | CLANG_ANALYZER_NONNULL = YES; 297 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 298 | CLANG_CXX_LIBRARY = "libc++"; 299 | CLANG_ENABLE_MODULES = YES; 300 | CLANG_ENABLE_OBJC_ARC = YES; 301 | CLANG_WARN_BOOL_CONVERSION = YES; 302 | CLANG_WARN_CONSTANT_CONVERSION = YES; 303 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 304 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 305 | CLANG_WARN_EMPTY_BODY = YES; 306 | CLANG_WARN_ENUM_CONVERSION = YES; 307 | CLANG_WARN_INFINITE_RECURSION = YES; 308 | CLANG_WARN_INT_CONVERSION = YES; 309 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 310 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 311 | CLANG_WARN_UNREACHABLE_CODE = YES; 312 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 313 | CODE_SIGN_IDENTITY = "-"; 314 | COPY_PHASE_STRIP = NO; 315 | CURRENT_PROJECT_VERSION = 1; 316 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 317 | ENABLE_NS_ASSERTIONS = NO; 318 | ENABLE_STRICT_OBJC_MSGSEND = YES; 319 | GCC_C_LANGUAGE_STANDARD = gnu99; 320 | GCC_NO_COMMON_BLOCKS = YES; 321 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 322 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 323 | GCC_WARN_UNDECLARED_SELECTOR = YES; 324 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 325 | GCC_WARN_UNUSED_FUNCTION = YES; 326 | GCC_WARN_UNUSED_VARIABLE = YES; 327 | MACOSX_DEPLOYMENT_TARGET = 10.12; 328 | MTL_ENABLE_DEBUG_INFO = NO; 329 | SDKROOT = macosx; 330 | VERSIONING_SYSTEM = "apple-generic"; 331 | VERSION_INFO_PREFIX = ""; 332 | }; 333 | name = Release; 334 | }; 335 | C97B39921E01C5B9005426F4 /* Debug */ = { 336 | isa = XCBuildConfiguration; 337 | buildSettings = { 338 | CODE_SIGN_IDENTITY = ""; 339 | COMBINE_HIDPI_IMAGES = YES; 340 | DEFINES_MODULE = NO; 341 | DEVELOPMENT_TEAM = RJKYY38TY2; 342 | DYLIB_COMPATIBILITY_VERSION = 1; 343 | DYLIB_CURRENT_VERSION = 1; 344 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 345 | FRAMEWORK_VERSION = A; 346 | INFOPLIST_FILE = CQTKit/Info.plist; 347 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 348 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 349 | PRODUCT_BUNDLE_IDENTIFIER = com.MattRajca.CQTKit; 350 | PRODUCT_NAME = "$(TARGET_NAME)"; 351 | SKIP_INSTALL = YES; 352 | }; 353 | name = Debug; 354 | }; 355 | C97B39931E01C5B9005426F4 /* Release */ = { 356 | isa = XCBuildConfiguration; 357 | buildSettings = { 358 | CODE_SIGN_IDENTITY = ""; 359 | COMBINE_HIDPI_IMAGES = YES; 360 | DEFINES_MODULE = NO; 361 | DEVELOPMENT_TEAM = RJKYY38TY2; 362 | DYLIB_COMPATIBILITY_VERSION = 1; 363 | DYLIB_CURRENT_VERSION = 1; 364 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 365 | FRAMEWORK_VERSION = A; 366 | INFOPLIST_FILE = CQTKit/Info.plist; 367 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 368 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 369 | PRODUCT_BUNDLE_IDENTIFIER = com.MattRajca.CQTKit; 370 | PRODUCT_NAME = "$(TARGET_NAME)"; 371 | SKIP_INSTALL = YES; 372 | }; 373 | name = Release; 374 | }; 375 | C97B39951E01C5B9005426F4 /* Debug */ = { 376 | isa = XCBuildConfiguration; 377 | buildSettings = { 378 | COMBINE_HIDPI_IMAGES = YES; 379 | DEVELOPMENT_TEAM = RJKYY38TY2; 380 | INFOPLIST_FILE = CQTKitTests/Info.plist; 381 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 382 | PRODUCT_BUNDLE_IDENTIFIER = com.MattRajca.CQTKitTests; 383 | PRODUCT_NAME = "$(TARGET_NAME)"; 384 | }; 385 | name = Debug; 386 | }; 387 | C97B39961E01C5B9005426F4 /* Release */ = { 388 | isa = XCBuildConfiguration; 389 | buildSettings = { 390 | COMBINE_HIDPI_IMAGES = YES; 391 | DEVELOPMENT_TEAM = RJKYY38TY2; 392 | INFOPLIST_FILE = CQTKitTests/Info.plist; 393 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 394 | PRODUCT_BUNDLE_IDENTIFIER = com.MattRajca.CQTKitTests; 395 | PRODUCT_NAME = "$(TARGET_NAME)"; 396 | }; 397 | name = Release; 398 | }; 399 | /* End XCBuildConfiguration section */ 400 | 401 | /* Begin XCConfigurationList section */ 402 | C97B39771E01C5B9005426F4 /* Build configuration list for PBXProject "CQTKit" */ = { 403 | isa = XCConfigurationList; 404 | buildConfigurations = ( 405 | C97B398F1E01C5B9005426F4 /* Debug */, 406 | C97B39901E01C5B9005426F4 /* Release */, 407 | ); 408 | defaultConfigurationIsVisible = 0; 409 | defaultConfigurationName = Release; 410 | }; 411 | C97B39911E01C5B9005426F4 /* Build configuration list for PBXNativeTarget "CQTKit" */ = { 412 | isa = XCConfigurationList; 413 | buildConfigurations = ( 414 | C97B39921E01C5B9005426F4 /* Debug */, 415 | C97B39931E01C5B9005426F4 /* Release */, 416 | ); 417 | defaultConfigurationIsVisible = 0; 418 | }; 419 | C97B39941E01C5B9005426F4 /* Build configuration list for PBXNativeTarget "CQTKitTests" */ = { 420 | isa = XCConfigurationList; 421 | buildConfigurations = ( 422 | C97B39951E01C5B9005426F4 /* Debug */, 423 | C97B39961E01C5B9005426F4 /* Release */, 424 | ); 425 | defaultConfigurationIsVisible = 0; 426 | }; 427 | /* End XCConfigurationList section */ 428 | }; 429 | rootObject = C97B39741E01C5B9005426F4 /* Project object */; 430 | } 431 | --------------------------------------------------------------------------------