You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

210 lines
9.6KB

  1. #include "Bark.hpp"
  2. #include "barkComponents.hpp"
  3. #include "dsp/vumeter.hpp"
  4. #include "dependancies/filt/biquad.cpp"
  5. #include "dependancies/filt/lp24.cpp"
  6. namespace rack_plugin_Bark {
  7. struct OneBand : Module {
  8. enum ParamIds {
  9. EQGAIN_PARAM,
  10. EQFREQ_PARAM,
  11. EQBANDWIDTH_PARAM,
  12. EQBYPASS_PARAM,
  13. PREPOST_PARAM,
  14. OUTGAIN_PARAM,
  15. SWAPLR_PARAM,
  16. LISTEN_PARAM,
  17. NUM_PARAMS
  18. };
  19. enum InputIds {
  20. GAINMOD_INPUT,
  21. FREQMOD_INPUT,
  22. BWMOD_INPUT,
  23. INL_INPUT,
  24. INR_INPUT,
  25. NUM_INPUTS
  26. };
  27. enum OutputIds {
  28. OUTL_OUTPUT,
  29. OUTR_OUTPUT,
  30. devParamOutGain,
  31. devParamOutFrq,
  32. devParamOutQ,
  33. NUM_OUTPUTS
  34. };
  35. enum LightIds {
  36. FreqParamOn,
  37. FreqParamOff,
  38. dBpeak_LIGHT,
  39. NUM_LIGHTS = dBpeak_LIGHT + 8 //7 + Clipping Light
  40. };
  41. OneBand() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  42. void step() override;
  43. VUMeter volUnitIndicatorPEAK;
  44. //create object of biquad filter
  45. Biquad *parametricEQL = new Biquad();
  46. Biquad *parametricEQR = new Biquad();
  47. LadderFilter lpf24; //smoothing
  48. };
  49. void OneBand::step(){
  50. bool Listen = params[LISTEN_PARAM].value, swapLR = params[SWAPLR_PARAM].value;
  51. float inL = 0.0f, inR = 0.0f, outLdBVU = 0.0f, outRdBVU = 0.0f,
  52. outL = clamp(outputs[OUTL_OUTPUT].value, -9.9f, 9.9f), outR = clamp(outputs[OUTR_OUTPUT].value, -9.9f, 9.9f),
  53. Gain = params[OUTGAIN_PARAM].value / 2.0f;
  54. double eqGain = params[EQGAIN_PARAM].value * 5.0 + (clamp(inputs[GAINMOD_INPUT].value, -6.5f, 6.5f) * 5.0),
  55. modInput, eqFreq = fmax(params[EQFREQ_PARAM].value, fmin(abs(.01375), abs(10.))),
  56. eqQ = clamp(params[EQBANDWIDTH_PARAM].value, 2.f, 40.f) + (4.f * clamp(inputs[BWMOD_INPUT].value, 2.f, 40.f));
  57. double sampRate, biquadFreq, biquadQ, biquadGain;
  58. //main gain knob
  59. inL = inputs[INL_INPUT].value; //dBmeter on input
  60. inR = inputs[INR_INPUT].value;
  61. outLdBVU = outputs[OUTL_OUTPUT].value; //dBmeter on output
  62. outRdBVU = outputs[OUTR_OUTPUT].value;
  63. //dB Peak Level Indicator------------------------------------------------------- pre EQ / post EQ
  64. volUnitIndicatorPEAK.dBInterval = 3.f;
  65. for (int light = 0; light < 8; light++) {
  66. //TODO: L/R unbalanced inputs will not engage clip light
  67. if (params[PREPOST_PARAM].value == 0.0f && !inputs[INR_INPUT].active) {//pre
  68. volUnitIndicatorPEAK.setValue(inL / 10.f);
  69. lights[dBpeak_LIGHT + light].setBrightnessSmooth(volUnitIndicatorPEAK.getBrightness(light));
  70. } else if (params[PREPOST_PARAM].value == 1.0f && !inputs[INR_INPUT].active) {//post
  71. volUnitIndicatorPEAK.setValue(outLdBVU / 10.f);
  72. lights[dBpeak_LIGHT + light].setBrightnessSmooth(volUnitIndicatorPEAK.getBrightness(light));
  73. }
  74. if (params[PREPOST_PARAM].value == 0.0f && inputs[INR_INPUT].active) {
  75. volUnitIndicatorPEAK.setValue(((inL / 10.f) + (inR / 10.f)) / 2.f);
  76. lights[dBpeak_LIGHT + light].setBrightnessSmooth(volUnitIndicatorPEAK.getBrightness(light));
  77. } else if (params[PREPOST_PARAM].value == 1.0f && inputs[INR_INPUT].active) {
  78. volUnitIndicatorPEAK.setValue(((outLdBVU / 10.f) + (outRdBVU / 10.f)) / 2.f);
  79. lights[dBpeak_LIGHT + light].setBrightnessSmooth(volUnitIndicatorPEAK.getBrightness(light));
  80. }
  81. }
  82. //dB Peak Level Indicator-------------------------------------------------------
  83. if (inputs[FREQMOD_INPUT].active) {
  84. lights[FreqParamOn].setBrightness(0); lights[FreqParamOff].setBrightness(1);
  85. modInput = fminf(clamp((inputs[FREQMOD_INPUT].value / 5.f), abs(.01375f), abs(10.f)), fmaxf(abs(.01375f), abs(10.f)));
  86. lpf24.setCutoff(110.f);
  87. lpf24.process(modInput, engineGetSampleTime());
  88. eqFreq = clamp(params[EQFREQ_PARAM].value, .11f, .11f) + ((5.f * lpf24.lowpass) * 2);
  89. } else if (!inputs[FREQMOD_INPUT].active){
  90. lights[FreqParamOn].setBrightness(1); lights[FreqParamOff].setBrightness(0);
  91. eqFreq = fmax(params[EQFREQ_PARAM].value, fmin(abs(.01375), abs(10.)));
  92. }
  93. sampRate = engineGetSampleRate();
  94. biquadFreq = eqFreq * 2000.f;
  95. biquadQ = eqQ;
  96. //Bypass EQ/Gain------------------------
  97. if (params[EQBYPASS_PARAM].value < 1.f) {biquadGain = eqGain;} //EQ ON
  98. else if (params[EQBYPASS_PARAM].value > 0.f) {biquadGain = 0.0;} //EQ OFF
  99. //Bypass EQ Gain------------------------
  100. //set Biquad Values
  101. parametricEQL->setBiquad(bq_type_peak, biquadFreq / sampRate, biquadQ, biquadGain);
  102. parametricEQR->setBiquad(bq_type_peak, biquadFreq / sampRate, biquadQ, biquadGain);
  103. //Listen to EQ
  104. if (Listen == 1) {//invert input
  105. if (swapLR == 1) {
  106. outR = parametricEQL->process(inL * Gain) -inL;
  107. outL = parametricEQR->process(inR * Gain) -inR;
  108. } else {
  109. outL = parametricEQL->process(inL * Gain) -inL;
  110. outR = parametricEQR->process(inR * Gain) -inR;
  111. }
  112. } else if (Listen != 1) {
  113. if (swapLR == 1) {
  114. outR = parametricEQL->process(inL * Gain);
  115. outL = parametricEQR->process(inR * Gain);
  116. } else {
  117. outL = parametricEQL->process(inL * Gain);
  118. outR = parametricEQR->process(inR * Gain);
  119. }
  120. }
  121. //dev---Check parameter value---------------------------------
  122. //outputs[devParamOutGain].value = params[EQGAIN_PARAM].value;
  123. //outputs[devParamOutFrq].value = params[EQFREQ_PARAM].value;
  124. //outputs[devParamOutQ].value = params[EQBANDWIDTH_PARAM].value;
  125. //dev---Check parameter value---------------------------------
  126. outputs[OUTL_OUTPUT].value = outL;
  127. outputs[OUTR_OUTPUT].value = outR;
  128. }
  129. struct OneBandWidget : ModuleWidget{
  130. OneBandWidget(OneBand *module);
  131. };
  132. OneBandWidget::OneBandWidget(OneBand *module) : ModuleWidget(module) {
  133. int rackY = 380;
  134. float lightXpos = 45.5f, offsetKnobs = 0.47f;
  135. box.size = Vec(4 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);{
  136. SVGPanel *panel = new SVGPanel();
  137. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Bark1Band.svg")));
  138. panel->box.size = box.size;
  139. addChild(panel);
  140. }
  141. ///Ports---
  142. //Out---
  143. addOutput(Port::create<BarkOutPort350>(Vec(4.05f, rackY - 174.04f), Port::OUTPUT, module, OneBand::OUTL_OUTPUT));
  144. addOutput(Port::create<BarkOutPort350>(Vec(31.38f, rackY - 174.04f), Port::OUTPUT, module, OneBand::OUTR_OUTPUT));
  145. //In---
  146. //Audio--
  147. addInput(Port::create<BarkInPort350>(Vec(4.05f, rackY - 46.16f), Port::INPUT, module, OneBand::INL_INPUT));
  148. addInput(Port::create<BarkInPort350>(Vec(31.38f, rackY - 46.16f), Port::INPUT, module, OneBand::INR_INPUT));
  149. //Mod--
  150. addInput(Port::create<BarkPatchPortIn>(Vec(34.16f, rackY - 324.73f), Port::INPUT, module, OneBand::GAINMOD_INPUT));
  151. addInput(Port::create<BarkPatchPortIn>(Vec(2.16f, rackY - 307.59f), Port::INPUT, module, OneBand::FREQMOD_INPUT));
  152. addInput(Port::create<BarkPatchPortIn>(Vec(33.78f, rackY - 248.26f), Port::INPUT, module, OneBand::BWMOD_INPUT));
  153. //dev test param values
  154. //addOutput(Port::create<BarkPatchPortIn>(Vec(34.16f, rackY - 324.73f), Port::OUTPUT, module, OneBand::devParamOutGain));
  155. //addOutput(Port::create<BarkPatchPortIn>(Vec(2.16f, rackY - 307.59f), Port::OUTPUT, module, OneBand::devParamOutFrq));
  156. //addOutput(Port::create<BarkPatchPortIn>(Vec(33.78f, rackY - 248.26f), Port::OUTPUT, module, OneBand::devParamOutQ));
  157. //Knobs---
  158. addParam(ParamWidget::create<BarkKnob26>(Vec(10.2f - offsetKnobs, rackY - 349.73f), module, OneBand::EQGAIN_PARAM, -6.5f, 6.5f, 0.f));
  159. addParam(ParamWidget::create<BarkKnob26>(Vec(24.95f - offsetKnobs, rackY - 291.2f), module, OneBand::EQFREQ_PARAM, .01375f, 10.f, 0.11f));
  160. addParam(ParamWidget::create<BarkKnob26>(Vec(10.68f - offsetKnobs, rackY - 231.51f), module, OneBand::EQBANDWIDTH_PARAM, 1.f, 40.f, 4.f));
  161. addParam(ParamWidget::create<BarkKnob30>(Vec(8.29f, rackY - 94.67f), module, OneBand::OUTGAIN_PARAM, 0.f, 7.f, 2.f));
  162. //Switch---
  163. addParam(ParamWidget::create<BarkSwitchSmall>(Vec(41.29f, rackY - 355.97f), module, OneBand::EQBYPASS_PARAM, 0.f, 1.f, 0.f));
  164. addParam(ParamWidget::create<BarkSwitchSmall>(Vec(11.26f, rackY - 123.78f), module, OneBand::PREPOST_PARAM, 0.f, 1.f, 0.f));
  165. addParam(ParamWidget::create<BarkSwitchSmallSide>(Vec(21.89f, rackY - 148.45f), module, OneBand::SWAPLR_PARAM, 0.f, 1.f, 0.f));//swapL/R
  166. addParam(ParamWidget::create<BarkSwitchSmall>(Vec(40.4f, rackY - 200.21f), module, OneBand::LISTEN_PARAM, 0.f, 1.f, 0.f));
  167. //TODO: Screw Positions
  168. addChild(Widget::create<BarkScrew1>(Vec(box.size.x - 13, 3))); //pos2
  169. addChild(Widget::create<BarkScrew2>(Vec(2, 367.2f))); //pos3
  170. //Light---
  171. float floatyMcFloatFace = 16.11f; //18.04f
  172. addChild(ModuleLightWidget::create<SmallerLightFA<ParamInLight>>(Vec(floatyMcFloatFace, rackY - 280.05f), module, OneBand::FreqParamOn));
  173. addChild(ModuleLightWidget::create<SmallerLightFA<ParamInLight>>(Vec(floatyMcFloatFace, rackY - 261.72f), module, OneBand::FreqParamOff));
  174. addChild(ModuleLightWidget::create<BiggerLight<clipLight>>(Vec(lightXpos - 1.f, rackY - 134.65f), module, OneBand::dBpeak_LIGHT + 0));
  175. addChild(ModuleLightWidget::create<BigLight<redLight>>(Vec(lightXpos, rackY - 133.66f), module, OneBand::dBpeak_LIGHT + 1));
  176. addChild(ModuleLightWidget::create<BigLight<orangeLight>>(Vec(lightXpos, rackY - 122.11f), module, OneBand::dBpeak_LIGHT + 2));
  177. addChild(ModuleLightWidget::create<BigLight<yellowLight2>>(Vec(lightXpos, rackY - 110.55f), module, OneBand::dBpeak_LIGHT + 3));
  178. addChild(ModuleLightWidget::create<BigLight<yellowLight1>>(Vec(lightXpos, rackY - 99.f), module, OneBand::dBpeak_LIGHT + 4));
  179. addChild(ModuleLightWidget::create<BigLight<greenLight>>(Vec(lightXpos, rackY - 87.45f), module, OneBand::dBpeak_LIGHT + 5));
  180. addChild(ModuleLightWidget::create<BigLight<greenLight>>(Vec(lightXpos, rackY - 75.9f), module, OneBand::dBpeak_LIGHT + 6));
  181. addChild(ModuleLightWidget::create<BigLight<greenLight>>(Vec(lightXpos, rackY - 64.35f), module, OneBand::dBpeak_LIGHT + 7));
  182. }
  183. } // namespace rack_plugin_Bark
  184. using namespace rack_plugin_Bark;
  185. RACK_PLUGIN_MODEL_INIT(Bark, OneBand) {
  186. Model *modelOneBand = Model::create<OneBand, OneBandWidget>("Bark", "1Band", "One Band", EQUALIZER_TAG, AMPLIFIER_TAG);
  187. return modelOneBand;
  188. }