diff --git a/CrystalizerEQ/AXIOMDesignSystem.h b/CrystalizerEQ/AXIOMDesignSystem.h index 7407335..57f33a3 100644 --- a/CrystalizerEQ/AXIOMDesignSystem.h +++ b/CrystalizerEQ/AXIOMDesignSystem.h @@ -1,9 +1,16 @@ -#ifndef AXIOMDESIGNSYSTEM_H -#define AXIOMDESIGNSYSTEM_H +/* +============================================================================== + AXIOMDesignSystem.h + + Comprehensive design system implementation providing: + - Color tokens and theming + - Typography scale and font management + - Spacing system with UI scaling + - Custom LookAndFeel implementations for all components + ============================================================================== +*/ #pragma once -#include - #include "JuceLibraryCode/BinaryData.h" @@ -362,9 +369,6 @@ namespace AXIOM { }; }; - struct Shadows { - }; - struct Opacity { static constexpr float MINALPHA = 0.04f; static constexpr float MAXALPHA = 0.95f; @@ -446,91 +450,6 @@ namespace AXIOM { } }; - /*struct Motion { - enum class Duration { - Slowest, - Slow, - Moderate, - Regular, - Fast - }; - enum class Ease { - Standard, - Decel, - Accel, - Emphasized, - Overshoot - }; - enum class Spring{ - Snappy, - Natural, - Gentle, - SoftOvershoot - }; - enum class MotionRole { - MenuEnter, MenuExit, ModalEnter, TooltipEnter, TooltipExit - }; - enum class MotionMicro { - Hover, Pressed, Focus, Success, Error - }; - enum class StaggerProfile { - Forward, CenterOut, Reverse - }; - - struct CubicBezier { - float x1, y1, x2, y2; - }; - struct SpringParameters { - float tension, friction, damping, mass; - }; - struct MicroParameters { - float scaleDelta, opacityDelta; - Duration duration; - Ease ease; - }; - - static float getDuration(Duration duration) { - switch (duration) { - case Duration::Slowest: return 0.36f; - case Duration::Slow: return 0.28f; - case Duration::Moderate: return 0.2f; - case Duration::Regular: return 0.14f; - case Duration::Fast: return 0.09f; - } - return 0.2f; - } - static CubicBezier getEasing(Ease easing) { - switch (easing) { - case Ease::Standard: return {0.2f, 0.0f, 0.0f, 1.0f}; - case Ease::Decel: return {0.05f, 0.7f, 0.1f, 1.0f}; - case Ease::Accel: return {0.3f, 0.0f, 0.8f, 0.15f}; - case Ease::Emphasized: return {0.2f, 0.0f, 0.0f, 1.0f}; - default: return {0.2f, 0.0f, 0.0f, 1.0f};; - // EIGENES STRUCT SPRING case Ease::Overshoot: return {0.2f, 0.0f, 0.0f, 1.0f}; - } - } - static SpringParameters getSpringPreset(Spring mode) { - switch (mode) { - case Spring::Snappy: return {220.0f, 26.0f, 0.6f, 1.0f}; - case Spring::Natural: return {170.0f, 22.0f, 0.68f, 1.0f}; - case Spring::Gentle: return {120.0f, 20.0f, 0.75f, 1.0f}; - case Spring::SoftOvershoot: return {180.0f, 17.0f, 0.55f, 1.0f}; - } - return {170.0f, 22.0f, 0.68f, 1.0f}; - } - static MicroParameters getMicroPreset(MotionMicro mode) { - switch (mode) { - case MotionMicro::Hover: return {0.02f, 0.06f, Duration::Fast, Ease::Emphasized}; - case MotionMicro::Pressed: return {-0.02f, 0.0f, Duration::Fast, Ease::Standard}; - case MotionMicro::Focus: return {0.0f, 0.02f, Duration::Regular, Ease::Decel}; - case MotionMicro::Success: return {0.04f, 0.04f, Duration::Regular, Ease::Emphasized}; - case MotionMicro::Error: return {0.00f, 0.00f, Duration::Fast, Ease::Standard}; - } - return {0.0f, 0.0f, Duration::Regular, Ease::Standard}; - } - - };*/ - struct Components { class BypassButtonLookAndFeel : public juce::LookAndFeel_V4 { public: @@ -1399,8 +1318,7 @@ namespace AXIOM { public: PresetComboBoxLookAndFeel() = default; - ~PresetComboBoxLookAndFeel() override { - } + ~PresetComboBoxLookAndFeel() override = default; void getIdealPopupMenuItemSize(const juce::String &text, bool isSeparator, int standardMenuItemHeight, int &idealWidth, @@ -1523,12 +1441,7 @@ namespace AXIOM { label.setJustificationType(juce::Justification::centredLeft); } - private: }; - private: }; -} - - -#endif //AXIOMDESIGNSYSTEM_H +} \ No newline at end of file diff --git a/CrystalizerEQ/CMakeLists.txt b/CrystalizerEQ/CMakeLists.txt index 46842b7..52b86a3 100644 --- a/CrystalizerEQ/CMakeLists.txt +++ b/CrystalizerEQ/CMakeLists.txt @@ -1,11 +1,17 @@ +# ============================================================================== +# CrystalizerEQ - CMake Build Configuration +# +# Defines plugin properties, dependencies, and build targets +# Supports VST3 and Standalone formats +# ============================================================================== + + cmake_minimum_required(VERSION 3.15) project(CrystalizerEQ VERSION 1.0.1) -# 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) -# Plugin-Projekt konfigurieren juce_add_plugin(CrystalizerEQ COMPANY_NAME "AXIOM" IS_SYNTH FALSE @@ -14,13 +20,12 @@ juce_add_plugin(CrystalizerEQ IS_MIDI_EFFECT FALSE EDITOR_WANTS_KEYBOARD_FOCUS FALSE COPY_PLUGIN_AFTER_BUILD TRUE - PLUGIN_MANUFACTURER_CODE Juce + PLUGIN_MANUFACTURER_CODE Axio PLUGIN_CODE CrEQ FORMATS VST3 Standalone PRODUCT_NAME "CrystalizerEQ" ) -# Quellcode einbinden target_sources(CrystalizerEQ PRIVATE PluginProcessor.cpp PluginEditor.cpp @@ -28,10 +33,8 @@ target_sources(CrystalizerEQ PRIVATE JuceLibraryCode/BinaryData.cpp ) -# C++20 aktivieren target_compile_features(CrystalizerEQ PRIVATE cxx_std_20) -# Benötigte JUCE-Module verlinken target_link_libraries(CrystalizerEQ PRIVATE juce::juce_audio_utils juce::juce_audio_plugin_client diff --git a/CrystalizerEQ/PluginEditor.cpp b/CrystalizerEQ/PluginEditor.cpp index 4b68f0c..dcf46f1 100644 --- a/CrystalizerEQ/PluginEditor.cpp +++ b/CrystalizerEQ/PluginEditor.cpp @@ -1,3 +1,15 @@ +/* +============================================================================== + PluginEditor.cpp + + Editor implementation for CrystalizerEQ + Handles UI layout, real-time spectrum analysis visualization, + parameter attachments, and user interactions + ============================================================================== +*/ + + + #include "PluginProcessor.h" #include "PluginEditor.h" #include "AXIOMDesignSystem.h" @@ -781,9 +793,6 @@ CrystalizerEQAudioProcessorEditor::CrystalizerEQAudioProcessorEditor(Crystalizer initPresetSystem(); updateFrequencyRanges(); - auto logoIcon = juce::XmlDocument::parse(BinaryData::logo_icon_svg); - if (logoIcon != nullptr) - logoDrawable = juce::Drawable::createFromSVG(*logoIcon); audioProcessor.apvts.addParameterListener("LowBandModes", this); audioProcessor.apvts.addParameterListener("HighBandModes", this); @@ -999,65 +1008,49 @@ void CrystalizerEQAudioProcessorEditor::paint(juce::Graphics &g) { g.setColour(AXIOM::DesignSystem::Colours::FOREGROUNDCOLOUR); - const auto mP = getLocalArea(&mainPanel, mainPanel.getLocalBounds()); - auto mPX = mP.getX(); - auto mPY = mP.getY(); - auto mPW = mP.getWidth(); - auto mPH = mP.getHeight(); + const auto mainPanelArea = getLocalArea(&mainPanel, mainPanel.getLocalBounds()); + auto mainPanelY = mainPanelArea.getY(); paintAnalyzer(g); g.setColour(Colours::SURFACEBYPASS); - const auto hB = getLocalArea(&headerBar, headerBar.getLocalBounds()); - auto hBX = hB.getX(); - auto hBY = hB.getY(); - auto hBW = hB.getWidth(); - auto hBH = hB.getHeight(); - auto hBPad = ((hBY + mPY) - hBH) / 2; - g.fillRect(hBX, hBY, hBW, mPY - hBPad); + const auto headerBarArea = getLocalArea(&headerBar, headerBar.getLocalBounds()); + auto headerBarAreaX = headerBarArea.getX(); + auto headerBarAreaY = headerBarArea.getY(); + auto headerBarAreaW = headerBarArea.getWidth(); + auto headerBarAreaH = headerBarArea.getHeight(); + auto headerBarAreaPad = ((headerBarAreaY + mainPanelY) - headerBarAreaH) / 2; + g.fillRect(headerBarAreaX, headerBarAreaY, headerBarAreaW, mainPanelY - headerBarAreaPad); g.setColour(Colours::SURFACECOLOUR); - const auto pA = getLocalArea(&presetArea, presetArea.getLocalBounds()); - auto pAX = pA.getX(); - auto pAY = pA.getY(); - auto pAWidth = pA.getWidth(); - auto pAHeight = pA.getHeight(); - g.fillRoundedRectangle(pAX, pAY - 10.f, pAWidth, pAHeight + 10.f, 10.0f); - - /*auto logoArea = hB.toFloat().reduced(hBPad); - logoArea = logoArea.withLeft(pAWidth + pAWidth / 2 + pAWidth / 4 + pAWidth / 8); + const auto presetLocalArea = getLocalArea(&presetArea, presetArea.getLocalBounds()); + auto presetLocalAreaX = presetLocalArea.getX(); + auto presetLocalAreaY = presetLocalArea.getY(); + auto presetLocalAreaWidth = presetLocalArea.getWidth(); + auto presetLocalAreaHeight = presetLocalArea.getHeight(); + g.fillRoundedRectangle(presetLocalAreaX, presetLocalAreaY - 10.f, presetLocalAreaWidth, presetLocalAreaHeight + 10.f, 10.0f); - logoDrawable->drawWithin(g, logoArea, juce::RectanglePlacement::centred, 1.0f);*/ - - - const auto fA = getLocalArea(&filterArea, filterArea.getLocalBounds()); - const int fABorderWidth = 3; - auto fABorder = fA.withSizeKeepingCentre(fA.getWidth() + fABorderWidth, fA.getHeight() + fABorderWidth); - fABorder = fABorder.withX(fABorder.getX() + fABorderWidth).withY(fABorder.getY() + fABorderWidth); + const auto filterLocalArea = getLocalArea(&filterArea, filterArea.getLocalBounds()); + const int filterLocalAreaBorderWidth = 3; + auto filterLocalAreaBorder = filterLocalArea.withSizeKeepingCentre(filterLocalArea.getWidth() + filterLocalAreaBorderWidth, filterLocalArea.getHeight() + filterLocalAreaBorderWidth); + filterLocalAreaBorder = filterLocalAreaBorder.withX(filterLocalAreaBorder.getX() + filterLocalAreaBorderWidth).withY(filterLocalAreaBorder.getY() + filterLocalAreaBorderWidth); g.setColour(Colours::SURFACECOLOUR); - g.fillRect(fABorder); + g.fillRect(filterLocalAreaBorder); - fABorder = fABorder.withX(fABorder.getX() - 2 * fABorderWidth).withY(fABorder.getY() - 2 * fABorderWidth); - g.fillRect(fABorder); + filterLocalAreaBorder = filterLocalAreaBorder.withX(filterLocalAreaBorder.getX() - 2 * filterLocalAreaBorderWidth).withY(filterLocalAreaBorder.getY() - 2 * filterLocalAreaBorderWidth); + g.fillRect(filterLocalAreaBorder); g.setColour(Colours::BACKGROUNDBYPASS); - g.fillRect(fA); - - //paintModeBoxBorders(g); + g.fillRect(filterLocalArea); g.setColour(Colours::SURFACEBYPASS); - const auto fB = getLocalArea(&footerBar, footerBar.getLocalBounds()); - g.fillRect(fB); + const auto footerBarArea = getLocalArea(&footerBar, footerBar.getLocalBounds()); + g.fillRect(footerBarArea); paintBorderLines(g); - /* - auto logoArea = fB.toFloat().reduced(hBPad); - - logoDrawable->drawWithin(g, logoArea, juce::RectanglePlacement::xLeft, 1.0f); - */ } diff --git a/CrystalizerEQ/PluginEditor.h b/CrystalizerEQ/PluginEditor.h index 523f5f1..4fc7e11 100644 --- a/CrystalizerEQ/PluginEditor.h +++ b/CrystalizerEQ/PluginEditor.h @@ -1,8 +1,10 @@ /* ============================================================================== + PluginEditor.h - This file contains the basic framework code for a JUCE plugin editor. - + Main editor interface for CrystalizerEQ + Declares UI components, spectrum analyzer, layout system, + and custom LookAndFeel instances ============================================================================== */ @@ -13,9 +15,7 @@ #include "PluginProcessor.h" #include "AXIOMDesignSystem.h" -//============================================================================== -/** -*/ + using AXIOM::DesignSystem; using Components = DesignSystem::Components; using SliderStyles = Components::SliderStyles; @@ -366,7 +366,6 @@ private: bool isAnimatingCrystalize = false; bool isFadingToActive = false; - std::unique_ptr logoDrawable; juce::Component::SafePointer presetMenuSafePtr; diff --git a/CrystalizerEQ/PluginProcessor.cpp b/CrystalizerEQ/PluginProcessor.cpp index 57f9564..f654f75 100644 --- a/CrystalizerEQ/PluginProcessor.cpp +++ b/CrystalizerEQ/PluginProcessor.cpp @@ -1,8 +1,10 @@ /* - ============================================================================== - - This file contains the basic framework code for a JUCE plugin processor. +============================================================================== + PluginProcessor.cpp + Core audio processing implementation for CrystalizerEQ + Implements 5-band EQ with shelving/bell/cut modes, multiband saturation, + and preset management system ============================================================================== */ @@ -645,15 +647,11 @@ bool CrystalizerEQAudioProcessor::isBusesLayoutSupported(const BusesLayout &layo juce::ignoreUnused (layouts); return true; #else - // This is the place where you check if the layout is supported. - // In this template code we only support mono or stereo. - // Some plugin hosts, such as certain GarageBand versions, will only - // load plugins that support stereo bus layouts. + if (layouts.getMainOutputChannelSet() != juce::AudioChannelSet::mono() && layouts.getMainOutputChannelSet() != juce::AudioChannelSet::stereo()) return false; - // This checks if the input layout matches the output layout #if ! JucePlugin_IsSynth if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet()) return false; @@ -711,9 +709,9 @@ void CrystalizerEQAudioProcessor::processBlock(juce::AudioBuffer &buffer, juce::AudioBuffer CrystalizerEQAudioProcessor::processMultiBand(juce::AudioBuffer &lowBuf, juce::AudioBuffer &highBuf) { const auto sr = getSampleRate(); + // Crossover frequency for multiband processing float fc = 10000.0f; fc = juce::jlimit(20.0f, 0.49f * (float) sr, fc); - auto peakGain = juce::Decibels::gainToDecibels(1.0f); auto lp = Coeff::makeLowPass(sr, fc, 0.7071f); auto hp = Coeff::makeHighPass(sr, fc, 0.7071f); diff --git a/CrystalizerEQ/PluginProcessor.h b/CrystalizerEQ/PluginProcessor.h index cbd9140..376fc9e 100644 --- a/CrystalizerEQ/PluginProcessor.h +++ b/CrystalizerEQ/PluginProcessor.h @@ -1,8 +1,10 @@ /* - ============================================================================== - - This file contains the basic framework code for a JUCE plugin processor. +============================================================================== + PluginProcessor.h + Audio processor for CrystalizerEQ plugin + Manages DSP processing chain, filter coefficients, multiband processing, + and parameter state (APVTS) ============================================================================== */ @@ -11,9 +13,7 @@ #include #include #include -//============================================================================== -/** -*/ + class AudioFIFO { public: @@ -29,7 +29,6 @@ public: juce::SpinLock lock; -private: }; class CrystalizerEQAudioProcessor : public juce::AudioProcessor, public juce::AudioProcessorValueTreeState::Listener { diff --git a/CrystalizerEQ/test1234.txt b/CrystalizerEQ/test1234.txt deleted file mode 100644 index e69de29..0000000