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) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.22)
|
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 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|||||||
12
README.md
12
README.md
@@ -6,24 +6,24 @@ Free, open-source linear phase EQ plugin built with JUCE. Available as VST3, AU
|
|||||||
|
|
||||||
## Download
|
## 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
|
### Windows
|
||||||
| File | Description |
|
| 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)
|
### macOS (Universal Binary: Apple Silicon + Intel)
|
||||||
| File | Description |
|
| 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-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.0/InstaLPEQ-AU-macOS.zip) | Audio Unit — copy to `~/Library/Audio/Plug-Ins/Components/` |
|
| [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)
|
### Linux (x64, built on Ubuntu 22.04)
|
||||||
| File | Description |
|
| 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-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.0/InstaLPEQ-LV2-Linux-x64.zip) | LV2 plugin — copy to `~/.lv2/` |
|
| [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:
|
> **macOS note:** Builds are Universal Binary (Apple Silicon + Intel). Not code-signed — after copying the plugin, remove the quarantine flag in Terminal:
|
||||||
> ```bash
|
> ```bash
|
||||||
|
|||||||
@@ -23,6 +23,34 @@ InstaLPEQEditor::InstaLPEQEditor (InstaLPEQProcessor& p)
|
|||||||
bypassLabel.setColour (juce::Label::textColourId, InstaLPEQLookAndFeel::textSecondary);
|
bypassLabel.setColour (juce::Label::textColourId, InstaLPEQLookAndFeel::textSecondary);
|
||||||
addAndMakeVisible (bypassLabel);
|
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
|
// EQ curve
|
||||||
curveDisplay.setListener (this);
|
curveDisplay.setListener (this);
|
||||||
addAndMakeVisible (curveDisplay);
|
addAndMakeVisible (curveDisplay);
|
||||||
@@ -102,18 +130,23 @@ void InstaLPEQEditor::resized()
|
|||||||
bypassLabel.setBounds (bypassArea.removeFromLeft (50));
|
bypassLabel.setBounds (bypassArea.removeFromLeft (50));
|
||||||
bypassToggle.setBounds (bypassArea);
|
bypassToggle.setBounds (bypassArea);
|
||||||
|
|
||||||
|
newBandButton.setBounds (header.removeFromRight ((int) (90 * scale)).reduced (2));
|
||||||
|
|
||||||
// Bottom master row
|
// Bottom master row
|
||||||
int masterH = (int) std::max (50.0f, 65.0f * scale);
|
int masterH = (int) std::max (50.0f, 65.0f * scale);
|
||||||
auto masterArea = bounds.removeFromBottom (masterH).reduced (pad, 2);
|
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)));
|
masterGainLabel.setFont (customLookAndFeel.getMediumFont (std::max (11.0f, 14.0f * scale)));
|
||||||
auto labelArea = masterArea.removeFromLeft (60);
|
auto labelArea = masterArea.removeFromLeft (60);
|
||||||
masterGainLabel.setBounds (labelArea);
|
masterGainLabel.setBounds (labelArea);
|
||||||
masterGainSlider.setBounds (masterArea.removeFromLeft (masterH));
|
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)
|
// Node parameter panel (15% of remaining height)
|
||||||
int nodePanelH = (int) (bounds.getHeight() * 0.18f);
|
int nodePanelH = (int) (bounds.getHeight() * 0.18f);
|
||||||
auto nodePanelArea = bounds.removeFromBottom (nodePanelH).reduced (pad, 2);
|
auto nodePanelArea = bounds.removeFromBottom (nodePanelH).reduced (pad, 2);
|
||||||
|
|||||||
@@ -39,10 +39,14 @@ private:
|
|||||||
NodeParameterPanel nodePanel;
|
NodeParameterPanel nodePanel;
|
||||||
|
|
||||||
juce::Label titleLabel { {}, "INSTALPEQ" };
|
juce::Label titleLabel { {}, "INSTALPEQ" };
|
||||||
juce::Label versionLabel { {}, "v1.0" };
|
juce::Label versionLabel { {}, "v1.1" };
|
||||||
juce::ToggleButton bypassToggle;
|
juce::ToggleButton bypassToggle;
|
||||||
juce::Label bypassLabel { {}, "BYPASS" };
|
juce::Label bypassLabel { {}, "BYPASS" };
|
||||||
|
|
||||||
|
juce::TextButton newBandButton { "NEW BAND" };
|
||||||
|
juce::ComboBox qualitySelector;
|
||||||
|
juce::Label qualityLabel { {}, "FIR" };
|
||||||
|
|
||||||
juce::Slider masterGainSlider;
|
juce::Slider masterGainSlider;
|
||||||
juce::Label masterGainLabel { {}, "MASTER" };
|
juce::Label masterGainLabel { {}, "MASTER" };
|
||||||
|
|
||||||
|
|||||||
@@ -125,6 +125,13 @@ void InstaLPEQProcessor::updateFIR()
|
|||||||
firEngine.setBands (currentBands);
|
firEngine.setBands (currentBands);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InstaLPEQProcessor::setQuality (int fftOrder)
|
||||||
|
{
|
||||||
|
firEngine.setFFTOrder (fftOrder);
|
||||||
|
setLatencySamples (firEngine.getLatencySamples());
|
||||||
|
updateFIR();
|
||||||
|
}
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// State save/restore
|
// State save/restore
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ public:
|
|||||||
std::atomic<bool> bypassed { false };
|
std::atomic<bool> bypassed { false };
|
||||||
std::atomic<float> masterGainDb { 0.0f };
|
std::atomic<float> masterGainDb { 0.0f };
|
||||||
|
|
||||||
|
void setQuality (int fftOrder);
|
||||||
|
|
||||||
FIREngine& getFIREngine() { return firEngine; }
|
FIREngine& getFIREngine() { return firEngine; }
|
||||||
double getCurrentSampleRate() const { return currentSampleRate; }
|
double getCurrentSampleRate() const { return currentSampleRate; }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user