zynaddsubfx

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

EchoTest.cpp (4173B)


      1 /*
      2   ZynAddSubFX - a software synthesizer
      3 
      4   EchoTest.h - CxxTest for Effect/Echo
      5   Copyright (C) 2009-2011 Mark McCurry
      6   Copyright (C) 2009 Harald Hvaal
      7   Authors: Mark McCurry, Harald Hvaal
      8 
      9   This program is free software; you can redistribute it and/or
     10   modify it under the terms of the GNU General Public License
     11   as published by the Free Software Foundation; either version 2
     12   of the License, or (at your option) any later version.
     13 */
     14 #include "test-suite.h"
     15 #include <cmath>
     16 #include <cstdlib>
     17 #include <iostream>
     18 #include "../Effects/Echo.h"
     19 #include "../Misc/Allocator.h"
     20 #include "../globals.h"
     21 
     22 using namespace std;
     23 using namespace zyn;
     24 
     25 SYNTH_T *synth;
     26 
     27 class EchoTest
     28 {
     29     public:
     30         void setUp() {
     31             synth = new SYNTH_T;
     32             outL  = new float[synth->buffersize];
     33             for(int i = 0; i < synth->buffersize; ++i)
     34                 outL[i] = 0.0f;
     35             outR = new float[synth->buffersize];
     36             for(int i = 0; i < synth->buffersize; ++i)
     37                 outR[i] = 0.0f;
     38             input = new Stereo<float *>(new float[synth->buffersize],
     39                                         new float[synth->buffersize]);
     40             for(int i = 0; i < synth->buffersize; ++i)
     41                 input->l[i] = input->r[i] = 0.0f;
     42             EffectParams pars{alloc,true, outL, outR, 0, 44100, 256, nullptr};
     43             testFX = new Echo(pars);
     44         }
     45 
     46         void tearDown() {
     47             delete[] input->r;
     48             delete[] input->l;
     49             delete input;
     50             delete[] outL;
     51             delete[] outR;
     52             delete testFX;
     53             delete synth;
     54         }
     55 
     56 
     57         void testInit() {
     58             //Make sure that the output will be zero at start
     59             //(given a zero input)
     60             testFX->out(*input);
     61             for(int i = 0; i < synth->buffersize; ++i) {
     62                 TS_ASSERT_DELTA(outL[i], 0.0f, 0.0001f);
     63                 TS_ASSERT_DELTA(outR[i], 0.0f, 0.0001f);
     64             }
     65         }
     66 
     67         void testClear() {
     68             char DELAY = 2;
     69             testFX->changepar(DELAY, 127);
     70 
     71             //flood with high input
     72             for(int i = 0; i < synth->buffersize; ++i)
     73                 input->r[i] = input->l[i] = 1.0f;
     74 
     75             for(int i = 0; i < 500; ++i)
     76                 testFX->out(*input);
     77             for(int i = 0; i < synth->buffersize; ++i) {
     78                 TS_ASSERT(outL[i] != 0.0f);
     79                 TS_ASSERT(outR[i] != 0.0f);
     80             }
     81             //After making sure the internal buffer has a nonzero value
     82             //cleanup
     83             //Then get the next output, which should be zereoed out if DELAY
     84             //is large enough
     85             testFX->cleanup();
     86             testFX->out(*input);
     87             for(int i = 0; i < synth->buffersize; ++i) {
     88                 TS_ASSERT_DELTA(outL[i], 0.0f, 0.0001f);
     89                 TS_ASSERT_DELTA(outR[i], 0.0f, 0.0001f);
     90             }
     91         }
     92         //Insures that the proper decay occurs with high feedback
     93         void testDecaywFb() {
     94             //flood with high input
     95             for(int i = 0; i < synth->buffersize; ++i)
     96                 input->r[i] = input->l[i] = 1.0f;
     97             char FEEDBACK = 5;
     98             testFX->changepar(FEEDBACK, 127);
     99             for(int i = 0; i < 100; ++i)
    100                 testFX->out(*input);
    101             for(int i = 0; i < synth->buffersize; ++i) {
    102                 TS_ASSERT(outL[i] != 0.0f);
    103                 TS_ASSERT(outR[i] != 0.0f);
    104             }
    105             float amp = abs(outL[0] + outR[0]) / 2;
    106             //reset input to zero
    107             for(int i = 0; i < synth->buffersize; ++i)
    108                 input->r[i] = input->l[i] = 0.0f;
    109 
    110             //give the echo time to fade based upon zero input and high feedback
    111             for(int i = 0; i < 50; ++i)
    112                 testFX->out(*input);
    113             TS_ASSERT(abs(outL[0] + outR[0]) / 2 <= amp);
    114         }
    115 
    116 
    117     private:
    118         Stereo<float *> *input;
    119         float *outR, *outL;
    120         Echo  *testFX;
    121         Alloc alloc;
    122 };
    123 
    124 int main()
    125 {
    126     tap_quiet = 1;
    127     EchoTest test;
    128     RUN_TEST(testInit);
    129     RUN_TEST(testClear);
    130     RUN_TEST(testDecaywFb);
    131     return test_summary();
    132 }