#include #include #include #include #include "AudioMath.h" #include "BiquadParams.h" #include "BiquadFilter.h" #include "BiquadState.h" #include "ColoredNoise.h" #include "FrequencyShifter.h" #include "HilbertFilterDesigner.h" #include "LookupTableFactory.h" #include "TestComposite.h" #include "Tremolo.h" #include "VocalAnimator.h" #include "VocalFilter.h" using Shifter = FrequencyShifter; using Animator = VocalAnimator; using VocFilter = VocalFilter; using Colors = ColoredNoise; using Trem = Tremolo; #include "MeasureTime.h" // There are many tests that are disabled with #if 0. // In most cases they still work, but don't need to be run regularly #if 0 static void test1() { double d = .1; srand(57); const double scale = 1.0 / RAND_MAX; MeasureTime::run("test1 (do nothing)", [&d, scale]() { return TestBuffers::get(); }, 1); MeasureTime::run("test1 sin", []() { float x = std::sin(TestBuffers::get()); return x; }, 1); MeasureTime::run("test1 sin double", []() { float x = std::sin(TestBuffers::get()); return x; }, 1); MeasureTime::run("test1 sinx2 float", []() { float x = std::sin(TestBuffers::get()); x = std::sin(x); return x; }, 1); MeasureTime::run("mult float-10", []() { float x = TestBuffers::get(); float y = TestBuffers::get(); return x * y; }, 10); MeasureTime::run("mult dbl", []() { double x = TestBuffers::get(); double y = TestBuffers::get(); return x * y; }, 1); MeasureTime::run("div float", []() { float x = TestBuffers::get(); float y = TestBuffers::get(); return x / y; }, 1); MeasureTime::run("div dbl", []() { double x = TestBuffers::get(); double y = TestBuffers::get(); return x / y; }, 1); MeasureTime::run("test1 (do nothing)", [&d, scale]() { return TestBuffers::get(); }, 1); MeasureTime::run("test1 pow2 float", []() { float x = std::pow(2, TestBuffers::get()); return x; }, 1); MeasureTime::run("test1 pow rnd float", []() { float x = std::pow(TestBuffers::get(), TestBuffers::get()); return x; }, 1); MeasureTime::run("test1 exp float", []() { float x = std::exp(TestBuffers::get()); return x; }, 1); } #endif template static void testHilbert() { BiquadParams paramsSin; BiquadParams paramsCos; BiquadState state; HilbertFilterDesigner::design(44100, paramsSin, paramsCos); MeasureTime::run("hilbert", [&state, ¶msSin]() { T d = BiquadFilter::run(TestBuffers::get(), state, paramsSin); return d; }, 1); } #if 0 static void testExpRange() { using T = float; LookupTableParams table; LookupTableFactory::makeExp2(table); MeasureTime::run("exp lookup", [&table]() { T d = LookupTable::lookup(table, TestBuffers::get()); return d; }, 1); } #endif static void testShifter() { Shifter fs; fs.setSampleRate(44100); fs.init(); fs.inputs[Shifter::AUDIO_INPUT].value = 0; MeasureTime::run("shifter", [&fs]() { fs.inputs[Shifter::AUDIO_INPUT].value = TestBuffers::get(); fs.step(); return fs.outputs[Shifter::SIN_OUTPUT].value; }, 1); } static void testAnimator() { Animator an; an.setSampleRate(44100); an.init(); an.inputs[Shifter::AUDIO_INPUT].value = 0; MeasureTime::run("animator", [&an]() { an.inputs[Shifter::AUDIO_INPUT].value = TestBuffers::get(); an.step(); return an.outputs[Shifter::SIN_OUTPUT].value; }, 1); } static void testVocalFilter() { VocFilter an; an.setSampleRate(44100); an.init(); an.inputs[Shifter::AUDIO_INPUT].value = 0; MeasureTime::run("vocal filter", [&an]() { an.inputs[Shifter::AUDIO_INPUT].value = TestBuffers::get(); an.step(); return an.outputs[Shifter::SIN_OUTPUT].value; }, 1); } static void testColors() { Colors co; co.setSampleRate(44100); co.init(); MeasureTime::run("colors", [&co]() { co.step(); return co.outputs[Colors::AUDIO_OUTPUT].value; }, 1); } static void testTremolo() { Trem tr; tr.setSampleRate(44100); tr.init(); MeasureTime::run("trem", [&tr]() { tr.inputs[Trem::AUDIO_INPUT].value = TestBuffers::get(); tr.step(); return tr.outputs[Trem::AUDIO_OUTPUT].value; }, 1); } #if 0 static void testAttenuverters() { auto scaler = AudioMath::makeLinearScaler(-2, 2); MeasureTime::run("linear scaler", [&scaler]() { float cv = TestBuffers::get(); float knob = TestBuffers::get(); float trim = TestBuffers::get(); return scaler(cv, knob, trim); }, 1); LookupTableParams lookup; LookupTableFactory::makeBipolarAudioTaper(lookup); MeasureTime::run("bipolar lookup", [&lookup]() { float x = TestBuffers::get(); return LookupTable::lookup(lookup, x); }, 1); // auto refFuncPos = AudioMath::makeFunc_AudioTaper(LookupTableFactory::audioTaperKnee()); { auto bipolarScaler = [&lookup, &scaler](float cv, float knob, float trim) { float scaledTrim = LookupTable::lookup(lookup, cv); return scaler(cv, knob, scaledTrim); }; MeasureTime::run("bipolar scaler", [&bipolarScaler]() { float cv = TestBuffers::get(); float knob = TestBuffers::get(); float trim = TestBuffers::get(); return bipolarScaler(cv, knob, trim); }, 1); } } #endif void perfTest() { #if 0 testAttenuverters(); testExpRange(); #endif testVocalFilter(); testAnimator(); testShifter(); testColors(); testTremolo(); // test1(); #if 0 testHilbert(); testHilbert(); #endif }