v1.3: Auto makeup gain, spectrum analyzer, FIR normalization, README overhaul

- Auto makeup gain: RMS-based loudness compensation from actual FIR response
- Real-time FFT spectrum analyzer behind EQ curves
- FIR normalization fix: flat settings now produce exact 0 dB passthrough
- Brickwall limiter (0 dB ceiling) with toggle
- Drag-and-drop signal chain reordering
- Low FIR tap count warning for 512/1024
- Double-click reset on all knobs
- Comprehensive README with linear phase EQ explanation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hariel1985
2026-03-25 22:28:31 +01:00
szülő 9c5b5a3957
commit aa546c7357
9 fájl változott, egészen pontosan 229 új sor hozzáadva és 73 régi sor törölve

Fájl megtekintése

@@ -92,17 +92,17 @@ InstaLPEQEditor::InstaLPEQEditor (InstaLPEQProcessor& p)
limiterLabel.setJustificationType (juce::Justification::centred);
addAndMakeVisible (limiterLabel);
// Makeup gain
makeupGainSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag);
makeupGainSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 60, 16);
makeupGainSlider.setRange (-24.0, 24.0, 0.1);
makeupGainSlider.setValue (0.0);
makeupGainSlider.setTextValueSuffix (" dB");
makeupGainSlider.setDoubleClickReturnValue (true, 0.0);
addAndMakeVisible (makeupGainSlider);
makeupGainLabel.setFont (customLookAndFeel.getMediumFont (13.0f));
makeupGainLabel.setJustificationType (juce::Justification::centred);
addAndMakeVisible (makeupGainLabel);
// Auto makeup gain
autoMakeupToggle.setToggleState (processor.autoMakeupEnabled.load(), juce::dontSendNotification);
addAndMakeVisible (autoMakeupToggle);
autoMakeupLabel.setFont (customLookAndFeel.getMediumFont (13.0f));
autoMakeupLabel.setColour (juce::Label::textColourId, InstaLPEQLookAndFeel::textSecondary);
autoMakeupLabel.setJustificationType (juce::Justification::centred);
addAndMakeVisible (autoMakeupLabel);
autoMakeupValue.setFont (customLookAndFeel.getRegularFont (12.0f));
autoMakeupValue.setColour (juce::Label::textColourId, InstaLPEQLookAndFeel::accent);
autoMakeupValue.setJustificationType (juce::Justification::centred);
addAndMakeVisible (autoMakeupValue);
// Signal chain panel
chainPanel.setListener (this);
@@ -189,10 +189,12 @@ void InstaLPEQEditor::resized()
limiterLabel.setBounds (masterArea.removeFromLeft (55));
limiterToggle.setBounds (masterArea.removeFromLeft (40));
// Makeup gain knob
makeupGainLabel.setFont (customLookAndFeel.getMediumFont (std::max (11.0f, 14.0f * scale)));
makeupGainLabel.setBounds (masterArea.removeFromLeft (55));
makeupGainSlider.setBounds (masterArea.removeFromLeft (masterH));
// Auto makeup gain toggle + value display
autoMakeupLabel.setFont (customLookAndFeel.getMediumFont (std::max (11.0f, 14.0f * scale)));
autoMakeupLabel.setBounds (masterArea.removeFromLeft (70));
autoMakeupToggle.setBounds (masterArea.removeFromLeft (40));
autoMakeupValue.setFont (customLookAndFeel.getRegularFont (std::max (10.0f, 12.0f * scale)));
autoMakeupValue.setBounds (masterArea.removeFromLeft (60));
// Quality selector on the right side of master row
qualityLabel.setFont (customLookAndFeel.getMediumFont (std::max (11.0f, 14.0f * scale)));
@@ -218,7 +220,12 @@ void InstaLPEQEditor::timerCallback()
processor.bypassed.store (bypassToggle.getToggleState());
processor.masterGainDb.store ((float) masterGainSlider.getValue());
processor.limiterEnabled.store (limiterToggle.getToggleState());
processor.makeupGainDb.store ((float) makeupGainSlider.getValue());
processor.autoMakeupEnabled.store (autoMakeupToggle.getToggleState());
// Update auto makeup display
float mkDb = processor.getActiveAutoMakeupDb();
juce::String mkStr = (mkDb >= 0 ? "+" : "") + juce::String (mkDb, 1) + " dB";
autoMakeupValue.setText (mkStr, juce::dontSendNotification);
// Update spectrum analyzer
{