commit 50db8a221902514e4834a2a596e0ed02bf1aa616
parent aa49da07eff2e29dae76cb655a4ce6f565e05318
Author: Matt Demanett <matt@demanett.net>
Date: Tue, 16 Jun 2020 00:08:36 -0400
Add _inverseChannels to base module, and use it wherever previously divided by the poly channel count; this is a minor performance improvement, and eliminates a class of divide by zero bugs.
Diffstat:
20 files changed, 49 insertions(+), 49 deletions(-)
diff --git a/src/AD.cpp b/src/AD.cpp
@@ -121,8 +121,8 @@ void AD::processChannel(const ProcessArgs& args, int c) {
}
void AD::postProcessAlways(const ProcessArgs& args) {
- lights[ATTACK_LIGHT].value = _attackLightSum / (float)_channels;
- lights[DECAY_LIGHT].value = _decayLightSum / (float)_channels;
+ lights[ATTACK_LIGHT].value = _attackLightSum * _inverseChannels;
+ lights[DECAY_LIGHT].value = _decayLightSum * _inverseChannels;
}
struct ADWidget : ModuleWidget {
diff --git a/src/ADSR.cpp b/src/ADSR.cpp
@@ -89,10 +89,10 @@ void ADSR::processChannel(const ProcessArgs& args, int c) {
}
void ADSR::postProcessAlways(const ProcessArgs& args) {
- lights[ATTACK_LIGHT].value = _attackLightSum / (float)_channels;
- lights[DECAY_LIGHT].value = _decayLightSum / (float)_channels;
- lights[SUSTAIN_LIGHT].value = _sustainLightSum / (float)_channels;
- lights[RELEASE_LIGHT].value = _releaseLightSum / (float)_channels;
+ lights[ATTACK_LIGHT].value = _attackLightSum * _inverseChannels;
+ lights[DECAY_LIGHT].value = _decayLightSum * _inverseChannels;
+ lights[SUSTAIN_LIGHT].value = _sustainLightSum * _inverseChannels;
+ lights[RELEASE_LIGHT].value = _releaseLightSum * _inverseChannels;
}
struct ADSRWidget : ModuleWidget {
diff --git a/src/ASR.cpp b/src/ASR.cpp
@@ -108,8 +108,8 @@ void ASR::processChannel(const ProcessArgs& args, int c) {
}
void ASR::postProcessAlways(const ProcessArgs& args) {
- lights[ATTACK_LIGHT].value = _attackLightSum / (float)_channels;
- lights[RELEASE_LIGHT].value = _releaseLightSum / (float)_channels;
+ lights[ATTACK_LIGHT].value = _attackLightSum * _inverseChannels;
+ lights[RELEASE_LIGHT].value = _releaseLightSum * _inverseChannels;
}
struct ASRWidget : ModuleWidget {
diff --git a/src/AddrSeq.cpp b/src/AddrSeq.cpp
@@ -29,7 +29,7 @@ void AddrSeq::processChannel(const ProcessArgs& args, int c) {
void AddrSeq::postProcessAlways(const ProcessArgs& args) {
for (int i = 0; i < 8; ++i) {
- lights[OUT1_LIGHT + i].value = _lightSums[i] / (float)_channels;
+ lights[OUT1_LIGHT + i].value = _lightSums[i] * _inverseChannels;
}
}
diff --git a/src/DADSRH.cpp b/src/DADSRH.cpp
@@ -87,11 +87,11 @@ void DADSRH::postProcess(const ProcessArgs& args) {
sustainSum += _sustainLights[c];
releaseSum += _releaseLights[c];
}
- lights[DELAY_LIGHT].value = delaySum / (float)_channels;
- lights[ATTACK_LIGHT].value = attackSum / (float)_channels;
- lights[DECAY_LIGHT].value = decaySum / (float)_channels;
- lights[SUSTAIN_LIGHT].value = sustainSum / (float)_channels;
- lights[RELEASE_LIGHT].value = releaseSum / (float)_channels;
+ lights[DELAY_LIGHT].value = delaySum * _inverseChannels;
+ lights[ATTACK_LIGHT].value = attackSum * _inverseChannels;
+ lights[DECAY_LIGHT].value = decaySum * _inverseChannels;
+ lights[SUSTAIN_LIGHT].value = sustainSum * _inverseChannels;
+ lights[RELEASE_LIGHT].value = releaseSum * _inverseChannels;
}
bool DADSRH::shouldTriggerOnNextLoad() {
diff --git a/src/DADSRHPlus.cpp b/src/DADSRHPlus.cpp
@@ -87,11 +87,11 @@ void DADSRHPlus::postProcess(const ProcessArgs& args) {
sustainSum += _sustainLights[c];
releaseSum += _releaseLights[c];
}
- lights[DELAY_LIGHT].value = delaySum / (float)_channels;
- lights[ATTACK_LIGHT].value = attackSum / (float)_channels;
- lights[DECAY_LIGHT].value = decaySum / (float)_channels;
- lights[SUSTAIN_LIGHT].value = sustainSum / (float)_channels;
- lights[RELEASE_LIGHT].value = releaseSum / (float)_channels;
+ lights[DELAY_LIGHT].value = delaySum * _inverseChannels;
+ lights[ATTACK_LIGHT].value = attackSum * _inverseChannels;
+ lights[DECAY_LIGHT].value = decaySum * _inverseChannels;
+ lights[SUSTAIN_LIGHT].value = sustainSum * _inverseChannels;
+ lights[RELEASE_LIGHT].value = releaseSum * _inverseChannels;
}
bool DADSRHPlus::shouldTriggerOnNextLoad() {
diff --git a/src/DGate.cpp b/src/DGate.cpp
@@ -94,8 +94,8 @@ void DGate::postProcess(const ProcessArgs& args) {
delaySum += _engines[c]->delayLight;
gateSum += _engines[c]->gateLight;
}
- lights[DELAY_LIGHT].value = delaySum / (float)_channels;
- lights[GATE_LIGHT].value = gateSum / (float)_channels;
+ lights[DELAY_LIGHT].value = delaySum * _inverseChannels;
+ lights[GATE_LIGHT].value = gateSum * _inverseChannels;
}
bool DGate::stepStage(int c, Param& knob) {
diff --git a/src/Edge.cpp b/src/Edge.cpp
@@ -91,7 +91,7 @@ void Edge::processChannel(const ProcessArgs& args, int c) {
}
void Edge::postProcessAlways(const ProcessArgs& args) {
- lights[HIGH_LIGHT].value = _highLightSum / (float)_channels;
+ lights[HIGH_LIGHT].value = _highLightSum * _inverseChannels;
}
struct EdgeWidget : ModuleWidget {
diff --git a/src/EightOne.cpp b/src/EightOne.cpp
@@ -33,7 +33,7 @@ void EightOne::processChannel(const ProcessArgs& args, int c) {
void EightOne::postProcessAlways(const ProcessArgs& args) {
for (int i = 0; i < 8; ++i) {
- lights[IN1_LIGHT + i].value = _lightSums[i] / (float)_channels;
+ lights[IN1_LIGHT + i].value = _lightSums[i] * _inverseChannels;
}
}
diff --git a/src/FMOp.cpp b/src/FMOp.cpp
@@ -254,10 +254,10 @@ void FMOp::processChannel(const ProcessArgs& args, int c) {
}
void FMOp::postProcessAlways(const ProcessArgs& args) {
- lights[ATTACK_LIGHT].value = _attackLightSum / (float)_channels;
- lights[DECAY_LIGHT].value = _decayLightSum / (float)_channels;
- lights[SUSTAIN_LIGHT].value = _sustainLightSum / (float)_channels;
- lights[RELEASE_LIGHT].value = _releaseLightSum / (float)_channels;
+ lights[ATTACK_LIGHT].value = _attackLightSum * _inverseChannels;
+ lights[DECAY_LIGHT].value = _decayLightSum * _inverseChannels;
+ lights[SUSTAIN_LIGHT].value = _sustainLightSum * _inverseChannels;
+ lights[RELEASE_LIGHT].value = _releaseLightSum * _inverseChannels;
}
struct FMOpWidget : ModuleWidget {
diff --git a/src/Mix1.cpp b/src/Mix1.cpp
@@ -45,7 +45,7 @@ void Mix1::processChannel(const ProcessArgs& args, int c) {
}
void Mix1::postProcessAlways(const ProcessArgs& args) {
- _rms = _rmsSum / (float)_channels;
+ _rms = _rmsSum * _inverseChannels;
}
struct Mix1Widget : ModuleWidget {
diff --git a/src/Mix2.cpp b/src/Mix2.cpp
@@ -56,9 +56,8 @@ void Mix2::processChannel(const ProcessArgs& args, int c) {
}
void Mix2::postProcessAlways(const ProcessArgs& args) {
- float ic = 1.0f / (float)std::max(1, _channels);
- _leftRms = _leftRmsSum * ic;
- _rightRms = _rightRmsSum * ic;
+ _leftRms = _leftRmsSum * _inverseChannels;
+ _rightRms = _rightRmsSum * _inverseChannels;
}
struct Mix2Widget : ModuleWidget {
diff --git a/src/OneEight.cpp b/src/OneEight.cpp
@@ -44,7 +44,7 @@ void OneEight::processChannel(const ProcessArgs& args, int c) {
void OneEight::postProcessAlways(const ProcessArgs& args) {
for (int i = 0; i < 8; ++i) {
- lights[OUT1_LIGHT + i].value = _lightSums[i] / (float)_channels;
+ lights[OUT1_LIGHT + i].value = _lightSums[i] * _inverseChannels;
}
}
diff --git a/src/PEQ.cpp b/src/PEQ.cpp
@@ -62,10 +62,9 @@ void PEQ::processChannel(const ProcessArgs& args, int c) {
}
void PEQ::postProcessAlways(const ProcessArgs& args) {
- float ic = 1.0f / (float)std::max(1, _channels);
- lights[A_LIGHT].value = _rmsSums[0] * ic;
- lights[B_LIGHT].value = _rmsSums[1] * ic;
- lights[C_LIGHT].value = _rmsSums[2] * ic;
+ lights[A_LIGHT].value = _rmsSums[0] * _inverseChannels;
+ lights[B_LIGHT].value = _rmsSums[1] * _inverseChannels;
+ lights[C_LIGHT].value = _rmsSums[2] * _inverseChannels;
}
struct PEQWidget : ModuleWidget {
diff --git a/src/Pgmr.cpp b/src/Pgmr.cpp
@@ -194,7 +194,7 @@ void Pgmr::processChannel(const ProcessArgs& args, int c) {
if (c == _channels - 1) {
for (int i = 0, n = _steps.size(); i < n; ++i) {
- _steps[i]->selectedLight.value = _steps[i]->lightSum / (float)_channels;
+ _steps[i]->selectedLight.value = _steps[i]->lightSum * _inverseChannels;
}
}
}
diff --git a/src/Shaper.cpp b/src/Shaper.cpp
@@ -71,10 +71,10 @@ void Shaper::postProcess(const ProcessArgs& args) {
decaySum += _decayLights[c];
offSum += _offLights[c];
}
- lights[ATTACK_LIGHT].value = attackSum / (float)_channels;
- lights[ON_LIGHT].value = onSum / (float)_channels;
- lights[DECAY_LIGHT].value = decaySum / (float)_channels;
- lights[OFF_LIGHT].value = offSum / (float)_channels;
+ lights[ATTACK_LIGHT].value = attackSum * _inverseChannels;
+ lights[ON_LIGHT].value = onSum * _inverseChannels;
+ lights[DECAY_LIGHT].value = decaySum * _inverseChannels;
+ lights[OFF_LIGHT].value = offSum * _inverseChannels;
}
bool Shaper::shouldTriggerOnNextLoad() {
diff --git a/src/ShaperPlus.cpp b/src/ShaperPlus.cpp
@@ -71,10 +71,10 @@ void ShaperPlus::postProcess(const ProcessArgs& args) {
decaySum += _decayLights[c];
offSum += _offLights[c];
}
- lights[ATTACK_LIGHT].value = attackSum / (float)_channels;
- lights[ON_LIGHT].value = onSum / (float)_channels;
- lights[DECAY_LIGHT].value = decaySum / (float)_channels;
- lights[OFF_LIGHT].value = offSum / (float)_channels;
+ lights[ATTACK_LIGHT].value = attackSum * _inverseChannels;
+ lights[ON_LIGHT].value = onSum * _inverseChannels;
+ lights[DECAY_LIGHT].value = decaySum * _inverseChannels;
+ lights[OFF_LIGHT].value = offSum * _inverseChannels;
}
bool ShaperPlus::shouldTriggerOnNextLoad() {
diff --git a/src/Switch.cpp b/src/Switch.cpp
@@ -113,10 +113,10 @@ void bogaudio::Switch::processChannel(const ProcessArgs& args, int c) {
}
void bogaudio::Switch::postProcessAlways(const ProcessArgs& args) {
- lights[HIGH1_LIGHT].value = _high1LightSum / (float)_channels;
- lights[LOW1_LIGHT].value = _low1LightSum / (float)_channels;
- lights[HIGH2_LIGHT].value = _high2LightSum / (float)_channels;
- lights[LOW2_LIGHT].value = _low2LightSum / (float)_channels;
+ lights[HIGH1_LIGHT].value = _high1LightSum * _inverseChannels;
+ lights[LOW1_LIGHT].value = _low1LightSum * _inverseChannels;
+ lights[HIGH2_LIGHT].value = _high2LightSum * _inverseChannels;
+ lights[LOW2_LIGHT].value = _low2LightSum * _inverseChannels;
}
struct SwitchWidget : ModuleWidget {
diff --git a/src/module.cpp b/src/module.cpp
@@ -30,6 +30,7 @@ void BGModule::process(const ProcessArgs& args) {
int channelsNow = std::max(1, channels());
if (channelsBefore != channelsNow) {
_channels = channelsNow;
+ _inverseChannels = 1.0f / (float)_channels;
channelsChanged(channelsBefore, channelsNow);
if (channelsBefore < channelsNow) {
while (channelsBefore < channelsNow) {
diff --git a/src/module.hpp b/src/module.hpp
@@ -12,6 +12,7 @@ struct BGModule : Module {
static constexpr int maxChannels = PORT_MAX_CHANNELS;
int _channels = 0;
+ float _inverseChannels = 0.0f;
BGModule() {
}