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 }