# DeepPluck V0.9.0 Effects — Implementation Report

Date: 2026-08-31

Branch: `master`

Starting HEAD: `14cf257e04d6cfc2201f7d7c513f8f335e6306b3`

Implementation commit: `b1441b3e7a9578f49d0b2b60f3f6ef03b81bd3e0` — `feat: add chorus delay and reverb effects rack`

Report commit: `57c030325472e3d649c41441eb2eee98eb0c2609` — `docs: add V0.9.0 implementation report`

## 1. Outcome

The complete automatable V0.9.0 Definition of Done passed. DeepPluck now has one compact global Chorus/Delay/Reverb rack after the complete voice sum, all six serial orders, a fifth FX page, one canonical order parameter with three GUI-only position proxies, deterministic effects randomization, compatible state/preset migration, retained Delay/Reverb tails, and centralized pre-build version validation.

The established instrument identity, no-input/stereo-output bus contract, exactly 16 musical voices, four Factory sounds, and the first forty-four parameter IDs/order/version hints remain unchanged. Eighteen append-only parameters bring the total to exactly sixty-two. No limiter, clipper, compressor, signal-dependent auto-gain, general modulation matrix, extra synthesis engine, final GUI redesign, or system installation was introduced.

The user's prior statement `hier als info: 0.8.0 läuft` confirms the starting V0.8.0 milestone, not V0.9.0. V0.9.0 listening, visible GUI, and Cubase verification remain explicitly open below.

## 2. Start gate and normative inputs

The work started from tracked-clean `master` at the V0.8.0 Foundation HEAD above. Only previously recorded protected untracked Cubase files, images, and milestone master prompts were present. Before implementation, `AGENTS.md`, `Docs/Sound/DeepPluck_Sound_Manifest_v1.0.md`, the complete V0.9.0 master prompt, normal project documentation, prior reports, CMake, parameter/state/preset/randomization/GUI/processor code, DSP, and tests were read and applied.

Sound Manifest decision: the effects remain a small, warm, restrained extension of the emotional deep-house pluck identity. Chorus supplies controlled width and movement; Delay supplies warm musical repeats without Ping-Pong or designer modes; Reverb supplies compact atmosphere without Shimmer, Freeze, convolution, or model browsing. Fixed wet calibrations and a bounded parameter-only Mix normalization protect both headroom and perceived level without signal-dependent processing. JUCE's focused Chorus and Reverb implementations were reused, while the bounded stereo Delay is project-owned.

## 3. Confirmed environment and baseline

- Windows 11 x64
- Visual Studio 2026 Developer Command Prompt 18.9.2
- generator `Visual Studio 18 2026`, architecture `x64`
- MSVC 19.51.36256.0 (`14.51.36231` tool directory)
- Windows SDK 10.0.26100.0
- CMake 4.4.3
- JUCE 9.0.1
- C++20

The pristine starting tree was freshly built before implementation:

| Configuration | V0.8.0 baseline |
|---|---:|
| Debug | 26/26 CTests pass, 25.22 s |
| Release | 26/26 CTests pass, 8.47 s |
| Release Unison 1/2/4 performance | 22.0734 / 27.3198 / 37.4574 ms |

The final configure command was:

```powershell
cmake --fresh -S . -B build -G "Visual Studio 18 2026" -A x64
```

The final build commands were:

```powershell
cmake --build build --config Debug --parallel
cmake --build build --config Release --parallel
```

The first plain desktop-shell configure could not discover MSVC. Running the same command inside the confirmed Visual Studio 2026 x64 developer environment succeeded and selected SDK 10.0.26100.0. This was an environment setup condition, not a project failure.

## 4. Identity, parameters, and compatibility

Unchanged identity and public contract:

- manufacturer code `Tntx`;
- plugin code `DpV1`;
- bundle identifier `de.tonetrax.deeppluck`;
- product/plugin name `DeepPluck`;
- VST3 and Standalone formats;
- no audio input, stereo audio output, MIDI input, no MIDI output;
- exactly 16 preallocated musical voices;
- indices 0..43, including every existing parameter ID, order, range, default, and version hint;
- the four Factory preset names, order, and original forty-four values.

The appended V0.9.0 parameters are:

| Index | ID | Range/choices | Default |
|---:|---|---|---:|
| 44 | `chorusBypass` | bool | bypassed |
| 45 | `chorusRate` | 0.05..4.0 Hz, logarithmic | 0.35 Hz |
| 46 | `chorusDepth` | 0..1 | 0.25 |
| 47 | `chorusWidth` | 0..1 | 0.65 |
| 48 | `chorusMix` | 0..1 | 0.20 |
| 49 | `delayBypass` | bool | bypassed |
| 50 | `delaySync` | Free/Sync | Sync |
| 51 | `delayTime` | 0.010..2.0 s, logarithmic | 0.375 s |
| 52 | `delaySyncDivision` | 1/4, 1/8 D, 1/8, 1/8 T, 1/16 D, 1/16, 1/16 T | 1/8 D |
| 53 | `delayFeedback` | 0..0.75 | 0.32 |
| 54 | `delayTone` | 800..18,000 Hz, logarithmic | 6,000 Hz |
| 55 | `delayMix` | 0..1 | 0.22 |
| 56 | `reverbBypass` | bool | bypassed |
| 57 | `reverbSize` | 0.10..0.92 | 0.55 |
| 58 | `reverbPreDelay` | 0..0.120 s | 0.018 s |
| 59 | `reverbDamping` | 0..1 | 0.55 |
| 60 | `reverbMix` | 0..1 | 0.18 |
| 61 | `fxOrder` | six canonical serial orders | C > D > R |

States and presets from V0.1.0 through V0.8.0 load with all three effects bypassed and every missing V0.9.0 value set to its declared default, independently of the live state being replaced. A partial V0.9.0 state retains supplied valid values and defaults only missing peers. Host state remains self-contained. Existing forty-four-value User/Pack presets load neutrally; new files store all sixty-two values. Every Factory stores the neutral FX extension and remains sample-identical to its dry V0.8.0 sound.

## 5. Final signal path and rack ownership

```text
MIDI -> 16-voice synthesiser -> complete true-stereo voice sum
     -> global Chorus/Delay/Reverb rack in one canonical serial order
     -> existing smoothed global Output Gain -> stereo output
```

`DeepPluckAudioProcessor` owns one `DeepPluckEffectsRack`. The rack owns exactly one long-lived prepared Chorus, Delay, and Reverb. All scratch, delay, and pre-delay buffers are allocated in `prepareToPlay`; processing uses fixed dispatch and bounded loops. A validated sixty-two-value snapshot and one validated host-tempo value are captured once per block. The same tempo cache is passed to the synthesiser and Delay, so the playhead is queried exactly once per block. A successful Factory/User/Pack/host load atomically requests a deterministic rack reset at the next audio-block boundary.

The processor reports a conservative 120-second tail. The existing output stage remains after the complete rack, with no hidden limiter, clipping, signal-dependent gain controller, or global automatic gain stage. The local static Mix normalization described below is derived only from parameter values.

## 6. Chorus

Chorus uses two preallocated mono `juce::dsp::Chorus<float>` instances. Both cores are full wet, have fixed zero feedback, and share Rate/Depth targets; their fixed centre delays are 6.5 ms left and 9.5 ms right. JUCE supplies its internal LFO/Depth smoothing. A project-owned 20 ms M/S Width smoother changes only the wet branch. External equal-power Mix uses a fixed wet calibration of `0.55`, the shared bounded Mix normalization, and 20 ms smoothing.

Bypass crossfades to exact dry over 20 ms. Chorus has no retained long tail: after it reaches fully dry, both small internal states reset and processing becomes idle. Reactivation resets while dry and fades in, preventing stale-buffer output. Mono/centre and correlated-signal headroom are automated.

## 7. Delay

Delay uses two preallocated circular buffers sized for three seconds plus block/interpolation reserve, linear fractional reads, independent same-channel feedback, and one stable feedback/wet low-pass per channel. Feedback is hard bounded to `0.75`; there is no cross-feedback or Ping-Pong path. Fixed wet calibration is `0.60`, followed by the shared bounded Mix normalization.

Free time is 10..2,000 ms. Sync uses the processor's one cached 20..400 BPM tempo and deterministic 120 BPM fallback:

```text
delaySeconds = 60 / tempoBpm * beatsPerDelay
beatsPerDelay = { 1, 3/4, 1/2, 1/3, 3/8, 1/4, 1/6 }
```

The entries correspond exactly to `1/4`, `1/8 D`, `1/8`, `1/8 T`, `1/16 D`, `1/16`, and `1/16 T`. Delay Time/tempo/division changes smooth over 40 ms, Feedback and Mix over 20 ms, and Tone over 30 ms. No target queue or runtime allocation is used.

Bypass ramps new feed to zero and dry to unity over 20 ms while existing repeats continue through the current wet gain and downstream effects. Reactivation preserves a still-active tail. A Delay becomes idle only after the current maximum repeat distance has elapsed and both feedback/wet state stay below `1e-5` (-100 dBFS) for eight consecutive blocks; then its state is cleared. The maximum 20 BPM/quarter-note, 0.75-feedback case converges inside the 120-second contract.

## 8. Reverb

Reverb reuses `juce::dsp::Reverb` after a project-owned preallocated stereo linear-interpolated pre-delay. The JUCE core runs with internal dry `0`, wet `1/3`, width `1`, freeze `0`, room size clamped to 0.10..0.92, and damping clamped to 0..1. JUCE supplies its internal Size/Damping smoothing. External equal-power Mix has fixed calibration `0.45`, the shared bounded Mix normalization, and 20 ms smoothing; Pre-Delay smooths over 30 ms.

Bypass ramps new feed to zero and dry to unity over 20 ms while pre-delay content and the existing Reverb tail continue into downstream effects. Reactivation does not clear an active tail. After the wet signal remains below `1e-5` for eight consecutive blocks, the bypassed Reverb clears and becomes idle. The maximum-size case converges inside the 120-second contract; Freeze is never enabled.

## 9. Mix, bypass, routing, and live order changes

All three external Mix stages use the same static curve:

```text
baseDry = cos(0.5 * pi * mix)
baseWet = sin(0.5 * pi * mix) * fixedWetCalibration
normalization = clamp(1 / sqrt(baseDry^2 + baseWet^2), 1, 1.75)
dryGain = baseDry * normalization
wetGain = baseWet * normalization
```

Mix 0 is explicitly exact dry and Mix 1 is explicitly zero-dry with a bounded normalized wet endpoint. The 1.75 ceiling is +4.86 dB. Mix already smooths over 20 ms, so the derived gains cannot jump. The curve uses no peak, RMS, envelope, cutoff, feedback, or audio-history measurement: clipping and instability remain visible to the existing tests and meters. During Delay/Reverb bypass, the dry coefficient alone returns smoothly to exact unity while retained tails continue through the same bounded wet coefficient.

| `fxOrder` | Serial order | Positions C/D/R |
|---:|---|---|
| 0 | Chorus > Delay > Reverb | 1/2/3 |
| 1 | Chorus > Reverb > Delay | 1/3/2 |
| 2 | Delay > Chorus > Reverb | 2/1/3 |
| 3 | Delay > Reverb > Chorus | 3/1/2 |
| 4 | Reverb > Chorus > Delay | 2/3/1 |
| 5 | Reverb > Delay > Chorus | 3/2/1 |

Live order automation coalesces to one latest pending order. Rack output fades equal-power to the unchanged rack input for 15 ms, switches only at the exact dry endpoint, then fades the new serial path in for 15 ms. Effect instances and tails remain alive; no DSP object is cloned or allocated.

## 10. GUI and position mapping

The fixed 1180 x 700 editor now has SOUND, FILTER, SHAPE, MODULATION, and FX pages. FX contains compact stacked Chorus, Delay, and Reverb modules with Bypass, Position, Mix, and focused effect controls. The shallow-row layout reserves at least a 48 x 48 pixel rotary drawing area for every FX knob. Bypassed sound controls dim while Bypass and Position remain available; Delay Free/Sync presentation changes without destroying attachments.

The editor owns exactly sixty-two APVTS bindings: the previous forty-four plus seventeen ordinary FX attachments and one `FxOrderController`. The three visible Position choices are GUI-only projections of that controller, never host parameters. Moving an effect removes it from the current permutation and inserts it at the requested one-based position, stably shifting the other two. The controller then publishes exactly one valid `fxOrder` gesture and refreshes all proxies without recursion. Reset Order writes only `fxOrder = 0`. The single `random.effectsRack` / `lock.effectsRack` pair covers the complete rack.

## 11. Randomization, locks, Amount, and Undo

The append-only Effects Rack module brings the randomization contract to ten modules and sixty randomizable parameters; Output and Master Tune remain excluded. Notation: `D` is weighted discrete, `U` uniform, `LU` log-uniform, and `M` a weighted mixture.

| Parameter | Target distribution |
|---|---|
| `chorusBypass` | D{Active:65, Bypassed:35} |
| `chorusRate` | M{70:LU[0.08,0.60], 25:LU[0.60,1.50], 5:LU[1.50,3.50]} |
| `chorusDepth` | M{65:U[0.12,0.45], 25:U[0.45,0.70], 8:U[0.03,0.12], 2:U[0.70,0.90]} |
| `chorusWidth` | M{65:U[0.35,0.75], 20:U[0.15,0.35], 13:U[0.75,0.95], 2:U[0,0.15]} |
| `chorusMix` | M{65:U[0.08,0.28], 25:U[0.28,0.42], 8:U[0,0.08], 2:U[0.42,0.55]} |
| `delayBypass` | D{Active:55, Bypassed:45} |
| `delaySync` | D{Sync:80, Free:20} |
| `delayTime` | M{60:LU[0.18,0.55], 25:LU[0.08,0.18], 12:LU[0.55,1.20], 3:LU[1.20,2.00]} |
| `delaySyncDivision` | D{1/4:14, 1/8 D:28, 1/8:28, 1/8 T:10, 1/16 D:8, 1/16:10, 1/16 T:2} |
| `delayFeedback` | M{55:U[0.20,0.42], 25:U[0.42,0.58], 15:U[0.05,0.20], 5:U[0.58,0.72]} |
| `delayTone` | M{65:LU[3500,9000], 20:LU[1800,3500], 12:LU[9000,15000], 3:LU[800,1800]} |
| `delayMix` | M{65:U[0.10,0.28], 25:U[0.28,0.40], 8:U[0.02,0.10], 2:U[0.40,0.55]} |
| `reverbBypass` | D{Active:70, Bypassed:30} |
| `reverbSize` | M{60:U[0.35,0.65], 25:U[0.20,0.35], 12:U[0.65,0.82], 3:U[0.82,0.92]} |
| `reverbPreDelay` | M{60:U[0.008,0.030], 25:U[0.030,0.060], 10:U[0,0.008], 5:U[0.060,0.100]} |
| `reverbDamping` | M{70:U[0.45,0.75], 15:U[0.25,0.45], 12:U[0.75,0.90], 3:U[0.10,0.25]} |
| `reverbMix` | M{65:U[0.10,0.28], 25:U[0.28,0.40], 8:U[0.02,0.10], 2:U[0.40,0.55]} |
| `fxOrder` | 70% retain current; 30% uniform among the other five valid orders |

Amount preserves the established interpolation/probability semantics. Amount 0 is an RNG-free no-op. Rack Lock consumes no RNG and blocks all eighteen values. Successful Random snapshots all randomizable parameters; Undo restores FX values and order while preserving Output and Master Tune. Loads invalidate Undo; deterministic seed/state/Amount/locks produce exact repeatable results. Tests cover every distribution branch, order probability, locks, Amount, Undo, 10,000 mixed actions, bounds, and rendered random states.

## 12. Realtime and deterministic safety

- no allocation, lock, file/network access, logging, or GUI access in the audio callback;
- all effect objects and buffers prepared before processing;
- bounded clamping for every control, tempo, feedback, buffer index, and order;
- one parameter snapshot and one playhead query per block;
- no APVTS ID/string lookup in sample, voice, or effect loops;
- no dynamic routing container, callback chain, or unbounded target queue;
- deterministic reset and load-boundary behavior;
- explicit finite guards in feedback/output paths;
- no Freeze, denormal growth, NaN/Infinity path, limiter, clipper, or signal-dependent compensation.

## 13. Automated coverage and final results

Two focused suites, `DeepPluck.effects` and `DeepPluck.effects_integration`, extend the project to 28 CTests. Coverage includes the sixty-two-parameter prefix/append contract, choices/defaults, full and partial state migration, all presets, deterministic all-off identity, exact Mix 0 and bypass, the hard compensation ceiling, normalized midpoint power, a deterministic moderate all-FX RMS/peak comparison, sample rates 44.1/48/96 kHz, block sizes including odd sizes, Chorus stereo/mono/headroom, Delay timing/sync/interpolation/feedback/tails, Reverb pre-delay/tails, all six orders, rapid automation, dry-bridge endpoints, GUI binding/position/reset behavior, randomization, one tempo query, load reset, 16 voices, voice stealing, tail convergence, headroom, and paired relative CPU measurements.

| Configuration | Build | Compiler errors | New compiler warnings | CTest result |
|---|---|---:|---:|---:|
| Debug | pass | 0 | 0 | 28/28 pass, 44.60 s |
| Release | pass | 0 | 0 | 28/28 pass, 14.57 s |

During iterative testing, two time-only measurements were affected by transient host load/clock drift. Their thresholds were not relaxed. The harness was made locally paired and order-alternating for modulation and waveform ratios; isolated and complete final Debug/Release runs then passed. Release is the product CPU acceptance basis.

## 14. Headroom, tails, and numerical results

| Render | Maximum peak |
|---|---:|
| V0.8-equivalent all FX off | 0.243209 |
| Factory Deep Pluck matrix | 0.256507 |
| Factory Soft Pluck matrix | 0.124792 |
| Factory Tight Pluck matrix | 0.473075 |
| Factory Long Pluck matrix | 0.137961 |
| deterministic randomized/forced-risk corpus | 0.523134 |
| Chorus only | 0.243171 |
| Delay only | 0.242649 |
| Reverb only | 0.243000 |
| all FX, default order | 0.242403 |
| all six musical orders, worst order 1 | 0.288961 |
| direct steady rack probe, all orders | 0.248590 |
| moderate all-FX 50% Mix loudness probe | 0.126635 |
| forced legal FX extreme/rapid automation | 0.341984 |
| tail-only | 0.0395774 |

The deterministic broadband loudness probe with Chorus, Delay, and Reverb all active at 50% Mix measured `0.804425` output/input RMS. It therefore detects the former excessive serial Mix attenuation while also rejecting excessive compensation above `1.50`. All musical and random peaks are below the required `0.95` contract. The forced legal extreme is below the separate `2.0` safety ceiling. Every tested sample stayed finite, tail renders showed no growth, Delay feedback never exceeded 0.75, Reverb Freeze stayed off, and the mono/centre acceptance remained finite and present. No headroom result relies on clipping or dynamic gain control.

## 15. Relative CPU results

Final Release paired baseline measurements:

| Scenario | Result | Acceptance |
|---|---:|---:|
| V0.8-equivalent / idle V0.9 rack | 95.1072 / 95.8247 ms | 1.00754 x; limit 1.05 |
| Saw/Saw versus measured V0.8 baseline | 35.3938 ms | 0.944908 x |
| Amount zero / maximum active modulation | 35.2315 / 40.0271 ms | 1.14013 x; limit 2.0 |
| Unison 4 / Unison 1 | 35.3938 / 22.1282 ms | 1.59949 x; limit 8.0 |
| paired worst waveform ratio | Pulse/Square | 1.01792 x; limit 2.0 |

Focused rack timing used 192 blocks of 256 samples (`1.024 s` of audio):

| Rack scenario | Median | One-core realtime fraction |
|---|---:|---:|
| all off | 13.7747 ms | 0.0134519 |
| Chorus only | 16.2771 ms | 0.0158956 |
| Delay Free | 15.7718 ms | 0.0154021 |
| Delay Sync | 15.6745 ms | 0.0153071 |
| Reverb only | 16.1503 ms | 0.0157718 |
| all FX, default order | 18.9454 ms | 0.0185014 |
| typical order 4 | 18.8671 ms | 0.0184249 |
| forced worst case | 19.5081 ms | 0.0190509 |
| tail only | 7.0080 ms | 0.00684375 |

All typical active rack scenarios remain far below the specified 0.25 one-core realtime fraction.

## 16. Central version flow and artifacts

`project(DeepPluck VERSION 0.9.0)` is the only authoritative current version. `${PROJECT_VERSION}` propagates through `juce_add_plugin`, generated JUCE macros, VST3 metadata, Windows VERSIONINFO, GUI, tests, and this report. `DeepPluck_PreBuildVersionCheck` validates CMakeCache, JUCE target information, generated Debug/Release definitions, and Windows resource version inputs before compilation. The `artifact_version` CTest and final all-configuration artifact script verify real binary metadata and byte identity.

Six required version statements:

- Debug VST3 reported version: `0.9.0`;
- Release VST3 reported version: `0.9.0`;
- Debug Standalone FileVersion: `0.9.0`;
- Debug Standalone ProductVersion: `0.9.0`;
- Release Standalone FileVersion: `0.9.0`;
- Release Standalone ProductVersion: `0.9.0`.

| Project-local artifact | Bytes | SHA-256 |
|---|---:|---|
| Debug VST3 `moduleinfo.json` | 1,086 | `945509732B1D0A721DD58BBAB84B677832E0392CF44C67934E69F997961043D2` |
| Debug VST3 inner binary | 28,145,152 | `8E4A2ADB5D2505B0D7248ACC2A837FA5CCFA1F50DFBA6A26E31CD64ABD8B9BB1` |
| Debug Standalone | 28,588,032 | `ECAFC27A9F3A5E03A347BE783E263534813558E2F6B6D5113B621CC1CE5FAEF1` |
| Release VST3 `moduleinfo.json` | 1,086 | `945509732B1D0A721DD58BBAB84B677832E0392CF44C67934E69F997961043D2` |
| Release VST3 inner binary | 9,321,984 | `70BC531F9E7748B445C2437EDAA6C26F90298898D87AF781B2963CCE3EC0A296` |
| Release Standalone | 9,341,440 | `07CAB057FC26A1C0EC815E249F6E59C9877862FD34E26D8D8815FE504DD796AF` |

The corresponding build outputs and files under `Artifacts/Debug` and `Artifacts/Release` are byte-identical. Both VST3 bundles and both Standalones exist. `COPY_PLUGIN_AFTER_BUILD` remains `FALSE`; build and Artifacts directories remain ignored and unstaged. No automatic or manual system installation occurred during this milestone.

The pre-existing system VST3 remained read-only and unchanged from the recorded baseline:

| System file | Bytes | SHA-256 |
|---|---:|---|
| `Contents/Resources/moduleinfo.json` | 1,086 | `E42CA30EF209944C12BFB43805D72306F36C642408794DC3D428586F5486FD45` |
| `Contents/x86_64-win/DeepPluck.vst3` | 7,870,464 | `288F1BC88BBB8FCD131DA089846C3ED99D5E554B77EA9DA4A97EA18E2000FDC3` |

## 17. Standalone smoke

Both final project-local executables started independently, exposed nonzero native main-window handles, accepted a normal window close, exited with code 0, and left no process behind:

- Debug: handle `723098`, exit 0;
- Release: handle `2624830`, exit 0.

This hidden process/window smoke is not a claim of visible layout, audio-device, or listening acceptance.

## 18. Protected files, JUCE, and repository hygiene

Final protected-file hashes match the preflight record:

| Protected file | Bytes | SHA-256 |
|---|---:|---|
| `CubaseTest/DeepPluckTest.cpr` | 785,571 | `A039DBBF9F60E8A8C61AC11C5CD63527CCD2EE5FF9935020CC0071B93AF36C5B` |
| `CubaseTest/Auto Saves/DeepPluckTest-01-(MIDI importieren SpurDeepPluck).bak` | 677,938 | `F589C323777A8CBEC9C3C1EF334E443E05C2889D14C5C834D66C7209EAEF8380` |
| `Docs/Codex-Bild 31. Aug. 2026, 11_53_35.png` | 1,487,439 | `067F6550C004B2C47857A9F75496F493E3A3C3DBC424F44DD69BA56D5DCEDDB2` |
| `Docs/deeppluck_synthesizer_oberfläche.png` | 1,487,439 | `067F6550C004B2C47857A9F75496F493E3A3C3DBC424F44DD69BA56D5DCEDDB2` |
| V0.9.0 master prompt | 69,915 | `1698E03458C82122F51A573C8873734DC983FB7644F4B287F8C63EE0AD8CB621` |

`CubaseTest/` remained recursively unchanged. No file under `JUCE/` changed. No protected untracked file, image, or master prompt was staged. `build/` and `Artifacts/` remain ignored. No push was performed.

## 19. Documentation and commits

Implementation commit 1 changed:

- `README.md`: V0.9.0 controls, migration, presets/randomization, fifth FX page, signal path, build/tests, smoke, and manual validation;
- `ARCHITECTURE.md`: rack ownership, all three engines, smoothing/tails/calibrations, six orders, GUI mapping, parameter/state/version/test contracts;
- `AGENTS.md`: confirmed V0.9.0 reference environment;
- `CMakeLists.txt`: version 0.9.0, effects sources, JUCE DSP, generated-version precheck, and 28 suites;
- focused Effects engine files plus processor, parameter/state, preset, randomization, GUI, and test integration;
- `Tests/VerifyGeneratedVersion.ps1` for pre-build configuration validation.

This report originated as the sole content of commit 2, `docs: add V0.9.0 implementation report`. A subsequent user screenshot exposed that the shallow FX rows left only about 26 vertical pixels for the Rotary area after label and value-box reservation. The focused correction uses compact panel margins, an 18-pixel label, and a 20-pixel value box only below 100-pixel control height. All twelve FX sliders now have a LookAndFeel-computed Rotary drawing area of at least 48 x 48 pixels at 1180 x 700. Toggle centring was made height-adaptive at the same time. DSP, parameter values, state, presets, automation, attachment ownership, and non-FX page sizing are unchanged.

The correction was rebuilt without warnings in Debug and Release, all 28 CTests passed in both configurations, both Standalone smokes passed, and artifact hashes above were refreshed. The final delivery supplies the focused follow-up commit hash.

A second user listening report then exposed excessive level loss when serial effects were enabled, especially as several Mix values increased. The cause was the multiplication of three equal-power dry coefficients while every wet coefficient was also reduced by its fixed calibration. `DeepPluckEffectMix.h` now centralizes a deterministic normalization of the nominal dry/wet vector, hard bounded to 1.75 (+4.86 dB). It uses only the already-smoothed Mix parameter and fixed calibration, so there is no detector, signal-dependent auto-gain, limiter, clipping, state migration, or automation change. A deterministic RMS regression, endpoint/ceiling tests, the complete headroom corpus, and forced legal extremes cover the correction. The final Debug/Release results and hashes in this report include this change.

## 20. Manual listening and visible GUI checklist — open

The user must still verify every item below; none is claimed by automation:

1. Chorus alone is subtle through broad without unpleasant sharp pitch wobble.
2. Delay alone produces warm, clear repeats.
3. Reverb alone is warm and spacious rather than metallic or harsh.
4. All three effects together remain musically focused and do not produce an excessive perceived level drop.
5. All six FX orders are auditioned.
6. Editing all three Position fields never creates duplicate or invalid positions.
7. Reset Order restores only C > D > R and preserves all effect values.
8. Live order changes produce no audible click or dangerous level jump.
9. Chorus Rate, Depth, Width, and Mix behave smoothly live.
10. Delay Free Time behaves smoothly.
11. Delay Sync is correct at several tempos.
12. Tempo changes during playback are click-safe and musical.
13. Delay Feedback, Tone, and Mix behave as intended.
14. Delay Bypass stops new feed while the existing tail continues.
15. Reverb Size, Pre-Delay, Damping, and Mix behave as intended.
16. Reverb Bypass stops new feed while the existing tail continues.
17. Mix sweeps from 0 to 100% avoid unnecessary loudness jumps; compare bypassed, moderate, and high combined Mix settings at matched Output Gain.
18. Mono compatibility and stereo centre remain healthy.
19. Random Amount 0/10/25/50/100 works musically with effects.
20. Effects Rack Lock, Master Random, and Rack Random interact correctly.
21. Random/Random/Undo restores all effect values and order.
22. User preset Save/Load recalls effects.
23. Pack preset Load recalls effects.
24. Old User/Pack presets load with neutral effects.
25. All four Factory presets remain unchanged and dry.
26. Layout is visibly correct at 100%, 125%, and 150% Windows scaling.
27. No final branding is implied by this functional page.

## 21. Cubase validation checklist — open

The user must still verify every item below in Cubase; none is claimed by automation:

1. The plugin is found as the same DeepPluck identity.
2. Exactly 62 host parameters appear and the first 44 IDs/order remain unchanged.
3. Exactly one `fxOrder` host parameter appears; no Position proxy is exposed.
4. Chorus alone works.
5. Delay alone works.
6. Reverb alone works.
7. All three effects work together.
8. All six FX orders work.
9. Position fields never show duplicate or invalid positions.
10. Reset Order changes only the routing order.
11. Live order changes remain click-safe.
12. Delay Sync follows several host tempos.
13. Host-tempo changes during playback behave correctly.
14. Delay and Reverb bypass tails continue correctly.
15. Every new parameter automates correctly.
16. `fxOrder` automation and GUI synchronization remain correct.
17. Randomization, Locks, and Undo work with effects.
18. User preset Save/Load works.
19. Pack preset Load works.
20. A Cubase project saves, closes, and reopens with the same sound.
21. Moving/deleting the external User preset afterward does not change the saved project sound.
22. V0.8.0 and older projects load unchanged with neutral effects.
23. Multiple plugin instances remain stable.
24. Realtime and offline bounce work and remain deterministic for unchanged states.
25. Voice stealing and long tails behave correctly.
26. Host peak meters remain healthy.
27. Host CPU is acceptable with all off, individual effects, all effects, and multiple instances.
28. Audio-device behavior remains healthy.

No Cubase, automation, visible GUI, host-state workflow, host-CPU, or listening acceptance is claimed by this automated run.

## 22. Final status

All automatable V0.9.0 requirements are complete. Manual listening/visible-GUI and Cubase validation remain explicitly pending. No external blocker remains and no push was performed.

**automatable DoD complete; manual V0.9.0 verification pending**
