feat: static gain-curve display for the selected channel

Add editor/gain_curve.rs: a square panel beside the scrolling plot showing the
channel transfer (out vs in, -60..0 dB) for whichever channel the plot tab
selects. Plots the full wet path — out = (in + pre_gain) + gain_reduction + makeup
— using the shared Compressor::gain_computer (now pub) so it matches the DSP and
the GR meter. Unity-reference diagonal + threshold marker; mix not folded in.

Update README structure/status to reflect the editor/ widget module and the
completed Stage 6 visualisers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Mikkeli Matlock
2026-06-25 15:24:08 +09:00
parent a8be2179c3
commit b1477f7ec6
5 changed files with 96 additions and 22 deletions
+19 -17
View File
@@ -130,21 +130,22 @@ src/
oversampler.rs # ✅ 4x polyphase oversampler for true-peak detection (detection-only)
```
The editor's meters and plot are currently drawn directly with egui's `Painter` inline in
`editor.rs`. When the UI is redesigned (gain curve, draggable crossover, real layout), the plan is
to split it into a widget module so each visualiser is self-contained and reusable:
The editor lives in an `editor/` module — one file per visualiser widget (each owns its GUI
state), with `mod.rs` as the aggregator/layout. Drawn directly with egui's `Painter`.
```
src/
editor/
mod.rs # editor assembly + layout (replaces editor.rs)
widgets/
meter.rs # |L | GR | R| level + gain-reduction cluster (extract from editor.rs)
plot.rs # rolling in/out/GR scope (extract from editor.rs)
gain_curve.rs # static gain-curve display per channel (threshold/ratio/knee) — planned
crossover.rs # frequency display with draggable crossover handles — planned
mod.rs # aggregator: create(), EditorState, layout, placeholder slider columns
meter.rs # |L | GR | R| level + gain-reduction bars + per-channel ceiling lamp
plot.rs # rolling in/out/GR scope (200 Hz ring feed) + ceiling-hit markers
crossover.rs # log-freq strip with draggable crossover handles + number boxes
gain_curve.rs # static gain-curve display (out vs in) for the selected channel
```
Remaining UI work: replace the placeholder per-channel slider columns in `mod.rs` with the real
layout.
Deferred until the redesign — no need to split prematurely while the layout is still a placeholder.
---
@@ -195,12 +196,13 @@ is essential — without it FL silently skips a plugin it has seen before.)
Work through these stages in order — each stage produces a loadable, audible plugin.
**Status (2026-06-23):** Stages 14 done — the full signal chain works: 3-band LR4 crossover →
per-band pre-gain + compressors (peak/RMS) → 'All' channel → **true-peak brickwall limiter** (4×
oversampled detection). `lib.rs` has been split into `params.rs`, `editor.rs`, and `meters.rs`.
Stage 6 metering is underway: per-channel **|L | GR | R| meters**, a **latching ceiling lamp**, and
a **rolling in/out/gain-reduction plot** (per-channel tabs + flow-speed selector). **Next: gain-curve
display and draggable crossover handles, then replace the placeholder slider UI.**
**Status (2026-06-25):** Stages 14 done — the full signal chain works: 3-band LR4 crossover →
per-band pre-gain + compressors (peak/RMS) → per-channel dry/wet mix → 'All' channel → **true-peak
brickwall limiter** (4× oversampled detection). `lib.rs` is split into `params.rs`, `meters.rs`, and
an `editor/` widget module. Stage 6 visualisers are essentially complete: per-channel **|L | GR | R|
meters** + **per-channel ceiling lamps**, a **rolling in/out/GR plot** (200 Hz ring feed, flow-speed,
ceiling-hit markers), **draggable crossover handles**, and a **static gain-curve display**. **Next:
replace the placeholder slider columns with the real UI layout.**
### Stage 1 — Skeleton plugin ✅
- [x] NIH-plug "passthrough" compiling and loading in DAW
@@ -236,8 +238,8 @@ display and draggable crossover handles, then replace the placeholder slider UI.
- [x] Per-channel level meters (output level, `|L | GR | R|` cluster)
- [x] Per-channel gain-reduction meters (vertical bars) + latching ceiling lamp
- [x] Rolling in/out/gain-reduction plot (per-channel tabs, flow-speed selector)
- [ ] Static gain-curve display per band (threshold/ratio/knee)
- [ ] Draggable crossover handles on a frequency display
- [x] Static gain-curve display (out vs in; includes pre-gain + makeup) for the selected channel
- [x] Draggable crossover handles on a log-frequency display (with number boxes)
- [ ] Replace the placeholder slider columns with the real UI
---