#include "Features.hpp" #if !USE_NEW_SCOPE #include #include "trowaSoft.hpp" #include "trowaSoftComponents.hpp" #include "trowaSoftUtilities.hpp" #include "dsp/digital.hpp" #include "Module_multiScope_Old.hpp" #include "Widget_multiScope_Old.hpp" // multiScope model. Model *modelMultiScope = Model::create(/*manufacturer*/ TROWA_PLUGIN_NAME, /*slug*/ "multiScope", /*name*/ "multiScope", /*Tags*/ VISUAL_TAG, UTILITY_TAG); //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- // multiScope() // Multi scope. //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- multiScope::multiScope() : Module(multiScope::NUM_PARAMS, multiScope::NUM_INPUTS, multiScope::NUM_OUTPUTS, multiScope::NUM_LIGHTS) { initialized = false; firstLoad = true; float initColorKnobs[4] = { -10, -3.33, 3, 7.2 }; for (int wIx = 0; wIx < TROWA_SCOPE_NUM_WAVEFORMS; wIx++) { waveForms[wIx] = new TSWaveform(); waveForms[wIx]->setHueFromKnob(initColorKnobs[wIx]); } return; } // end multiScope() //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- // ~multiScope() //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- multiScope::~multiScope() { // Clean our stuff for (int wIx = 0; wIx < TROWA_SCOPE_NUM_WAVEFORMS; wIx++) { delete waveForms[wIx]; } return; } // end multiScope() //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- // step(void) //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- void multiScope::step() { if (!initialized) return; TSWaveform* waveForm = NULL; for (int wIx = 0; wIx < TROWA_SCOPE_NUM_WAVEFORMS; wIx++) { waveForm = waveForms[wIx]; // tmp pointer // Lissajous: if (waveForm->lissajousTrigger.process(params[multiScope::LISSAJOUS_PARAM + wIx].value)) { waveForm->lissajous = !waveForm->lissajous; } lights[multiScope::LISSAJOUS_LED + wIx].value = waveForm->lissajous; // Compute Color: float hue = 0; if(inputs[multiScope::COLOR_INPUT+wIx].active){ 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); } else { hue = rescale(params[multiScope::COLOR_PARAM+wIx].value, TROWA_SCOPE_HUE_KNOB_MIN, TROWA_SCOPE_HUE_KNOB_MAX, 0.0, 1.0); } waveForm->colorChanged = hue != waveForm->waveHue || firstLoad; if (waveForm->colorChanged) { waveForm->waveHue = hue; // nvgHSLA(waveForm->waveHue, 0.5, 0.5, 0xdd); waveForm->waveColor = HueToColor(waveForm->waveHue); // Base Color (opacity full) #if TROWA_SCOPE_USE_COLOR_LIGHTS // Change the light color: waveForm->waveLight->setColor(waveForm->waveColor); #endif } // Opacity: if (inputs[multiScope::OPACITY_INPUT + wIx].active) { 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), TROWA_SCOPE_MIN_OPACITY, TROWA_SCOPE_MAX_OPACITY); } else { waveForm->waveOpacity = params[multiScope::OPACITY_PARAM + wIx].value; } // Compute rotation: waveForm->rotKnobValue = params[multiScope::ROTATION_PARAM+wIx].value; if (waveForm->rotModeTrigger.process(params[multiScope::ROTATION_MODE_PARAM+wIx].value)) { waveForm->rotMode = !waveForm->rotMode; } lights[multiScope::ROT_LED+wIx].value = waveForm->rotMode; float rot = 0; float rotRate = 0; if (waveForm->rotMode) { // Absolute position: rot = rescale(params[multiScope::ROTATION_PARAM+wIx].value + inputs[multiScope::ROTATION_INPUT+wIx].value, 0, 10, 0, NVG_PI); } else { // Differential rotation rotRate = rescale(params[multiScope::ROTATION_PARAM+wIx].value + inputs[multiScope::ROTATION_INPUT+wIx].value, 0, 10, 0, 0.5); } waveForm->rotAbsValue = rot; waveForm->rotDiffValue = rotRate; // Compute time: float deltaTime = powf(2.0, params[TIME_PARAM+wIx].value + inputs[TIME_INPUT+wIx].value); int frameCount = (int)ceilf(deltaTime * engineGetSampleRate()); // Add frame to buffer if (waveForm->bufferIndex < BUFFER_SIZE) { if (++(waveForm->frameIndex) > frameCount) { waveForm->frameIndex = 0; waveForm->bufferX[waveForm->bufferIndex] = inputs[X_INPUT+wIx].value; waveForm->bufferY[waveForm->bufferIndex] = inputs[Y_INPUT+wIx].value; waveForm->bufferPenOn[waveForm->bufferIndex] = (!inputs[PEN_ON_INPUT + wIx].active || inputs[PEN_ON_INPUT + wIx].value > 0.1); // Allow some noise? waveForm->bufferIndex++; } } else { if (waveForm->lissajous) { // Reset waveForm->bufferIndex = 0; waveForm->frameIndex = 0; } else { // Just show stuff (no trigger inputs) waveForm->frameIndex++; float holdTime = 0.1; if (waveForm->frameIndex >= engineGetSampleRate() * holdTime) { waveForm->bufferIndex = 0; waveForm->frameIndex = 0; } } } } // end loop through waveforms firstLoad = false; return; } // end step() #endif // end if use old scope