From f95c6e4b1723f084580944536064035a3f08850a Mon Sep 17 00:00:00 2001 From: hariel1985 Date: Wed, 25 Mar 2026 10:37:07 +0100 Subject: [PATCH] v1.1: Add New Band button and FIR quality selector - New Band button in header bar for adding EQ nodes - FIR latency dropdown: 4096 (~46ms), 8192 (~93ms), 16384 (~186ms) - Version bump to 1.1 Co-Authored-By: Claude Opus 4.6 (1M context) --- CMakeLists.txt | 2 +- README.md | 12 ++++++------ Source/PluginEditor.cpp | 39 +++++++++++++++++++++++++++++++++++--- Source/PluginEditor.h | 6 +++++- Source/PluginProcessor.cpp | 7 +++++++ Source/PluginProcessor.h | 2 ++ 6 files changed, 57 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c6ad1fa..58e229d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.22) -project(InstaLPEQ VERSION 1.0.0) +project(InstaLPEQ VERSION 1.1.0) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) diff --git a/README.md b/README.md index e360863..a024163 100644 --- a/README.md +++ b/README.md @@ -6,24 +6,24 @@ Free, open-source linear phase EQ plugin built with JUCE. Available as VST3, AU ## Download -**[Latest Release: v1.0](https://github.com/hariel1985/InstaLPEQ/releases/tag/v1.0)** +**[Latest Release: v1.1](https://github.com/hariel1985/InstaLPEQ/releases/tag/v1.1)** ### Windows | File | Description | |------|-------------| -| [InstaLPEQ-VST3-Win64.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.0/InstaLPEQ-VST3-Win64.zip) | VST3 plugin — copy to `C:\Program Files\Common Files\VST3\` | +| [InstaLPEQ-VST3-Win64.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.1/InstaLPEQ-VST3-Win64.zip) | VST3 plugin — copy to `C:\Program Files\Common Files\VST3\` | ### macOS (Universal Binary: Apple Silicon + Intel) | File | Description | |------|-------------| -| [InstaLPEQ-VST3-macOS.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.0/InstaLPEQ-VST3-macOS.zip) | VST3 plugin — copy to `~/Library/Audio/Plug-Ins/VST3/` | -| [InstaLPEQ-AU-macOS.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.0/InstaLPEQ-AU-macOS.zip) | Audio Unit — copy to `~/Library/Audio/Plug-Ins/Components/` | +| [InstaLPEQ-VST3-macOS.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.1/InstaLPEQ-VST3-macOS.zip) | VST3 plugin — copy to `~/Library/Audio/Plug-Ins/VST3/` | +| [InstaLPEQ-AU-macOS.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.1/InstaLPEQ-AU-macOS.zip) | Audio Unit — copy to `~/Library/Audio/Plug-Ins/Components/` | ### Linux (x64, built on Ubuntu 22.04) | File | Description | |------|-------------| -| [InstaLPEQ-VST3-Linux-x64.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.0/InstaLPEQ-VST3-Linux-x64.zip) | VST3 plugin — copy to `~/.vst3/` | -| [InstaLPEQ-LV2-Linux-x64.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.0/InstaLPEQ-LV2-Linux-x64.zip) | LV2 plugin — copy to `~/.lv2/` | +| [InstaLPEQ-VST3-Linux-x64.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.1/InstaLPEQ-VST3-Linux-x64.zip) | VST3 plugin — copy to `~/.vst3/` | +| [InstaLPEQ-LV2-Linux-x64.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.1/InstaLPEQ-LV2-Linux-x64.zip) | LV2 plugin — copy to `~/.lv2/` | > **macOS note:** Builds are Universal Binary (Apple Silicon + Intel). Not code-signed — after copying the plugin, remove the quarantine flag in Terminal: > ```bash diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index 14b4823..6cd87a7 100644 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -23,6 +23,34 @@ InstaLPEQEditor::InstaLPEQEditor (InstaLPEQProcessor& p) bypassLabel.setColour (juce::Label::textColourId, InstaLPEQLookAndFeel::textSecondary); addAndMakeVisible (bypassLabel); + // New Band button + newBandButton.onClick = [this] + { + if (processor.getNumBands() < InstaLPEQProcessor::maxBands) + { + processor.addBand (1000.0f, 0.0f); + syncDisplayFromProcessor(); + curveDisplay.setSelectedBand (processor.getNumBands() - 1); + } + }; + addAndMakeVisible (newBandButton); + + // Quality selector (FIR latency) + qualitySelector.addItem ("4096 (~46ms)", 1); + qualitySelector.addItem ("8192 (~93ms)", 2); + qualitySelector.addItem ("16384 (~186ms)", 3); + qualitySelector.setSelectedId (2, juce::dontSendNotification); // default 8192 + qualitySelector.onChange = [this] + { + int sel = qualitySelector.getSelectedId(); + int order = (sel == 1) ? 12 : (sel == 2) ? 13 : 14; + processor.setQuality (order); + }; + addAndMakeVisible (qualitySelector); + qualityLabel.setFont (customLookAndFeel.getMediumFont (13.0f)); + qualityLabel.setJustificationType (juce::Justification::centredRight); + addAndMakeVisible (qualityLabel); + // EQ curve curveDisplay.setListener (this); addAndMakeVisible (curveDisplay); @@ -102,18 +130,23 @@ void InstaLPEQEditor::resized() bypassLabel.setBounds (bypassArea.removeFromLeft (50)); bypassToggle.setBounds (bypassArea); + newBandButton.setBounds (header.removeFromRight ((int) (90 * scale)).reduced (2)); + // Bottom master row int masterH = (int) std::max (50.0f, 65.0f * scale); auto masterArea = bounds.removeFromBottom (masterH).reduced (pad, 2); - // Divider above master - // (painted in paint()) - masterGainLabel.setFont (customLookAndFeel.getMediumFont (std::max (11.0f, 14.0f * scale))); auto labelArea = masterArea.removeFromLeft (60); masterGainLabel.setBounds (labelArea); masterGainSlider.setBounds (masterArea.removeFromLeft (masterH)); + // Quality selector on the right side of master row + qualityLabel.setFont (customLookAndFeel.getMediumFont (std::max (11.0f, 14.0f * scale))); + auto qLabelArea = masterArea.removeFromRight (30); + qualityLabel.setBounds (qLabelArea); + qualitySelector.setBounds (masterArea.removeFromRight ((int) (130 * scale)).reduced (2, (masterH - 24) / 2)); + // Node parameter panel (15% of remaining height) int nodePanelH = (int) (bounds.getHeight() * 0.18f); auto nodePanelArea = bounds.removeFromBottom (nodePanelH).reduced (pad, 2); diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h index 389c359..8c0f34d 100644 --- a/Source/PluginEditor.h +++ b/Source/PluginEditor.h @@ -39,10 +39,14 @@ private: NodeParameterPanel nodePanel; juce::Label titleLabel { {}, "INSTALPEQ" }; - juce::Label versionLabel { {}, "v1.0" }; + juce::Label versionLabel { {}, "v1.1" }; juce::ToggleButton bypassToggle; juce::Label bypassLabel { {}, "BYPASS" }; + juce::TextButton newBandButton { "NEW BAND" }; + juce::ComboBox qualitySelector; + juce::Label qualityLabel { {}, "FIR" }; + juce::Slider masterGainSlider; juce::Label masterGainLabel { {}, "MASTER" }; diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 3c4f4d8..caf64ad 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -125,6 +125,13 @@ void InstaLPEQProcessor::updateFIR() firEngine.setBands (currentBands); } +void InstaLPEQProcessor::setQuality (int fftOrder) +{ + firEngine.setFFTOrder (fftOrder); + setLatencySamples (firEngine.getLatencySamples()); + updateFIR(); +} + // ============================================================ // State save/restore // ============================================================ diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index 1ac0da2..e4b2b7c 100644 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -44,6 +44,8 @@ public: std::atomic bypassed { false }; std::atomic masterGainDb { 0.0f }; + void setQuality (int fftOrder); + FIREngine& getFIREngine() { return firEngine; } double getCurrentSampleRate() const { return currentSampleRate; }