BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

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");