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:
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));