Commitok összehasonlítása
4 Commit-ok
| Szerző | SHA1 | Dátum | |
|---|---|---|---|
|
|
72c7958d98 | ||
|
|
2c440d8deb | ||
|
|
f95c6e4b17 | ||
|
|
6a5f331185 |
31
.github/workflows/build.yml
vendored
31
.github/workflows/build.yml
vendored
@@ -25,21 +25,12 @@ jobs:
|
|||||||
- name: Package VST3
|
- name: Package VST3
|
||||||
run: Compress-Archive -Path "build/InstaLPEQ_artefacts/Release/VST3/InstaLPEQ.vst3" -DestinationPath "InstaLPEQ-VST3-Win64.zip"
|
run: Compress-Archive -Path "build/InstaLPEQ_artefacts/Release/VST3/InstaLPEQ.vst3" -DestinationPath "InstaLPEQ-VST3-Win64.zip"
|
||||||
|
|
||||||
- name: Package Standalone
|
|
||||||
run: Compress-Archive -Path "build/InstaLPEQ_artefacts/Release/Standalone/InstaLPEQ.exe" -DestinationPath "InstaLPEQ-Standalone-Win64.zip"
|
|
||||||
|
|
||||||
- name: Upload VST3
|
- name: Upload VST3
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: InstaLPEQ-VST3-Win64
|
name: InstaLPEQ-VST3-Win64
|
||||||
path: InstaLPEQ-VST3-Win64.zip
|
path: InstaLPEQ-VST3-Win64.zip
|
||||||
|
|
||||||
- name: Upload Standalone
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: InstaLPEQ-Standalone-Win64
|
|
||||||
path: InstaLPEQ-Standalone-Win64.zip
|
|
||||||
|
|
||||||
build-macos:
|
build-macos:
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
@@ -62,10 +53,6 @@ jobs:
|
|||||||
working-directory: build/InstaLPEQ_artefacts/Release
|
working-directory: build/InstaLPEQ_artefacts/Release
|
||||||
run: zip -r $GITHUB_WORKSPACE/InstaLPEQ-AU-macOS.zip AU/InstaLPEQ.component
|
run: zip -r $GITHUB_WORKSPACE/InstaLPEQ-AU-macOS.zip AU/InstaLPEQ.component
|
||||||
|
|
||||||
- name: Package Standalone
|
|
||||||
working-directory: build/InstaLPEQ_artefacts/Release
|
|
||||||
run: zip -r $GITHUB_WORKSPACE/InstaLPEQ-Standalone-macOS.zip Standalone/InstaLPEQ.app
|
|
||||||
|
|
||||||
- name: Upload VST3
|
- name: Upload VST3
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -78,12 +65,6 @@ jobs:
|
|||||||
name: InstaLPEQ-AU-macOS
|
name: InstaLPEQ-AU-macOS
|
||||||
path: InstaLPEQ-AU-macOS.zip
|
path: InstaLPEQ-AU-macOS.zip
|
||||||
|
|
||||||
- name: Upload Standalone
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: InstaLPEQ-Standalone-macOS
|
|
||||||
path: InstaLPEQ-Standalone-macOS.zip
|
|
||||||
|
|
||||||
build-linux:
|
build-linux:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
@@ -113,9 +94,6 @@ jobs:
|
|||||||
working-directory: build/InstaLPEQ_artefacts/Release
|
working-directory: build/InstaLPEQ_artefacts/Release
|
||||||
run: zip -r $GITHUB_WORKSPACE/InstaLPEQ-LV2-Linux-x64.zip LV2/InstaLPEQ.lv2
|
run: zip -r $GITHUB_WORKSPACE/InstaLPEQ-LV2-Linux-x64.zip LV2/InstaLPEQ.lv2
|
||||||
|
|
||||||
- name: Package Standalone
|
|
||||||
run: zip -j InstaLPEQ-Standalone-Linux-x64.zip build/InstaLPEQ_artefacts/Release/Standalone/InstaLPEQ
|
|
||||||
|
|
||||||
- name: Upload VST3
|
- name: Upload VST3
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -128,12 +106,6 @@ jobs:
|
|||||||
name: InstaLPEQ-LV2-Linux-x64
|
name: InstaLPEQ-LV2-Linux-x64
|
||||||
path: InstaLPEQ-LV2-Linux-x64.zip
|
path: InstaLPEQ-LV2-Linux-x64.zip
|
||||||
|
|
||||||
- name: Upload Standalone
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: InstaLPEQ-Standalone-Linux-x64
|
|
||||||
path: InstaLPEQ-Standalone-Linux-x64.zip
|
|
||||||
|
|
||||||
release:
|
release:
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
needs: [build-windows, build-macos, build-linux]
|
needs: [build-windows, build-macos, build-linux]
|
||||||
@@ -151,11 +123,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
artifacts/InstaLPEQ-VST3-Win64/InstaLPEQ-VST3-Win64.zip
|
artifacts/InstaLPEQ-VST3-Win64/InstaLPEQ-VST3-Win64.zip
|
||||||
artifacts/InstaLPEQ-Standalone-Win64/InstaLPEQ-Standalone-Win64.zip
|
|
||||||
artifacts/InstaLPEQ-VST3-macOS/InstaLPEQ-VST3-macOS.zip
|
artifacts/InstaLPEQ-VST3-macOS/InstaLPEQ-VST3-macOS.zip
|
||||||
artifacts/InstaLPEQ-AU-macOS/InstaLPEQ-AU-macOS.zip
|
artifacts/InstaLPEQ-AU-macOS/InstaLPEQ-AU-macOS.zip
|
||||||
artifacts/InstaLPEQ-Standalone-macOS/InstaLPEQ-Standalone-macOS.zip
|
|
||||||
artifacts/InstaLPEQ-VST3-Linux-x64/InstaLPEQ-VST3-Linux-x64.zip
|
artifacts/InstaLPEQ-VST3-Linux-x64/InstaLPEQ-VST3-Linux-x64.zip
|
||||||
artifacts/InstaLPEQ-LV2-Linux-x64/InstaLPEQ-LV2-Linux-x64.zip
|
artifacts/InstaLPEQ-LV2-Linux-x64/InstaLPEQ-LV2-Linux-x64.zip
|
||||||
artifacts/InstaLPEQ-Standalone-Linux-x64/InstaLPEQ-Standalone-Linux-x64.zip
|
|
||||||
generate_release_notes: true
|
generate_release_notes: true
|
||||||
|
|||||||
@@ -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.3)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
@@ -13,7 +13,7 @@ juce_add_plugin(InstaLPEQ
|
|||||||
NEEDS_MIDI_OUTPUT FALSE
|
NEEDS_MIDI_OUTPUT FALSE
|
||||||
PLUGIN_MANUFACTURER_CODE Inst
|
PLUGIN_MANUFACTURER_CODE Inst
|
||||||
PLUGIN_CODE Ilpe
|
PLUGIN_CODE Ilpe
|
||||||
FORMATS VST3 AU LV2 Standalone
|
FORMATS VST3 AU LV2
|
||||||
LV2URI "https://github.com/hariel1985/InstaLPEQ"
|
LV2URI "https://github.com/hariel1985/InstaLPEQ"
|
||||||
PRODUCT_NAME "InstaLPEQ"
|
PRODUCT_NAME "InstaLPEQ"
|
||||||
COPY_PLUGIN_AFTER_BUILD FALSE
|
COPY_PLUGIN_AFTER_BUILD FALSE
|
||||||
|
|||||||
18
README.md
18
README.md
@@ -1,32 +1,29 @@
|
|||||||
# InstaLPEQ
|
# InstaLPEQ
|
||||||
|
|
||||||
Free, open-source linear phase EQ plugin built with JUCE. Available as VST3, AU, LV2 and Standalone.
|
Free, open-source linear phase EQ plugin built with JUCE. Available as VST3, AU and LV2.
|
||||||
|
|
||||||
      
|
      
|
||||||
|
|
||||||
## 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\` |
|
||||||
| [InstaLPEQ-Standalone-Win64.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.0/InstaLPEQ-Standalone-Win64.zip) | Standalone application |
|
|
||||||
|
|
||||||
### 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/` |
|
||||||
| [InstaLPEQ-Standalone-macOS.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.0/InstaLPEQ-Standalone-macOS.zip) | Standalone application |
|
|
||||||
|
|
||||||
### 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/` |
|
||||||
| [InstaLPEQ-Standalone-Linux-x64.zip](https://github.com/hariel1985/InstaLPEQ/releases/download/v1.0/InstaLPEQ-Standalone-Linux-x64.zip) | Standalone application |
|
|
||||||
|
|
||||||
> **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
|
||||||
@@ -107,7 +104,6 @@ Output:
|
|||||||
- VST3: `build/InstaLPEQ_artefacts/Release/VST3/InstaLPEQ.vst3`
|
- VST3: `build/InstaLPEQ_artefacts/Release/VST3/InstaLPEQ.vst3`
|
||||||
- AU: `build/InstaLPEQ_artefacts/Release/AU/InstaLPEQ.component` (macOS)
|
- AU: `build/InstaLPEQ_artefacts/Release/AU/InstaLPEQ.component` (macOS)
|
||||||
- LV2: `build/InstaLPEQ_artefacts/Release/LV2/InstaLPEQ.lv2`
|
- LV2: `build/InstaLPEQ_artefacts/Release/LV2/InstaLPEQ.lv2`
|
||||||
- Standalone: `build/InstaLPEQ_artefacts/Release/Standalone/InstaLPEQ.exe`
|
|
||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ void FIREngine::setBands (const std::vector<EQBand>& newBands)
|
|||||||
|
|
||||||
void FIREngine::setFFTOrder (int order)
|
void FIREngine::setFFTOrder (int order)
|
||||||
{
|
{
|
||||||
fftOrder.store (juce::jlimit (12, 14, order));
|
fftOrder.store (juce::jlimit (9, 14, order));
|
||||||
needsUpdate.store (true);
|
needsUpdate.store (true);
|
||||||
notify();
|
notify();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
class FIREngine : private juce::Thread
|
class FIREngine : private juce::Thread
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static constexpr int defaultFFTOrder = 13; // 8192 taps
|
static constexpr int defaultFFTOrder = 11; // 2048 taps
|
||||||
static constexpr int maxBands = 8;
|
static constexpr int maxBands = 8;
|
||||||
|
|
||||||
FIREngine();
|
FIREngine();
|
||||||
|
|||||||
@@ -5,11 +5,14 @@ NodeParameterPanel::NodeParameterPanel()
|
|||||||
{
|
{
|
||||||
setupSlider (freqSlider, freqLabel, 20.0, 20000.0, 1.0, " Hz");
|
setupSlider (freqSlider, freqLabel, 20.0, 20000.0, 1.0, " Hz");
|
||||||
freqSlider.setSkewFactorFromMidPoint (1000.0);
|
freqSlider.setSkewFactorFromMidPoint (1000.0);
|
||||||
|
freqSlider.setDoubleClickReturnValue (true, 1000.0);
|
||||||
|
|
||||||
setupSlider (gainSlider, gainLabel, -24.0, 24.0, 0.1, " dB");
|
setupSlider (gainSlider, gainLabel, -24.0, 24.0, 0.1, " dB");
|
||||||
|
gainSlider.setDoubleClickReturnValue (true, 0.0);
|
||||||
|
|
||||||
setupSlider (qSlider, qLabel, 0.1, 18.0, 0.01, "");
|
setupSlider (qSlider, qLabel, 0.1, 18.0, 0.01, "");
|
||||||
qSlider.setSkewFactorFromMidPoint (1.0);
|
qSlider.setSkewFactorFromMidPoint (1.0);
|
||||||
|
qSlider.setDoubleClickReturnValue (true, 1.0);
|
||||||
qSlider.getProperties().set (InstaLPEQLookAndFeel::knobTypeProperty, "dark");
|
qSlider.getProperties().set (InstaLPEQLookAndFeel::knobTypeProperty, "dark");
|
||||||
|
|
||||||
typeSelector.addItem ("Peak", 1);
|
typeSelector.addItem ("Peak", 1);
|
||||||
|
|||||||
@@ -23,6 +23,47 @@ 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 ("512 (~6ms)", 1);
|
||||||
|
qualitySelector.addItem ("1024 (~12ms)", 2);
|
||||||
|
qualitySelector.addItem ("2048 (~23ms)", 3);
|
||||||
|
qualitySelector.addItem ("4096 (~46ms)", 4);
|
||||||
|
qualitySelector.addItem ("8192 (~93ms)", 5);
|
||||||
|
qualitySelector.addItem ("16384 (~186ms)", 6);
|
||||||
|
qualitySelector.setSelectedId (3, juce::dontSendNotification); // default 2048
|
||||||
|
qualitySelector.onChange = [this]
|
||||||
|
{
|
||||||
|
int sel = qualitySelector.getSelectedId();
|
||||||
|
int order = sel + 8; // 1->9, 2->10, 3->11, 4->12, 5->13, 6->14
|
||||||
|
processor.setQuality (order);
|
||||||
|
|
||||||
|
if (sel <= 2) // 512 or 1024
|
||||||
|
qualityWarning.setText ("Low freq accuracy reduced", juce::dontSendNotification);
|
||||||
|
else
|
||||||
|
qualityWarning.setText ("", juce::dontSendNotification);
|
||||||
|
};
|
||||||
|
addAndMakeVisible (qualitySelector);
|
||||||
|
qualityLabel.setFont (customLookAndFeel.getMediumFont (13.0f));
|
||||||
|
qualityLabel.setJustificationType (juce::Justification::centredRight);
|
||||||
|
addAndMakeVisible (qualityLabel);
|
||||||
|
|
||||||
|
qualityWarning.setFont (customLookAndFeel.getRegularFont (11.0f));
|
||||||
|
qualityWarning.setColour (juce::Label::textColourId, juce::Colour (0xffff6644));
|
||||||
|
qualityWarning.setJustificationType (juce::Justification::centredRight);
|
||||||
|
addAndMakeVisible (qualityWarning);
|
||||||
|
|
||||||
// EQ curve
|
// EQ curve
|
||||||
curveDisplay.setListener (this);
|
curveDisplay.setListener (this);
|
||||||
addAndMakeVisible (curveDisplay);
|
addAndMakeVisible (curveDisplay);
|
||||||
@@ -37,11 +78,20 @@ InstaLPEQEditor::InstaLPEQEditor (InstaLPEQProcessor& p)
|
|||||||
masterGainSlider.setRange (-24.0, 24.0, 0.1);
|
masterGainSlider.setRange (-24.0, 24.0, 0.1);
|
||||||
masterGainSlider.setValue (0.0);
|
masterGainSlider.setValue (0.0);
|
||||||
masterGainSlider.setTextValueSuffix (" dB");
|
masterGainSlider.setTextValueSuffix (" dB");
|
||||||
|
masterGainSlider.setDoubleClickReturnValue (true, 0.0);
|
||||||
addAndMakeVisible (masterGainSlider);
|
addAndMakeVisible (masterGainSlider);
|
||||||
masterGainLabel.setFont (customLookAndFeel.getMediumFont (13.0f));
|
masterGainLabel.setFont (customLookAndFeel.getMediumFont (13.0f));
|
||||||
masterGainLabel.setJustificationType (juce::Justification::centred);
|
masterGainLabel.setJustificationType (juce::Justification::centred);
|
||||||
addAndMakeVisible (masterGainLabel);
|
addAndMakeVisible (masterGainLabel);
|
||||||
|
|
||||||
|
// Limiter toggle
|
||||||
|
limiterToggle.setToggleState (processor.limiterEnabled.load(), juce::dontSendNotification);
|
||||||
|
addAndMakeVisible (limiterToggle);
|
||||||
|
limiterLabel.setFont (customLookAndFeel.getMediumFont (13.0f));
|
||||||
|
limiterLabel.setColour (juce::Label::textColourId, InstaLPEQLookAndFeel::textSecondary);
|
||||||
|
limiterLabel.setJustificationType (juce::Justification::centred);
|
||||||
|
addAndMakeVisible (limiterLabel);
|
||||||
|
|
||||||
// Sizing
|
// Sizing
|
||||||
constrainer.setMinimumSize (700, 450);
|
constrainer.setMinimumSize (700, 450);
|
||||||
constrainer.setMaximumSize (1920, 1080);
|
constrainer.setMaximumSize (1920, 1080);
|
||||||
@@ -102,18 +152,30 @@ 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));
|
||||||
|
|
||||||
|
// Limiter toggle next to master gain
|
||||||
|
limiterLabel.setFont (customLookAndFeel.getMediumFont (std::max (11.0f, 14.0f * scale)));
|
||||||
|
limiterLabel.setBounds (masterArea.removeFromLeft (55));
|
||||||
|
limiterToggle.setBounds (masterArea.removeFromLeft (40));
|
||||||
|
|
||||||
|
// 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));
|
||||||
|
qualityWarning.setFont (customLookAndFeel.getRegularFont (std::max (9.0f, 11.0f * scale)));
|
||||||
|
qualityWarning.setBounds (masterArea.removeFromRight ((int) (170 * scale)));
|
||||||
|
|
||||||
// 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);
|
||||||
@@ -126,9 +188,10 @@ void InstaLPEQEditor::resized()
|
|||||||
|
|
||||||
void InstaLPEQEditor::timerCallback()
|
void InstaLPEQEditor::timerCallback()
|
||||||
{
|
{
|
||||||
// Sync bypass
|
// Sync bypass & limiter
|
||||||
processor.bypassed.store (bypassToggle.getToggleState());
|
processor.bypassed.store (bypassToggle.getToggleState());
|
||||||
processor.masterGainDb.store ((float) masterGainSlider.getValue());
|
processor.masterGainDb.store ((float) masterGainSlider.getValue());
|
||||||
|
processor.limiterEnabled.store (limiterToggle.getToggleState());
|
||||||
|
|
||||||
// Update display with latest magnitude response
|
// Update display with latest magnitude response
|
||||||
auto magDb = processor.getFIREngine().getMagnitudeResponseDb();
|
auto magDb = processor.getFIREngine().getMagnitudeResponseDb();
|
||||||
|
|||||||
@@ -39,12 +39,19 @@ private:
|
|||||||
NodeParameterPanel nodePanel;
|
NodeParameterPanel nodePanel;
|
||||||
|
|
||||||
juce::Label titleLabel { {}, "INSTALPEQ" };
|
juce::Label titleLabel { {}, "INSTALPEQ" };
|
||||||
juce::Label versionLabel { {}, "v1.0" };
|
juce::Label versionLabel { {}, "v1.1.3" };
|
||||||
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::Label qualityWarning { {}, "" };
|
||||||
|
|
||||||
juce::Slider masterGainSlider;
|
juce::Slider masterGainSlider;
|
||||||
juce::Label masterGainLabel { {}, "MASTER" };
|
juce::Label masterGainLabel { {}, "MASTER" };
|
||||||
|
juce::ToggleButton limiterToggle;
|
||||||
|
juce::Label limiterLabel { {}, "LIMITER" };
|
||||||
|
|
||||||
juce::ComponentBoundsConstrainer constrainer;
|
juce::ComponentBoundsConstrainer constrainer;
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ void InstaLPEQProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
|
|||||||
|
|
||||||
juce::dsp::ProcessSpec spec { sampleRate, (juce::uint32) samplesPerBlock, 2 };
|
juce::dsp::ProcessSpec spec { sampleRate, (juce::uint32) samplesPerBlock, 2 };
|
||||||
convolution.prepare (spec);
|
convolution.prepare (spec);
|
||||||
|
limiter.prepare (spec);
|
||||||
|
limiter.setThreshold (0.0f);
|
||||||
|
limiter.setRelease (50.0f);
|
||||||
|
|
||||||
firEngine.start (sampleRate);
|
firEngine.start (sampleRate);
|
||||||
updateFIR();
|
updateFIR();
|
||||||
@@ -67,6 +70,14 @@ void InstaLPEQProcessor::processBlock (juce::AudioBuffer<float>& buffer, juce::M
|
|||||||
float gain = juce::Decibels::decibelsToGain (masterGainDb.load());
|
float gain = juce::Decibels::decibelsToGain (masterGainDb.load());
|
||||||
if (std::abs (gain - 1.0f) > 0.001f)
|
if (std::abs (gain - 1.0f) > 0.001f)
|
||||||
buffer.applyGain (gain);
|
buffer.applyGain (gain);
|
||||||
|
|
||||||
|
// Brickwall limiter (0 dB ceiling)
|
||||||
|
if (limiterEnabled.load())
|
||||||
|
{
|
||||||
|
juce::dsp::AudioBlock<float> limBlock (buffer);
|
||||||
|
juce::dsp::ProcessContextReplacing<float> limContext (limBlock);
|
||||||
|
limiter.process (limContext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
@@ -125,6 +136,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
|
||||||
// ============================================================
|
// ============================================================
|
||||||
@@ -134,6 +152,7 @@ void InstaLPEQProcessor::getStateInformation (juce::MemoryBlock& destData)
|
|||||||
juce::XmlElement xml ("InstaLPEQ");
|
juce::XmlElement xml ("InstaLPEQ");
|
||||||
xml.setAttribute ("bypass", bypassed.load());
|
xml.setAttribute ("bypass", bypassed.load());
|
||||||
xml.setAttribute ("masterGain", (double) masterGainDb.load());
|
xml.setAttribute ("masterGain", (double) masterGainDb.load());
|
||||||
|
xml.setAttribute ("limiter", limiterEnabled.load());
|
||||||
|
|
||||||
auto currentBands = getBands();
|
auto currentBands = getBands();
|
||||||
for (int i = 0; i < (int) currentBands.size(); ++i)
|
for (int i = 0; i < (int) currentBands.size(); ++i)
|
||||||
@@ -157,6 +176,7 @@ void InstaLPEQProcessor::setStateInformation (const void* data, int sizeInBytes)
|
|||||||
|
|
||||||
bypassed.store (xml->getBoolAttribute ("bypass", false));
|
bypassed.store (xml->getBoolAttribute ("bypass", false));
|
||||||
masterGainDb.store ((float) xml->getDoubleAttribute ("masterGain", 0.0));
|
masterGainDb.store ((float) xml->getDoubleAttribute ("masterGain", 0.0));
|
||||||
|
limiterEnabled.store (xml->getBoolAttribute ("limiter", true));
|
||||||
|
|
||||||
std::vector<EQBand> loadedBands;
|
std::vector<EQBand> loadedBands;
|
||||||
for (auto* bandXml : xml->getChildIterator())
|
for (auto* bandXml : xml->getChildIterator())
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ public:
|
|||||||
// Settings
|
// Settings
|
||||||
std::atomic<bool> bypassed { false };
|
std::atomic<bool> bypassed { false };
|
||||||
std::atomic<float> masterGainDb { 0.0f };
|
std::atomic<float> masterGainDb { 0.0f };
|
||||||
|
std::atomic<bool> limiterEnabled { true };
|
||||||
|
|
||||||
|
void setQuality (int fftOrder);
|
||||||
|
|
||||||
FIREngine& getFIREngine() { return firEngine; }
|
FIREngine& getFIREngine() { return firEngine; }
|
||||||
double getCurrentSampleRate() const { return currentSampleRate; }
|
double getCurrentSampleRate() const { return currentSampleRate; }
|
||||||
@@ -53,6 +56,7 @@ private:
|
|||||||
|
|
||||||
FIREngine firEngine;
|
FIREngine firEngine;
|
||||||
juce::dsp::Convolution convolution;
|
juce::dsp::Convolution convolution;
|
||||||
|
juce::dsp::Limiter<float> limiter;
|
||||||
|
|
||||||
double currentSampleRate = 44100.0;
|
double currentSampleRate = 44100.0;
|
||||||
int currentBlockSize = 512;
|
int currentBlockSize = 512;
|
||||||
|
|||||||
Reference in New Issue
Block a user