Chris@892: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
Chris@892: 
Chris@892: /*
Chris@892:     Sonic Visualiser
Chris@892:     An audio file viewer and annotation editor.
Chris@892:     Centre for Digital Music, Queen Mary, University of London.
Chris@892:     
Chris@892:     This program is free software; you can redistribute it and/or
Chris@892:     modify it under the terms of the GNU General Public License as
Chris@892:     published by the Free Software Foundation; either version 2 of the
Chris@892:     License, or (at your option) any later version.  See the file
Chris@892:     COPYING included with this distribution for more information.
Chris@892: */
Chris@892: 
Chris@892: #ifndef TEST_PITCH_H
Chris@892: #define TEST_PITCH_H
Chris@892: 
Chris@892: #include "../Pitch.h"
Chris@892: #include "../Preferences.h"
Chris@892: 
Chris@892: #include <QObject>
Chris@892: #include <QtTest>
Chris@892: #include <QDir>
Chris@892: 
Chris@892: #include <iostream>
Chris@892: 
Chris@892: using namespace std;
Chris@892: 
Chris@892: class TestPitch : public QObject
Chris@892: {
Chris@892:     Q_OBJECT
Chris@892: 
Chris@892: private slots:
Chris@892:     void init() {
Chris@892: 	Preferences::getInstance()->setOctaveOfMiddleC(4);
Chris@892: 	Preferences::getInstance()->setTuningFrequency(440);
Chris@892:     }
Chris@892: 
Chris@892:     void pitchLabel()
Chris@892:     {
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(60, 0, false), QString("C4"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(69, 0, false), QString("A4"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(61, 0, false), QString("C#4"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(61, 0, true), QString("Db4"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(59, 0, false), QString("B3"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(59, 0, true), QString("B3"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(0, 0, false), QString("C-1"));
Chris@892: 
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(60, -40, false), QString("C4-40c"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(60, 40, false), QString("C4+40c"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(58, 4, false), QString("A#3+4c"));
Chris@892: 
Chris@892: 	Preferences::getInstance()->setOctaveOfMiddleC(3);
Chris@892: 
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(60, 0, false), QString("C3"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(69, 0, false), QString("A3"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(61, 0, false), QString("C#3"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(61, 0, true), QString("Db3"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(59, 0, false), QString("B2"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(59, 0, true), QString("B2"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(0, 0, false), QString("C-2"));
Chris@892: 
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(60, -40, false), QString("C3-40c"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(60, 40, false), QString("C3+40c"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabel(58, 4, false), QString("A#2+4c"));
Chris@892:     }
Chris@892: 
Chris@892:     void pitchLabelForFrequency()
Chris@892:     {
Chris@892: 	QCOMPARE(Pitch::getPitchLabelForFrequency(440, 440, false), QString("A4"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabelForFrequency(440, 220, false), QString("A5"));
Chris@892: 	QCOMPARE(Pitch::getPitchLabelForFrequency(261.63, 440, false), QString("C4"));
Chris@892:     }
Chris@892: 
Chris@1025: #define MIDDLE_C 261.6255653005986
Chris@892: 
Chris@892:     void frequencyForPitch()
Chris@892:     {
Chris@892: 	QCOMPARE(Pitch::getFrequencyForPitch(60, 0), MIDDLE_C);
Chris@1025: 	QCOMPARE(Pitch::getFrequencyForPitch(69, 0), 440.0);
Chris@1025: 	QCOMPARE(Pitch::getFrequencyForPitch(60, 0, 220), MIDDLE_C / 2.0);
Chris@1025: 	QCOMPARE(Pitch::getFrequencyForPitch(69, 0, 220), 220.0);
Chris@892:     }
Chris@892: 
Chris@892:     void pitchForFrequency()
Chris@892:     {
Chris@1025: 	double centsOffset = 0.0;
Chris@1025: 	QCOMPARE(Pitch::getPitchForFrequency(MIDDLE_C, &centsOffset), 60);
Chris@1366: 	QCOMPARE(centsOffset + 1.0, 1.0); // avoid ineffective fuzzy-compare to 0
Chris@1025: 	QCOMPARE(Pitch::getPitchForFrequency(261.0, &centsOffset), 60);
Chris@1025: 	QCOMPARE(int(centsOffset), -4);
Chris@1025: 	QCOMPARE(Pitch::getPitchForFrequency(440.0, &centsOffset), 69);
Chris@1366: 	QCOMPARE(centsOffset + 1.0, 1.0);
Chris@1025:     }
Chris@1025: 
Chris@1025:     void pitchForFrequencyF()
Chris@1025:     {
Chris@892: 	float centsOffset = 0.f;
Chris@892: 	QCOMPARE(Pitch::getPitchForFrequency(MIDDLE_C, &centsOffset), 60);
Chris@1366: 	QCOMPARE(centsOffset + 1.f, 1.f); // avoid ineffective fuzzy-compare to 0
Chris@892: 	QCOMPARE(Pitch::getPitchForFrequency(261.0, &centsOffset), 60);
Chris@892: 	QCOMPARE(int(centsOffset), -4);
Chris@892: 	QCOMPARE(Pitch::getPitchForFrequency(440.0, &centsOffset), 69);
Chris@1366: 	QCOMPARE(centsOffset + 1.f, 1.f);
Chris@892:     }
Chris@892: };
Chris@892: 
Chris@892: #endif