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.

154 lines
5.0KB

  1. #include "Features.hpp"
  2. #if !USE_NEW_SCOPE
  3. #include <string.h>
  4. #include "trowaSoft.hpp"
  5. #include "trowaSoftComponents.hpp"
  6. #include "trowaSoftUtilities.hpp"
  7. #include "dsp/digital.hpp"
  8. #include "Module_multiScope_Old.hpp"
  9. #include "Widget_multiScope_Old.hpp"
  10. // multiScope model.
  11. Model *modelMultiScope = Model::create<multiScope, multiScopeWidget>(/*manufacturer*/ TROWA_PLUGIN_NAME, /*slug*/ "multiScope", /*name*/ "multiScope", /*Tags*/ VISUAL_TAG, UTILITY_TAG);
  12. //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  13. // multiScope()
  14. // Multi scope.
  15. //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  16. multiScope::multiScope() : Module(multiScope::NUM_PARAMS, multiScope::NUM_INPUTS, multiScope::NUM_OUTPUTS, multiScope::NUM_LIGHTS)
  17. {
  18. initialized = false;
  19. firstLoad = true;
  20. float initColorKnobs[4] = { -10, -3.33, 3, 7.2 };
  21. for (int wIx = 0; wIx < TROWA_SCOPE_NUM_WAVEFORMS; wIx++)
  22. {
  23. waveForms[wIx] = new TSWaveform();
  24. waveForms[wIx]->setHueFromKnob(initColorKnobs[wIx]);
  25. }
  26. return;
  27. } // end multiScope()
  28. //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  29. // ~multiScope()
  30. //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  31. multiScope::~multiScope()
  32. {
  33. // Clean our stuff
  34. for (int wIx = 0; wIx < TROWA_SCOPE_NUM_WAVEFORMS; wIx++)
  35. {
  36. delete waveForms[wIx];
  37. }
  38. return;
  39. } // end multiScope()
  40. //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  41. // step(void)
  42. //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  43. void multiScope::step() {
  44. if (!initialized)
  45. return;
  46. TSWaveform* waveForm = NULL;
  47. for (int wIx = 0; wIx < TROWA_SCOPE_NUM_WAVEFORMS; wIx++)
  48. {
  49. waveForm = waveForms[wIx]; // tmp pointer
  50. // Lissajous:
  51. if (waveForm->lissajousTrigger.process(params[multiScope::LISSAJOUS_PARAM + wIx].value))
  52. {
  53. waveForm->lissajous = !waveForm->lissajous;
  54. }
  55. lights[multiScope::LISSAJOUS_LED + wIx].value = waveForm->lissajous;
  56. // Compute Color:
  57. float hue = 0;
  58. if(inputs[multiScope::COLOR_INPUT+wIx].active){
  59. hue = clamp(rescale(inputs[multiScope::COLOR_INPUT+wIx].value, TROWA_SCOPE_HUE_INPUT_MIN_V, TROWA_SCOPE_HUE_INPUT_MAX_V, 0.0, 1.0), 0.0, 1.0);
  60. } else {
  61. hue = rescale(params[multiScope::COLOR_PARAM+wIx].value, TROWA_SCOPE_HUE_KNOB_MIN, TROWA_SCOPE_HUE_KNOB_MAX, 0.0, 1.0);
  62. }
  63. waveForm->colorChanged = hue != waveForm->waveHue || firstLoad;
  64. if (waveForm->colorChanged)
  65. {
  66. waveForm->waveHue = hue;
  67. // nvgHSLA(waveForm->waveHue, 0.5, 0.5, 0xdd);
  68. waveForm->waveColor = HueToColor(waveForm->waveHue); // Base Color (opacity full)
  69. #if TROWA_SCOPE_USE_COLOR_LIGHTS
  70. // Change the light color:
  71. waveForm->waveLight->setColor(waveForm->waveColor);
  72. #endif
  73. }
  74. // Opacity:
  75. if (inputs[multiScope::OPACITY_INPUT + wIx].active)
  76. {
  77. waveForm->waveOpacity = clamp(rescale(inputs[multiScope::OPACITY_INPUT + wIx].value, TROWA_SCOPE_OPACITY_INPUT_MIN, TROWA_SCOPE_OPACITY_INPUT_MAX, TROWA_SCOPE_MIN_OPACITY, TROWA_SCOPE_MAX_OPACITY),
  78. TROWA_SCOPE_MIN_OPACITY, TROWA_SCOPE_MAX_OPACITY);
  79. }
  80. else
  81. {
  82. waveForm->waveOpacity = params[multiScope::OPACITY_PARAM + wIx].value;
  83. }
  84. // Compute rotation:
  85. waveForm->rotKnobValue = params[multiScope::ROTATION_PARAM+wIx].value;
  86. if (waveForm->rotModeTrigger.process(params[multiScope::ROTATION_MODE_PARAM+wIx].value))
  87. {
  88. waveForm->rotMode = !waveForm->rotMode;
  89. }
  90. lights[multiScope::ROT_LED+wIx].value = waveForm->rotMode;
  91. float rot = 0;
  92. float rotRate = 0;
  93. if (waveForm->rotMode)
  94. {
  95. // Absolute position:
  96. rot = rescale(params[multiScope::ROTATION_PARAM+wIx].value + inputs[multiScope::ROTATION_INPUT+wIx].value, 0, 10, 0, NVG_PI);
  97. }
  98. else
  99. {
  100. // Differential rotation
  101. rotRate = rescale(params[multiScope::ROTATION_PARAM+wIx].value + inputs[multiScope::ROTATION_INPUT+wIx].value, 0, 10, 0, 0.5);
  102. }
  103. waveForm->rotAbsValue = rot;
  104. waveForm->rotDiffValue = rotRate;
  105. // Compute time:
  106. float deltaTime = powf(2.0, params[TIME_PARAM+wIx].value + inputs[TIME_INPUT+wIx].value);
  107. int frameCount = (int)ceilf(deltaTime * engineGetSampleRate());
  108. // Add frame to buffer
  109. if (waveForm->bufferIndex < BUFFER_SIZE) {
  110. if (++(waveForm->frameIndex) > frameCount) {
  111. waveForm->frameIndex = 0;
  112. waveForm->bufferX[waveForm->bufferIndex] = inputs[X_INPUT+wIx].value;
  113. waveForm->bufferY[waveForm->bufferIndex] = inputs[Y_INPUT+wIx].value;
  114. waveForm->bufferPenOn[waveForm->bufferIndex] = (!inputs[PEN_ON_INPUT + wIx].active || inputs[PEN_ON_INPUT + wIx].value > 0.1); // Allow some noise?
  115. waveForm->bufferIndex++;
  116. }
  117. }
  118. else {
  119. if (waveForm->lissajous)
  120. {
  121. // Reset
  122. waveForm->bufferIndex = 0;
  123. waveForm->frameIndex = 0;
  124. }
  125. else
  126. {
  127. // Just show stuff (no trigger inputs)
  128. waveForm->frameIndex++;
  129. float holdTime = 0.1;
  130. if (waveForm->frameIndex >= engineGetSampleRate() * holdTime) {
  131. waveForm->bufferIndex = 0;
  132. waveForm->frameIndex = 0;
  133. }
  134. }
  135. }
  136. } // end loop through waveforms
  137. firstLoad = false;
  138. return;
  139. } // end step()
  140. #endif // end if use old scope