diff --git a/include/dsp/vumeter.hpp b/include/dsp/vumeter.hpp new file mode 100644 index 00000000..73792c81 --- /dev/null +++ b/include/dsp/vumeter.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include "math.hpp" + + +namespace rack { + + +struct VUMeter { + /** Decibel level difference between adjacent meter lights */ + float dBInterval = 3.0; + float dBScaled; + /** Value should be scaled so that 1.0 is clipping */ + void setValue(float v) { + dBScaled = log10f(fabsf(v)) * 20.0 / dBInterval; + } + /** Returns the brightness of the light indexed by i + Light 0 is a clip light (red) which is either on or off. + All others are smooth lights which are fully bright at -dBInterval*i and higher, and fully off at -dBInterval*(i-1). + */ + float getBrightness(int i) { + if (i == 0) { + return (dBScaled >= 0.0) ? 1.0 : 0.0; + } + else { + return clampf(dBScaled + i, 0.0, 1.0); + } + } +}; + + +} // namespace rack