BogaudioModules

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

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