- FX moved from master bus to per-pad processing: each pad has its own Filter, Distortion, EQ, Compressor, Reverb via DrumPad::applyPadFx() with temp buffer rendering - FxPanel now edits the selected pad's FX parameters - Animated toggle switches with smooth lerp transition and glow - Per-pad compressor GR meter connected to FxPanel display - Master panel simplified: Volume/Tune/Pan + Limiter toggle + VU meter - Master bus chain: Vol/Pan → Output Limiter (0dB brickwall) → VU - Pointer glow reduced to half intensity (4 layers, narrower spread) - Smooth 8-layer arc glow with exponential opacity falloff Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
57 sor
1.7 KiB
C++
57 sor
1.7 KiB
C++
#pragma once
|
|
#include <JuceHeader.h>
|
|
#include "DrumPad.h"
|
|
|
|
class FxPanel : public juce::Component
|
|
{
|
|
public:
|
|
FxPanel();
|
|
|
|
void paint (juce::Graphics& g) override;
|
|
void resized() override;
|
|
|
|
// Connect to a pad's FX params
|
|
void setPad (DrumPad* pad);
|
|
void syncToPad(); // write GUI values to pad
|
|
void syncFromPad(); // read pad values to GUI
|
|
|
|
// Compressor GR meter
|
|
void setCompGainReduction (float grDb) { compGrDb = grDb; repaint (compGrArea); }
|
|
|
|
void paintOverChildren (juce::Graphics& g) override;
|
|
|
|
private:
|
|
// Compressor
|
|
juce::Slider compThreshSlider, compRatioSlider;
|
|
juce::Label compThreshLabel, compRatioLabel, compTitle;
|
|
juce::ToggleButton compToggle;
|
|
|
|
// EQ
|
|
juce::Slider eqLoSlider, eqMidSlider, eqHiSlider;
|
|
juce::Label eqLoLabel, eqMidLabel, eqHiLabel, eqTitle;
|
|
juce::ToggleButton eqToggle;
|
|
|
|
// Distortion
|
|
juce::Slider distDriveSlider, distMixSlider;
|
|
juce::Label distDriveLabel, distMixLabel, distTitle;
|
|
juce::ToggleButton distToggle;
|
|
|
|
// Reverb
|
|
juce::Slider reverbSizeSlider, reverbDecaySlider;
|
|
juce::Label reverbSizeLabel, reverbDecayLabel, reverbTitle;
|
|
juce::ToggleButton reverbToggle;
|
|
|
|
DrumPad* currentPad = nullptr;
|
|
|
|
float compGrDb = 0.0f;
|
|
bool repaintCompGr = false;
|
|
juce::Rectangle<int> compGrArea; // stored from resized for paintOverChildren
|
|
|
|
void setupKnob (juce::Slider& s, juce::Label& l, const juce::String& name,
|
|
double min, double max, double val, double step = 0.01);
|
|
void setupTitle (juce::Label& l, const juce::String& text);
|
|
void setupToggle (juce::ToggleButton& t);
|
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FxPanel)
|
|
};
|