zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

OscilGenTest.cpp (4491B)


      1 /*
      2   ZynAddSubFX - a software synthesizer
      3 
      4   AdNoteTest.h - CxxTest for Synth/OscilGen
      5   Copyright (C) 20011-2012 Mark McCurry
      6   Author: Mark McCurry
      7 
      8   This program is free software; you can redistribute it and/or
      9   modify it under the terms of the GNU General Public License
     10   as published by the Free Software Foundation; either version 2
     11   of the License, or (at your option) any later version.
     12 */
     13 #include "test-suite.h"
     14 #include <string>
     15 #include "../Synth/OscilGen.h"
     16 #include "../Misc/XMLwrapper.h"
     17 #include "../DSP/FFTwrapper.h"
     18 #include "../Misc/Util.h"
     19 #include "../globals.h"
     20 using namespace std;
     21 using namespace zyn;
     22 
     23 SYNTH_T *synth;
     24 
     25 class OscilGenTest
     26 {
     27     public:
     28         float  freq;
     29         float *outR, *outL;
     30         FFTwrapper *fft;
     31         OscilGen   *oscil;
     32 
     33         void setUp() {
     34             synth = new SYNTH_T;
     35             //First the sensible settings and variables that have to be set:
     36             synth->buffersize = 256;
     37             synth->oscilsize  = 1024;
     38 
     39             outL = new float[synth->oscilsize];
     40             outR = new float[synth->oscilsize];
     41             memset(outL, 0, sizeof(float) * synth->oscilsize);
     42             memset(outR, 0, sizeof(float) * synth->oscilsize);
     43 
     44             //prepare the default settings
     45             fft   = new FFTwrapper(synth->oscilsize);
     46             oscil = new OscilGen(*synth, fft, NULL);
     47 
     48             //Assert defaults [TODO]
     49 
     50 
     51             XMLwrapper wrap;
     52             wrap.loadXMLfile(string(SOURCE_DIR)
     53                               + string("/guitar-adnote.xmz"));
     54             TS_ASSERT(wrap.enterbranch("MASTER"));
     55             TS_ASSERT(wrap.enterbranch("PART", 0));
     56             TS_ASSERT(wrap.enterbranch("INSTRUMENT"));
     57             TS_ASSERT(wrap.enterbranch("INSTRUMENT_KIT"));
     58             TS_ASSERT(wrap.enterbranch("INSTRUMENT_KIT_ITEM", 0));
     59             TS_ASSERT(wrap.enterbranch("ADD_SYNTH_PARAMETERS"));
     60             TS_ASSERT(wrap.enterbranch("VOICE", 0));
     61             TS_ASSERT(wrap.enterbranch("OSCIL"));
     62             oscil->getfromXML(wrap);
     63 
     64             //verify xml was loaded [TODO]
     65 
     66             //lets go with.... 50! as a nice note
     67             const char testnote = 50;
     68             freq = 440.0f * powf(2.0f, (testnote - 69.0f) / 12.0f);
     69         }
     70 
     71         void tearDown() {
     72             delete oscil;
     73             delete fft;
     74             delete[] outL;
     75             delete[] outR;
     76             FFT_cleanup();
     77             delete synth;
     78         }
     79 
     80         //verifies that initialization occurs
     81         void testInit(void)
     82         {
     83             oscil->get(outL, freq);
     84         }
     85 
     86         void testOutput(void)
     87         {
     88             oscil->get(outL, freq);
     89             TS_ASSERT_DELTA(outL[23], -0.5371f, 0.0001f);
     90             TS_ASSERT_DELTA(outL[129], 0.3613f, 0.0001f);
     91             TS_ASSERT_DELTA(outL[586], 0.1118f, 0.0001f);
     92             TS_ASSERT_DELTA(outL[1023], -0.6889f, 0.0001f);
     93         }
     94 
     95         void testSpectrum(void)
     96         {
     97             oscil->getspectrum(synth->oscilsize / 2, outR, 1);
     98             TS_ASSERT_DELTA(outR[1], 350.698059f, 0.0001f);
     99             TS_ASSERT_DELTA(outR[2], 228.889267f, 0.0001f);
    100             TS_ASSERT_DELTA(outR[3], 62.187931f, 0.0001f);
    101             TS_ASSERT_DELTA(outR[4], 22.295225f, 0.0001f);
    102             TS_ASSERT_DELTA(outR[5], 6.942001f, 0.0001f);
    103             TS_ASSERT_DELTA(outR[27], 0.015110f, 0.0001f);
    104             TS_ASSERT_DELTA(outR[48], 0.003425f, 0.0001f);
    105             TS_ASSERT_DELTA(outR[66], 0.001293f, 0.0001f);
    106         }
    107 
    108         //performance testing
    109 #ifdef __linux__
    110         void testSpeed() {
    111             const int samps = 15000;
    112 
    113             int t_on = clock(); // timer before calling func
    114             for(int i = 0; i < samps; ++i)
    115                 oscil->prepare();
    116             int t_off = clock(); // timer when func returns
    117 
    118             printf("OscilGenTest: %f seconds for %d prepares.\n",
    119                    (static_cast<float>(t_off - t_on)) / CLOCKS_PER_SEC, samps);
    120 
    121             t_on = clock(); // timer before calling func
    122             for(int i = 0; i < samps; ++i)
    123                 oscil->get(outL, freq);
    124             t_off = clock(); // timer when func returns
    125 
    126             printf("OscilGenTest: %f seconds for %d gets.\n",
    127                    (static_cast<float>(t_off - t_on)) / CLOCKS_PER_SEC, samps);
    128         }
    129 #endif
    130 };
    131 
    132 int main()
    133 {
    134     OscilGenTest test;
    135     RUN_TEST(testInit);
    136     RUN_TEST(testOutput);
    137     RUN_TEST(testSpectrum);
    138 #ifdef __linux__
    139     RUN_TEST(testSpeed);
    140 #endif
    141     return test_summary();
    142 }