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.

75 lines
2.1KB

  1. #include "NauModular.hpp"
  2. namespace rack_plugin_NauModular {
  3. struct Function : Module{
  4. enum ParamIds {
  5. A_PARAM,
  6. NUM_PARAMS
  7. };
  8. enum InputIds {
  9. X_INPUT,
  10. NUM_INPUTS
  11. };
  12. enum OutputIds{
  13. ELLIPSE_OUTPUT,
  14. PARABOLA_OUTPUT,
  15. HYPERBOLA_OUTPUT,
  16. NUM_OUTPUTS
  17. };
  18. enum LightIds {
  19. NUM_LIGHTS
  20. };
  21. Function() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS){}
  22. void step() override;
  23. };
  24. void Function::step(){
  25. float v = inputs[X_INPUT].value;
  26. float a = params[A_PARAM].value;
  27. outputs[ELLIPSE_OUTPUT].value = sqrt((a*a)-(v*v));
  28. outputs[HYPERBOLA_OUTPUT].value = a/v;
  29. outputs[PARABOLA_OUTPUT].value = v*v*a;
  30. }
  31. struct FunctionWidget : ModuleWidget{
  32. FunctionWidget(Function *module);
  33. };
  34. FunctionWidget::FunctionWidget(Function *module) : ModuleWidget(module){
  35. box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  36. {
  37. SVGPanel *panel = new SVGPanel();
  38. panel->box.size = box.size;
  39. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Function.svg")));
  40. addChild(panel);
  41. }
  42. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  43. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  44. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  45. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  46. addParam(ParamWidget::create<Davies1900hBlackKnob>(Vec(50, 87), module, Function::A_PARAM, -5.0, 5.0, 0.0));
  47. addInput(Port::create<PJ301MPort>(Vec(15, 87), Port::INPUT, module, Function::X_INPUT));
  48. addOutput(Port::create<PJ301MPort>(Vec(15,150), Port::OUTPUT, module, Function::HYPERBOLA_OUTPUT));
  49. addOutput(Port::create<PJ301MPort>(Vec(15,220), Port::OUTPUT, module, Function::PARABOLA_OUTPUT));
  50. addOutput(Port::create<PJ301MPort>(Vec(15,300), Port::OUTPUT, module, Function::ELLIPSE_OUTPUT));
  51. };
  52. } // namespace rack_plugin_NauModular
  53. using namespace rack_plugin_NauModular;
  54. RACK_PLUGIN_MODEL_INIT(NauModular, Function) {
  55. Model *modelFunction = Model::create<Function, FunctionWidget>("NauModular", "Function", "Function", FUNCTION_GENERATOR_TAG);
  56. return modelFunction;
  57. }