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.

202 lines
5.8KB

  1. #pragma once
  2. #include <rack.hpp>
  3. using namespace rack;
  4. extern Plugin* pluginInstance;
  5. extern Model* modelEvenVCO;
  6. extern Model* modelRampage;
  7. extern Model* modelABC;
  8. extern Model* modelSpringReverb;
  9. extern Model* modelMixer;
  10. extern Model* modelSlewLimiter;
  11. extern Model* modelDualAtenuverter;
  12. extern Model* modelPercall;
  13. extern Model* modelHexmixVCA;
  14. extern Model* modelChoppingKinky;
  15. extern Model* modelKickall;
  16. extern Model* modelSamplingModulator;
  17. extern Model* modelMorphader;
  18. extern Model* modelADSR;
  19. extern Model* modelSTMix;
  20. extern Model* modelMuxlicer;
  21. extern Model* modelMex;
  22. struct Knurlie : SvgScrew {
  23. Knurlie() {
  24. setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/Knurlie.svg")));
  25. }
  26. };
  27. struct BefacoTinyKnobWhite : BefacoTinyKnob {
  28. BefacoTinyKnobWhite() {}
  29. };
  30. struct BefacoTinyKnobRed : BefacoTinyKnob {
  31. BefacoTinyKnobRed() {
  32. setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/BefacoTinyPointWhite.svg")));
  33. bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/BefacoTinyKnobRed_bg.svg")));
  34. }
  35. };
  36. struct BefacoTinyKnobDarkGrey : BefacoTinyKnob {
  37. BefacoTinyKnobDarkGrey() {
  38. setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/BefacoTinyPointWhite.svg")));
  39. bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/BefacoTinyKnobDarkGrey_bg.svg")));
  40. }
  41. };
  42. struct BefacoTinyKnobLightGrey : BefacoTinyKnob {
  43. BefacoTinyKnobLightGrey() {
  44. bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/BefacoTinyKnobLightGrey_bg.svg")));
  45. }
  46. };
  47. struct BefacoTinyKnobBlack : BefacoTinyKnob {
  48. BefacoTinyKnobBlack() {
  49. setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/BefacoTinyPointWhite.svg")));
  50. bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/BefacoTinyKnobBlack_bg.svg")));
  51. }
  52. };
  53. struct Davies1900hLargeGreyKnob : Davies1900hKnob {
  54. Davies1900hLargeGreyKnob() {
  55. setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/Davies1900hLargeGrey.svg")));
  56. bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/Davies1900hLargeGrey_bg.svg")));
  57. }
  58. };
  59. struct Davies1900hLightGreyKnob : Davies1900hKnob {
  60. Davies1900hLightGreyKnob() {
  61. setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/Davies1900hLightGrey.svg")));
  62. bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/Davies1900hLightGrey_bg.svg")));
  63. }
  64. };
  65. struct Davies1900hDarkGreyKnob : Davies1900hKnob {
  66. Davies1900hDarkGreyKnob() {
  67. setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/Davies1900hDarkGrey.svg")));
  68. bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/Davies1900hDarkGrey_bg.svg")));
  69. }
  70. };
  71. /** Deprecated alias */
  72. using Davies1900hDarkBlackAlt = Davies1900hBlackKnob;
  73. struct BananutRed : app::SvgPort {
  74. BananutRed() {
  75. setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/BananutRed.svg")));
  76. }
  77. };
  78. /** Deprecated alias */
  79. using BefacoOutputPort = BananutRed;
  80. struct BananutBlack : app::SvgPort {
  81. BananutBlack() {
  82. setSvg(Svg::load(asset::plugin(pluginInstance, "res/components/BananutBlack.svg")));
  83. }
  84. };
  85. /** Deprecated alias */
  86. using BefacoInputPort = BananutRed;
  87. struct CKSSNarrow : app::SvgSwitch {
  88. CKSSNarrow() {
  89. addFrame(Svg::load(asset::plugin(pluginInstance, "res/components/SwitchNarrow_0.svg")));
  90. addFrame(Svg::load(asset::plugin(pluginInstance, "res/components/SwitchNarrow_1.svg")));
  91. }
  92. };
  93. struct Crossfader : app::SvgSlider {
  94. Crossfader() {
  95. setBackgroundSvg(Svg::load(asset::plugin(pluginInstance, "res/components/CrossfaderBackground.svg")));
  96. setHandleSvg(Svg::load(asset::plugin(pluginInstance, "res/components/CrossfaderHandle.svg")));
  97. minHandlePos = mm2px(Vec(4.5f, -0.8f));
  98. maxHandlePos = mm2px(Vec(34.5, -0.8f));
  99. horizontal = true;
  100. math::Vec margin = math::Vec(15, 5);
  101. background->box.pos = margin;
  102. box.size = background->box.size.plus(margin.mult(2));
  103. }
  104. };
  105. struct BefacoSwitchHorizontal : app::SvgSwitch {
  106. BefacoSwitchHorizontal() {
  107. addFrame(Svg::load(asset::plugin(pluginInstance, "res/components/BefacoSwitchHoriz_0.svg")));
  108. addFrame(Svg::load(asset::plugin(pluginInstance, "res/components/BefacoSwitchHoriz_1.svg")));
  109. addFrame(Svg::load(asset::plugin(pluginInstance, "res/components/BefacoSwitchHoriz_2.svg")));
  110. }
  111. };
  112. template <typename T>
  113. T sin2pi_pade_05_5_4(T x) {
  114. x -= 0.5f;
  115. return (T(-6.283185307) * x + T(33.19863968) * simd::pow(x, 3) - T(32.44191367) * simd::pow(x, 5))
  116. / (1 + T(1.296008659) * simd::pow(x, 2) + T(0.7028072946) * simd::pow(x, 4));
  117. }
  118. template <typename T>
  119. T tanh_pade(T x) {
  120. T x2 = x * x;
  121. T q = 12.f + x2;
  122. return 12.f * x * q / (36.f * x2 + q * q);
  123. }
  124. template <typename T>
  125. T exponentialBipolar80Pade_5_4(T x) {
  126. return (T(0.109568) * x + T(0.281588) * simd::pow(x, 3) + T(0.133841) * simd::pow(x, 5))
  127. / (T(1.) - T(0.630374) * simd::pow(x, 2) + T(0.166271) * simd::pow(x, 4));
  128. }
  129. struct ADEnvelope {
  130. enum Stage {
  131. STAGE_OFF,
  132. STAGE_ATTACK,
  133. STAGE_DECAY
  134. };
  135. Stage stage = STAGE_OFF;
  136. float env = 0.f;
  137. float attackTime = 0.1, decayTime = 0.1;
  138. float attackShape = 1.0, decayShape = 1.0;
  139. ADEnvelope() { };
  140. void process(const float& sampleTime) {
  141. if (stage == STAGE_OFF) {
  142. env = envLinear = 0.0f;
  143. }
  144. else if (stage == STAGE_ATTACK) {
  145. envLinear += sampleTime / attackTime;
  146. env = std::pow(envLinear, attackShape);
  147. }
  148. else if (stage == STAGE_DECAY) {
  149. envLinear -= sampleTime / decayTime;
  150. env = std::pow(envLinear, decayShape);
  151. }
  152. if (envLinear >= 1.0f) {
  153. stage = STAGE_DECAY;
  154. env = envLinear = 1.0f;
  155. }
  156. else if (envLinear <= 0.0f) {
  157. stage = STAGE_OFF;
  158. env = envLinear = 0.0f;
  159. }
  160. }
  161. void trigger() {
  162. stage = ADEnvelope::STAGE_ATTACK;
  163. // non-linear envelopes won't retrigger at the correct starting point if
  164. // attackShape != decayShape, so we advance the linear envelope
  165. envLinear = std::pow(env, 1.0f / attackShape);
  166. }
  167. private:
  168. float envLinear = 0.f;
  169. };