|
- /*
- 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 <cxxtest/TestSuite.h>
- #include <iostream>
- #include <fstream>
- #include <ctime>
- #include <string>
- #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<float>(t_off - t_on)) / CLOCKS_PER_SEC, samps);
- }
- #endif
- };
|