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.

166 lines
4.3KB

  1. #include "mscHack.hpp"
  2. //#include "mscHack_Controls.hpp"
  3. #include "dsp/digital.hpp"
  4. //#include "CLog.h"
  5. namespace rack_plugin_mscHack {
  6. #define CHANNELS 3
  7. //-----------------------------------------------------
  8. // Module Definition
  9. //
  10. //-----------------------------------------------------
  11. struct XFade : Module
  12. {
  13. enum ParamIds
  14. {
  15. PARAM_MIX,
  16. PARAM_LEVEL,
  17. nPARAMS
  18. };
  19. enum InputIds
  20. {
  21. IN_MIXCV,
  22. IN_AL,
  23. IN_AR = IN_AL + CHANNELS,
  24. IN_BL = IN_AR + CHANNELS,
  25. IN_BR = IN_BL + CHANNELS,
  26. nINPUTS = IN_BR + CHANNELS
  27. };
  28. enum OutputIds
  29. {
  30. OUT_L,
  31. OUT_R = OUT_L + CHANNELS,
  32. nOUTPUTS = OUT_R + CHANNELS
  33. };
  34. CLog lg;
  35. // Contructor
  36. XFade() : Module(nPARAMS, nINPUTS, nOUTPUTS){}
  37. // Overrides
  38. void step() override;
  39. //json_t* toJson() override;
  40. //void fromJson(json_t *rootJ) override;
  41. void onRandomize() override;
  42. void onReset() override;
  43. };
  44. //-----------------------------------------------------
  45. // Procedure: Widget
  46. //
  47. //-----------------------------------------------------
  48. struct XFade_Widget : ModuleWidget {
  49. XFade_Widget( XFade *module );
  50. };
  51. XFade_Widget::XFade_Widget( XFade *module ) : ModuleWidget(module)
  52. {
  53. int i, x, y;
  54. box.size = Vec( 15*8, 380);
  55. {
  56. SVGPanel *panel = new SVGPanel();
  57. panel->box.size = box.size;
  58. panel->setBackground(SVG::load(assetPlugin(plugin, "res/XFade.svg")));
  59. addChild(panel);
  60. }
  61. //module->lg.Open("XFade.txt");
  62. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  63. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  64. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  65. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  66. x = 10;
  67. y = 47;
  68. for( i = 0; i < CHANNELS; i++ )
  69. {
  70. // audio A
  71. addInput(Port::create<MyPortInSmall>( Vec( x, y ), Port::INPUT, module, XFade::IN_AL + i ) );
  72. addInput(Port::create<MyPortInSmall>( Vec( x + 28, y ), Port::INPUT, module, XFade::IN_AR + i ) );
  73. // audio B
  74. addInput(Port::create<MyPortInSmall>( Vec( x, y + 32 ), Port::INPUT, module, XFade::IN_BL + i ) );
  75. addInput(Port::create<MyPortInSmall>( Vec( x + 28, y + 32 ), Port::INPUT, module, XFade::IN_BR + i ) );
  76. // audio outputs
  77. addOutput(Port::create<MyPortOutSmall>( Vec( x + 83, y ), Port::OUTPUT, module, XFade::OUT_L + i ) );
  78. addOutput(Port::create<MyPortOutSmall>( Vec( x + 83, y + 32 ), Port::OUTPUT, module, XFade::OUT_R + i ) );
  79. y += 67;
  80. }
  81. // mix CV
  82. addInput(Port::create<MyPortInSmall>( Vec( 4, 263 ), Port::INPUT, module, XFade::IN_MIXCV) );
  83. // mix knobs
  84. addParam(ParamWidget::create<Knob_Yellow2_56>( Vec( 30, 243 ), module, XFade::PARAM_MIX, -1.0, 1.0, 0.0 ) );
  85. addParam(ParamWidget::create<Knob_Yellow2_56>( Vec( 30, 313 ), module, XFade::PARAM_LEVEL, 0.0, 2.0, 1.0 ) );
  86. }
  87. //-----------------------------------------------------
  88. // Procedure: reset
  89. //
  90. //-----------------------------------------------------
  91. void XFade::onReset()
  92. {
  93. }
  94. //-----------------------------------------------------
  95. // Procedure: randomize
  96. //
  97. //-----------------------------------------------------
  98. void XFade::onRandomize()
  99. {
  100. }
  101. //-----------------------------------------------------
  102. // Procedure: step
  103. //
  104. //-----------------------------------------------------
  105. void XFade::step()
  106. {
  107. int i;
  108. float mix, mixa, mixb;
  109. if( inputs[ IN_MIXCV ].active )
  110. mix = inputs[ IN_MIXCV ].value / AUDIO_MAX;
  111. else
  112. mix = params[ PARAM_MIX ].value;
  113. if( mix <= 0.0 )
  114. {
  115. mixa = 1.0;
  116. mixb = 1.0 + mix;
  117. }
  118. else
  119. {
  120. mixb = 1.0;
  121. mixa = 1.0 - mix;
  122. }
  123. for( i = 0; i < CHANNELS; i++ )
  124. {
  125. outputs[ OUT_L + i ].value = ( ( inputs[ IN_AL + i ].value * mixa ) + ( inputs[ IN_BL + i ].value * mixb ) ) * params[ PARAM_LEVEL ].value;
  126. outputs[ OUT_R + i ].value = ( ( inputs[ IN_AR + i ].value * mixa ) + ( inputs[ IN_BR + i ].value * mixb ) ) * params[ PARAM_LEVEL ].value;
  127. }
  128. }
  129. } // namespace rack_plugin_mscHack
  130. using namespace rack_plugin_mscHack;
  131. RACK_PLUGIN_MODEL_INIT(mscHack, XFade) {
  132. Model *modelXFade = Model::create<XFade, XFade_Widget>( "mscHack", "XFade", "MIXER Cross Fader 3 Channel", MIXER_TAG, MULTIPLE_TAG );
  133. return modelXFade;
  134. }