BogaudioModules

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

commit 42142691843eed4ff9f550e08435fd8031e26dbb
parent 6bee078a9c1e9c2dd4f5673155adb00cd2afd606
Author: Matt Demanett <matt@demanett.net>
Date:   Tue,  5 Dec 2017 18:08:05 -0500

Analyzer: make Smooth knob continuous and time-based - number of frames to average is calculated from knob time, sample rate, fft size; also reset channels on sample rate change.

Diffstat:
Mres/Analyzer-src.svg | 0
Mres/Analyzer.svg | 0
Msrc/Analyzer.cpp | 26++++++++++++++------------
3 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/res/Analyzer-src.svg b/res/Analyzer-src.svg Binary files differ. diff --git a/res/Analyzer.svg b/res/Analyzer.svg Binary files differ. diff --git a/src/Analyzer.cpp b/src/Analyzer.cpp @@ -124,6 +124,7 @@ struct Analyzer : Module { float _range = 0.0; float _smooth = 0.0; Quality _quality = QUALITY_GOOD; + const SpectrumAnalyzer::Overlap _overlap = SpectrumAnalyzer::OVERLAP_2; const int _binAverageN = 2; Analyzer() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { @@ -134,6 +135,7 @@ struct Analyzer : Module { } virtual void reset() override; + virtual void onSampleRateChange() override; void resetChannels(); SpectrumAnalyzer::Size size(); virtual void step() override; @@ -144,6 +146,10 @@ void Analyzer::reset() { resetChannels(); } +void Analyzer::onSampleRateChange() { + resetChannels(); +} + void Analyzer::resetChannels() { if (_channelA) { delete _channelA; @@ -173,9 +179,12 @@ SpectrumAnalyzer::Size Analyzer::size() { void Analyzer::step() { _range = clampf(params[RANGE_PARAM].value, 0.1, 1.0); - int smooth = (int)roundf(clampf(params[SMOOTH_PARAM].value, 1.0, 10.0)); - if (_averageN != smooth) { - _averageN = smooth; + const float maxTime = 0.5; + float smooth = clampf(params[SMOOTH_PARAM].value, 0.0, 1.0) * maxTime; + smooth /= size() / (_overlap * engineGetSampleRate()); + int smoothN = std::max(1, (int)roundf(smooth)); + if (_averageN != smoothN) { + _averageN = smoothN; resetChannels(); } @@ -201,7 +210,7 @@ void Analyzer::stepChannel(ChannelAnalyzer*& channelPointer, bool running, Input if (!channelPointer) { channelPointer = new ChannelAnalyzer( size(), - SpectrumAnalyzer::OVERLAP_2, + _overlap, SpectrumAnalyzer::WINDOW_HAMMING, engineGetSampleRate(), _averageN, @@ -505,13 +514,6 @@ struct OneTenKnob : Knob38 { }; -struct IntegerOneTenKnob : OneTenKnob { - IntegerOneTenKnob() : OneTenKnob() { - snap = true; - } -}; - - AnalyzerWidget::AnalyzerWidget() { auto module = new Analyzer(); setModule(module); @@ -560,7 +562,7 @@ AnalyzerWidget::AnalyzerWidget() { // end generated by svg_widgets.rb addParam(createParam<OneTenKnob>(rangeParamPosition, module, Analyzer::RANGE_PARAM, 0.1, 1.0, 0.5)); - addParam(createParam<IntegerOneTenKnob>(smoothParamPosition, module, Analyzer::SMOOTH_PARAM, 1.0, 10.0, 5.0)); + addParam(createParam<Knob38>(smoothParamPosition, module, Analyzer::SMOOTH_PARAM, 0.0, 1.0, 0.5)); addParam(createParam<Button9Toggle2>(qualityParamPosition, module, Analyzer::QUALITY_PARAM, 1.0, 2.0, 1.0)); addParam(createParam<Button9Toggle2>(powerParamPosition, module, Analyzer::POWER_PARAM, 0.0, 1.0, 1.0));