Mute8.cpp (8763B)
1 2 #include "Mute8.hpp" 3 #include "mixer.hpp" 4 5 #define LATCHING_CVS "latching_cvs" 6 7 const float Mute8::maxDecibels = 0.0f; 8 const float Mute8::minDecibels = Amplifier::minDecibels; 9 const float Mute8::slewTimeMS = 5.0f; 10 11 json_t* Mute8::saveToJson(json_t* root) { 12 json_object_set_new(root, LATCHING_CVS, json_boolean(_latchingCVs)); 13 return root; 14 } 15 16 void Mute8::loadFromJson(json_t* root) { 17 json_t* l = json_object_get(root, LATCHING_CVS); 18 if (l) { 19 _latchingCVs = json_is_true(l); 20 } 21 } 22 23 void Mute8::reset() { 24 for (int i = 0; i < 8; ++i) { 25 for (int c = 0; c < maxChannels; ++c) { 26 _triggers[i][c].reset(); 27 } 28 } 29 } 30 31 void Mute8::sampleRateChange() { 32 float sampleRate = APP->engine->getSampleRate(); 33 for (int i = 0; i < 8; ++i) { 34 for (int c = 0; c < maxChannels; ++c) { 35 _slewLimiters[i][c].setParams(sampleRate, slewTimeMS, maxDecibels - minDecibels); 36 } 37 } 38 } 39 40 void Mute8::processAll(const ProcessArgs& args) { 41 bool solo = false; 42 for (int i = 0; i < 8; ++i) { 43 solo = solo || params[MUTE1_PARAM + i].getValue() > 1.5f; 44 } 45 for (int i = 0; i < 8; ++i) { 46 stepChannel(i, solo); 47 } 48 } 49 50 void Mute8::stepChannel(int i, bool solo) { 51 bool allMuted = solo ? params[MUTE1_PARAM + i].getValue() < 2.0f : params[MUTE1_PARAM + i].getValue() > 0.5f; 52 53 if (inputs[INPUT1_INPUT + i].isConnected()) { 54 int n = inputs[INPUT1_INPUT + i].getChannels(); 55 outputs[OUTPUT1_OUTPUT + i].setChannels(n); 56 int mutedCount = 0; 57 for (int c = 0; c < n; ++c) { 58 if (_triggers[i][c].process(inputs[MUTE1_INPUT + i].getPolyVoltage(c))) { 59 _latches[i][c] = !_latches[i][c]; 60 } 61 bool muted = allMuted || (!_latchingCVs && _triggers[i][c].isHigh()) || (_latchingCVs && _latches[i][c]); 62 if (muted) { 63 ++mutedCount; 64 _amplifiers[i][c].setLevel(_slewLimiters[i][c].next(minDecibels)); 65 } 66 else { 67 _amplifiers[i][c].setLevel(_slewLimiters[i][c].next(maxDecibels)); 68 } 69 outputs[OUTPUT1_OUTPUT + i].setChannels(n); 70 outputs[OUTPUT1_OUTPUT + i].setVoltage(_amplifiers[i][c].next(inputs[INPUT1_INPUT + i].getVoltage(c)), c); 71 } 72 lights[MUTE1_LIGHT + i].value = mutedCount / (float)n; 73 } 74 else { 75 if (_triggers[i][0].process(inputs[MUTE1_INPUT + i].getVoltage())) { 76 _latches[i][0] = !_latches[i][0]; 77 } 78 bool muted = allMuted || (!_latchingCVs && _triggers[i][0].isHigh()) || (_latchingCVs && _latches[i][0]); 79 if (muted) { 80 lights[MUTE1_LIGHT + i].value = 1.0f; 81 _amplifiers[i][0].setLevel(_slewLimiters[i][0].next(minDecibels)); 82 } 83 else { 84 lights[MUTE1_LIGHT + i].value = 0.0f; 85 _amplifiers[i][0].setLevel(_slewLimiters[i][0].next(maxDecibels)); 86 } 87 outputs[OUTPUT1_OUTPUT + i].setChannels(1); 88 outputs[OUTPUT1_OUTPUT + i].setVoltage(_amplifiers[i][0].next(5.0f)); 89 } 90 } 91 92 struct Mute8Widget : BGModuleWidget { 93 static constexpr int hp = 10; 94 95 Mute8Widget(Mute8* module) { 96 setModule(module); 97 box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); 98 setPanel(box.size, "Mute8"); 99 createScrews(); 100 101 // generated by svg_widgets.rb 102 auto mute1ParamPosition = Vec(78.5, 41.0); 103 auto mute2ParamPosition = Vec(78.5, 81.0); 104 auto mute3ParamPosition = Vec(78.5, 121.0); 105 auto mute4ParamPosition = Vec(78.5, 161.0); 106 auto mute5ParamPosition = Vec(78.5, 201.0); 107 auto mute6ParamPosition = Vec(78.5, 241.0); 108 auto mute7ParamPosition = Vec(78.5, 281.0); 109 auto mute8ParamPosition = Vec(78.5, 319.0); 110 111 auto input1InputPosition = Vec(11.0, 36.0); 112 auto input2InputPosition = Vec(11.0, 76.0); 113 auto input3InputPosition = Vec(11.0, 116.0); 114 auto input4InputPosition = Vec(11.0, 156.0); 115 auto input5InputPosition = Vec(11.0, 196.0); 116 auto input6InputPosition = Vec(11.0, 236.0); 117 auto input7InputPosition = Vec(11.0, 276.0); 118 auto input8InputPosition = Vec(11.0, 316.0); 119 auto mute1InputPosition = Vec(46.0, 36.0); 120 auto mute2InputPosition = Vec(46.0, 76.0); 121 auto mute3InputPosition = Vec(46.0, 116.0); 122 auto mute4InputPosition = Vec(46.0, 156.0); 123 auto mute5InputPosition = Vec(46.0, 196.0); 124 auto mute6InputPosition = Vec(46.0, 236.0); 125 auto mute7InputPosition = Vec(46.0, 276.0); 126 auto mute8InputPosition = Vec(46.0, 316.0); 127 128 auto output1OutputPosition = Vec(115.0, 36.0); 129 auto output2OutputPosition = Vec(115.0, 76.0); 130 auto output3OutputPosition = Vec(115.0, 116.0); 131 auto output4OutputPosition = Vec(115.0, 156.0); 132 auto output5OutputPosition = Vec(115.0, 196.0); 133 auto output6OutputPosition = Vec(115.0, 236.0); 134 auto output7OutputPosition = Vec(115.0, 276.0); 135 auto output8OutputPosition = Vec(115.0, 316.0); 136 137 auto mute1LightPosition = Vec(100.5, 46.8); 138 auto mute2LightPosition = Vec(100.5, 86.8); 139 auto mute3LightPosition = Vec(100.5, 126.8); 140 auto mute4LightPosition = Vec(100.5, 166.8); 141 auto mute5LightPosition = Vec(100.5, 206.8); 142 auto mute6LightPosition = Vec(100.5, 246.8); 143 auto mute7LightPosition = Vec(100.5, 286.8); 144 auto mute8LightPosition = Vec(100.5, 324.8); 145 // end generated by svg_widgets.rb 146 147 addParam(createParam<SoloMuteButton>(mute1ParamPosition, module, Mute8::MUTE1_PARAM)); 148 addParam(createParam<SoloMuteButton>(mute2ParamPosition, module, Mute8::MUTE2_PARAM)); 149 addParam(createParam<SoloMuteButton>(mute3ParamPosition, module, Mute8::MUTE3_PARAM)); 150 addParam(createParam<SoloMuteButton>(mute4ParamPosition, module, Mute8::MUTE4_PARAM)); 151 addParam(createParam<SoloMuteButton>(mute5ParamPosition, module, Mute8::MUTE5_PARAM)); 152 addParam(createParam<SoloMuteButton>(mute6ParamPosition, module, Mute8::MUTE6_PARAM)); 153 addParam(createParam<SoloMuteButton>(mute7ParamPosition, module, Mute8::MUTE7_PARAM)); 154 addParam(createParam<SoloMuteButton>(mute8ParamPosition, module, Mute8::MUTE8_PARAM)); 155 156 addInput(createInput<Port24>(input1InputPosition, module, Mute8::INPUT1_INPUT)); 157 addInput(createInput<Port24>(input2InputPosition, module, Mute8::INPUT2_INPUT)); 158 addInput(createInput<Port24>(input3InputPosition, module, Mute8::INPUT3_INPUT)); 159 addInput(createInput<Port24>(input4InputPosition, module, Mute8::INPUT4_INPUT)); 160 addInput(createInput<Port24>(input5InputPosition, module, Mute8::INPUT5_INPUT)); 161 addInput(createInput<Port24>(input6InputPosition, module, Mute8::INPUT6_INPUT)); 162 addInput(createInput<Port24>(input7InputPosition, module, Mute8::INPUT7_INPUT)); 163 addInput(createInput<Port24>(input8InputPosition, module, Mute8::INPUT8_INPUT)); 164 addInput(createInput<Port24>(mute1InputPosition, module, Mute8::MUTE1_INPUT)); 165 addInput(createInput<Port24>(mute2InputPosition, module, Mute8::MUTE2_INPUT)); 166 addInput(createInput<Port24>(mute3InputPosition, module, Mute8::MUTE3_INPUT)); 167 addInput(createInput<Port24>(mute4InputPosition, module, Mute8::MUTE4_INPUT)); 168 addInput(createInput<Port24>(mute5InputPosition, module, Mute8::MUTE5_INPUT)); 169 addInput(createInput<Port24>(mute6InputPosition, module, Mute8::MUTE6_INPUT)); 170 addInput(createInput<Port24>(mute7InputPosition, module, Mute8::MUTE7_INPUT)); 171 addInput(createInput<Port24>(mute8InputPosition, module, Mute8::MUTE8_INPUT)); 172 173 addOutput(createOutput<Port24>(output1OutputPosition, module, Mute8::OUTPUT1_OUTPUT)); 174 addOutput(createOutput<Port24>(output2OutputPosition, module, Mute8::OUTPUT2_OUTPUT)); 175 addOutput(createOutput<Port24>(output3OutputPosition, module, Mute8::OUTPUT3_OUTPUT)); 176 addOutput(createOutput<Port24>(output4OutputPosition, module, Mute8::OUTPUT4_OUTPUT)); 177 addOutput(createOutput<Port24>(output5OutputPosition, module, Mute8::OUTPUT5_OUTPUT)); 178 addOutput(createOutput<Port24>(output6OutputPosition, module, Mute8::OUTPUT6_OUTPUT)); 179 addOutput(createOutput<Port24>(output7OutputPosition, module, Mute8::OUTPUT7_OUTPUT)); 180 addOutput(createOutput<Port24>(output8OutputPosition, module, Mute8::OUTPUT8_OUTPUT)); 181 182 addChild(createLight<BGSmallLight<GreenLight>>(mute1LightPosition, module, Mute8::MUTE1_LIGHT)); 183 addChild(createLight<BGSmallLight<GreenLight>>(mute2LightPosition, module, Mute8::MUTE2_LIGHT)); 184 addChild(createLight<BGSmallLight<GreenLight>>(mute3LightPosition, module, Mute8::MUTE3_LIGHT)); 185 addChild(createLight<BGSmallLight<GreenLight>>(mute4LightPosition, module, Mute8::MUTE4_LIGHT)); 186 addChild(createLight<BGSmallLight<GreenLight>>(mute5LightPosition, module, Mute8::MUTE5_LIGHT)); 187 addChild(createLight<BGSmallLight<GreenLight>>(mute6LightPosition, module, Mute8::MUTE6_LIGHT)); 188 addChild(createLight<BGSmallLight<GreenLight>>(mute7LightPosition, module, Mute8::MUTE7_LIGHT)); 189 addChild(createLight<BGSmallLight<GreenLight>>(mute8LightPosition, module, Mute8::MUTE8_LIGHT)); 190 } 191 192 void contextMenu(Menu* menu) override { 193 auto m = dynamic_cast<Mute8*>(module); 194 assert(m); 195 menu->addChild(new BoolOptionMenuItem("Latching CV triggers", [m]() { return &m->_latchingCVs; })); 196 } 197 }; 198 199 Model* modelMute8 = bogaudio::createModel<Mute8, Mute8Widget>("Bogaudio-Mute8", "MUTE8", "8 independent mutes with CV control", "Polyphonic");