#include #include #include "SawOscillator.h" using namespace std; // do objects exist? template void testSaw1() { SawOscillatorParams params; SawOscillator::setFrequency(params, (T(.1))); SawOscillatorState state; SawOscillator::run(state, params); } /** * Does parameter calculation do anything? */ template void testSaw2() { SawOscillatorParams params; assert(params.phaseIncrement == 0); SawOscillator::setFrequency(params, (T(.1))); assert(params.phaseIncrement > 0); } /** * Does something come out? */ template void testSaw3() { SawOscillatorParams params; SawOscillator::setFrequency(params, (T(.2))); SawOscillatorState state; SawOscillator::run(state, params); const T out = SawOscillator::run(state, params); assert(out >= 0); assert(out < 1); } /** * Does it look like a saw? */ template void testSaw4() { const T freq = T(.01); const T freq_2 = freq / 2; const T delta = freq / 1000; SawOscillatorParams params; SawOscillator::setFrequency(params, (T(.01))); SawOscillatorState state; T last = 0; for (int i = 0; i < 1000; ++i) { const T output = SawOscillator::run(state, params); assert(output >= 0); assert(output < 1); if (output < last) { assert(last > .99); assert(output < .01); } else { assert(output < (last + freq + delta)); } last = output; } } /** * is the quadrature really 90 out of phase? */ template void testSaw5() { const T freq = T(.01); const T freq_2 = freq / 2; const T delta = freq / 1000; SawOscillatorParams params; SawOscillator::setFrequency(params, (T(.01))); SawOscillatorState state; T output; T quadratureOutput; for (int i = 0; i < 1000; ++i) { SawOscillator::runQuadrature(output, quadratureOutput, state, params); // normalize output (unwrap) if (quadratureOutput < output) { quadratureOutput += 1; } assert(quadratureOutput = (output + T(.25))); } } /** * Does it look like a negative saw? */ template void testSaw6() { const T freq = T(-.01); const T delta = freq / 1000; SawOscillatorParams params; SawOscillator::setFrequency(params, freq); SawOscillatorState state; T last = 0; for (int i = 0; i < 1000; ++i) { const T output = SawOscillator::run(state, params); assert(output >= 0); assert(output < 1); if (output > last) { // wrap case - did we more or less wrap? assert(last < .01); assert(output > .98); } else { // no-wrap - are we decreasing assert(output > (last + freq + delta)); } last = output; } } template void testSawT() { testSaw1(); testSaw2(); testSaw3(); testSaw4(); testSaw5(); testSaw6(); } void testSaw() { testSawT(); testSawT(); }