Compare commits

...

2 Commits

Author SHA1 Message Date
Legaeli
e239d3e955 CrystalizerEQ v1.0.0 2025-11-26 16:44:22 +01:00
Legaeli
f270e4613e Almost finished 2025-11-26 14:31:10 +01:00
8 changed files with 1544 additions and 1822 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.15) cmake_minimum_required(VERSION 3.15)
project(CrystalizerEQ VERSION 0.1.0) project(CrystalizerEQ VERSION 1.0.0)
# JUCE einbinden (lokaler Pfad zu JUCE, z.B. als Submodul oder manuell kopiert) # JUCE einbinden (lokaler Pfad zu JUCE, z.B. als Submodul oder manuell kopiert)
add_subdirectory(juce) # <-- Pfad zu deinem JUCE-Ordner relativ zum Projekt add_subdirectory(juce) # <-- Pfad zu deinem JUCE-Ordner relativ zum Projekt

View File

@ -11499,7 +11499,7 @@ static const unsigned char temp_binary_data_14[] =
"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 32\">\n" "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 32\">\n"
" <g id=\"Ebene_6\" data-name=\"Ebene 6\">\n" " <g id=\"Ebene_6\" data-name=\"Ebene 6\">\n"
" <rect x=\"0\" y=\"0\" width=\"64\" height=\"32\" fill=\"#171a1a\"/>\n" " <rect x=\"0\" y=\"0\" width=\"64\" height=\"32\" fill=\"#171a1a\"/>\n"
" <polygon points=\"0 32 2 30 32 16 62 2 64 0 64 32 0 32\" fill=\"#262b2b\"/>\n" " <polygon points=\"64 0 62 2 32 16 2 30 0 32 0 0 64 0\" fill=\"#262b2b\"/>\n"
" </g>\n" " </g>\n"
" <g id=\"Ebene_2\" data-name=\"Ebene 2\">\n" " <g id=\"Ebene_2\" data-name=\"Ebene 2\">\n"
" <rect x=\"2\" y=\"2\" width=\"60\" height=\"28\" fill=\"#3db7b7\"/>\n" " <rect x=\"2\" y=\"2\" width=\"60\" height=\"28\" fill=\"#3db7b7\"/>\n"
@ -11525,51 +11525,51 @@ static const unsigned char temp_binary_data_14[] =
" </g>\n" " </g>\n"
" </g>\n" " </g>\n"
" <g id=\"Ebene_3_Kopie\" data-name=\"Ebene 3 Kopie\">\n" " <g id=\"Ebene_3_Kopie\" data-name=\"Ebene 3 Kopie\">\n"
" <rect x=\"8\" y=\"8\" width=\"48\" height=\"16\" fill=\"#fffcfc\" opacity=\".21\"/>\n" " <rect x=\"8\" y=\"8\" width=\"48\" height=\"16\" fill=\"#fffcfc\" opacity=\".17\"/>\n"
" <polygon points=\"2 30 8 24 56 24 62 30 2 30\" fill=\"#fffcfc\" opacity=\".21\"/>\n" " <polygon points=\"2 30 8 24 56 24 62 30 2 30\" fill=\"#fffcfc\" opacity=\".17\"/>\n"
" <polygon points=\"62 2 56 8 8 8 2 2 62 2\" fill=\"#fffcfc\" opacity=\".21\"/>\n" " <polygon points=\"62 2 56 8 8 8 2 2 62 2\" fill=\"#fffcfc\" opacity=\".17\"/>\n"
" <polygon points=\"56 24 56 8 62 2 62 30 56 24\" fill=\"#fffcfc\" opacity=\".21\"/>\n" " <polygon points=\"56 24 56 8 62 2 62 30 56 24\" fill=\"#fffcfc\" opacity=\".17\"/>\n"
" <polygon points=\"8 8 8 24 2 30 2 2 8 8\" fill=\"#fffcfc\" opacity=\".21\"/>\n" " <polygon points=\"8 8 8 24 2 30 2 2 8 8\" fill=\"#fffcfc\" opacity=\".17\"/>\n"
" <polygon points=\"8 24 5 27 2 30 2 24 8 24\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"8 24 5 27 2 30 2 24 8 24\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"2 30 5 27 8 24 8 30 2 30\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"2 30 5 27 8 24 8 30 2 30\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"8 30 8 24 14 27 20 30 8 30\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"8 30 8 24 14 27 20 30 8 30\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"2 8 5 12 8 16 2 16 2 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"2 8 5 12 8 16 2 16 2 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"20 30 26 27 32 24 32 30 20 30\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"20 30 26 27 32 24 32 30 20 30\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"32 24 26 27 20 30 20 24 32 24\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"32 24 26 27 20 30 20 24 32 24\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"8 16 5 12 2 8 8 8 8 16\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"8 16 5 12 2 8 8 8 8 16\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"8 16 5 20 2 24 2 16 8 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"8 16 5 20 2 24 2 16 8 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"20 24 20 30 14 27 8 24 20 24\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"20 24 20 30 14 27 8 24 20 24\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"56 30 56 24 50 27 44 30 56 30\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"56 30 56 24 50 27 44 30 56 30\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"44 30 38 27 32 24 32 30 44 30\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"44 30 38 27 32 24 32 30 44 30\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"32 24 38 27 44 30 44 24 32 24\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"32 24 38 27 44 30 44 24 32 24\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"44 24 44 30 50 27 56 24 44 24\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"44 24 44 30 50 27 56 24 44 24\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"32 2 32 8 26 5 20 2 32 2\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"32 2 32 8 26 5 20 2 32 2\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"20 2 14 5 8 8 8 2 20 2\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"20 2 14 5 8 8 8 2 20 2\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"2 24 5 20 8 16 8 24 2 24\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"2 24 5 20 8 16 8 24 2 24\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"8 8 14 5 20 2 20 8 8 8\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"8 8 14 5 20 2 20 8 8 8\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"8 24 20 20 32 16 32 24 8 24\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"8 24 20 20 32 16 32 24 8 24\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"56 24 44 20 32 16 32 24 56 24\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"56 24 44 20 32 16 32 24 56 24\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"56 8 44 12 32 16 32 8 56 8\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"56 8 44 12 32 16 32 8 56 8\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"8 8 20 12 32 16 32 8 8 8\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"8 8 20 12 32 16 32 8 8 8\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"32 16 20 12 8 8 8 16 32 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"32 16 20 12 8 8 8 16 32 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"32 16 44 12 56 8 56 16 32 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"32 16 44 12 56 8 56 16 32 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"32 16 20 20 8 24 8 16 32 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"32 16 20 20 8 24 8 16 32 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"32 16 44 20 56 24 56 16 32 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"32 16 44 20 56 24 56 16 32 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"20 8 20 2 26 5 32 8 20 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"20 8 20 2 26 5 32 8 20 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"32 2 32 8 38 5 44 2 32 2\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"32 2 32 8 38 5 44 2 32 2\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"44 2 50 5 56 8 56 2 44 2\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"44 2 50 5 56 8 56 2 44 2\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"56 8 50 5 44 2 44 8 56 8\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"56 8 50 5 44 2 44 8 56 8\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"44 8 44 2 38 5 32 8 44 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"44 8 44 2 38 5 32 8 44 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"8 2 8 8 5 5 2 2 8 2\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"8 2 8 8 5 5 2 2 8 2\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"2 8 2 2 5 5 8 8 2 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"2 8 2 2 5 5 8 8 2 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"56 24 59 27 62 30 62 24 56 24\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"56 24 59 27 62 30 62 24 56 24\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"62 8 59 12 56 16 62 16 62 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"62 8 59 12 56 16 62 16 62 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"56 16 59 12 62 8 56 8 56 16\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"56 16 59 12 62 8 56 8 56 16\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"56 16 59 20 62 24 56 24 56 16\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"56 16 59 20 62 24 56 24 56 16\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"62 30 59 27 56 24 56 30 62 30\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"62 30 59 27 56 24 56 30 62 30\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"56 16 59 20 62 24 62 16 56 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"56 16 59 20 62 24 62 16 56 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"56 2 56 8 59 5 62 2 56 2\" fill=\"#fff\" opacity=\".21\"/>\n" " <polygon points=\"56 2 56 8 59 5 62 2 56 2\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"62 8 62 2 59 5 56 8 62 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n" " <polygon points=\"62 8 62 2 59 5 56 8 62 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" </g>\n" " </g>\n"
"</svg>"; "</svg>";
@ -11692,7 +11692,7 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)
case 0x31532e06: numBytes = 353; return low_cut_icon_svg; case 0x31532e06: numBytes = 353; return low_cut_icon_svg;
case 0x7e8ca05e: numBytes = 410; return low_shelf_icon_svg; case 0x7e8ca05e: numBytes = 410; return low_shelf_icon_svg;
case 0x4df4bf1e: numBytes = 350; return preset_menu_icon_svg; case 0x4df4bf1e: numBytes = 350; return preset_menu_icon_svg;
case 0xd842aaab: numBytes = 6343; return crystalize_button_active_icon_svg; case 0xd842aaab: numBytes = 6341; return crystalize_button_active_icon_svg;
case 0x885a7642: numBytes = 6279; return crystalize_button_passive_icon_svg; case 0x885a7642: numBytes = 6279; return crystalize_button_passive_icon_svg;
case 0xe49e0f15: numBytes = 406; return bypass_icon_svg; case 0xe49e0f15: numBytes = 406; return bypass_icon_svg;
default: break; default: break;

View File

@ -51,7 +51,7 @@ namespace BinaryData
const int preset_menu_icon_svgSize = 350; const int preset_menu_icon_svgSize = 350;
extern const char* crystalize_button_active_icon_svg; extern const char* crystalize_button_active_icon_svg;
const int crystalize_button_active_icon_svgSize = 6343; const int crystalize_button_active_icon_svgSize = 6341;
extern const char* crystalize_button_passive_icon_svg; extern const char* crystalize_button_passive_icon_svg;
const int crystalize_button_passive_icon_svgSize = 6279; const int crystalize_button_passive_icon_svgSize = 6279;

File diff suppressed because it is too large Load Diff

View File

@ -19,9 +19,11 @@
using AXIOM::DesignSystem; using AXIOM::DesignSystem;
using Components = DesignSystem::Components; using Components = DesignSystem::Components;
using SliderStyles = Components::SliderStyles; using SliderStyles = Components::SliderStyles;
class SpectrumAnalyzer { class SpectrumAnalyzer {
public: public:
SpectrumAnalyzer(AudioFIFO& fifoRef, CrystalizerEQAudioProcessor& processor) : audioFIFO(fifoRef), audioProcessor(processor) { SpectrumAnalyzer(AudioFIFO &fifoRef, CrystalizerEQAudioProcessor &processor) : audioFIFO(fifoRef),
audioProcessor(processor) {
fftData.resize(2 * FFTSIZE); fftData.resize(2 * FFTSIZE);
magnitudes.resize(BINS); magnitudes.resize(BINS);
magnitudesDb.resize(BINS); magnitudesDb.resize(BINS);
@ -33,15 +35,14 @@ class SpectrumAnalyzer {
peakHoldMagnitudesDb.resize(BINS); peakHoldMagnitudesDb.resize(BINS);
DELTAT = static_cast<float>(HOPSIZE) / static_cast<float>(sampleRate); DELTAT = static_cast<float>(HOPSIZE) / static_cast<float>(sampleRate);
renderValuesDb.resize(BINS); renderValuesDb.resize(BINS);
} }
~SpectrumAnalyzer() = default; ~SpectrumAnalyzer() = default;
AudioFIFO& audioFIFO; AudioFIFO &audioFIFO;
CrystalizerEQAudioProcessor& audioProcessor; CrystalizerEQAudioProcessor &audioProcessor;
static constexpr int FFTSIZE = 4096; static constexpr int FFTSIZE = 4096;
@ -52,7 +53,7 @@ class SpectrumAnalyzer {
juce::Array<float> fftFrame; juce::Array<float> fftFrame;
//CHANGE FOR LOWER/HIGHER EMA-SMOOTHING //LOWER VALUE -> MORE SMOOTHING/SLOW RESPONSE -- HIGHER VALUE -> LESS SMOOTHING/FAST RESPONSE //MAX VALUE = 1.f //CHANGE FOR LOWER/HIGHER EMA-SMOOTHING //LOWER VALUE -> MORE SMOOTHING/SLOW RESPONSE -- HIGHER VALUE -> LESS SMOOTHING/FAST RESPONSE //MAX VALUE = 1.f
float smoothingFactor = 0.3f; float smoothingFactor = 0.5f;
void processSamples(); void processSamples();
@ -62,21 +63,20 @@ class SpectrumAnalyzer {
void applyWindowOnFftFrame(std::vector<float> &fullFrame); void applyWindowOnFftFrame(std::vector<float> &fullFrame);
juce::dsp::WindowingFunction<float> window juce::dsp::WindowingFunction<float> window
{ {
FFTSIZE, FFTSIZE,
juce::dsp::WindowingFunction<float>::hann juce::dsp::WindowingFunction<float>::hann
}; };
void processWindowedFrame(std::vector<float> &windowedFrame); void processWindowedFrame(std::vector<float> &windowedFrame);
static constexpr int FFTORDER = 12; static constexpr int FFTORDER = 12;
juce::dsp::FFT fft { FFTORDER }; juce::dsp::FFT fft{FFTORDER};
std::vector<float> fftData; std::vector<float> fftData;
const float MINDB = -90.f; const float MINDB = -90.f;
const float MAXDB = 0.f; const float MAXDB = 0.f;
@ -103,7 +103,7 @@ class SpectrumAnalyzer {
std::vector<double> freqPerBin; std::vector<double> freqPerBin;
//CHANGE FOR FASTER FALLOFF -- VALUE IS IN DB/S //CHANGE FOR FASTER FALLOFF -- VALUE IS IN DB/S
const float FALLOFFRATE = 120.f; const float FALLOFFRATE = 240.f;
float DELTAT = 0.f; float DELTAT = 0.f;
@ -114,37 +114,43 @@ class SpectrumAnalyzer {
const float MAXFREQ = static_cast<float>(sampleRate) / 2; const float MAXFREQ = static_cast<float>(sampleRate) / 2;
void fillFftDataFromFrame(std::vector<float> &windowedFrame); void fillFftDataFromFrame(std::vector<float> &windowedFrame);
void buildMagnitudeSpectrum();
void convertToDb();
void applySmoothing();
void applyEMA();
void applyFreqSmoothing();
void applyPeakHoldAndFalloff();
std::vector<float> getRenderValues();
void buildMagnitudeSpectrum();
void convertToDb();
void applySmoothing();
void applyEMA();
void applyFreqSmoothing();
void applyPeakHoldAndFalloff();
std::vector<float> getRenderValues();
}; };
class CrystalizerEQAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer class CrystalizerEQAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::AudioProcessorValueTreeState::Listener {
{
public: public:
CrystalizerEQAudioProcessorEditor(CrystalizerEQAudioProcessor &);
CrystalizerEQAudioProcessorEditor (CrystalizerEQAudioProcessor&);
~CrystalizerEQAudioProcessorEditor() override; ~CrystalizerEQAudioProcessorEditor() override;
void paintAnalyzer(juce::Graphics &g); void paintAnalyzer(juce::Graphics &g);
void paintModeBoxBorders(juce::Graphics &g); void paintModeBoxBorders(juce::Graphics &g);
void paintBorderLines(juce::Graphics& g); void paintBorderLines(juce::Graphics &g);
//=================================================================== //===================================================================
void timerCallback(); void timerCallback();
void paint (juce::Graphics&) override;
void paint(juce::Graphics &) override;
void resized() override; void resized() override;
void resetAllCheckboxes(); void resetAllCheckboxes();
using SliderAttach = juce::AudioProcessorValueTreeState::SliderAttachment; using SliderAttach = juce::AudioProcessorValueTreeState::SliderAttachment;
@ -153,7 +159,7 @@ public:
using ComboBoxAttach = juce::AudioProcessorValueTreeState::ComboBoxAttachment; using ComboBoxAttach = juce::AudioProcessorValueTreeState::ComboBoxAttachment;
juce::Slider testNoiseSlider, juce::Slider
lowBandFreqSlider, lowBandSlopeSlider, lowBandGainSlider, lowBandQSlider, lowBandFreqSlider, lowBandSlopeSlider, lowBandGainSlider, lowBandQSlider,
peak1FreqSlider, peak1GainSlider, peak1QSlider, peak1FreqSlider, peak1GainSlider, peak1QSlider,
peak2FreqSlider, peak2GainSlider, peak2QSlider, peak2FreqSlider, peak2GainSlider, peak2QSlider,
@ -161,7 +167,7 @@ public:
highBandFreqSlider, highBandSlopeSlider, highBandGainSlider, highBandQSlider, highBandFreqSlider, highBandSlopeSlider, highBandGainSlider, highBandQSlider,
inputSlider, outputSlider; inputSlider, outputSlider;
const juce::Array<juce::Slider*> sliders = { const juce::Array<juce::Slider *> sliders = {
&lowBandGainSlider, &lowBandFreqSlider, &lowBandQSlider, &lowBandSlopeSlider, &lowBandGainSlider, &lowBandFreqSlider, &lowBandQSlider, &lowBandSlopeSlider,
&peak1GainSlider, &peak1FreqSlider, &peak1QSlider, &peak1GainSlider, &peak1FreqSlider, &peak1QSlider,
&peak2GainSlider, &peak2FreqSlider, &peak2QSlider, &peak2GainSlider, &peak2FreqSlider, &peak2QSlider,
@ -170,7 +176,7 @@ public:
&inputSlider, &outputSlider &inputSlider, &outputSlider
}; };
std::unique_ptr<SliderAttach> testNoiseAttach, std::unique_ptr<SliderAttach>
lowBandFreqAttach, lowBandSlopeAttach, lowBandGainAttach, lowBandQAttach, lowBandFreqAttach, lowBandSlopeAttach, lowBandGainAttach, lowBandQAttach,
peak1FreqAttach, peak1GainAttach, peak1QAttach, peak1FreqAttach, peak1GainAttach, peak1QAttach,
peak2FreqAttach, peak2GainAttach, peak2QAttach, peak2FreqAttach, peak2GainAttach, peak2QAttach,
@ -178,7 +184,11 @@ public:
highBandFreqAttach, highBandSlopeAttach, highBandGainAttach, highBandQAttach, highBandFreqAttach, highBandSlopeAttach, highBandGainAttach, highBandQAttach,
inputAttach, outputAttach; inputAttach, outputAttach;
juce::Label titleLabel, testNoiseLabel, std::unique_ptr<ButtonAttach>
peak1BypassAttach, peak2BypassAttach, peak3BypassAttach,
crystalizeAttach, masterBypassAttach;
juce::Label titleLabel,
lowBandFreqLabel, lowBandSlopeLabel, lowBandGainLabel, lowBandQLabel, lowBandModeLabel, lowBandFreqLabel, lowBandSlopeLabel, lowBandGainLabel, lowBandQLabel, lowBandModeLabel,
low12, low24, low36, low48, lowdBOctLabel, low12, low24, low36, low48, lowdBOctLabel,
peak1FreqLabel, peak1GainLabel, peak1QLabel, peak1FreqLabel, peak1GainLabel, peak1QLabel,
@ -189,32 +199,35 @@ public:
inputLabel, outputLabel, inputLabel, outputLabel,
presetBoxLabel; presetBoxLabel;
const juce::Array<juce::Label*> sliderLabels = { const juce::Array<juce::Label *> sliderLabels = {
&lowBandFreqLabel, &lowBandSlopeLabel, &lowBandGainLabel, &lowBandQLabel, &lowBandModeLabel, &lowdBOctLabel, &lowBandFreqLabel, &lowBandSlopeLabel, &lowBandGainLabel, &lowBandQLabel, &lowBandModeLabel, &lowdBOctLabel,
&peak1FreqLabel, &peak1GainLabel, &peak1QLabel, &peak1FreqLabel, &peak1GainLabel, &peak1QLabel,
&peak2FreqLabel, &peak2GainLabel, &peak2QLabel, &peak2FreqLabel, &peak2GainLabel, &peak2QLabel,
&peak3FreqLabel, &peak3GainLabel, &peak3QLabel, &peak3FreqLabel, &peak3GainLabel, &peak3QLabel,
&highBandFreqLabel, &highBandSlopeLabel, &highBandGainLabel, &highBandQLabel, &highBandModeLabel, &highdBOctLabel, &highBandFreqLabel, &highBandSlopeLabel, &highBandGainLabel, &highBandQLabel, &highBandModeLabel,
&highdBOctLabel,
&inputLabel, &outputLabel &inputLabel, &outputLabel
}; };
const juce::Array<juce::Label*> slopeLabels = { const juce::Array<juce::Label *> slopeLabels = {
&low12, &low24, &low36, &low48, &low12, &low24, &low36, &low48,
&high12, &high24, &high36, &high48 &high12, &high24, &high36, &high48
}; };
juce::TextButton resetButton, savePresetButton, deletePresetButton;
juce::TextButton testNoiseButton, resetButton, savePresetButton, deletePresetButton; juce::ToggleButton masterBypassButton, crystalizeButton, peak1BypassButton, peak2BypassButton, peak3BypassButton,
presetMenuButton;
juce::ToggleButton masterBypassButton, crystalizeButton, peak1BypassButton, peak2BypassButton, peak3BypassButton, presetMenuButton; const juce::Array<juce::ToggleButton *> peakBypassButtons = {
&peak1BypassButton, &peak2BypassButton, &peak3BypassButton
const juce::Array<juce::ToggleButton*> peakBypassButtons = {&peak1BypassButton, &peak2BypassButton, &peak3BypassButton}; };
juce::ComboBox presetBox; juce::ComboBox presetBox;
juce::Component lowBandModeBox, highBandModeBox; juce::Component lowBandModeBox, highBandModeBox;
juce::Array<juce::ToggleButton*> lowBandModeButtons, highBandModeButtons; juce::Array<juce::ToggleButton *> lowBandModeButtons, highBandModeButtons;
std::array<bool, 4> lowBandBools, highBandBools; std::array<bool, 4> lowBandBools, highBandBools;
@ -222,16 +235,12 @@ public:
juce::ToggleButton lowBypass, lowCut, lowBell, lowShelf, juce::ToggleButton lowBypass, lowCut, lowBell, lowShelf,
highBypass, highCut, highBell, highShelf; highBypass, highCut, highBell, highShelf;
juce::TextEditor presetNameInput; DesignSystem::ClickableTextEditor presetNameInput;
private: private:
// This reference is provided as a quick way for your editor to // This reference is provided as a quick way for your editor to
// access the processor object that created it. // access the processor object that created it.
CrystalizerEQAudioProcessor& audioProcessor; CrystalizerEQAudioProcessor &audioProcessor;
void setKnobVisibility(); void setKnobVisibility();
@ -253,9 +262,13 @@ private:
void setupToggleButtons(); void setupToggleButtons();
void disableLowBand(float target); void disableLowBand(float target);
void disableLowMidBand(float target); void disableLowMidBand(float target);
void disableMidBand(float target); void disableMidBand(float target);
void disableHighMidBand(float target); void disableHighMidBand(float target);
void disableHighBand(float target); void disableHighBand(float target);
void disableEverything(float target); void disableEverything(float target);
@ -270,6 +283,10 @@ private:
void initPresetSystem(); void initPresetSystem();
void updateFrequencyRanges();
void updateModeButtons();
std::unique_ptr<AXIOM::DesignSystem::Components::BaseSliderLookAndFeel> baseLookAndFeel; std::unique_ptr<AXIOM::DesignSystem::Components::BaseSliderLookAndFeel> baseLookAndFeel;
std::unique_ptr<DesignSystem::Components::GainSliderLookAndFeel> gainLookAndFeel; std::unique_ptr<DesignSystem::Components::GainSliderLookAndFeel> gainLookAndFeel;
@ -284,6 +301,7 @@ private:
std::unique_ptr<DesignSystem::PresetMenuLookAndFeel> presetMenuLookAndFeel; std::unique_ptr<DesignSystem::PresetMenuLookAndFeel> presetMenuLookAndFeel;
std::unique_ptr<DesignSystem::PresetButtonsLookAndFeel> presetButtonLookAndFeel; std::unique_ptr<DesignSystem::PresetButtonsLookAndFeel> presetButtonLookAndFeel;
std::unique_ptr<DesignSystem::PresetComboBoxLookAndFeel> presetComboBoxLookAndFeel; std::unique_ptr<DesignSystem::PresetComboBoxLookAndFeel> presetComboBoxLookAndFeel;
std::unique_ptr<DesignSystem::PresetInputLookAndFeel> presetInputLookAndFeel;
//SPECRTRUM ANALYZER //SPECRTRUM ANALYZER
@ -308,25 +326,31 @@ private:
Component highMidFilterArea; Component highMidFilterArea;
Component highFilterArea; Component highFilterArea;
const juce::Array<juce::Component*> filterAreas { const juce::Array<juce::Component *> filterAreas{
&lowFilterArea, &lowMidFilterArea, &midFilterArea, &highMidFilterArea, &highFilterArea &lowFilterArea, &lowMidFilterArea, &midFilterArea, &highMidFilterArea, &highFilterArea
}; };
Component globalControlArea; Component globalControlArea;
void scalePluginWindow(juce::Rectangle<int> area); void scalePluginWindow(juce::Rectangle<int> area);
void setupMainGrid(juce::Rectangle<int> area); void setupMainGrid(juce::Rectangle<int> area);
void setupLowBandLayout(); void setupLowBandLayout();
void setupLowMidBandLayout(); void setupLowMidBandLayout();
void setupMidBandLayout(); void setupMidBandLayout();
void setupHighMidBandLayout(); void setupHighMidBandLayout();
void setupHighBandLayout(); void setupHighBandLayout();
void setupHeader(); void setupHeader();
void setupBody(); void setupBody();
void setupFooter(); void setupFooter();
juce::Array<float> getReferenceCell(); juce::Array<float> getReferenceCell();
@ -344,13 +368,19 @@ private:
std::unique_ptr<juce::Drawable> logoDrawable; std::unique_ptr<juce::Drawable> logoDrawable;
DesignSystem::PresetMenu* test;
juce::Component::SafePointer<DesignSystem::PresetMenu> presetMenuSafePtr; juce::Component::SafePointer<DesignSystem::PresetMenu> presetMenuSafePtr;
bool inputFocused = false;
float mapFrequencyToX(float freq, float minFreq, float maxFreq, float width); float mapFrequencyToX(float freq, float minFreq, float maxFreq, float width);
int getClosestBinForFrequency(float freq); int getClosestBinForFrequency(float freq);
void drawFrequencyGrid(juce::Graphics& g, const float dbRange);
void drawFrequencyGrid(juce::Graphics &g, const float dbRange);
float getInterpolatedDb(float exactBin); float getInterpolatedDb(float exactBin);
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CrystalizerEQAudioProcessorEditor) void parameterChanged(const juce::String& parameterID, float newValue) override;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CrystalizerEQAudioProcessorEditor)
}; };

File diff suppressed because it is too large Load Diff

View File

@ -18,66 +18,81 @@
class AudioFIFO { class AudioFIFO {
public: public:
AudioFIFO(); AudioFIFO();
~AudioFIFO(); ~AudioFIFO();
juce::Array<float> sampleStack; juce::Array<float> sampleStack;
void loadSamplesToFIFO(const juce::AudioBuffer<float> &samples); void loadSamplesToFIFO(const juce::AudioBuffer<float> &samples);
juce::Array<float> sendSamplesToEditor(); juce::Array<float> sendSamplesToEditor();
juce::SpinLock lock; juce::SpinLock lock;
private: private:
}; };
class CrystalizerEQAudioProcessor : public juce::AudioProcessor , public juce::AudioProcessorValueTreeState::Listener class CrystalizerEQAudioProcessor : public juce::AudioProcessor, public juce::AudioProcessorValueTreeState::Listener {
{
public: public:
//============================================================================== //==============================================================================
CrystalizerEQAudioProcessor(); CrystalizerEQAudioProcessor();
~CrystalizerEQAudioProcessor() override; ~CrystalizerEQAudioProcessor() override;
void parameterChanged (const juce::String& id, float newValue) override;
void parameterChanged(const juce::String &id, float newValue) override;
//============================================================================== //==============================================================================
void prepareToPlay (double sampleRate, int samplesPerBlock) override; void prepareToPlay(double sampleRate, int samplesPerBlock) override;
void releaseResources() override; void releaseResources() override;
#ifndef JucePlugin_PreferredChannelConfigurations #ifndef JucePlugin_PreferredChannelConfigurations
bool isBusesLayoutSupported (const BusesLayout& layouts) const override; bool isBusesLayoutSupported(const BusesLayout &layouts) const override;
#endif #endif
void processBlock (juce::AudioBuffer<float>&, juce::MidiBuffer&) override; void processBlock(juce::AudioBuffer<float> &, juce::MidiBuffer &) override;
//============================================================================== //==============================================================================
juce::AudioProcessorEditor* createEditor() override; juce::AudioProcessorEditor *createEditor() override;
bool hasEditor() const override; bool hasEditor() const override;
//============================================================================== //==============================================================================
const juce::String getName() const override; const juce::String getName() const override;
bool acceptsMidi() const override; bool acceptsMidi() const override;
bool producesMidi() const override; bool producesMidi() const override;
bool isMidiEffect() const override; bool isMidiEffect() const override;
double getTailLengthSeconds() const override; double getTailLengthSeconds() const override;
//============================================================================== //==============================================================================
int getNumPrograms() override; int getNumPrograms() override;
int getCurrentProgram() override; int getCurrentProgram() override;
void setCurrentProgram (int index) override;
const juce::String getProgramName (int index) override; void setCurrentProgram(int index) override;
void changeProgramName (int index, const juce::String& newName) override;
const juce::String getProgramName(int index) override;
void changeProgramName(int index, const juce::String &newName) override;
//============================================================================== //==============================================================================
void getStateInformation (juce::MemoryBlock& destData) override; void getStateInformation(juce::MemoryBlock &destData) override;
void setStateInformation (const void* data, int sizeInBytes) override;
void setStateInformation(const void *data, int sizeInBytes) override;
// --------- Parameter (APVTS) ---------- // --------- Parameter (APVTS) ----------
static juce::AudioProcessorValueTreeState::ParameterLayout createParameterLayout(); static juce::AudioProcessorValueTreeState::ParameterLayout createParameterLayout();
juce::AudioProcessorValueTreeState apvts { *this, nullptr, "PARAMS", createParameterLayout() };
void setPresetName (const juce::String& s); juce::AudioProcessorValueTreeState apvts{*this, nullptr, "PARAMS", createParameterLayout()};
void setPresetName(const juce::String &s);
juce::String getPresetName() const noexcept { return presetName; } juce::String getPresetName() const noexcept { return presetName; }
juce::StringArray getPresetNamesArray() const; juce::StringArray getPresetNamesArray() const;
@ -90,39 +105,39 @@ public:
void resetAllParameters() const; void resetAllParameters() const;
bool lowCutActive = false;
bool highCutActive = false;
AudioFIFO audioFIFO; AudioFIFO audioFIFO;
private: private:
// --------- EQ-Kette ----------
using Gain = juce::dsp::Gain<float>; using Gain = juce::dsp::Gain<float>;
using Filter = juce::dsp::IIR::Filter<float>; using Filter = juce::dsp::IIR::Filter<float>;
using Chain = juce::dsp::ProcessorChain<Gain, Filter, Filter, Filter, Filter, Filter, Filter, Filter, Filter, Filter, Filter, Filter, Filter, Filter, Gain>; // 0: LowCut (HP), 1: Peak, 2: HighCut (LP) using Chain = juce::dsp::ProcessorChain<Gain, Filter, Filter, Filter, Filter, Filter, Filter, Filter, Filter, Filter
, Filter, Filter, Filter, Filter, Gain>; // 0: LowCut (HP), 1: Peak, 2: HighCut (LP)
juce::Random noiseRandL, noiseRandR; juce::Random noiseRandL, noiseRandR;
Chain leftChain, rightChain; Chain leftChain, rightChain;
void updateFilters(); // Koeffizienten aus Parametern berechnen void updateFilters();
juce::AudioBuffer<float> processMultiBand(juce::AudioBuffer<float> &lowBuf, juce::AudioBuffer<float> &highBuf);
juce::AudioBuffer<float> processMultiBand(juce::AudioBuffer<float>& lowBuf, juce::AudioBuffer<float>& highBuf);
using Coeff = juce::dsp::IIR::Coefficients<float>; using Coeff = juce::dsp::IIR::Coefficients<float>;
juce::dsp::LinkwitzRileyFilter<float> mbLowpass;
juce::dsp::LinkwitzRileyFilter<float> mbHighpass; juce::dsp::IIR::Filter<float> mbHighPeakL;
juce::dsp::IIR::Filter<float> mbHighPeak; juce::dsp::IIR::Filter<float> mbHighPeakR;
juce::dsp::WaveShaper<float> saturator;
juce::dsp::LinkwitzRileyFilter<float> mbLowpassL, mbLowpassR;
juce::dsp::LinkwitzRileyFilter<float> mbHighpassL, mbHighpassR;
juce::dsp::WaveShaper<float> saturatorL, saturatorR;
juce::String presetName { "Init" }; juce::String presetName{"Init"};
//============================================================================== //==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CrystalizerEQAudioProcessor) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CrystalizerEQAudioProcessor)
}; };