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.

221 lines
6.5KB

  1. ///////////////////////////////////////////////////////////////////
  2. //
  3. // dBiz revisited version of Cartesian seq. by Strum
  4. //
  5. ///////////////////////////////////////////////////////////////////
  6. #include "dBiz.hpp"
  7. #include "dsp/digital.hpp"
  8. namespace rack_plugin_dBiz {
  9. struct VCA4 : Module {
  10. enum ParamIds
  11. {
  12. CV_PARAM,
  13. MUTE_PARAM = CV_PARAM+16,
  14. NUM_PARAMS = MUTE_PARAM + 16
  15. };
  16. enum InputIds
  17. {
  18. CH_INPUT,
  19. CV_INPUT=CH_INPUT+4,
  20. NUM_INPUTS=CV_INPUT+16
  21. };
  22. enum OutputIds
  23. {
  24. CH_OUTPUT,
  25. NUM_OUTPUTS=CH_OUTPUT+4
  26. };
  27. enum LightIds
  28. {
  29. MUTE_LIGHT,
  30. NUM_LIGHTS =MUTE_LIGHT+16
  31. };
  32. SchmittTrigger mute_triggers[16];
  33. bool mute_states[16] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  34. float ch_in[4];
  35. float ch_out[4];
  36. float cv_val[16];
  37. VCA4() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  38. void step() override;
  39. json_t *toJson() override
  40. {
  41. json_t *rootJ = json_object();
  42. // mute states
  43. json_t *mute_statesJ = json_array();
  44. for (int i = 0; i < 16; i++)
  45. {
  46. json_t *mute_stateJ = json_integer((int)mute_states[i]);
  47. json_array_append_new(mute_statesJ, mute_stateJ);
  48. }
  49. json_object_set_new(rootJ, "mutes", mute_statesJ);
  50. return rootJ;
  51. }
  52. void fromJson(json_t *rootJ) override
  53. {
  54. // mute states
  55. json_t *mute_statesJ = json_object_get(rootJ, "mutes");
  56. if (mute_statesJ)
  57. {
  58. for (int i = 0; i < 16; i++)
  59. {
  60. json_t *mute_stateJ = json_array_get(mute_statesJ, i);
  61. if (mute_stateJ)
  62. mute_states[i] = !!json_integer_value(mute_stateJ);
  63. }
  64. }
  65. }
  66. };
  67. void VCA4::step() {
  68. for (int i = 0; i < 4; i++)
  69. {
  70. for (int j = 0; j < 4; j++)
  71. {
  72. if (mute_triggers[i + j * 4].process(params[MUTE_PARAM + i + j * 4].value))
  73. {
  74. mute_states[i + j * 4] = !mute_states[+i + j * 4];
  75. }
  76. lights[MUTE_LIGHT + i + j * 4].value = mute_states[i + j * 4] ? 1.0 : 0.0;
  77. }
  78. }
  79. for (int i = 0; i < 4; i++)
  80. {
  81. ch_in[i] = inputs[CH_INPUT + i].value;
  82. }
  83. for (int i = 0; i < 4; i++)
  84. {
  85. for (int j = 0; j < 4; j++)
  86. {
  87. if (!mute_states[i + j * 4])
  88. {
  89. cv_val[i + j * 4] = 0.0;
  90. }
  91. else
  92. cv_val[i + j * 4] = params[CV_PARAM + i + j * 4].value*clamp(inputs[CV_INPUT + i+j*4].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  93. }
  94. }
  95. for (int i = 0; i < 4; i++)
  96. {
  97. outputs[CH_OUTPUT + i ].value =0.4* (ch_in[0]*cv_val[i] + ch_in[0]*cv_val[i] + ch_in[0]*cv_val[i] + ch_in[0]*cv_val[i]);
  98. }
  99. for (int i = 0; i < 4; i++)
  100. {
  101. outputs[CH_OUTPUT + i ].value +=0.4* (ch_in[1] * cv_val[i+4] + ch_in[1] * cv_val[i+4] + ch_in[1] * cv_val[i+4] + ch_in[1] * cv_val[i+4]);
  102. }
  103. for (int i = 0; i < 4; i++)
  104. {
  105. outputs[CH_OUTPUT + i].value +=0.4* (ch_in[2] * cv_val[i + 8] + ch_in[2] * cv_val[i + 8] + ch_in[2] * cv_val[i + 8] + ch_in[2] * cv_val[i + 8]);
  106. }
  107. for (int i = 0; i < 4; i++)
  108. {
  109. outputs[CH_OUTPUT + i].value +=0.4* (ch_in[3] * cv_val[i+12] + ch_in[3] * cv_val[i+12] + ch_in[3] * cv_val[i+12] + ch_in[3] * cv_val[i+12]);
  110. }
  111. }
  112. /*for (int i = 0; i < 4; i++)
  113. {
  114. ch_in[i]=inputs[CH_INPUT+i].value;
  115. }
  116. for (int i = 0; i < 4; i++)
  117. {
  118. outputs[CH_OUTPUT+i].value=ch_out[i];
  119. }
  120. }*/
  121. ////////////////////////////////
  122. struct VCA4Widget : ModuleWidget
  123. {
  124. VCA4Widget(VCA4 *module) : ModuleWidget(module)
  125. {
  126. box.size = Vec(15*20, 380);
  127. {
  128. SVGPanel *panel = new SVGPanel();
  129. panel->box.size = box.size;
  130. panel->setBackground(SVG::load(assetPlugin(plugin,"res/VCA4.svg")));
  131. addChild(panel);
  132. }
  133. int top = 20;
  134. int left = 2;
  135. int column_spacing = 35;
  136. int row_spacing = 30;
  137. int button_offset = 20;
  138. // addOutput(Port::create<PJ301MOrPort>(Vec(130, 10), Port::OUTPUT, module, VCA4::X_OUT));
  139. // addOutput(Port::create<PJ301MOrPort>(Vec(130, 40), Port::OUTPUT, module, VCA4::Y_OUT));
  140. // addOutput(Port::create<PJ301MOrPort>(Vec(130, 70), Port::OUTPUT, module, VCA4::G_OUT));
  141. for (int i = 0; i < 4; i++)
  142. {
  143. for ( int j = 0 ; j < 4 ; j++)
  144. {
  145. addParam(ParamWidget::create<LEDButton>(Vec(button_offset + left + column_spacing * i+140, top + row_spacing * j + 170), module, VCA4::MUTE_PARAM + i + j * 4, 0.0, 1.0, 0.0));
  146. addChild(GrayModuleLightWidget::create<BigLight<OrangeLight>>(Vec(button_offset + column_spacing * i+140, top + row_spacing * j + 170 ), module, VCA4::MUTE_LIGHT + i + j * 4));
  147. addParam(ParamWidget::create<Trimpot>(Vec(10+column_spacing * i, top + row_spacing * j + 170), module, VCA4::CV_PARAM + i + j * 4, 0.0, 1.0, 0.0));
  148. }
  149. }
  150. for (int i = 0; i < 4; i++)
  151. {
  152. addInput(Port::create<PJ301MIPort>(Vec(30,24+40*i), Port::INPUT, module, VCA4::CH_INPUT + i));
  153. }
  154. for (int i = 0; i < 4; i++)
  155. {
  156. for (int j = 0; j < 4; j++)
  157. {
  158. if (j == 0 || j==2 )
  159. addInput(Port::create<PJ301MIPort>(Vec(column_spacing * 1.5 * i + 100, 60 + row_spacing * j), Port::INPUT, module, VCA4::CV_INPUT + i + j * 4));
  160. else
  161. addInput(Port::create<PJ301MIPort>(Vec(column_spacing * 1.5 * i + 70, 60 + row_spacing * j), Port::INPUT, module, VCA4::CV_INPUT + i + j * 4));
  162. }
  163. }
  164. for (int i = 0; i < 4; i++)
  165. {
  166. addOutput(Port::create<PJ301MRPort>(Vec(70 + row_spacing *1.9* i,24), Port::OUTPUT, module, VCA4::CH_OUTPUT + i));
  167. }
  168. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  169. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  170. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  171. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  172. }
  173. };
  174. } // namespace rack_plugin_dBiz
  175. using namespace rack_plugin_dBiz;
  176. RACK_PLUGIN_MODEL_INIT(dBiz, VCA4) {
  177. Model *modelVCA4 = Model::create<VCA4, VCA4Widget>("dBiz", "VCA4", "VCA4", UTILITY_TAG);
  178. return modelVCA4;
  179. }