Initial release — InstaShadow mastering compressor v1.0

Dual-stage compressor (optical + VCA) with output transformer saturation.
- Port-Hamiltonian T4B opto-cell model with implicit trapezoidal integration
- Feed-forward VCA with 7 ratios, 6 attack/release presets, Dual release mode
- 3 transformer types (Nickel/Iron/Steel) with 4x oversampled waveshaping
- Analog-style needle VU meters, horizontal GR meters
- Sidechain HPF, stereo link, independent section bypass
- Full state save/restore, CI/CD for Windows/macOS/Linux
This commit is contained in:
hariel1985
2026-03-27 16:03:24 +01:00
commit a587a43ff9
33 fájl változott, egészen pontosan 2417 új sor hozzáadva és 0 régi sor törölve

64
Source/CompressorEngine.h Normal file
Fájl megtekintése

@@ -0,0 +1,64 @@
#pragma once
#include <JuceHeader.h>
#include "OpticalCell.h"
#include "VCACompressor.h"
#include "TransformerSaturation.h"
class CompressorEngine
{
public:
CompressorEngine();
void prepare (double sampleRate, int samplesPerBlock);
void processBlock (juce::AudioBuffer<float>& buffer);
// --- Optical section (GUI → audio) ---
std::atomic<float> optoThresholdDb { -20.0f };
std::atomic<float> optoGainDb { 0.0f };
std::atomic<float> optoScHpfHz { 90.0f };
std::atomic<bool> optoBypass { false };
// --- Discrete VCA section ---
std::atomic<float> vcaThresholdDb { -20.0f };
std::atomic<float> vcaGainDb { 0.0f };
std::atomic<int> vcaRatioIndex { 1 };
std::atomic<int> vcaAttackIndex { 2 };
std::atomic<int> vcaReleaseIndex { 2 };
std::atomic<bool> vcaBypass { false };
// --- Transformer ---
std::atomic<int> transformerType { 0 }; // 0=Off, 1=Nickel, 2=Iron, 3=Steel
// --- Output / Global ---
std::atomic<float> outputGainDb { 0.0f };
std::atomic<bool> stereoLink { true };
std::atomic<bool> globalBypass { false };
// --- Metering (audio → GUI) ---
std::atomic<float> optoGrDb { 0.0f };
std::atomic<float> vcaGrDb { 0.0f };
std::atomic<float> outputLevelL { 0.0f };
std::atomic<float> outputLevelR { 0.0f };
// Lookup tables
static constexpr float ratios[] = { 1.2f, 2.0f, 3.0f, 4.0f, 6.0f, 10.0f, 20.0f };
static constexpr float attacks[] = { 0.0001f, 0.0005f, 0.001f, 0.005f, 0.01f, 0.03f };
static constexpr float releases[] = { 0.1f, 0.25f, 0.5f, 0.8f, 1.2f, -1.0f }; // -1 = Dual
static constexpr int numRatios = 7;
static constexpr int numAttacks = 6;
static constexpr int numReleases = 6;
private:
double currentSampleRate = 44100.0;
// Per-channel DSP
std::array<OpticalCell, 2> optoCells;
std::array<VCACompressor, 2> vcaComps;
TransformerSaturation transformer;
// Sidechain HPF (2nd order, per channel)
std::array<juce::dsp::IIR::Filter<float>, 2> scHpfFilters;
float lastScHpfFreq = 0.0f;
void updateScHpf (float freqHz);
};