/* ZynAddSubFX - a software synthesizer AdNoteTest.h - CxxTest for Synth/SUBnote Copyright (C) 2009-2011 Mark McCurry Author: Mark McCurry This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License (version 2 or later) for more details. You should have received a copy of the GNU General Public License (version 2) along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ //Based Upon AdNoteTest.h #include #include #include #include #include #include "../Misc/Master.h" #include "../Misc/Util.h" #include "../Synth/SUBnote.h" #include "../Params/Presets.h" #include "../globals.h" SYNTH_T *synth; using namespace std; class SubNoteTest:public CxxTest::TestSuite { public: SUBnote *note; Master *master; Controller *controller; unsigned char testnote; float *outR, *outL; void setUp() { synth = new SYNTH_T; //First the sensible settings and variables that have to be set: synth->buffersize = 256; outL = new float[synth->buffersize]; for(int i = 0; i < synth->buffersize; ++i) *(outL + i) = 0; outR = new float[synth->buffersize]; for(int i = 0; i < synth->buffersize; ++i) *(outR + i) = 0; //next the bad global variables that for some reason have not been properly placed in some //initialization routine, but rather exist as cryptic oneliners in main.cpp: denormalkillbuf = new float[synth->buffersize]; for(int i = 0; i < synth->buffersize; ++i) denormalkillbuf[i] = 0; //prepare the default settings SUBnoteParameters *defaultPreset = new SUBnoteParameters(); XMLwrapper *wrap = new XMLwrapper(); wrap->loadXMLfile(string(SOURCE_DIR) + string("/guitar-adnote.xmz")); TS_ASSERT(wrap->enterbranch("MASTER")); TS_ASSERT(wrap->enterbranch("PART", 1)); TS_ASSERT(wrap->enterbranch("INSTRUMENT")); TS_ASSERT(wrap->enterbranch("INSTRUMENT_KIT")); TS_ASSERT(wrap->enterbranch("INSTRUMENT_KIT_ITEM", 0)); TS_ASSERT(wrap->enterbranch("SUB_SYNTH_PARAMETERS")); defaultPreset->getfromXML(wrap); controller = new Controller(); //lets go with.... 50! as a nice note testnote = 50; float freq = 440.0f * powf(2.0f, (testnote - 69.0f) / 12.0f); note = new SUBnote(defaultPreset, controller, freq, 120, 0, testnote, false); delete wrap; delete defaultPreset; } void willNoteBeRunButIsHereForLinkingReasonsHowsThisForCamelCaseEh() { master = new Master(); } void tearDown() { delete controller; delete note; delete [] outL; delete [] outR; delete [] denormalkillbuf; clearTmpBuffers(); delete synth; } void testDefaults() { //Note: if these tests fail it is due to the relationship between //global.h::RND and SUBnote.cpp int sampleCount = 0; //#define WRITE_OUTPUT #ifdef WRITE_OUTPUT ofstream file("subnoteout", ios::out); #endif note->noteout(outL, outR); #ifdef WRITE_OUTPUT for(int i = 0; i < synth->buffersize; ++i) file << outL[i] << std::endl; #endif sampleCount += synth->buffersize; TS_ASSERT_DELTA(outL[255], 0.0000f, 0.0001f); note->relasekey(); note->noteout(outL, outR); sampleCount += synth->buffersize; TS_ASSERT_DELTA(outL[255], 0.0016f, 0.0001f); note->noteout(outL, outR); sampleCount += synth->buffersize; TS_ASSERT_DELTA(outL[255], -0.0000f, 0.0001f); note->noteout(outL, outR); sampleCount += synth->buffersize; TS_ASSERT_DELTA(outL[255], -0.0013f, 0.0001f); note->noteout(outL, outR); sampleCount += synth->buffersize; TS_ASSERT_DELTA(outL[255], -0.0002f, 0.0001f); while(!note->finished()) { note->noteout(outL, outR); #ifdef WRITE_OUTPUT for(int i = 0; i < synth->buffersize; ++i) file << outL[i] << std::endl; #endif sampleCount += synth->buffersize; } #ifdef WRITE_OUTPUT file.close(); #endif TS_ASSERT_EQUALS(sampleCount, 2304); } #define OUTPUT_PROFILE #ifdef OUTPUT_PROFILE void testSpeed() { const int samps = 15000; int t_on = clock(); // timer before calling func for(int i = 0; i < samps; ++i) note->noteout(outL, outR); int t_off = clock(); // timer when func returns printf("SubNoteTest: %f seconds for %d Samples to be generated.\n", (static_cast(t_off - t_on)) / CLOCKS_PER_SEC, samps); } #endif };