Chris@222: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@222: Chris@222: #include "dsp/keydetection/GetKeyMode.h" Chris@222: Chris@222: #include Chris@222: Chris@222: #include Chris@222: Chris@222: #define BOOST_TEST_DYN_LINK Chris@222: #define BOOST_TEST_MAIN Chris@222: Chris@222: #include Chris@222: Chris@222: BOOST_AUTO_TEST_SUITE(TestGetKeyMode) Chris@222: Chris@222: using std::cout; Chris@222: using std::endl; Chris@222: using std::string; Chris@222: using std::vector; Chris@222: Chris@222: string keyName(int index, bool minor) Chris@222: { Chris@222: static string namesMajor[] = { Chris@222: "C", "Db", "D", "Eb", Chris@222: "E", "F", "F# / Gb", "G", Chris@222: "Ab", "A", "Bb", "B" Chris@222: }; Chris@222: Chris@222: static string namesMinor[] = { Chris@222: "C", "C#", "D", "Eb / D#", Chris@222: "E", "F", "F#", "G", Chris@222: "G#", "A", "Bb", "B" Chris@222: }; Chris@222: Chris@222: if (index < 1 || index > 12) return ""; Chris@222: Chris@222: std::string name; Chris@222: if (minor) name = namesMinor[index - 1] + " minor"; Chris@222: else name = namesMajor[index - 1] + " major"; Chris@222: return name; Chris@222: } Chris@222: Chris@222: string midiPitchName(int midiPitch) Chris@222: { Chris@222: static string names[] = { Chris@222: "C", "C#", "D", "D#", Chris@222: "E", "F", "F#", "G", Chris@222: "G#", "A", "A#", "B" Chris@222: }; Chris@222: Chris@222: return names[midiPitch % 12]; Chris@222: } Chris@222: Chris@222: vector generateSinusoid(double frequency, Chris@222: int sampleRate, Chris@222: int length) Chris@222: { Chris@222: vector buffer; Chris@222: buffer.reserve(length); Chris@222: for (int i = 0; i < length; ++i) { Chris@222: buffer.push_back(sin(i * M_PI * 2.0 * frequency / sampleRate)); Chris@222: } Chris@222: return buffer; Chris@222: } Chris@222: Chris@222: BOOST_AUTO_TEST_CASE(sinusoid_12tET) Chris@222: { Chris@222: double concertA = 440.0; Chris@222: int sampleRate = 44100; Chris@222: Chris@222: for (int midiPitch = 48; midiPitch < 96; ++midiPitch) { Chris@222: Chris@222: cout << endl; Chris@222: Chris@222: GetKeyMode gkm(sampleRate, concertA, 10, 10); Chris@222: int blockSize = gkm.getBlockSize(); Chris@222: int hopSize = gkm.getHopSize(); Chris@222: cerr << "blockSize = " << blockSize Chris@222: << ", hopSize = " << hopSize << endl; Chris@222: Chris@222: double frequency = concertA * pow(2.0, (midiPitch - 69.0) / 12.0); Chris@222: cout << "midiPitch = " << midiPitch Chris@222: << ", name = " << midiPitchName(midiPitch) Chris@222: << ", frequency = " << frequency << endl; Chris@222: Chris@222: int blocks = 4; Chris@222: int totalLength = blockSize * blocks; Chris@222: vector signal = generateSinusoid(frequency, sampleRate, Chris@222: totalLength); Chris@222: Chris@222: int key; Chris@222: Chris@222: for (int offset = 0; offset + blockSize < totalLength; Chris@222: offset += hopSize) { Chris@222: int k = gkm.process(signal.data() + offset); Chris@222: if (offset == 0) { Chris@222: key = k; Chris@222: } else { Chris@222: BOOST_CHECK_EQUAL(key, k); Chris@222: } Chris@222: } Chris@222: Chris@222: bool minor = (key > 12); Chris@222: Chris@222: int tonic = key; Chris@222: if (minor) tonic -= 12; Chris@222: Chris@222: string name = keyName(tonic, minor); Chris@222: cout << "key value = " << key << ", name = " << name << endl; Chris@222: } Chris@222: } Chris@222: Chris@222: BOOST_AUTO_TEST_SUITE_END()