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