v1.1 — Improved metering, transformer, and optical cell tuning

- Needle VU meters with spring-mass-damper physics (analog inertia)
- Swappable meter modes: GR needles + input bars, or input needles + GR bars
- GR bar meters fill right-to-left (0dB=empty, -30dB=full)
- Input bar meters fill left-to-right with green color
- Optical cell: normalized parameters (eta=50) for proper audio-level response
- Transformer: removed 3-band crossover artifacts, simplified waveshaping with dry/wet mix
- Nickel/Iron/Steel with distinct but subtle harmonic character
- Layout: optical left, discrete right, meters center, transformer+output bottom center
This commit is contained in:
hariel1985
2026-03-27 17:46:25 +01:00
szülő 1c8b8012f6
commit d750716608
7 fájl változott, egészen pontosan 244 új sor hozzáadva és 123 régi sor törölve

Fájl megtekintése

@@ -41,20 +41,50 @@ InstaShadowEditor::InstaShadowEditor (InstaShadowProcessor& p)
addAndMakeVisible (transformerPanel);
addAndMakeVisible (outputPanel);
// Needle VU meters
vuMeterL.setLabel ("L");
addAndMakeVisible (vuMeterL);
vuMeterR.setLabel ("R");
addAndMakeVisible (vuMeterR);
// Needle meters (default: GR)
needleMeterL.setLabel ("OPTICAL GR");
needleMeterL.setMode (NeedleVuMeter::GR);
addAndMakeVisible (needleMeterL);
needleMeterR.setLabel ("DISCRETE GR");
needleMeterR.setMode (NeedleVuMeter::GR);
addAndMakeVisible (needleMeterR);
// GR meters (compact bars)
optoGrMeter.setLabel ("OPTICAL GR");
optoGrMeter.setBarColour (juce::Colour (0xffff8833));
addAndMakeVisible (optoGrMeter);
// Bar meters (default: input level)
barMeterL.setLabel ("INPUT L");
barMeterL.setBarColour (juce::Colour (0xff00cc44));
addAndMakeVisible (barMeterL);
barMeterR.setLabel ("INPUT R");
barMeterR.setBarColour (juce::Colour (0xff00cc44));
addAndMakeVisible (barMeterR);
vcaGrMeter.setLabel ("DISCRETE GR");
vcaGrMeter.setBarColour (juce::Colour (0xff4488ff));
addAndMakeVisible (vcaGrMeter);
// Meter swap button
meterSwapButton.onClick = [this]
{
metersSwapped = ! metersSwapped;
if (metersSwapped)
{
needleMeterL.setLabel ("INPUT L");
needleMeterL.setMode (NeedleVuMeter::VU);
needleMeterR.setLabel ("INPUT R");
needleMeterR.setMode (NeedleVuMeter::VU);
barMeterL.setLabel ("OPTICAL GR");
barMeterL.setBarColour (juce::Colour (0xffff8833));
barMeterR.setLabel ("DISCRETE GR");
barMeterR.setBarColour (juce::Colour (0xff4488ff));
}
else
{
needleMeterL.setLabel ("OPTICAL GR");
needleMeterL.setMode (NeedleVuMeter::GR);
needleMeterR.setLabel ("DISCRETE GR");
needleMeterR.setMode (NeedleVuMeter::GR);
barMeterL.setLabel ("INPUT L");
barMeterL.setBarColour (juce::Colour (0xff00cc44));
barMeterR.setLabel ("INPUT R");
barMeterR.setBarColour (juce::Colour (0xff00cc44));
}
};
addAndMakeVisible (meterSwapButton);
syncKnobsToEngine();
startTimerHz (30);
@@ -116,13 +146,22 @@ void InstaShadowEditor::timerCallback()
auto& eng = processor.getEngine();
// Needle VU meters
vuMeterL.setLevel (eng.outputLevelL.load());
vuMeterR.setLevel (eng.outputLevelR.load());
// GR meters
optoGrMeter.setGainReduction (eng.optoGrDb.load());
vcaGrMeter.setGainReduction (eng.vcaGrDb.load());
if (! metersSwapped)
{
// Default: needles = GR, bars = input
needleMeterL.setGainReduction (eng.optoGrDb.load());
needleMeterR.setGainReduction (eng.vcaGrDb.load());
barMeterL.setInputLevel (eng.inputLevelL.load());
barMeterR.setInputLevel (eng.inputLevelR.load());
}
else
{
// Swapped: needles = input, bars = GR
needleMeterL.setLevel (eng.inputLevelL.load());
needleMeterR.setLevel (eng.inputLevelR.load());
barMeterL.setGainReduction (eng.optoGrDb.load());
barMeterR.setGainReduction (eng.vcaGrDb.load());
}
// Output panel VU
outputPanel.vuMeter.setLevel (eng.outputLevelL.load(), eng.outputLevelR.load());
@@ -185,20 +224,24 @@ void InstaShadowEditor::resized()
// Center column: VU meters, GR bars, Transformer, Output — all stacked
auto centerArea = mainRow;
// Two needle VU meters side by side (~30%)
// Two needle meters side by side (~30%)
int vuH = (int) (centerArea.getHeight() * 0.30f);
auto vuRow = centerArea.removeFromTop (vuH);
int vuW = (vuRow.getWidth() - pad) / 2;
vuMeterL.setBounds (vuRow.removeFromLeft (vuW));
vuRow.removeFromLeft (pad);
vuMeterR.setBounds (vuRow);
auto needleRow = centerArea.removeFromTop (vuH);
int needleW = (needleRow.getWidth() - pad) / 2;
needleMeterL.setBounds (needleRow.removeFromLeft (needleW));
needleRow.removeFromLeft (pad);
needleMeterR.setBounds (needleRow);
centerArea.removeFromTop (pad);
// Two GR meter bars (~15%)
int grBarH = (int) (centerArea.getHeight() * 0.12f);
optoGrMeter.setBounds (centerArea.removeFromTop (grBarH));
// Swap button (compact, between needles and bars)
meterSwapButton.setBounds (centerArea.removeFromTop (20).reduced (centerArea.getWidth() / 4, 0));
centerArea.removeFromTop (pad);
vcaGrMeter.setBounds (centerArea.removeFromTop (grBarH));
// Two bar meters (~10%)
int barH = (int) (centerArea.getHeight() * 0.10f);
barMeterL.setBounds (centerArea.removeFromTop (barH));
centerArea.removeFromTop (pad);
barMeterR.setBounds (centerArea.removeFromTop (barH));
centerArea.removeFromTop (pad);
// Transformer + Output side by side in remaining center space