#include "FrozenWasteland.hpp" #include "dsp/decimator.hpp" #include "dsp/digital.hpp" #include using namespace std; #define BUFFER_SIZE 32000 #define FRAME_COUNT 10 #define FREQUENCY_BANDS 6 #ifndef FCOMPLEX_H_ #define FCOMPLEX_H_ #define J fcomplex(0.0,1.0) typedef std::complex fcomplex; #endif /* FCOMPLEX_H_ */ namespace rack_plugin_FrozenWasteland { struct Sabonis : Module { enum ParamIds { SMOOTHENESS_PARAM, NUM_PARAMS }; enum InputIds { SIGNAL_IN, NUM_INPUTS }; enum OutputIds { TRANSIENT_OUTPUT, TONAL_OUTPUT, NUM_OUTPUTS }; int defaultWindowSize = 2048; //11ms window. NOTE add detection for sample rate change int halfWindowSize = defaultWindowSize / 2; int hopSize = 512; //30ms overlap. NOTE add detection for sample rate change float windowFunction[BUFFER_SIZE] = {}; float signalBuffer[BUFFER_SIZE] = {}; float X[BUFFER_SIZE][FREQUENCY_BANDS] = {}; void CreateBlackmanHarrisWindow(int windowSize) { float a0 = 0.35875; float a1 = 0.48829; float a2 = 0.14128; float a3 = 0.01168; for(int n=0;nbox.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin, "res/Sabonis.svg"))); addChild(panel); } addParam(ParamWidget::create(Vec(14, 84), module, Sabonis::SMOOTHENESS_PARAM, 0, 1.0, .25)); addInput(Port::create(Vec(10, 170), Port::INPUT, module, Sabonis::SIGNAL_IN)); addOutput(Port::create(Vec(10, 255), Port::OUTPUT, module, Sabonis::TRANSIENT_OUTPUT)); addOutput(Port::create(Vec(10, 305), Port::OUTPUT, module, Sabonis::TONAL_OUTPUT)); addChild(Widget::create(Vec(15, 0))); addChild(Widget::create(Vec(box.size.x-30, 0))); addChild(Widget::create(Vec(15, 365))); addChild(Widget::create(Vec(box.size.x-30, 365))); } } // namespace rack_plugin_FrozenWasteland using namespace rack_plugin_FrozenWasteland; RACK_PLUGIN_MODEL_INIT(FrozenWasteland, Sabonis) { Model *modelSabonis = Model::create("Frozen Wasteland", "Sabonis", "Sabonis", FILTER_TAG); return modelSabonis; }