diff --git a/src/LoudnessMeter.cpp b/src/LoudnessMeter.cpp index 224a64b..f49a7a7 100644 --- a/src/LoudnessMeter.cpp +++ b/src/LoudnessMeter.cpp @@ -255,6 +255,7 @@ struct LoudnessMeterWidget : ModuleWidget { addInput(createInputCentered(Vec(22.5f, inputYPx), module, LoudnessMeter::AUDIO_INPUT_L)); addInput(createInputCentered(Vec(67.5f, inputYPx), module, LoudnessMeter::AUDIO_INPUT_R)); addInput(createInputCentered(Vec(112.5f, inputYPx), module, LoudnessMeter::RESET_INPUT)); + addOutput(createOutputCentered(Vec(196.760f, 361.120f), module, LoudnessMeter::OVERSHOOT_OUTPUT)); addParam(createParamCentered(Vec(157.5f, inputYPx), module, LoudnessMeter::RESET_PARAM)); addParam(createParamCentered(Vec(202.5f, inputYPx), module, LoudnessMeter::TARGET_PARAM)); diff --git a/src/LoudnessMeterEngine.hpp b/src/LoudnessMeterEngine.hpp index 2de7718..15f9c5f 100644 --- a/src/LoudnessMeterEngine.hpp +++ b/src/LoudnessMeterEngine.hpp @@ -29,7 +29,10 @@ struct LoudnessMeter : engine::Module { RESET_INPUT, NUM_INPUTS }; - enum OutputIds { NUM_OUTPUTS }; + enum OutputIds { + OVERSHOOT_OUTPUT, + NUM_OUTPUTS + }; enum LightIds { NUM_LIGHTS }; // Enum for processing modes @@ -92,6 +95,7 @@ struct LoudnessMeter : engine::Module { configInput(AUDIO_INPUT_L, "Audio L / Mono"); configInput(AUDIO_INPUT_R, "Audio R"); configInput(RESET_INPUT, "Reset"); + configOutput(OVERSHOOT_OUTPUT, "Overshoot"); configParam(TARGET_PARAM, -36.f, 0.f, -23.f, "Target loudness", " LUFS"); configParam(RESET_PARAM, 0.f, 1.f, 0.f, "Reset"); @@ -460,6 +464,13 @@ struct LoudnessMeter : engine::Module { if (bufferPosition >= PROCESSING_BLOCK_FRAMES) { processBlockBuffer(); } + + float targetValue = params[TARGET_PARAM].getValue(); + float overshoot = momentaryLufs - targetValue; + float overshootVoltage = overshoot / 20.f * 10.f; + + overshootVoltage = clamp(overshootVoltage, -10.f, 10.f); // Ensure within -10V to +10V + outputs[OVERSHOOT_OUTPUT].setVoltage(overshootVoltage); } json_t* dataToJson() override {