2026-08-29 13:17:11 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <JuceHeader.h>
|
|
|
|
|
#include "PluginProcessor.h"
|
|
|
|
|
|
|
|
|
|
namespace gelyk
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
class NeonLookAndFeel : public juce::LookAndFeel_V4
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
NeonLookAndFeel();
|
|
|
|
|
void drawLinearSlider(juce::Graphics&, int x, int y, int width, int height,
|
|
|
|
|
float sliderPos, float minSliderPos, float maxSliderPos,
|
|
|
|
|
const juce::Slider::SliderStyle, juce::Slider&) override;
|
2026-08-29 15:32:16 +02:00
|
|
|
void drawRotarySlider(juce::Graphics&, int x, int y, int width, int height,
|
|
|
|
|
float sliderPosProportional, float rotaryStartAngle,
|
|
|
|
|
float rotaryEndAngle, juce::Slider&) override;
|
2026-08-29 13:17:11 +02:00
|
|
|
void drawComboBox(juce::Graphics&, int width, int height, bool isButtonDown,
|
|
|
|
|
int buttonX, int buttonY, int buttonW, int buttonH,
|
|
|
|
|
juce::ComboBox&) override;
|
|
|
|
|
void positionComboBoxText(juce::ComboBox&, juce::Label&) override;
|
|
|
|
|
|
|
|
|
|
juce::Colour cyan { 0xff00e5ff };
|
|
|
|
|
juce::Colour magenta{ 0xffff2fd6 };
|
|
|
|
|
juce::Colour violet { 0xff8a2be2 };
|
|
|
|
|
juce::Colour bg { 0xff0b0f16 };
|
|
|
|
|
juce::Colour panel { 0xff121a24 };
|
|
|
|
|
juce::Colour line { 0xff1f2a38 };
|
|
|
|
|
juce::Colour textDim{ 0xff7a8aa0 };
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
class GelykEQAudioProcessorEditor final : public juce::AudioProcessorEditor,
|
|
|
|
|
public juce::Timer
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
explicit GelykEQAudioProcessorEditor(GelykEQAudioProcessor&);
|
|
|
|
|
~GelykEQAudioProcessorEditor() override;
|
|
|
|
|
|
|
|
|
|
void paint(juce::Graphics&) override;
|
|
|
|
|
void resized() override;
|
|
|
|
|
void timerCallback() override;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void rebuildFaders();
|
|
|
|
|
void scaleUI(float percent);
|
|
|
|
|
|
|
|
|
|
GelykEQAudioProcessor& processor;
|
|
|
|
|
|
|
|
|
|
NeonLookAndFeel lookAndFeel;
|
|
|
|
|
|
2026-08-29 15:32:16 +02:00
|
|
|
static constexpr int numBands = 7;
|
2026-08-29 13:17:11 +02:00
|
|
|
struct BandWidget
|
|
|
|
|
{
|
|
|
|
|
std::unique_ptr<juce::Slider> gain;
|
|
|
|
|
std::unique_ptr<juce::Slider> q;
|
2026-08-29 15:42:21 +02:00
|
|
|
std::unique_ptr<juce::Slider> freq;
|
2026-08-29 13:17:11 +02:00
|
|
|
std::unique_ptr<juce::Label> freqLabel;
|
2026-08-29 15:32:16 +02:00
|
|
|
std::unique_ptr<juce::Label> gainCaption;
|
|
|
|
|
std::unique_ptr<juce::Label> gainValue;
|
|
|
|
|
std::unique_ptr<juce::Label> qCaption;
|
|
|
|
|
std::unique_ptr<juce::Label> qValue;
|
2026-08-29 15:42:21 +02:00
|
|
|
std::unique_ptr<juce::Label> freqCaption;
|
|
|
|
|
std::unique_ptr<juce::Label> freqValue;
|
2026-08-29 13:17:11 +02:00
|
|
|
};
|
|
|
|
|
BandWidget bands[numBands];
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<juce::Label> masterLabel;
|
|
|
|
|
std::unique_ptr<juce::Slider> master;
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<juce::ComboBox> scaleBox;
|
|
|
|
|
std::unique_ptr<juce::Label> titleLabel;
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<juce::Label> statusBar;
|
|
|
|
|
std::unique_ptr<juce::Label> statusGit;
|
|
|
|
|
|
2026-08-29 13:26:26 +02:00
|
|
|
std::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment> gainAttachments[numBands];
|
|
|
|
|
std::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment> qAttachments[numBands];
|
2026-08-29 15:42:21 +02:00
|
|
|
std::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment> freqAttachments[numBands];
|
2026-08-29 13:17:11 +02:00
|
|
|
std::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment> masterAttachment;
|
|
|
|
|
|
|
|
|
|
juce::Array<float> spectrum;
|
|
|
|
|
juce::Array<float> freqBins;
|
2026-08-29 15:42:21 +02:00
|
|
|
juce::Array<float> eqCurve;
|
2026-08-29 13:17:11 +02:00
|
|
|
std::atomic<float> scaling { 1.0f }; // for resized()
|
|
|
|
|
|
|
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(GelykEQAudioProcessorEditor)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace gelyk
|