Per-pad FX chain, animated toggles, GR meter, simplified master panel

- 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>
This commit is contained in:
hariel1985
2026-03-23 06:42:47 +01:00
szülő 20b9fe2674
commit a0e83fa0a4
11 fájl változott, egészen pontosan 500 új sor hozzáadva és 210 régi sor törölve

Fájl megtekintése

@@ -1,5 +1,6 @@
#pragma once
#include <JuceHeader.h>
#include "DrumPad.h"
class FxPanel : public juce::Component
{
@@ -9,37 +10,47 @@ public:
void paint (juce::Graphics& g) override;
void resized() override;
// FX parameter getters (for processor to read)
float getCompThreshold() const { return (float) compThreshSlider.getValue(); }
float getCompRatio() const { return (float) compRatioSlider.getValue(); }
float getEqLo() const { return (float) eqLoSlider.getValue(); }
float getEqMid() const { return (float) eqMidSlider.getValue(); }
float getEqHi() const { return (float) eqHiSlider.getValue(); }
float getDistDrive() const { return (float) distDriveSlider.getValue(); }
float getDistMix() const { return (float) distMixSlider.getValue(); }
float getReverbSize() const { return (float) reverbSizeSlider.getValue(); }
float getReverbDecay() const { return (float) reverbDecaySlider.getValue(); }
// 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)
};