From 9f6de8863954715f930f937568ed274ee66d33db Mon Sep 17 00:00:00 2001
From: John Glover <j@johnglover.net>
Date: Mon, 24 Sep 2012 11:18:09 +0200
Subject: [partial_tracking] Default to inharmonic partial tracking mode in
 SMSPartialTracking. Add methods to SMSPartialTracking to allow realtime mode
 and harmonic mode to be switched on/off.

---
 tests/test_partial_tracking.cpp | 97 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 95 insertions(+), 2 deletions(-)

(limited to 'tests')

diff --git a/tests/test_partial_tracking.cpp b/tests/test_partial_tracking.cpp
index 71c5452..f5c1fff 100644
--- a/tests/test_partial_tracking.cpp
+++ b/tests/test_partial_tracking.cpp
@@ -14,13 +14,105 @@
 namespace simpl
 {
 
+// ---------------------------------------------------------------------------
+//	TestSMSPartialTracking
+// ---------------------------------------------------------------------------
+class TestSMSPartialTracking : public CPPUNIT_NS::TestCase {
+    CPPUNIT_TEST_SUITE(TestSMSPartialTracking);
+    CPPUNIT_TEST(test_basic);
+    CPPUNIT_TEST(test_peaks);
+    CPPUNIT_TEST_SUITE_END();
+
+protected:
+    static const double PRECISION = 0.001;
+    SMSPeakDetection* pd;
+    SMSPartialTracking* pt;
+    SndfileHandle sf;
+    int num_samples;
+
+    void test_basic() {
+        pt->reset();
+        pd->hop_size(256);
+        pd->frame_size(2048);
+
+        sample* audio = new sample[(int)sf.frames()];
+        sf.read(audio, (int)sf.frames());
+
+        Frames frames = pd->find_peaks(num_samples, &(audio[(int)sf.frames() / 2]));
+        frames = pt->find_partials(frames);
+
+        for(int i = 0; i < frames.size(); i++) {
+            CPPUNIT_ASSERT(frames[i]->num_peaks() > 0);
+            CPPUNIT_ASSERT(frames[i]->num_partials() > 0);
+        }
+    }
+
+    void test_peaks() {
+        pt->reset();
+
+        Frames frames;
+        Peaks peaks;
+        int num_frames = 8;
+
+        for(int i = 0; i < num_frames; i++) {
+            Peak* p = new Peak();
+            p->amplitude = 0.2;
+            p->frequency = 220;
+
+            Peak* p2 = new Peak();
+            p2->amplitude = 0.2;
+            p2->frequency = 440;
+
+            Frame* f = new Frame();
+            f->add_peak(p);
+            f->add_peak(p2);
+
+            frames.push_back(f);
+            peaks.push_back(p);
+            peaks.push_back(p2);
+        }
+
+        pt->find_partials(frames);
+        for(int i = 0; i < num_frames; i++) {
+            CPPUNIT_ASSERT(frames[i]->num_peaks() > 0);
+            CPPUNIT_ASSERT(frames[i]->num_partials() > 0);
+            CPPUNIT_ASSERT(frames[i]->partial(0)->amplitude == 0.2);
+            CPPUNIT_ASSERT(frames[i]->partial(0)->frequency == 220);
+            CPPUNIT_ASSERT(frames[i]->partial(1)->amplitude == 0.2);
+            CPPUNIT_ASSERT(frames[i]->partial(1)->frequency == 440);
+        }
+
+        for(int i = 0; i < num_frames * 2; i++) {
+            delete peaks[i];
+        }
+
+        for(int i = 0; i < num_frames; i++) {
+            delete frames[i];
+        }
+    }
+
+public:
+    void setUp() {
+        pd = new SMSPeakDetection();
+        pt = new SMSPartialTracking();
+        pt->realtime(1);
+        sf = SndfileHandle("../tests/audio/flute.wav");
+        num_samples = 4096;
+    }
+
+    void tearDown() {
+        delete pd;
+        delete pt;
+    }
+};
+
 // ---------------------------------------------------------------------------
 //	TestLorisPartialTracking
 // ---------------------------------------------------------------------------
 class TestLorisPartialTracking : public CPPUNIT_NS::TestCase {
     CPPUNIT_TEST_SUITE(TestLorisPartialTracking);
     CPPUNIT_TEST(test_basic);
-    // CPPUNIT_TEST(test_simple_peaks);
+    CPPUNIT_TEST(test_peaks);
     CPPUNIT_TEST_SUITE_END();
 
 protected:
@@ -47,7 +139,7 @@ protected:
         }
     }
 
-    void test_simple_peaks() {
+    void test_peaks() {
         pt->reset();
 
         Frames frames;
@@ -107,6 +199,7 @@ public:
 
 } // end of namespace simpl
 
+CPPUNIT_TEST_SUITE_REGISTRATION(simpl::TestSMSPartialTracking);
 CPPUNIT_TEST_SUITE_REGISTRATION(simpl::TestLorisPartialTracking);
 
 int main(int arg, char **argv) {
-- 
cgit v1.2.3