BogaudioModules

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

commit b091e0b8c8f1ed4030be71bd18fc22e5927ef5e6
parent 7d80459c9800ca1452d4a6b46bbc13032d436f85
Author: Matt Demanett <matt@demanett.net>
Date:   Sat, 18 May 2019 00:42:33 -0400

v1: RUNS!  Barely.

Diffstat:
M.gitignore | 1+
Msrc/Additator.cpp | 37++++++++++++++++++++++++-------------
Msrc/Additator.hpp | 12+-----------
Msrc/Blank3.cpp | 5+++++
Msrc/Blank6.cpp | 5+++++
Msrc/EightFO.cpp | 25+++++++++++++++++--------
Msrc/EightFO.hpp | 8--------
Msrc/Mix1.cpp | 4+++-
Msrc/Mix4.cpp | 16+++++++++-------
Msrc/Mix8.cpp | 24+++++++++++++-----------
Msrc/Pressor.cpp | 5+++++
Msrc/Reftone.cpp | 5+++++
Msrc/VCAmp.cpp | 9+++++++--
Msrc/VCAmp.hpp | 2--
Msrc/VU.cpp | 5+++++
Msrc/Walk2.cpp | 5+++++
Msrc/analyzer_base.cpp | 5+++++
Msrc/lfo_base.hpp | 41+++++++++++++++++++++--------------------
18 files changed, 131 insertions(+), 83 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -38,3 +38,4 @@ testmain releasenote.md plot plot.* +lldb.cmd diff --git a/src/Additator.cpp b/src/Additator.cpp @@ -1,6 +1,17 @@ #include "Additator.hpp" +const int modulationSteps = 100; +const float maxWidth = 2.0f; +const float maxSkew = 0.99f; +const float minAmplitudeNormalization = 1.0f; +const float maxAmplitudeNormalization = 5.0f; +const float minDecay = -1.0f; +const float maxDecay = 3.0f; +const float minFilter = 0.1; +const float maxFilter = 1.9; +const float slewLimitTime = 1.0f; + void Additator::onReset() { _syncTrigger.reset(); _steps = modulationSteps; @@ -195,38 +206,38 @@ struct AdditatorWidget : ModuleWidget { addParam(createParam<Knob68>(frequencyParamPosition, module, Additator::FREQUENCY_PARAM, -3.0, 6.0, 0.0)); { - auto w = createParam<Knob38>(partialsParamPosition, module, Additator::PARTIALS_PARAM, 1.0, module->maxPartials, module->maxPartials / 5.0); + auto w = createParam<Knob38>(partialsParamPosition, module, Additator::PARTIALS_PARAM, 1.0, Additator::maxPartials, Additator::maxPartials / 5.0); dynamic_cast<Knob*>(w)->snap = true; addParam(w); } addParam(createParam<Knob16>(fineParamPosition, module, Additator::FINE_PARAM, -1.0, 1.0, 0.0)); - addParam(createParam<Knob26>(widthParamPosition, module, Additator::WIDTH_PARAM, 0.0, module->maxWidth, module->maxWidth / 2.0)); - addParam(createParam<Knob26>(oddSkewParamPosition, module, Additator::ODD_SKEW_PARAM, -module->maxSkew, module->maxSkew, 0.0)); - addParam(createParam<Knob26>(evenSkewParamPosition, module, Additator::EVEN_SKEW_PARAM, -module->maxSkew, module->maxSkew, 0.0)); + addParam(createParam<Knob26>(widthParamPosition, module, Additator::WIDTH_PARAM, 0.0, maxWidth, maxWidth / 2.0)); + addParam(createParam<Knob26>(oddSkewParamPosition, module, Additator::ODD_SKEW_PARAM, -maxSkew, maxSkew, 0.0)); + addParam(createParam<Knob26>(evenSkewParamPosition, module, Additator::EVEN_SKEW_PARAM, -maxSkew, maxSkew, 0.0)); addParam(createParam<Knob26>( gainParamPosition, module, Additator::GAIN_PARAM, - module->minAmplitudeNormalization, - module->maxAmplitudeNormalization, - (module->maxAmplitudeNormalization - module->minAmplitudeNormalization) / 2.0 + module->minAmplitudeNormalization + minAmplitudeNormalization, + maxAmplitudeNormalization, + (maxAmplitudeNormalization - minAmplitudeNormalization) / 2.0 + minAmplitudeNormalization )); addParam(createParam<Knob26>( decayParamPosition, module, Additator::DECAY_PARAM, - module->minDecay, - module->maxDecay, - (module->maxDecay - module->minDecay) / 2.0 + module->minDecay + minDecay, + maxDecay, + (maxDecay - minDecay) / 2.0 + minDecay )); addParam(createParam<Knob26>(balanceParamPosition, module, Additator::BALANCE_PARAM, -1.0, 1.0, 0.0)); addParam(createParam<Knob26>( filterParamPosition, module, Additator::FILTER_PARAM, - module->minFilter, - module->maxFilter, - (module->maxFilter - module->minFilter) / 2.0 + module->minFilter + minFilter, + maxFilter, + (maxFilter - minFilter) / 2.0 + minFilter )); addParam(createParam<StatefulButton9>(phaseParamPosition, module, Additator::PHASE_PARAM, 1.0, 2.0, 1.0)); diff --git a/src/Additator.hpp b/src/Additator.hpp @@ -58,17 +58,7 @@ struct Additator : Module { PHASE_COSINE }; - const int modulationSteps = 100; - const int maxPartials = 100; - const float maxWidth = 2.0f; - const float maxSkew = 0.99f; - const float minAmplitudeNormalization = 1.0f; - const float maxAmplitudeNormalization = 5.0f; - const float minDecay = -1.0f; - const float maxDecay = 3.0f; - const float minFilter = 0.1; - const float maxFilter = 1.9; - const float slewLimitTime = 1.0f; + static constexpr int maxPartials = 100; int _steps = 0; int _partials = 0; diff --git a/src/Blank3.cpp b/src/Blank3.cpp @@ -30,6 +30,11 @@ struct Blank3Display : OpaqueWidget { } void draw(NVGcontext* vg) override { + // FIXME.v1 + if (!_module) { + return; + } + float offsetX = box.size.x / 2.0f; float offsetY = box.size.y / 2.0f; nvgSave(vg); diff --git a/src/Blank6.cpp b/src/Blank6.cpp @@ -30,6 +30,11 @@ struct Blank6Display : OpaqueWidget { } void draw(NVGcontext* vg) override { + // FIXME.v1 + if (!_module) { + return; + } + float offsetX = box.size.x / 2.0f; float offsetY = box.size.y / 2.0f; nvgSave(vg); diff --git a/src/EightFO.cpp b/src/EightFO.cpp @@ -1,6 +1,15 @@ #include "EightFO.hpp" +const Phasor::phase_delta_t basePhase7Offset = Phasor::radiansToPhase(1.75f * M_PI); +const Phasor::phase_delta_t basePhase6Offset = Phasor::radiansToPhase(1.5f * M_PI); +const Phasor::phase_delta_t basePhase5Offset = Phasor::radiansToPhase(1.25f * M_PI); +const Phasor::phase_delta_t basePhase4Offset = Phasor::radiansToPhase(M_PI); +const Phasor::phase_delta_t basePhase3Offset = Phasor::radiansToPhase(0.75f * M_PI); +const Phasor::phase_delta_t basePhase2Offset = Phasor::radiansToPhase(0.5f * M_PI); +const Phasor::phase_delta_t basePhase1Offset = Phasor::radiansToPhase(0.25f * M_PI); +const Phasor::phase_delta_t basePhase0Offset = Phasor::radiansToPhase(0.0f); + void EightFO::onReset() { _resetTrigger.reset(); _modulationStep = modulationSteps; @@ -227,14 +236,14 @@ struct EightFOWidget : LFOBaseWidget { addParam(createParam<Knob26>(offsetParamPosition, module, EightFO::OFFSET_PARAM, -1.0, 1.0, 0.0)); addParam(createParam<Knob26>(scaleParamPosition, module, EightFO::SCALE_PARAM, 0.0, 1.0, 1.0)); - addPhaseParam(phase7ParamPosition, module, EightFO::PHASE7_PARAM, Phasor::phaseToRadians(module->basePhase7Offset)); - addPhaseParam(phase6ParamPosition, module, EightFO::PHASE6_PARAM, Phasor::phaseToRadians(module->basePhase6Offset)); - addPhaseParam(phase5ParamPosition, module, EightFO::PHASE5_PARAM, Phasor::phaseToRadians(module->basePhase5Offset)); - addPhaseParam(phase4ParamPosition, module, EightFO::PHASE4_PARAM, Phasor::phaseToRadians(module->basePhase4Offset)); - addPhaseParam(phase3ParamPosition, module, EightFO::PHASE3_PARAM, Phasor::phaseToRadians(module->basePhase3Offset)); - addPhaseParam(phase2ParamPosition, module, EightFO::PHASE2_PARAM, Phasor::phaseToRadians(module->basePhase2Offset)); - addPhaseParam(phase1ParamPosition, module, EightFO::PHASE1_PARAM, Phasor::phaseToRadians(module->basePhase1Offset)); - addPhaseParam(phase0ParamPosition, module, EightFO::PHASE0_PARAM, Phasor::phaseToRadians(module->basePhase0Offset)); + addPhaseParam(phase7ParamPosition, module, EightFO::PHASE7_PARAM, Phasor::phaseToRadians(basePhase7Offset)); + addPhaseParam(phase6ParamPosition, module, EightFO::PHASE6_PARAM, Phasor::phaseToRadians(basePhase6Offset)); + addPhaseParam(phase5ParamPosition, module, EightFO::PHASE5_PARAM, Phasor::phaseToRadians(basePhase5Offset)); + addPhaseParam(phase4ParamPosition, module, EightFO::PHASE4_PARAM, Phasor::phaseToRadians(basePhase4Offset)); + addPhaseParam(phase3ParamPosition, module, EightFO::PHASE3_PARAM, Phasor::phaseToRadians(basePhase3Offset)); + addPhaseParam(phase2ParamPosition, module, EightFO::PHASE2_PARAM, Phasor::phaseToRadians(basePhase2Offset)); + addPhaseParam(phase1ParamPosition, module, EightFO::PHASE1_PARAM, Phasor::phaseToRadians(basePhase1Offset)); + addPhaseParam(phase0ParamPosition, module, EightFO::PHASE0_PARAM, Phasor::phaseToRadians(basePhase0Offset)); addInput(createPort<Port24>(samplePwmInputPosition, PortWidget::INPUT, module, EightFO::SAMPLE_PWM_INPUT)); addInput(createPort<Port24>(offsetInputPosition, PortWidget::INPUT, module, EightFO::OFFSET_INPUT)); diff --git a/src/EightFO.hpp b/src/EightFO.hpp @@ -73,14 +73,6 @@ struct EightFO : LFOBase { const int modulationSteps = 100; const float amplitude = 5.0f; - const Phasor::phase_delta_t basePhase7Offset = Phasor::radiansToPhase(1.75f * M_PI); - const Phasor::phase_delta_t basePhase6Offset = Phasor::radiansToPhase(1.5f * M_PI); - const Phasor::phase_delta_t basePhase5Offset = Phasor::radiansToPhase(1.25f * M_PI); - const Phasor::phase_delta_t basePhase4Offset = Phasor::radiansToPhase(M_PI); - const Phasor::phase_delta_t basePhase3Offset = Phasor::radiansToPhase(0.75f * M_PI); - const Phasor::phase_delta_t basePhase2Offset = Phasor::radiansToPhase(0.5f * M_PI); - const Phasor::phase_delta_t basePhase1Offset = Phasor::radiansToPhase(0.25f * M_PI); - const Phasor::phase_delta_t basePhase0Offset = Phasor::radiansToPhase(0.0f); int _modulationStep = 0; Wave _wave = NO_WAVE; diff --git a/src/Mix1.cpp b/src/Mix1.cpp @@ -46,7 +46,9 @@ struct Mix1Widget : ModuleWidget { 1.0, fabsf(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels) ); - dynamic_cast<VUSlider*>(slider)->setVULevel(&module->_channel.rms); + if (module) { + dynamic_cast<VUSlider*>(slider)->setVULevel(&module->_channel.rms); + } addParam(slider); } addParam(createParam<MuteButton>(muteParamPosition, module, Mix1::MUTE_PARAM, 0.0, 1.0, 0.0)); diff --git a/src/Mix4.cpp b/src/Mix4.cpp @@ -119,19 +119,19 @@ struct Mix4Widget : ModuleWidget { auto rOutputPosition = Vec(186.5, 325.0); // end generated by svg_widgets.rb - addSlider(level1ParamPosition, module, Mix4::LEVEL1_PARAM, module->_channel1.rms); + addSlider(level1ParamPosition, module, Mix4::LEVEL1_PARAM, module ? &module->_channel1.rms : NULL); addParam(createParam<Knob16>(pan1ParamPosition, module, Mix4::PAN1_PARAM, -1.0, 1.0, 0.0)); addParam(createParam<SoloMuteButton>(mute1ParamPosition, module, Mix4::MUTE1_PARAM, 0.0, 3.0, 0.0)); - addSlider(level2ParamPosition, module, Mix4::LEVEL2_PARAM, module->_channel2.rms); + addSlider(level2ParamPosition, module, Mix4::LEVEL2_PARAM, module ? &module->_channel2.rms : NULL); addParam(createParam<Knob16>(pan2ParamPosition, module, Mix4::PAN2_PARAM, -1.0, 1.0, 0.0)); addParam(createParam<SoloMuteButton>(mute2ParamPosition, module, Mix4::MUTE2_PARAM, 0.0, 3.0, 0.0)); - addSlider(level3ParamPosition, module, Mix4::LEVEL3_PARAM, module->_channel3.rms); + addSlider(level3ParamPosition, module, Mix4::LEVEL3_PARAM, module ? &module->_channel3.rms : NULL); addParam(createParam<Knob16>(pan3ParamPosition, module, Mix4::PAN3_PARAM, -1.0, 1.0, 0.0)); addParam(createParam<SoloMuteButton>(mute3ParamPosition, module, Mix4::MUTE3_PARAM, 0.0, 3.0, 0.0)); - addSlider(level4ParamPosition, module, Mix4::LEVEL4_PARAM, module->_channel4.rms); + addSlider(level4ParamPosition, module, Mix4::LEVEL4_PARAM, module ? &module->_channel4.rms : NULL); addParam(createParam<Knob16>(pan4ParamPosition, module, Mix4::PAN4_PARAM, -1.0, 1.0, 0.0)); addParam(createParam<SoloMuteButton>(mute4ParamPosition, module, Mix4::MUTE4_PARAM, 0.0, 3.0, 0.0)); - addSlider(mixParamPosition, module, Mix4::MIX_PARAM, module->_rmsLevel); + addSlider(mixParamPosition, module, Mix4::MIX_PARAM, module ? &module->_rmsLevel : NULL); addParam(createParam<MuteButton>(mixMuteParamPosition, module, Mix4::MIX_MUTE_PARAM, 0.0, 1.0, 0.0)); addInput(createPort<Port24>(cv1InputPosition, PortWidget::INPUT, module, Mix4::CV1_INPUT)); @@ -152,7 +152,7 @@ struct Mix4Widget : ModuleWidget { addOutput(createPort<Port24>(rOutputPosition, PortWidget::OUTPUT, module, Mix4::R_OUTPUT)); } - void addSlider(Vec position, Mix4* module, int id, float& rms) { + void addSlider(Vec position, Mix4* module, int id, float* rms) { auto slider = createParam<VUSlider151>( position, module, @@ -161,7 +161,9 @@ struct Mix4Widget : ModuleWidget { 1.0, fabsf(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels) ); - dynamic_cast<VUSlider*>(slider)->setVULevel(&rms); + if (rms) { + dynamic_cast<VUSlider*>(slider)->setVULevel(rms); + } addParam(slider); } }; diff --git a/src/Mix8.cpp b/src/Mix8.cpp @@ -167,31 +167,31 @@ struct Mix8Widget : ModuleWidget { auto rOutputPosition = Vec(366.5, 325.0); // end generated by svg_widgets.rb - addSlider(level1ParamPosition, module, Mix8::LEVEL1_PARAM, module->_channel1.rms); + addSlider(level1ParamPosition, module, Mix8::LEVEL1_PARAM, module ? &module->_channel1.rms : NULL); addParam(createParam<SoloMuteButton>(mute1ParamPosition, module, Mix8::MUTE1_PARAM, 0.0, 3.0, 0.0)); addParam(createParam<Knob16>(pan1ParamPosition, module, Mix8::PAN1_PARAM, -1.0, 1.0, 0.0)); - addSlider(level2ParamPosition, module, Mix8::LEVEL2_PARAM, module->_channel2.rms); + addSlider(level2ParamPosition, module, Mix8::LEVEL2_PARAM, module ? &module->_channel2.rms : NULL); addParam(createParam<SoloMuteButton>(mute2ParamPosition, module, Mix8::MUTE2_PARAM, 0.0, 3.0, 0.0)); addParam(createParam<Knob16>(pan2ParamPosition, module, Mix8::PAN2_PARAM, -1.0, 1.0, 0.0)); - addSlider(level3ParamPosition, module, Mix8::LEVEL3_PARAM, module->_channel3.rms); + addSlider(level3ParamPosition, module, Mix8::LEVEL3_PARAM, module ? &module->_channel3.rms : NULL); addParam(createParam<SoloMuteButton>(mute3ParamPosition, module, Mix8::MUTE3_PARAM, 0.0, 3.0, 0.0)); addParam(createParam<Knob16>(pan3ParamPosition, module, Mix8::PAN3_PARAM, -1.0, 1.0, 0.0)); - addSlider(level4ParamPosition, module, Mix8::LEVEL4_PARAM, module->_channel4.rms); + addSlider(level4ParamPosition, module, Mix8::LEVEL4_PARAM, module ? &module->_channel4.rms : NULL); addParam(createParam<SoloMuteButton>(mute4ParamPosition, module, Mix8::MUTE4_PARAM, 0.0, 3.0, 0.0)); addParam(createParam<Knob16>(pan4ParamPosition, module, Mix8::PAN4_PARAM, -1.0, 1.0, 0.0)); - addSlider(level5ParamPosition, module, Mix8::LEVEL5_PARAM, module->_channel5.rms); + addSlider(level5ParamPosition, module, Mix8::LEVEL5_PARAM, module ? &module->_channel5.rms : NULL); addParam(createParam<SoloMuteButton>(mute5ParamPosition, module, Mix8::MUTE5_PARAM, 0.0, 3.0, 0.0)); addParam(createParam<Knob16>(pan5ParamPosition, module, Mix8::PAN5_PARAM, -1.0, 1.0, 0.0)); - addSlider(level6ParamPosition, module, Mix8::LEVEL6_PARAM, module->_channel6.rms); + addSlider(level6ParamPosition, module, Mix8::LEVEL6_PARAM, module ? &module->_channel6.rms : NULL); addParam(createParam<SoloMuteButton>(mute6ParamPosition, module, Mix8::MUTE6_PARAM, 0.0, 3.0, 0.0)); addParam(createParam<Knob16>(pan6ParamPosition, module, Mix8::PAN6_PARAM, -1.0, 1.0, 0.0)); - addSlider(level7ParamPosition, module, Mix8::LEVEL7_PARAM, module->_channel7.rms); + addSlider(level7ParamPosition, module, Mix8::LEVEL7_PARAM, module ? &module->_channel7.rms : NULL); addParam(createParam<SoloMuteButton>(mute7ParamPosition, module, Mix8::MUTE7_PARAM, 0.0, 3.0, 0.0)); addParam(createParam<Knob16>(pan7ParamPosition, module, Mix8::PAN7_PARAM, -1.0, 1.0, 0.0)); - addSlider(level8ParamPosition, module, Mix8::LEVEL8_PARAM, module->_channel8.rms); + addSlider(level8ParamPosition, module, Mix8::LEVEL8_PARAM, module ? &module->_channel8.rms : NULL); addParam(createParam<SoloMuteButton>(mute8ParamPosition, module, Mix8::MUTE8_PARAM, 0.0, 3.0, 0.0)); addParam(createParam<Knob16>(pan8ParamPosition, module, Mix8::PAN8_PARAM, -1.0, 1.0, 0.0)); - addSlider(mixParamPosition, module, Mix8::MIX_PARAM, module->_rmsLevel); + addSlider(mixParamPosition, module, Mix8::MIX_PARAM, module ? &module->_rmsLevel : NULL); addParam(createParam<MuteButton>(mixMuteParamPosition, module, Mix8::MIX_MUTE_PARAM, 0.0, 1.0, 0.0)); addInput(createPort<Port24>(cv1InputPosition, PortWidget::INPUT, module, Mix8::CV1_INPUT)); @@ -224,7 +224,7 @@ struct Mix8Widget : ModuleWidget { addOutput(createPort<Port24>(rOutputPosition, PortWidget::OUTPUT, module, Mix8::R_OUTPUT)); } - void addSlider(Vec position, Mix8* module, int id, float& rms) { + void addSlider(Vec position, Mix8* module, int id, float* rms) { auto slider = createParam<VUSlider151>( position, module, @@ -233,7 +233,9 @@ struct Mix8Widget : ModuleWidget { 1.0, fabsf(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels) ); - dynamic_cast<VUSlider*>(slider)->setVULevel(&rms); + if (rms) { + dynamic_cast<VUSlider*>(slider)->setVULevel(rms); + } addParam(slider); } }; diff --git a/src/Pressor.cpp b/src/Pressor.cpp @@ -147,6 +147,11 @@ struct CompressionDisplay : OpaqueWidget { } void draw(NVGcontext* vg) override { + // FIXME.v1 + if (!_module) { + return; + } + nvgSave(vg); for (int i = 0; i < 80; i += 5) { const Level& l = _levels.at(i / 5); diff --git a/src/Reftone.cpp b/src/Reftone.cpp @@ -59,6 +59,11 @@ struct ReftoneDisplay : TransparentWidget { }; void ReftoneDisplay::draw(NVGcontext* vg) { + // FIXME.v1 + if (!_module) { + return; + } + const int n = 20; char octave[n]; snprintf(octave, n, "%d", _module->_octave); diff --git a/src/VCAmp.cpp b/src/VCAmp.cpp @@ -2,6 +2,9 @@ #include "VCAmp.hpp" #include "mixer.hpp" +const float maxDecibels = 12.0f; +const float minDecibels = Amplifier::minDecibels; + void VCAmp::onSampleRateChange() { float sampleRate = engineGetSampleRate(); _levelSL.setParams(sampleRate, MixerChannel::levelSlewTimeMS, maxDecibels - minDecibels); @@ -56,9 +59,11 @@ struct VCAmpWidget : ModuleWidget { VCAmp::LEVEL_PARAM, 0.0, 1.0, - fabs(module->minDecibels) / (module->maxDecibels - module->minDecibels) + fabs(minDecibels) / (maxDecibels - minDecibels) ); - dynamic_cast<VUSlider*>(slider)->setVULevel(&(module->_rmsLevel)); + if (module) { + dynamic_cast<VUSlider*>(slider)->setVULevel(&(module->_rmsLevel)); + } addParam(slider); addInput(createPort<Port24>(cvInputPosition, PortWidget::INPUT, module, VCAmp::CV_INPUT)); diff --git a/src/VCAmp.hpp b/src/VCAmp.hpp @@ -30,8 +30,6 @@ struct VCAmp : Module { NUM_LIGHTS }; - const float maxDecibels = 12.0f; - const float minDecibels = Amplifier::minDecibels; Amplifier _amplifier; bogaudio::dsp::SlewLimiter _levelSL; Saturator _saturator; diff --git a/src/VU.cpp b/src/VU.cpp @@ -43,6 +43,11 @@ struct VUDisplay : OpaqueWidget { } void draw(NVGcontext* vg) override { + // FIXME.v1 + if (!_module) { + return; + } + float lDb = _module->_lLevel; if (lDb > 0.0f) { lDb = amplitudeToDecibels(lDb); diff --git a/src/Walk2.cpp b/src/Walk2.cpp @@ -165,6 +165,11 @@ struct Walk2Display : TransparentWidget { } void draw(NVGcontext* vg) override { + // FIXME.v1 + if (!_module) { + return; + } + switch (_module->_traceColor) { case Walk2::ORANGE_TRACE_COLOR: { _traceColor = nvgRGBA(0xff, 0x80, 0x00, 0xee); diff --git a/src/analyzer_base.cpp b/src/analyzer_base.cpp @@ -207,6 +207,11 @@ void AnalyzerCore::stepChannel(int channelIndex, Input& input) { void AnalyzerDisplay::draw(NVGcontext* vg) { + // FIXME.v1 + if (!_module) { + return; + } + drawBackground(vg); float strokeWidth = 2.0f; // FIXME.v1 std::max(1.0f, 3 - gRackScene->zoomWidget->zoom); _xAxisLogFactor = (_module->_rangeMaxHz - _module->_rangeMinHz) / _module->_rangeMaxHz; diff --git a/src/lfo_base.hpp b/src/lfo_base.hpp @@ -75,29 +75,30 @@ struct LFOBaseWidget : ModuleWidget, PitchModeListener { , _compliantSVG(compliantSVG) { setSVG(); - _module->setPitchModeListener(this); + if (_module) { + _module->setPitchModeListener(this); + } } void setSVG() { - if (_module->isCompliantPitchMode()) { - _panel->setBackground(_compliantSVG); - // FXIME.v1 - // if (_frequencyKnob) { - // _frequencyKnob->minValue = -5.0f; - // _frequencyKnob->maxValue = 8.0f; - // _frequencyKnob->dirty = true; - // } - } - else { - _panel->setBackground(_classicSVG); - // FXIME.v1 - // if (_frequencyKnob) { - // _frequencyKnob->minValue = -8.0f; - // _frequencyKnob->maxValue = 5.0f; - // _frequencyKnob->dirty = true; - // } - } - _panel->dirty = true; + // FIXME.v1 + // if (_module->isCompliantPitchMode()) { + // _panel->setBackground(_compliantSVG); + // if (_frequencyKnob) { + // _frequencyKnob->minValue = -5.0f; + // _frequencyKnob->maxValue = 8.0f; + // _frequencyKnob->dirty = true; + // } + // } + // else { + // _panel->setBackground(_classicSVG); + // if (_frequencyKnob) { + // _frequencyKnob->minValue = -8.0f; + // _frequencyKnob->maxValue = 5.0f; + // _frequencyKnob->dirty = true; + // } + // } + // _panel->dirty = true; } void pitchModeChanged() override {