MCPcopy Create free account
hub / github.com/VCVRack/Befaco / process

Method process

src/MuDi.cpp:59–123  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

57 }
58
59 void process(const ProcessArgs& args) override {
60
61 const int numPolyphonyEngines = inputs[CLOCK_INPUT].getChannels();
62
63 for (int c = 0; c < numPolyphonyEngines; c += 4) {
64 // reset
65 float_4 reset = resetTrigger[c / 4].process(inputs[RESET_INPUT].getPolyVoltageSimd<float_4>(c));
66 clockState_2[c / 4] = ifelse(reset, 0.f, clockState_2[c / 4]);
67 clockState_4[c / 4] = ifelse(reset, 0.f, clockState_4[c / 4]);
68 clockState_8[c / 4] = ifelse(reset, 0.f, clockState_8[c / 4]);
69 clockState_16[c / 4] = ifelse(reset, 0.f, clockState_16[c / 4]);
70
71 // base derived clock
72 float_4 triggered = clockTrigger_1[c / 4].process(inputs[CLOCK_INPUT].getVoltageSimd<float_4>(c));
73 clockState_1[c / 4] = clockTrigger_1[c / 4].isHigh();
74
75 // 1/2 derived clock changes state on every rising edge of the base clock
76 clockState_2[c / 4] = ifelse(triggered, ~clockState_2[c / 4], clockState_2[c / 4]);
77 float_4 clockTriggered_2 = clockTrigger_2[c / 4].process(ifelse(clockState_2[c / 4], 10.f, 0.f));
78
79 // 1/4 derived clock changes state on every rising edge of the 1/2 derived clock
80 clockState_4[c / 4] = ifelse(clockTriggered_2, ~clockState_4[c / 4], clockState_4[c / 4]);
81 float_4 clockTriggered_4 = clockTrigger_4[c / 4].process(ifelse(clockState_4[c / 4], 10.f, 0.f));
82
83 // 1/8 derived clock changes state on every rising edge of the 1/4 derived clock
84 clockState_8[c / 4] = ifelse(clockTriggered_4, ~clockState_8[c / 4], clockState_8[c / 4]);
85 float_4 clockTriggered_8 = clockTrigger_8[c / 4].process(ifelse(clockState_8[c / 4], 10.f, 0.f));
86
87 // 1/16 derived clock changes state on every rising edge of the 1/8 derived clock
88 clockState_16[c / 4] = ifelse(clockTriggered_8, ~clockState_16[c / 4], clockState_16[c / 4]);
89
90 // Set outputs
91 outputs[F_1_OUTPUT].setVoltageSimd(ifelse(clockState_1[c / 4], 10.f, 0.f) - 5.f * removeClockDC, c);
92 outputs[F_2_OUTPUT].setVoltageSimd(ifelse(clockState_2[c / 4], 10.f, 0.f) - 5.f * removeClockDC, c);
93 outputs[F_4_OUTPUT].setVoltageSimd(ifelse(clockState_4[c / 4], 10.f, 0.f) - 5.f * removeClockDC, c);
94 outputs[F_8_OUTPUT].setVoltageSimd(ifelse(clockState_8[c / 4], 10.f, 0.f) - 5.f * removeClockDC, c);
95 outputs[F_16_OUTPUT].setVoltageSimd(ifelse(clockState_16[c / 4], 10.f, 0.f) - 5.f * removeClockDC, c);
96 }
97
98 outputs[F_1_OUTPUT].setChannels(numPolyphonyEngines);
99 outputs[F_2_OUTPUT].setChannels(numPolyphonyEngines);
100 outputs[F_4_OUTPUT].setChannels(numPolyphonyEngines);
101 outputs[F_8_OUTPUT].setChannels(numPolyphonyEngines);
102 outputs[F_16_OUTPUT].setChannels(numPolyphonyEngines);
103
104 bool anyState[5] = {};
105 for (int c = 0; c < numPolyphonyEngines; c++) {
106 anyState[0] |= ifelse(clockState_1[c / 4], 1.f, 0.f)[c % 4] > 0.f;
107 anyState[1] |= ifelse(clockState_2[c / 4], 1.f, 0.f)[c % 4] > 0.f;
108 anyState[2] |= ifelse(clockState_4[c / 4], 1.f, 0.f)[c % 4] > 0.f;
109 anyState[3] |= ifelse(clockState_8[c / 4], 1.f, 0.f)[c % 4] > 0.f;
110 anyState[4] |= ifelse(clockState_16[c / 4], 1.f, 0.f)[c % 4] > 0.f;
111 }
112
113 // Set lights
114 if (lightDivider.process()) {
115 float lightTime = args.sampleTime * lightDivider.getDivision();
116

Callers

nothing calls this directly

Calls 1

getChannelsMethod · 0.80

Tested by

no test coverage detected