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.

112 lines
3.9KB

  1. #include "plugin.hpp"
  2. #include "Ripples/ripples.hpp"
  3. struct Ripples : Module {
  4. enum ParamIds {
  5. RES_PARAM,
  6. FREQ_PARAM,
  7. FM_PARAM,
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. RES_INPUT,
  12. FREQ_INPUT,
  13. FM_INPUT,
  14. IN_INPUT,
  15. GAIN_INPUT,
  16. NUM_INPUTS
  17. };
  18. enum OutputIds {
  19. BP2_OUTPUT,
  20. LP2_OUTPUT,
  21. LP4_OUTPUT,
  22. LP4VCA_OUTPUT,
  23. NUM_OUTPUTS
  24. };
  25. enum LightIds {
  26. NUM_LIGHTS
  27. };
  28. ripples::RipplesEngine engines[16];
  29. Ripples() {
  30. config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
  31. configParam(RES_PARAM, 0.f, 1.f, 0.f, "Resonance", "%", 0, 100);
  32. configParam(FREQ_PARAM, std::log2(ripples::kFreqKnobMin), std::log2(ripples::kFreqKnobMax), std::log2(ripples::kFreqKnobMax), "Frequency", " Hz", 2.f);
  33. configParam(FM_PARAM, -1.f, 1.f, 0.f, "Frequency modulation", "%", 0, 100);
  34. onSampleRateChange();
  35. }
  36. void onReset() override {
  37. onSampleRateChange();
  38. }
  39. void onSampleRateChange() override {
  40. // TODO In Rack v2, replace with args.sampleRate
  41. for (int c = 0; c < 16; c++) {
  42. engines[c].setSampleRate(APP->engine->getSampleRate());
  43. }
  44. }
  45. void process(const ProcessArgs& args) override {
  46. int channels = std::max(inputs[IN_INPUT].getChannels(), 1);
  47. // Reuse the same frame object for multiple engines because the params aren't touched.
  48. ripples::RipplesEngine::Frame frame;
  49. frame.res_knob = params[RES_PARAM].getValue();
  50. frame.freq_knob = rescale(params[FREQ_PARAM].getValue(), std::log2(ripples::kFreqKnobMin), std::log2(ripples::kFreqKnobMax), 0.f, 1.f);
  51. frame.fm_knob = params[FM_PARAM].getValue();
  52. frame.gain_cv_present = inputs[GAIN_INPUT].isConnected();
  53. for (int c = 0; c < channels; c++) {
  54. frame.res_cv = inputs[RES_INPUT].getPolyVoltage(c);
  55. frame.freq_cv = inputs[FREQ_INPUT].getPolyVoltage(c);
  56. frame.fm_cv = inputs[FM_INPUT].getPolyVoltage(c);
  57. frame.input = inputs[IN_INPUT].getVoltage(c);
  58. frame.gain_cv = inputs[GAIN_INPUT].getPolyVoltage(c);
  59. engines[c].process(frame);
  60. outputs[BP2_OUTPUT].setVoltage(frame.bp2, c);
  61. outputs[LP2_OUTPUT].setVoltage(frame.lp2, c);
  62. outputs[LP4_OUTPUT].setVoltage(frame.lp4, c);
  63. outputs[LP4VCA_OUTPUT].setVoltage(frame.lp4vca, c);
  64. }
  65. outputs[BP2_OUTPUT].setChannels(channels);
  66. outputs[LP2_OUTPUT].setChannels(channels);
  67. outputs[LP4_OUTPUT].setChannels(channels);
  68. outputs[LP4VCA_OUTPUT].setChannels(channels);
  69. }
  70. };
  71. struct RipplesWidget : ModuleWidget {
  72. RipplesWidget(Ripples* module) {
  73. setModule(module);
  74. setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/Ripples.svg")));
  75. addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  76. addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  77. addParam(createParamCentered<Rogan2PSRed>(mm2px(Vec(8.872, 20.877)), module, Ripples::RES_PARAM));
  78. addParam(createParamCentered<Rogan3PSWhite>(mm2px(Vec(20.307, 42.468)), module, Ripples::FREQ_PARAM));
  79. addParam(createParamCentered<Rogan2PSGreen>(mm2px(Vec(31.732 + 0.1, 64.059)), module, Ripples::FM_PARAM));
  80. addInput(createInputCentered<PJ301MPort>(mm2px(Vec(8.227, 86.909)), module, Ripples::RES_INPUT));
  81. addInput(createInputCentered<PJ301MPort>(mm2px(Vec(20.297, 86.909)), module, Ripples::FREQ_INPUT));
  82. addInput(createInputCentered<PJ301MPort>(mm2px(Vec(32.367, 86.909)), module, Ripples::FM_INPUT));
  83. addInput(createInputCentered<PJ301MPort>(mm2px(Vec(8.227, 98.979)), module, Ripples::IN_INPUT));
  84. addInput(createInputCentered<PJ301MPort>(mm2px(Vec(8.227, 111.05)), module, Ripples::GAIN_INPUT));
  85. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.297, 98.979)), module, Ripples::BP2_OUTPUT));
  86. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(32.367, 98.979)), module, Ripples::LP2_OUTPUT));
  87. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(20.297, 111.05)), module, Ripples::LP4_OUTPUT));
  88. addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(32.367, 111.05)), module, Ripples::LP4VCA_OUTPUT));
  89. }
  90. };
  91. Model* modelRipples = createModel<Ripples, RipplesWidget>("Ripples");