v.1.0.2
This commit is contained in:
parent
8e50251ba3
commit
369c8f55db
@ -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
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user