commit c91416555b60ee3ce914f83d3398f0e7a9d1c4c2
parent 0ab4cc28c8d7670d493a9783d450baedffda04db
Author: Matt Demanett <matt@fundera.com>
Date: Fri, 1 Dec 2017 17:01:10 -0500
Analyzer: implement Smooth knob (number of FFT frames to average for display).
Diffstat:
3 files changed, 23 insertions(+), 4 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
@@ -57,7 +57,7 @@ bool ChannelAnalyzer::step(float sample) {
struct Analyzer : Module {
enum ParamsIds {
RANGE_PARAM,
- // SMOOTH_PARAM,
+ SMOOTH_PARAM,
// TYPE_PARAM,
POWER_PARAM,
NUM_PARAMS
@@ -90,6 +90,7 @@ struct Analyzer : Module {
ChannelAnalyzer* _channelA = NULL;
ChannelAnalyzer* _channelB = NULL;
float _range = 0.0;
+ float _smooth = 0.0;
Analyzer() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
reset();
@@ -99,13 +100,17 @@ struct Analyzer : Module {
}
virtual void reset() override;
+ void resetChannels();
virtual void step() override;
void stepChannel(ChannelAnalyzer*& channelPointer, bool running, Input& input, Output& output);
};
void Analyzer::reset() {
_displayType = DISPLAYTYPE_LINE;
- _averageN = 10;
+ resetChannels();
+}
+
+void Analyzer::resetChannels() {
if (_channelA) {
delete _channelA;
_channelA = NULL;
@@ -118,6 +123,13 @@ void Analyzer::reset() {
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;
+ resetChannels();
+ }
+
bool running = params[POWER_PARAM].value == 1.0;
stepChannel(_channelA, running, inputs[SIGNALA_INPUT], outputs[SIGNALA_OUTPUT]);
stepChannel(_channelB, running, inputs[SIGNALB_INPUT], outputs[SIGNALB_OUTPUT]);
@@ -352,6 +364,13 @@ int AnalyzerDisplay::binValueToHeight(float value) {
}
+struct AnalyzerKnob : Knob38 {
+ AnalyzerKnob() : Knob38() {
+ snap = true;
+ }
+};
+
+
AnalyzerWidget::AnalyzerWidget() {
auto module = new Analyzer();
setModule(module);
@@ -380,7 +399,7 @@ AnalyzerWidget::AnalyzerWidget() {
// generated by svg_widgets.rb
auto rangeParamPosition = Vec(100.08, 303.58);
- // auto smoothParamPosition = Vec(164.08, 303.58);
+ auto smoothParamPosition = Vec(164.08, 303.58);
// auto typeParamPosition = Vec(231.9, 305.4);
auto powerParamPosition = Vec(272.9, 305.4);
@@ -392,7 +411,7 @@ AnalyzerWidget::AnalyzerWidget() {
// end generated by svg_widgets.rb
addParam(createParam<Knob38>(rangeParamPosition, module, Analyzer::RANGE_PARAM, 0.1, 1.0, 0.5));
- // addParam(createParam<Knob38>(smoothParamPosition, module, Analyzer::SMOOTH_PARAM, 0.1, 1.0, 0.3));
+ addParam(createParam<AnalyzerKnob>(smoothParamPosition, module, Analyzer::SMOOTH_PARAM, 1.0, 10.0, 5.0));
// addParam(createParam<CKSS>(typeParamPosition, module, Analyzer::TYPE_PARAM, 0.0, 1.0, 1.0));
addParam(createParam<CKSS>(powerParamPosition, module, Analyzer::POWER_PARAM, 0.0, 1.0, 1.0));