BogaudioModules

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

PEQ14.cpp (18546B)


      1 
      2 #include "PEQ14.hpp"
      3 
      4 void PEQ14::sampleRateChange() {
      5 	float sr = APP->engine->getSampleRate();
      6 	for (int c = 0; c < _channels; ++c) {
      7 		_engines[c]->setSampleRate(sr);
      8 	}
      9 }
     10 
     11 bool PEQ14::active() {
     12 	return
     13 		outputs[OUT_OUTPUT].isConnected() ||
     14 		outputs[ODDS_OUTPUT].isConnected() ||
     15 		outputs[EVENS_OUTPUT].isConnected() ||
     16 		outputs[OUT1_OUTPUT].isConnected() ||
     17 		outputs[OUT2_OUTPUT].isConnected() ||
     18 		outputs[OUT3_OUTPUT].isConnected() ||
     19 		outputs[OUT4_OUTPUT].isConnected() ||
     20 		outputs[OUT5_OUTPUT].isConnected() ||
     21 		outputs[OUT6_OUTPUT].isConnected() ||
     22 		outputs[OUT7_OUTPUT].isConnected() ||
     23 		outputs[OUT8_OUTPUT].isConnected() ||
     24 		outputs[OUT9_OUTPUT].isConnected() ||
     25 		outputs[OUT10_OUTPUT].isConnected() ||
     26 		outputs[OUT11_OUTPUT].isConnected() ||
     27 		outputs[OUT12_OUTPUT].isConnected() ||
     28 		outputs[OUT13_OUTPUT].isConnected() ||
     29 		outputs[OUT14_OUTPUT].isConnected() ||
     30 		expanderConnected();
     31 }
     32 
     33 int PEQ14::channels() {
     34 	return inputs[IN_INPUT].getChannels();
     35 }
     36 
     37 void PEQ14::addChannel(int c) {
     38 	const int n = 14;
     39 	_engines[c] = new PEQEngine(n);
     40 	for (int i = 0; i < n; ++i) {
     41 		_engines[c]->configChannel(
     42 			i,
     43 			c,
     44 			params[LEVEL1_PARAM + i*3],
     45 			params[FREQUENCY1_PARAM + i*3],
     46 			params[FREQUENCY_CV1_PARAM + i*3],
     47 			&params[FREQUENCY_CV_PARAM],
     48 			params[BANDWIDTH_PARAM],
     49 			inputs[LEVEL1_INPUT + i*2],
     50 			inputs[FREQUENCY_CV1_INPUT + i*2],
     51 			inputs[FREQUENCY_CV_INPUT],
     52 			&inputs[BANDWIDTH_INPUT]
     53 		);
     54 	}
     55 	_engines[c]->setSampleRate(APP->engine->getSampleRate());
     56 }
     57 
     58 void PEQ14::removeChannel(int c) {
     59 	delete _engines[c];
     60 	_engines[c] = NULL;
     61 }
     62 
     63 void PEQ14::modulate() {
     64 	_fullFrequencyMode = params[FMOD_PARAM].getValue() > 0.5f;
     65 
     66 	_lowMode = params[LP_PARAM].getValue() > 0.5f ? MultimodeFilter::LOWPASS_MODE : MultimodeFilter::BANDPASS_MODE;
     67 	_highMode = params[HP_PARAM].getValue() > 0.5f ? MultimodeFilter::HIGHPASS_MODE : MultimodeFilter::BANDPASS_MODE;
     68 	for (int c = 0; c < _channels; ++c) {
     69 		PEQEngine& e = *_engines[c];
     70 		e.setLowFilterMode(_lowMode);
     71 		e.setHighFilterMode(_highMode);
     72 		e.setFrequencyMode(_fullFrequencyMode);
     73 		e.modulate();
     74 	}
     75 }
     76 
     77 void PEQ14::processAlways(const ProcessArgs& args) {
     78 	outputs[OUT_OUTPUT].setChannels(_channels);
     79 	outputs[ODDS_OUTPUT].setChannels(_channels);
     80 	outputs[EVENS_OUTPUT].setChannels(_channels);
     81 	for (int i = 0; i < 14; ++i) {
     82 		outputs[OUT1_OUTPUT + i].setChannels(_channels);
     83 	}
     84 	std::fill(_rmsSums, _rmsSums + 14, 0.0f);
     85 }
     86 
     87 void PEQ14::processChannel(const ProcessArgs& args, int c) {
     88 	PEQEngine& e = *_engines[c];
     89 	float out = e.next(inputs[IN_INPUT].getVoltage(c), _rmsSums);
     90 	float oddOut = 0.0f;
     91 	float evenOut = 0.0f;
     92 	float beOut = 0.0f;
     93 	float beOddOut = 0.0f;
     94 	float beEvenOut = 0.0f;
     95 	for (int i = 0; i < 14; ++i) {
     96 		float odd = e.outs[i] * (float)(i % 2 == 0 || (i == 13 && _highMode == MultimodeFilter::HIGHPASS_MODE));
     97 		oddOut += odd;
     98 		float even = e.outs[i] * (float)(i % 2 == 1 || (i == 0 && _lowMode == MultimodeFilter::LOWPASS_MODE));
     99 		evenOut += even;
    100 		if (outputs[OUT1_OUTPUT + i].isConnected()) {
    101 			outputs[OUT1_OUTPUT + i].setVoltage(e.outs[i], c);
    102 		}
    103 		else {
    104 			beOut += e.outs[i];
    105 			beOddOut += odd;
    106 			beEvenOut += even;
    107 		}
    108 	}
    109 	if (_bandExclude) {
    110 		outputs[OUT_OUTPUT].setVoltage(beOut, c);
    111 		outputs[ODDS_OUTPUT].setVoltage(beOddOut, c);
    112 		outputs[EVENS_OUTPUT].setVoltage(beEvenOut, c);
    113 	}
    114 	else {
    115 		outputs[OUT_OUTPUT].setVoltage(out, c);
    116 		outputs[ODDS_OUTPUT].setVoltage(oddOut, c);
    117 		outputs[EVENS_OUTPUT].setVoltage(evenOut, c);
    118 	}
    119 
    120 	if (expanderConnected()) {
    121 		auto m = toExpander();
    122 		m->valid = true;
    123 		std::copy(e.outs, e.outs + 14, m->outs[c]);
    124 		std::copy(e.frequencies, e.frequencies + 14, m->frequencies[c]);
    125 		m->bandwidths[c] = e.bandwidth;
    126 		m->lowLP = _lowMode == MultimodeFilter::LOWPASS_MODE;
    127 		m->highHP = _highMode == MultimodeFilter::HIGHPASS_MODE;
    128 	}
    129 }
    130 
    131 void PEQ14::postProcessAlways(const ProcessArgs& args) {
    132 	for (int i = 0; i < 14; ++i) {
    133 		_rms[i] = _rmsSums[i] * _inverseChannels;
    134 	}
    135 
    136 	bool ffm = params[FMOD_PARAM].getValue() > 0.5f;
    137 	lights[FMOD_RELATIVE_LIGHT].value = !ffm;
    138 	lights[FMOD_FULL_LIGHT].value = ffm;
    139 }
    140 
    141 struct PEQ14Widget : BandExcludeModuleWidget {
    142 	static constexpr int hp = 46;
    143 
    144 	PEQ14Widget(PEQ14* module) {
    145 		setModule(module);
    146 		box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
    147 		setPanel(box.size, "PEQ14");
    148 		createScrews();
    149 
    150 		// generated by svg_widgets.rb
    151 		auto frequencyCvParamPosition = Vec(47.0, 59.0);
    152 		auto bandwidthParamPosition = Vec(47.0, 121.0);
    153 		auto lpParamPosition = Vec(48.5, 180.0);
    154 		auto hpParamPosition = Vec(48.5, 192.0);
    155 		auto fmodParamPosition = Vec(32.5, 252.0);
    156 		auto level1ParamPosition = Vec(87.5, 28.0);
    157 		auto frequency1ParamPosition = Vec(88.5, 184.0);
    158 		auto frequencyCv1ParamPosition = Vec(88.5, 224.0);
    159 		auto level2ParamPosition = Vec(131.5, 28.0);
    160 		auto frequency2ParamPosition = Vec(132.5, 184.0);
    161 		auto frequencyCv2ParamPosition = Vec(132.5, 224.0);
    162 		auto level3ParamPosition = Vec(175.5, 28.0);
    163 		auto frequency3ParamPosition = Vec(176.5, 184.0);
    164 		auto frequencyCv3ParamPosition = Vec(176.5, 224.0);
    165 		auto level4ParamPosition = Vec(219.5, 28.0);
    166 		auto frequency4ParamPosition = Vec(220.5, 184.0);
    167 		auto frequencyCv4ParamPosition = Vec(220.5, 224.0);
    168 		auto level5ParamPosition = Vec(263.5, 28.0);
    169 		auto frequency5ParamPosition = Vec(264.5, 184.0);
    170 		auto frequencyCv5ParamPosition = Vec(264.5, 224.0);
    171 		auto level6ParamPosition = Vec(307.5, 28.0);
    172 		auto frequency6ParamPosition = Vec(308.5, 184.0);
    173 		auto frequencyCv6ParamPosition = Vec(308.5, 224.0);
    174 		auto level7ParamPosition = Vec(351.5, 28.0);
    175 		auto frequency7ParamPosition = Vec(352.5, 184.0);
    176 		auto frequencyCv7ParamPosition = Vec(352.5, 224.0);
    177 		auto level8ParamPosition = Vec(395.5, 28.0);
    178 		auto frequency8ParamPosition = Vec(396.5, 184.0);
    179 		auto frequencyCv8ParamPosition = Vec(396.5, 224.0);
    180 		auto level9ParamPosition = Vec(439.5, 28.0);
    181 		auto frequency9ParamPosition = Vec(440.5, 184.0);
    182 		auto frequencyCv9ParamPosition = Vec(440.5, 224.0);
    183 		auto level10ParamPosition = Vec(483.5, 28.0);
    184 		auto frequency10ParamPosition = Vec(484.5, 184.0);
    185 		auto frequencyCv10ParamPosition = Vec(484.5, 224.0);
    186 		auto level11ParamPosition = Vec(527.5, 28.0);
    187 		auto frequency11ParamPosition = Vec(528.5, 184.0);
    188 		auto frequencyCv11ParamPosition = Vec(528.5, 224.0);
    189 		auto level12ParamPosition = Vec(571.5, 28.0);
    190 		auto frequency12ParamPosition = Vec(572.5, 184.0);
    191 		auto frequencyCv12ParamPosition = Vec(572.5, 224.0);
    192 		auto level13ParamPosition = Vec(615.5, 28.0);
    193 		auto frequency13ParamPosition = Vec(616.5, 184.0);
    194 		auto frequencyCv13ParamPosition = Vec(616.5, 224.0);
    195 		auto level14ParamPosition = Vec(659.5, 28.0);
    196 		auto frequency14ParamPosition = Vec(660.5, 184.0);
    197 		auto frequencyCv14ParamPosition = Vec(660.5, 224.0);
    198 
    199 		auto frequencyCvInputPosition = Vec(9.5, 56.0);
    200 		auto bandwidthInputPosition = Vec(9.5, 121.0);
    201 		auto inInputPosition = Vec(10.5, 290.0);
    202 		auto level1InputPosition = Vec(84.5, 255.0);
    203 		auto frequencyCv1InputPosition = Vec(84.5, 290.0);
    204 		auto level2InputPosition = Vec(128.5, 255.0);
    205 		auto frequencyCv2InputPosition = Vec(128.5, 290.0);
    206 		auto level3InputPosition = Vec(172.5, 255.0);
    207 		auto frequencyCv3InputPosition = Vec(172.5, 290.0);
    208 		auto level4InputPosition = Vec(216.5, 255.0);
    209 		auto frequencyCv4InputPosition = Vec(216.5, 290.0);
    210 		auto level5InputPosition = Vec(260.5, 255.0);
    211 		auto frequencyCv5InputPosition = Vec(260.5, 290.0);
    212 		auto level6InputPosition = Vec(304.5, 255.0);
    213 		auto frequencyCv6InputPosition = Vec(304.5, 290.0);
    214 		auto level7InputPosition = Vec(348.5, 255.0);
    215 		auto frequencyCv7InputPosition = Vec(348.5, 290.0);
    216 		auto level8InputPosition = Vec(392.5, 255.0);
    217 		auto frequencyCv8InputPosition = Vec(392.5, 290.0);
    218 		auto level9InputPosition = Vec(436.5, 255.0);
    219 		auto frequencyCv9InputPosition = Vec(436.5, 290.0);
    220 		auto level10InputPosition = Vec(480.5, 255.0);
    221 		auto frequencyCv10InputPosition = Vec(480.5, 290.0);
    222 		auto level11InputPosition = Vec(524.5, 255.0);
    223 		auto frequencyCv11InputPosition = Vec(524.5, 290.0);
    224 		auto level12InputPosition = Vec(568.5, 255.0);
    225 		auto frequencyCv12InputPosition = Vec(568.5, 290.0);
    226 		auto level13InputPosition = Vec(612.5, 255.0);
    227 		auto frequencyCv13InputPosition = Vec(612.5, 290.0);
    228 		auto level14InputPosition = Vec(656.5, 255.0);
    229 		auto frequencyCv14InputPosition = Vec(656.5, 290.0);
    230 
    231 		auto oddsOutputPosition = Vec(40.5, 290.0);
    232 		auto outOutputPosition = Vec(10.5, 325.0);
    233 		auto evensOutputPosition = Vec(40.5, 325.0);
    234 		auto out1OutputPosition = Vec(84.5, 325.0);
    235 		auto out2OutputPosition = Vec(128.5, 325.0);
    236 		auto out3OutputPosition = Vec(172.5, 325.0);
    237 		auto out4OutputPosition = Vec(216.5, 325.0);
    238 		auto out5OutputPosition = Vec(260.5, 325.0);
    239 		auto out6OutputPosition = Vec(304.5, 325.0);
    240 		auto out7OutputPosition = Vec(348.5, 325.0);
    241 		auto out8OutputPosition = Vec(392.5, 325.0);
    242 		auto out9OutputPosition = Vec(436.5, 325.0);
    243 		auto out10OutputPosition = Vec(480.5, 325.0);
    244 		auto out11OutputPosition = Vec(524.5, 325.0);
    245 		auto out12OutputPosition = Vec(568.5, 325.0);
    246 		auto out13OutputPosition = Vec(612.5, 325.0);
    247 		auto out14OutputPosition = Vec(656.5, 325.0);
    248 
    249 		auto fmodRelativeLightPosition = Vec(28.5, 228.0);
    250 		auto fmodFullLightPosition = Vec(28.5, 241.0);
    251 		// end generated by svg_widgets.rb
    252 
    253 		addParam(createParam<Knob16>(frequencyCvParamPosition, module, PEQ14::FREQUENCY_CV_PARAM));
    254 		addParam(createParam<Knob16>(bandwidthParamPosition, module, PEQ14::BANDWIDTH_PARAM));
    255 		addParam(createParam<IndicatorButtonGreen9>(lpParamPosition, module, PEQ14::LP_PARAM));
    256 		addParam(createParam<IndicatorButtonGreen9>(hpParamPosition, module, PEQ14::HP_PARAM));
    257 		addParam(createParam<StatefulButton9>(fmodParamPosition, module, PEQ14::FMOD_PARAM));
    258 		addSlider(level1ParamPosition, module, PEQ14::LEVEL1_PARAM, module ? &module->_rms[0] : NULL);
    259 		addParam(createParam<Knob16>(frequency1ParamPosition, module, PEQ14::FREQUENCY1_PARAM));
    260 		addParam(createParam<Knob16>(frequencyCv1ParamPosition, module, PEQ14::FREQUENCY_CV1_PARAM));
    261 		addSlider(level2ParamPosition, module, PEQ14::LEVEL2_PARAM, module ? &module->_rms[1] : NULL);
    262 		addParam(createParam<Knob16>(frequency2ParamPosition, module, PEQ14::FREQUENCY2_PARAM));
    263 		addParam(createParam<Knob16>(frequencyCv2ParamPosition, module, PEQ14::FREQUENCY_CV2_PARAM));
    264 		addSlider(level3ParamPosition, module, PEQ14::LEVEL3_PARAM, module ? &module->_rms[2] : NULL);
    265 		addParam(createParam<Knob16>(frequency3ParamPosition, module, PEQ14::FREQUENCY3_PARAM));
    266 		addParam(createParam<Knob16>(frequencyCv3ParamPosition, module, PEQ14::FREQUENCY_CV3_PARAM));
    267 		addSlider(level4ParamPosition, module, PEQ14::LEVEL4_PARAM, module ? &module->_rms[3] : NULL);
    268 		addParam(createParam<Knob16>(frequency4ParamPosition, module, PEQ14::FREQUENCY4_PARAM));
    269 		addParam(createParam<Knob16>(frequencyCv4ParamPosition, module, PEQ14::FREQUENCY_CV4_PARAM));
    270 		addSlider(level5ParamPosition, module, PEQ14::LEVEL5_PARAM, module ? &module->_rms[4] : NULL);
    271 		addParam(createParam<Knob16>(frequency5ParamPosition, module, PEQ14::FREQUENCY5_PARAM));
    272 		addParam(createParam<Knob16>(frequencyCv5ParamPosition, module, PEQ14::FREQUENCY_CV5_PARAM));
    273 		addSlider(level6ParamPosition, module, PEQ14::LEVEL6_PARAM, module ? &module->_rms[5] : NULL);
    274 		addParam(createParam<Knob16>(frequency6ParamPosition, module, PEQ14::FREQUENCY6_PARAM));
    275 		addParam(createParam<Knob16>(frequencyCv6ParamPosition, module, PEQ14::FREQUENCY_CV6_PARAM));
    276 		addSlider(level7ParamPosition, module, PEQ14::LEVEL7_PARAM, module ? &module->_rms[6] : NULL);
    277 		addParam(createParam<Knob16>(frequency7ParamPosition, module, PEQ14::FREQUENCY7_PARAM));
    278 		addParam(createParam<Knob16>(frequencyCv7ParamPosition, module, PEQ14::FREQUENCY_CV7_PARAM));
    279 		addSlider(level8ParamPosition, module, PEQ14::LEVEL8_PARAM, module ? &module->_rms[7] : NULL);
    280 		addParam(createParam<Knob16>(frequency8ParamPosition, module, PEQ14::FREQUENCY8_PARAM));
    281 		addParam(createParam<Knob16>(frequencyCv8ParamPosition, module, PEQ14::FREQUENCY_CV8_PARAM));
    282 		addSlider(level9ParamPosition, module, PEQ14::LEVEL9_PARAM, module ? &module->_rms[8] : NULL);
    283 		addParam(createParam<Knob16>(frequency9ParamPosition, module, PEQ14::FREQUENCY9_PARAM));
    284 		addParam(createParam<Knob16>(frequencyCv9ParamPosition, module, PEQ14::FREQUENCY_CV9_PARAM));
    285 		addSlider(level10ParamPosition, module, PEQ14::LEVEL10_PARAM, module ? &module->_rms[9] : NULL);
    286 		addParam(createParam<Knob16>(frequency10ParamPosition, module, PEQ14::FREQUENCY10_PARAM));
    287 		addParam(createParam<Knob16>(frequencyCv10ParamPosition, module, PEQ14::FREQUENCY_CV10_PARAM));
    288 		addSlider(level11ParamPosition, module, PEQ14::LEVEL11_PARAM, module ? &module->_rms[10] : NULL);
    289 		addParam(createParam<Knob16>(frequency11ParamPosition, module, PEQ14::FREQUENCY11_PARAM));
    290 		addParam(createParam<Knob16>(frequencyCv11ParamPosition, module, PEQ14::FREQUENCY_CV11_PARAM));
    291 		addSlider(level12ParamPosition, module, PEQ14::LEVEL12_PARAM, module ? &module->_rms[11] : NULL);
    292 		addParam(createParam<Knob16>(frequency12ParamPosition, module, PEQ14::FREQUENCY12_PARAM));
    293 		addParam(createParam<Knob16>(frequencyCv12ParamPosition, module, PEQ14::FREQUENCY_CV12_PARAM));
    294 		addSlider(level13ParamPosition, module, PEQ14::LEVEL13_PARAM, module ? &module->_rms[12] : NULL);
    295 		addParam(createParam<Knob16>(frequency13ParamPosition, module, PEQ14::FREQUENCY13_PARAM));
    296 		addParam(createParam<Knob16>(frequencyCv13ParamPosition, module, PEQ14::FREQUENCY_CV13_PARAM));
    297 		addSlider(level14ParamPosition, module, PEQ14::LEVEL14_PARAM, module ? &module->_rms[13] : NULL);
    298 		addParam(createParam<Knob16>(frequency14ParamPosition, module, PEQ14::FREQUENCY14_PARAM));
    299 		addParam(createParam<Knob16>(frequencyCv14ParamPosition, module, PEQ14::FREQUENCY_CV14_PARAM));
    300 
    301 		addInput(createInput<Port24>(frequencyCvInputPosition, module, PEQ14::FREQUENCY_CV_INPUT));
    302 		addInput(createInput<Port24>(bandwidthInputPosition, module, PEQ14::BANDWIDTH_INPUT));
    303 		addInput(createInput<Port24>(inInputPosition, module, PEQ14::IN_INPUT));
    304 		addInput(createInput<Port24>(level1InputPosition, module, PEQ14::LEVEL1_INPUT));
    305 		addInput(createInput<Port24>(frequencyCv1InputPosition, module, PEQ14::FREQUENCY_CV1_INPUT));
    306 		addInput(createInput<Port24>(level2InputPosition, module, PEQ14::LEVEL2_INPUT));
    307 		addInput(createInput<Port24>(frequencyCv2InputPosition, module, PEQ14::FREQUENCY_CV2_INPUT));
    308 		addInput(createInput<Port24>(level3InputPosition, module, PEQ14::LEVEL3_INPUT));
    309 		addInput(createInput<Port24>(frequencyCv3InputPosition, module, PEQ14::FREQUENCY_CV3_INPUT));
    310 		addInput(createInput<Port24>(level4InputPosition, module, PEQ14::LEVEL4_INPUT));
    311 		addInput(createInput<Port24>(frequencyCv4InputPosition, module, PEQ14::FREQUENCY_CV4_INPUT));
    312 		addInput(createInput<Port24>(level5InputPosition, module, PEQ14::LEVEL5_INPUT));
    313 		addInput(createInput<Port24>(frequencyCv5InputPosition, module, PEQ14::FREQUENCY_CV5_INPUT));
    314 		addInput(createInput<Port24>(level6InputPosition, module, PEQ14::LEVEL6_INPUT));
    315 		addInput(createInput<Port24>(frequencyCv6InputPosition, module, PEQ14::FREQUENCY_CV6_INPUT));
    316 		addInput(createInput<Port24>(level7InputPosition, module, PEQ14::LEVEL7_INPUT));
    317 		addInput(createInput<Port24>(frequencyCv7InputPosition, module, PEQ14::FREQUENCY_CV7_INPUT));
    318 		addInput(createInput<Port24>(level8InputPosition, module, PEQ14::LEVEL8_INPUT));
    319 		addInput(createInput<Port24>(frequencyCv8InputPosition, module, PEQ14::FREQUENCY_CV8_INPUT));
    320 		addInput(createInput<Port24>(level9InputPosition, module, PEQ14::LEVEL9_INPUT));
    321 		addInput(createInput<Port24>(frequencyCv9InputPosition, module, PEQ14::FREQUENCY_CV9_INPUT));
    322 		addInput(createInput<Port24>(level10InputPosition, module, PEQ14::LEVEL10_INPUT));
    323 		addInput(createInput<Port24>(frequencyCv10InputPosition, module, PEQ14::FREQUENCY_CV10_INPUT));
    324 		addInput(createInput<Port24>(level11InputPosition, module, PEQ14::LEVEL11_INPUT));
    325 		addInput(createInput<Port24>(frequencyCv11InputPosition, module, PEQ14::FREQUENCY_CV11_INPUT));
    326 		addInput(createInput<Port24>(level12InputPosition, module, PEQ14::LEVEL12_INPUT));
    327 		addInput(createInput<Port24>(frequencyCv12InputPosition, module, PEQ14::FREQUENCY_CV12_INPUT));
    328 		addInput(createInput<Port24>(level13InputPosition, module, PEQ14::LEVEL13_INPUT));
    329 		addInput(createInput<Port24>(frequencyCv13InputPosition, module, PEQ14::FREQUENCY_CV13_INPUT));
    330 		addInput(createInput<Port24>(level14InputPosition, module, PEQ14::LEVEL14_INPUT));
    331 		addInput(createInput<Port24>(frequencyCv14InputPosition, module, PEQ14::FREQUENCY_CV14_INPUT));
    332 
    333 		addOutput(createOutput<Port24>(oddsOutputPosition, module, PEQ14::ODDS_OUTPUT));
    334 		addOutput(createOutput<Port24>(outOutputPosition, module, PEQ14::OUT_OUTPUT));
    335 		addOutput(createOutput<Port24>(evensOutputPosition, module, PEQ14::EVENS_OUTPUT));
    336 		addOutput(createOutput<Port24>(out1OutputPosition, module, PEQ14::OUT1_OUTPUT));
    337 		addOutput(createOutput<Port24>(out2OutputPosition, module, PEQ14::OUT2_OUTPUT));
    338 		addOutput(createOutput<Port24>(out3OutputPosition, module, PEQ14::OUT3_OUTPUT));
    339 		addOutput(createOutput<Port24>(out4OutputPosition, module, PEQ14::OUT4_OUTPUT));
    340 		addOutput(createOutput<Port24>(out5OutputPosition, module, PEQ14::OUT5_OUTPUT));
    341 		addOutput(createOutput<Port24>(out6OutputPosition, module, PEQ14::OUT6_OUTPUT));
    342 		addOutput(createOutput<Port24>(out7OutputPosition, module, PEQ14::OUT7_OUTPUT));
    343 		addOutput(createOutput<Port24>(out8OutputPosition, module, PEQ14::OUT8_OUTPUT));
    344 		addOutput(createOutput<Port24>(out9OutputPosition, module, PEQ14::OUT9_OUTPUT));
    345 		addOutput(createOutput<Port24>(out10OutputPosition, module, PEQ14::OUT10_OUTPUT));
    346 		addOutput(createOutput<Port24>(out11OutputPosition, module, PEQ14::OUT11_OUTPUT));
    347 		addOutput(createOutput<Port24>(out12OutputPosition, module, PEQ14::OUT12_OUTPUT));
    348 		addOutput(createOutput<Port24>(out13OutputPosition, module, PEQ14::OUT13_OUTPUT));
    349 		addOutput(createOutput<Port24>(out14OutputPosition, module, PEQ14::OUT14_OUTPUT));
    350 
    351 		addChild(createLight<BGSmallLight<GreenLight>>(fmodRelativeLightPosition, module, PEQ14::FMOD_RELATIVE_LIGHT));
    352 		addChild(createLight<BGSmallLight<GreenLight>>(fmodFullLightPosition, module, PEQ14::FMOD_FULL_LIGHT));
    353 	}
    354 
    355 	void addSlider(Vec position, PEQ14* module, int id, float* rms) {
    356 		auto slider = createParam<VUSlider151>(position, module, id);
    357 		if (rms) {
    358 			dynamic_cast<VUSlider*>(slider)->setVULevel(rms);
    359 		}
    360 		addParam(slider);
    361 	}
    362 };
    363 
    364 Model* modelPEQ14 = createModel<PEQ14, PEQ14Widget>("Bogaudio-PEQ14", "PEQ14", "14-channel parametric equalizer / filter bank", "Filter", "Vocoder", "Polyphonic");