BogaudioModules

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

AddrSeq.cpp (4837B)


      1 
      2 #include "AddrSeq.hpp"
      3 
      4 void AddrSeq::processAlways(const ProcessArgs& args) {
      5 	if (expanderConnected()) {
      6 		AddrSeqExpanderMessage* te = toExpander();
      7 		te->baseID = _id;
      8 		te->position = 1;
      9 		te->rangeOffset = _rangeOffset;
     10 		te->rangeScale = _rangeScale;
     11 	}
     12 }
     13 
     14 void AddrSeq::processChannel(const ProcessArgs& args, int c) {
     15 	std::lock_guard<SpinLock> lock(_elementsLock);
     16 	std::vector<AddrSeqStep*>& steps = _elements;
     17 	int stepsN = steps.size();
     18 
     19 	if (c == 0) {
     20 		for (int i = 0; i < stepsN; ++i) {
     21 			steps[i]->lightSum = 0.0f;
     22 		}
     23 	}
     24 
     25 	int step = nextStep(
     26 		c,
     27 		&inputs[RESET_INPUT],
     28 		inputs[CLOCK_INPUT],
     29 		&params[STEPS_PARAM],
     30 		params[DIRECTION_PARAM],
     31 		&params[SELECT_PARAM],
     32 		inputs[SELECT_INPUT],
     33 		stepsN
     34 	);
     35 
     36 	float out = steps[step]->param.getValue();
     37 	out += _rangeOffset;
     38 	out *= _rangeScale;
     39 	outputs[OUT_OUTPUT].setChannels(_channels);
     40 	outputs[OUT_OUTPUT].setVoltage(out, c);
     41 
     42 	steps[step]->lightSum += 1;
     43 
     44 	if (c == _channels - 1) {
     45 		for (int i = 0; i < stepsN; ++i) {
     46 			steps[i]->light.value = steps[i]->lightSum * _inverseChannels;
     47 		}
     48 	}
     49 }
     50 
     51 struct AddrSeqWidget : AddressableSequenceModuleWidget {
     52 	static constexpr int hp = 6;
     53 
     54 	AddrSeqWidget(AddrSeq* module) {
     55 		setModule(module);
     56 		box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
     57 		setPanel(box.size, "AddrSeq");
     58 		createScrews();
     59 
     60 		// generated by svg_widgets.rb
     61 		auto stepsParamPosition = Vec(15.5, 131.5);
     62 		auto directionParamPosition = Vec(16.0, 167.5);
     63 		auto selectParamPosition = Vec(9.0, 230.0);
     64 		auto out1ParamPosition = Vec(58.5, 36.0);
     65 		auto out2ParamPosition = Vec(58.5, 77.3);
     66 		auto out3ParamPosition = Vec(58.5, 118.6);
     67 		auto out4ParamPosition = Vec(58.5, 159.9);
     68 		auto out5ParamPosition = Vec(58.5, 201.1);
     69 		auto out6ParamPosition = Vec(58.5, 242.4);
     70 		auto out7ParamPosition = Vec(58.5, 283.7);
     71 		auto out8ParamPosition = Vec(58.5, 325.0);
     72 
     73 		auto clockInputPosition = Vec(11.5, 35.0);
     74 		auto resetInputPosition = Vec(11.5, 72.0);
     75 		auto selectInputPosition = Vec(11.5, 270.0);
     76 
     77 		auto outOutputPosition = Vec(11.5, 324.0);
     78 
     79 		auto out1LightPosition = Vec(66.5, 58.5);
     80 		auto out2LightPosition = Vec(66.5, 99.8);
     81 		auto out3LightPosition = Vec(66.5, 141.1);
     82 		auto out4LightPosition = Vec(66.5, 182.4);
     83 		auto out5LightPosition = Vec(66.5, 223.6);
     84 		auto out6LightPosition = Vec(66.5, 264.9);
     85 		auto out7LightPosition = Vec(66.5, 306.2);
     86 		auto out8LightPosition = Vec(66.5, 347.5);
     87 		// end generated by svg_widgets.rb
     88 
     89 		addParam(createParam<Knob16>(stepsParamPosition, module, AddrSeq::STEPS_PARAM));
     90 		addParam(createParam<SliderSwitch2State14>(directionParamPosition, module, AddrSeq::DIRECTION_PARAM));
     91 		addParam(createParam<Knob29>(selectParamPosition, module, AddrSeq::SELECT_PARAM));
     92 		addParam(createParam<Knob16>(out1ParamPosition, module, AddrSeq::OUT1_PARAM));
     93 		addParam(createParam<Knob16>(out2ParamPosition, module, AddrSeq::OUT2_PARAM));
     94 		addParam(createParam<Knob16>(out3ParamPosition, module, AddrSeq::OUT3_PARAM));
     95 		addParam(createParam<Knob16>(out4ParamPosition, module, AddrSeq::OUT4_PARAM));
     96 		addParam(createParam<Knob16>(out5ParamPosition, module, AddrSeq::OUT5_PARAM));
     97 		addParam(createParam<Knob16>(out6ParamPosition, module, AddrSeq::OUT6_PARAM));
     98 		addParam(createParam<Knob16>(out7ParamPosition, module, AddrSeq::OUT7_PARAM));
     99 		addParam(createParam<Knob16>(out8ParamPosition, module, AddrSeq::OUT8_PARAM));
    100 
    101 		addInput(createInput<Port24>(clockInputPosition, module, AddrSeq::CLOCK_INPUT));
    102 		addInput(createInput<Port24>(resetInputPosition, module, AddrSeq::RESET_INPUT));
    103 		addInput(createInput<Port24>(selectInputPosition, module, AddrSeq::SELECT_INPUT));
    104 
    105 		addOutput(createOutput<Port24>(outOutputPosition, module, AddrSeq::OUT_OUTPUT));
    106 
    107 		addChild(createLight<BGSmallLight<GreenLight>>(out1LightPosition, module, AddrSeq::OUT1_LIGHT));
    108 		addChild(createLight<BGSmallLight<GreenLight>>(out2LightPosition, module, AddrSeq::OUT2_LIGHT));
    109 		addChild(createLight<BGSmallLight<GreenLight>>(out3LightPosition, module, AddrSeq::OUT3_LIGHT));
    110 		addChild(createLight<BGSmallLight<GreenLight>>(out4LightPosition, module, AddrSeq::OUT4_LIGHT));
    111 		addChild(createLight<BGSmallLight<GreenLight>>(out5LightPosition, module, AddrSeq::OUT5_LIGHT));
    112 		addChild(createLight<BGSmallLight<GreenLight>>(out6LightPosition, module, AddrSeq::OUT6_LIGHT));
    113 		addChild(createLight<BGSmallLight<GreenLight>>(out7LightPosition, module, AddrSeq::OUT7_LIGHT));
    114 		addChild(createLight<BGSmallLight<GreenLight>>(out8LightPosition, module, AddrSeq::OUT8_LIGHT));
    115 	}
    116 
    117 	void contextMenu(Menu* menu) override {
    118 		AddressableSequenceModuleWidget::contextMenu(menu);
    119 		OutputRangeOptionMenuItem::addOutputRangeOptionsToMenu(module, menu);
    120 	}
    121 };
    122 
    123 Model* modelAddrSeq = bogaudio::createModel<AddrSeq, AddrSeqWidget>("Bogaudio-AddrSeq", "ADDR-SEQ", "Voltage-addressable 8-step sequencer", "Sequencer", "Polyphonic");