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.

139 lines
4.6KB

  1. //**************************************************************************************
  2. //Volt rescale module module for VCV Rack by Alfredo Santamaria - AS - https://github.com/AScustomWorks/AS
  3. //
  4. //**************************************************************************************
  5. #include "AS.hpp"
  6. struct ReScale: Module {
  7. enum ParamIds {
  8. CONVERT_PARAM,
  9. NUM_PARAMS
  10. };
  11. enum InputIds {
  12. INPUT_0,
  13. INPUT_1,
  14. INPUT_2,
  15. INPUT_3,
  16. NUM_INPUTS
  17. };
  18. enum OutputIds {
  19. OUTPUT,
  20. NUM_OUTPUTS
  21. };
  22. enum LightIds {
  23. NUM_LIGHTS
  24. };
  25. int selection = 0;
  26. float rescaled_value = 0.0f;
  27. float input_value = 0.0f;
  28. float getNoteInVolts(float noteValue) {
  29. int octaveInVolts = int(floorf(noteValue));
  30. float voltMinusOct = noteValue - octaveInVolts;
  31. return voltMinusOct;
  32. }
  33. ReScale() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  34. }
  35. void step() override;
  36. };
  37. void ReScale::step() {
  38. selection = params[CONVERT_PARAM].value;
  39. if(inputs[INPUT_0].active){
  40. input_value = clamp(inputs[INPUT_0].value, -5.0f,5.0f);
  41. if(selection==0){
  42. rescaled_value = input_value;
  43. }else if(selection==1){
  44. rescaled_value = rescale(input_value, -5.0f, 5.0f, 0.0f, 5.0f);
  45. }else if(selection==2){
  46. rescaled_value = rescale(input_value, -5.0f, 5.0f, -10.0f, 10.0f);
  47. }else if(selection==3){
  48. rescaled_value = rescale(input_value, -5.0f, 5.0f, 0.0f, 10.0f);
  49. }
  50. }else if(inputs[INPUT_1].active){
  51. input_value = clamp(inputs[INPUT_1].value, 0.0f, 5.0f);
  52. if(selection==0){
  53. rescaled_value = rescale(input_value, 0.0f, 5.0f, -5.0f, 5.0f);
  54. }else if(selection==1){
  55. rescaled_value = input_value;
  56. }else if(selection==2){
  57. rescaled_value = rescale(input_value, 0.0f, 5.0f, -10.0f, 10.0f);
  58. }else if(selection==3){
  59. rescaled_value = rescale(input_value, -5.0f, 5.0f, 0.0f, 10.0f);
  60. }
  61. }else if(inputs[INPUT_2].active){
  62. input_value = clamp(inputs[INPUT_2].value, 0.0f, 10.0f);
  63. if(selection==0){
  64. rescaled_value = rescale(input_value, 0.0f, 10.0f, -5.0f, 5.0f);
  65. }else if(selection==1){
  66. rescaled_value = rescale(input_value, 0.0f, 10.0f, 0.0f, 5.0f);
  67. }else if(selection==2){
  68. rescaled_value = rescale(input_value, 0.0f, 10.0f, -10.0f, 10.0f);
  69. }else if(selection==3){
  70. rescaled_value = input_value;
  71. }
  72. }else if(inputs[INPUT_3].active){
  73. input_value = inputs[INPUT_3].value;
  74. if(selection==0){
  75. rescaled_value = input_value;
  76. }else if(selection==1){
  77. rescaled_value = input_value;
  78. }else if(selection==2){
  79. rescaled_value = input_value;
  80. }else if(selection==3){
  81. //take the input of a midi KB, get the voltage minus octave, convert it to 1V/KEY
  82. float ext_key = getNoteInVolts(input_value);
  83. rescaled_value = clamp( rescale( ext_key, 0.0f, 1.0f, 0.0f, 11.0f ), 0.0f, 10.0f );
  84. }
  85. }
  86. outputs[OUTPUT].value = rescaled_value;
  87. }
  88. ////////////////////////////////////
  89. struct ReScaleWidget : ModuleWidget
  90. {
  91. ReScaleWidget(ReScale *module);
  92. };
  93. ReScaleWidget::ReScaleWidget(ReScale *module) : ModuleWidget(module) {
  94. setPanel(SVG::load(assetPlugin(plugin, "res/ReScale.svg")));
  95. //SCREWS - SPECIAL SPACING FOR RACK WIDTH*4
  96. addChild(Widget::create<as_HexScrew>(Vec(0, 0)));
  97. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - RACK_GRID_WIDTH, 0)));
  98. addChild(Widget::create<as_HexScrew>(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  99. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  100. //PORTS
  101. addInput(Port::create<as_PJ301MPort>(Vec(18, 65), Port::INPUT, module, ReScale::INPUT_0));
  102. addInput(Port::create<as_PJ301MPort>(Vec(18, 105), Port::INPUT, module, ReScale::INPUT_1));
  103. addInput(Port::create<as_PJ301MPort>(Vec(18, 145), Port::INPUT, module, ReScale::INPUT_2));
  104. addInput(Port::create<as_PJ301MPort>(Vec(18, 185), Port::INPUT, module, ReScale::INPUT_3));
  105. addParam(ParamWidget::create<as_KnobBlackSnap4>(Vec(12, 230), module, ReScale::CONVERT_PARAM, 0.0f, 3.0f, 0.0f));
  106. addOutput(Port::create<as_PJ301MPort>(Vec(18, 280), Port::OUTPUT, module, ReScale::OUTPUT));
  107. }
  108. RACK_PLUGIN_MODEL_INIT(AS, ReScale) {
  109. Model *modelReScale = Model::create<ReScale, ReScaleWidget>("AS", "ReScale", "Voltage Converter", UTILITY_TAG);
  110. return modelReScale;
  111. }