This commit is contained in:
Legaeli 2025-12-01 19:00:14 +01:00
parent 8e50251ba3
commit 369c8f55db
7 changed files with 78 additions and 173 deletions

View File

@ -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 <corecrt_math_defines.h>
#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
}

View File

@ -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

View File

@ -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);
*/
}

View File

@ -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<juce::Drawable> logoDrawable;
juce::Component::SafePointer<DesignSystem::PresetMenu> presetMenuSafePtr;

View File

@ -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<float> &buffer,
juce::AudioBuffer<float> CrystalizerEQAudioProcessor::processMultiBand(juce::AudioBuffer<float> &lowBuf,
juce::AudioBuffer<float> &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);

View File

@ -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 <juce_audio_processors/juce_audio_processors.h>
#include <juce_audio_utils/juce_audio_utils.h>
#include <juce_dsp/juce_dsp.h>
//==============================================================================
/**
*/
class AudioFIFO {
public:
@ -29,7 +29,6 @@ public:
juce::SpinLock lock;
private:
};
class CrystalizerEQAudioProcessor : public juce::AudioProcessor, public juce::AudioProcessorValueTreeState::Listener {