BogaudioModules

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

Mumix.cpp (4375B)


      1 
      2 #include "Mumix.hpp"
      3 #include "mixer.hpp"
      4 
      5 const float Mumix::maxDecibels = 0.0f;
      6 const float Mumix::minDecibels = Amplifier::minDecibels;
      7 const float Mumix::slewTimeMS = 5.0f;
      8 
      9 void Mumix::sampleRateChange() {
     10 	float sampleRate = APP->engine->getSampleRate();
     11 	for (int i = 0; i < 8; ++i) {
     12 		_slewLimiters[i].setParams(sampleRate, slewTimeMS, maxDecibels - minDecibels);
     13 	}
     14 }
     15 
     16 bool Mumix::active() {
     17 	return outputs[OUT_OUTPUT].isConnected();
     18 }
     19 
     20 int Mumix::channels() {
     21 	return inputs[IN1_INPUT].getChannels();
     22 }
     23 
     24 void Mumix::modulate() {
     25 	MatrixBaseModule::modulate();
     26 
     27 	bool solo = false;
     28 	for (int i = 0; i < 8; ++i) {
     29 		solo = solo || params[MUTE1_PARAM + i].getValue() > 1.5f;
     30 	}
     31 	for (int i = 0; i < 8; ++i) {
     32 		_muted[i] = solo ? params[MUTE1_PARAM + i].getValue() < 2.0f : params[MUTE1_PARAM + i].getValue() > 0.5f;
     33 	}
     34 
     35 	if (_sum) {
     36 		_invActive = 0.0f;
     37 	}
     38 	else {
     39 		int active = 0;
     40 		for (int i = 0; i < 8; ++i) {
     41 			if (inputs[IN1_INPUT + i].isConnected()) {
     42 				++active;
     43 			}
     44 		}
     45 		_invActive = active > 0 ? 1.0f / (float)active : 0.0f;
     46 	}
     47 }
     48 
     49 void Mumix::processAlways(const ProcessArgs& args) {
     50 	for (int i = 0; i < 8; ++i) {
     51 		float level = _slewLimiters[i].next(_muted[i] ? minDecibels : maxDecibels);
     52 		_amplifiers[i].setLevel(level);
     53 	}
     54 }
     55 
     56 void Mumix::processChannel(const ProcessArgs& args, int c) {
     57 	outputs[OUT_OUTPUT].setChannels(_channels);
     58 
     59 	float out = 0.0f;
     60 	for (int i = 0; i < 8; ++i) {
     61 		out += _inputGainLevel * _amplifiers[i].next(inputs[IN1_INPUT + i].getPolyVoltage(c));
     62 	}
     63 	if (!_sum && _invActive > 0.0f) {
     64 		out *= _invActive;
     65 	}
     66 	if (_clippingMode == HARD_CLIPPING) {
     67 		outputs[OUT_OUTPUT].setVoltage(clamp(out, -12.0f, 12.0f), c);
     68 	}
     69 	else {
     70 		outputs[OUT_OUTPUT].setVoltage(_saturator[c].next(out), c);
     71 	}
     72 }
     73 
     74 struct MumixWidget : MatrixBaseModuleWidget {
     75 	static constexpr int hp = 6;
     76 
     77 	MumixWidget(Mumix* module) {
     78 		setModule(module);
     79 		box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
     80 		setPanel(box.size, "Mumix");
     81 		createScrews();
     82 
     83 		// generated by svg_widgets.rb
     84 		auto mute1ParamPosition = Vec(56.5, 33.0);
     85 		auto mute2ParamPosition = Vec(56.5, 70.0);
     86 		auto mute3ParamPosition = Vec(56.5, 107.0);
     87 		auto mute4ParamPosition = Vec(56.5, 144.0);
     88 		auto mute5ParamPosition = Vec(56.5, 181.0);
     89 		auto mute6ParamPosition = Vec(56.5, 218.0);
     90 		auto mute7ParamPosition = Vec(56.5, 255.0);
     91 		auto mute8ParamPosition = Vec(56.5, 292.0);
     92 
     93 		auto in1InputPosition = Vec(12.5, 30.0);
     94 		auto in2InputPosition = Vec(12.5, 67.0);
     95 		auto in3InputPosition = Vec(12.5, 104.0);
     96 		auto in4InputPosition = Vec(12.5, 141.0);
     97 		auto in5InputPosition = Vec(12.5, 178.0);
     98 		auto in6InputPosition = Vec(12.5, 215.0);
     99 		auto in7InputPosition = Vec(12.5, 252.0);
    100 		auto in8InputPosition = Vec(12.5, 289.0);
    101 
    102 		auto outOutputPosition = Vec(12.5, 321.0);
    103 		// end generated by svg_widgets.rb
    104 
    105 		addParam(createParam<SoloMuteButton>(mute1ParamPosition, module, Mumix::MUTE1_PARAM));
    106 		addParam(createParam<SoloMuteButton>(mute2ParamPosition, module, Mumix::MUTE2_PARAM));
    107 		addParam(createParam<SoloMuteButton>(mute3ParamPosition, module, Mumix::MUTE3_PARAM));
    108 		addParam(createParam<SoloMuteButton>(mute4ParamPosition, module, Mumix::MUTE4_PARAM));
    109 		addParam(createParam<SoloMuteButton>(mute5ParamPosition, module, Mumix::MUTE5_PARAM));
    110 		addParam(createParam<SoloMuteButton>(mute6ParamPosition, module, Mumix::MUTE6_PARAM));
    111 		addParam(createParam<SoloMuteButton>(mute7ParamPosition, module, Mumix::MUTE7_PARAM));
    112 		addParam(createParam<SoloMuteButton>(mute8ParamPosition, module, Mumix::MUTE8_PARAM));
    113 
    114 		addInput(createInput<Port24>(in1InputPosition, module, Mumix::IN1_INPUT));
    115 		addInput(createInput<Port24>(in2InputPosition, module, Mumix::IN2_INPUT));
    116 		addInput(createInput<Port24>(in3InputPosition, module, Mumix::IN3_INPUT));
    117 		addInput(createInput<Port24>(in4InputPosition, module, Mumix::IN4_INPUT));
    118 		addInput(createInput<Port24>(in5InputPosition, module, Mumix::IN5_INPUT));
    119 		addInput(createInput<Port24>(in6InputPosition, module, Mumix::IN6_INPUT));
    120 		addInput(createInput<Port24>(in7InputPosition, module, Mumix::IN7_INPUT));
    121 		addInput(createInput<Port24>(in8InputPosition, module, Mumix::IN8_INPUT));
    122 
    123 		addOutput(createOutput<Port24>(outOutputPosition, module, Mumix::OUT_OUTPUT));
    124 	}
    125 };
    126 
    127 Model* modelMumix = createModel<Mumix, MumixWidget>("Bogaudio-Mumix", "MUMIX", "8-input unity mixer with mutes", "Mixer", "Polyphonic");