XFade.cpp (2547B)
1 2 #include "XFade.hpp" 3 4 void XFade::sampleRateChange() { 5 for (int c = 0; c < maxChannels; ++c) { 6 _mixSL[c].setParams(APP->engine->getSampleRate(), 10.0f, 2.0f); 7 } 8 } 9 10 bool XFade::active() { 11 return outputs[OUT_OUTPUT].isConnected(); 12 } 13 14 int XFade::channels() { 15 return inputs[A_INPUT].getChannels(); 16 } 17 18 void XFade::processChannel(const ProcessArgs& args, int c) { 19 bool linear = params[LINEAR_PARAM].getValue() > 0.5f; 20 21 float mix = params[MIX_PARAM].getValue(); 22 if (inputs[MIX_INPUT].isConnected()) { 23 mix *= clamp(inputs[MIX_INPUT].getPolyVoltage(c) / 5.0f, -1.0f, 1.0f); 24 } 25 mix = _mixSL[c].next(mix); 26 27 float curveIn = params[CURVE_PARAM].getValue(); 28 29 if (_linear != linear || _mix[c] != mix || _curveIn[c] != curveIn) { 30 _linear = linear; 31 _mix[c] = mix; 32 _curveIn[c] = curveIn; 33 if (!linear) { 34 curveIn = powf(params[CURVE_PARAM].getValue(), 0.082f); 35 } 36 curveIn *= 2.0f; 37 curveIn -= 1.0f; 38 39 _mixer[c].setParams(mix, curveIn, linear); 40 } 41 42 outputs[OUT_OUTPUT].setChannels(_channels); 43 outputs[OUT_OUTPUT].setVoltage(_mixer[c].next(inputs[A_INPUT].getVoltage(c), inputs[B_INPUT].getVoltage(c)), c); 44 } 45 46 struct XFadeWidget : BGModuleWidget { 47 static constexpr int hp = 3; 48 49 XFadeWidget(XFade* module) { 50 setModule(module); 51 box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); 52 setPanel(box.size, "XFade"); 53 createScrews(); 54 55 // generated by svg_widgets.rb 56 auto mixParamPosition = Vec(8.0, 36.0); 57 auto curveParamPosition = Vec(14.5, 152.5); 58 auto linearParamPosition = Vec(25.5, 177.0); 59 60 auto mixInputPosition = Vec(10.5, 77.0); 61 auto aInputPosition = Vec(10.5, 213.0); 62 auto bInputPosition = Vec(10.5, 248.0); 63 64 auto outOutputPosition = Vec(10.5, 286.0); 65 // end generated by svg_widgets.rb 66 67 addParam(createParam<Knob29>(mixParamPosition, module, XFade::MIX_PARAM)); 68 { 69 auto w = createParam<Knob16>(curveParamPosition, module, XFade::CURVE_PARAM); 70 auto k = dynamic_cast<SvgKnob*>(w); 71 k->minAngle = -0.5 * M_PI; 72 k->maxAngle = 0.5 * M_PI; 73 addParam(w); 74 } 75 addParam(createParam<IndicatorButtonGreen9>(linearParamPosition, module, XFade::LINEAR_PARAM)); 76 77 addInput(createInput<Port24>(mixInputPosition, module, XFade::MIX_INPUT)); 78 addInput(createInput<Port24>(aInputPosition, module, XFade::A_INPUT)); 79 addInput(createInput<Port24>(bInputPosition, module, XFade::B_INPUT)); 80 81 addOutput(createOutput<Port24>(outOutputPosition, module, XFade::OUT_OUTPUT)); 82 } 83 }; 84 85 Model* modelXFade = bogaudio::createModel<XFade, XFadeWidget>("Bogaudio-XFade", "XFADE", "Crossfader", "Mixer", "Polyphonic");