BogaudioModules

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

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:
Msrc/AD.cpp | 4++--
Msrc/ADSR.cpp | 8++++----
Msrc/ASR.cpp | 4++--
Msrc/AddrSeq.cpp | 2+-
Msrc/DADSRH.cpp | 10+++++-----
Msrc/DADSRHPlus.cpp | 10+++++-----
Msrc/DGate.cpp | 4++--
Msrc/Edge.cpp | 2+-
Msrc/EightOne.cpp | 2+-
Msrc/FMOp.cpp | 8++++----
Msrc/Mix1.cpp | 2+-
Msrc/Mix2.cpp | 5++---
Msrc/OneEight.cpp | 2+-
Msrc/PEQ.cpp | 7+++----
Msrc/Pgmr.cpp | 2+-
Msrc/Shaper.cpp | 8++++----
Msrc/ShaperPlus.cpp | 8++++----
Msrc/Switch.cpp | 8++++----
Msrc/module.cpp | 1+
Msrc/module.hpp | 1+
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() { }