- Compressor: switchable peak / RMS detection (EnumParam<DetectionMode> in lib.rs
-> use_rms bool in CompressorSettings; DSP stays framework-agnostic). RMS is a
one-pole running mean of the linked squared level with a hardcoded 5 ms window,
updated whenever active so peak<->RMS switching is seamless. New unit test
(RMS compresses a sine less than peak); 6 tests total.
- README: reconciled Implementation Order checklists with actual progress
(Stages 1-2 done; look-ahead/latency + basic UI pulled forward), annotated the
project structure (implemented vs planned), and corrected the Latency and
Denormal-flushing notes to match the code (set_latency_samples once / constant
latency; in-code denormal flush). Overview and goals left unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Implements the single full-band feed-forward compressor (the engine that will be
reused per band + for the 'All' channel). Design follows Giannoulis et al. 2012:
log-domain gain computer with a quadratic soft knee feeding a smooth decoupled
peak detector for attack/release ballistics. Stereo-linked peak detection.
Look-ahead uses a fixed audio delay with a constant reported latency (set once in
initialize); the knob only moves the detector tap within that delay. This avoids
renegotiating latency from process(), which crashed FL Studio when the look-ahead
was adjusted during playback.
- src/dsp/compressor.rs: Compressor + CompressorSettings, RT-safe (no alloc in
process; buffers sized in prepare; envelope denormals flushed in-code)
- src/lib.rs: nested CompressorParams (threshold/ratio/knee/attack/release/makeup/
bypass) + global look-ahead; egui ParamSlider grid; latency reported once
- 5 unit tests (static curve, knee continuity, steady-state convergence, constant
latency); Cargo.toml lib crate-type added so tests link
- README: 'All' channel architecture already documented; look-ahead spec updated
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>