# DeepPluck V0.10.4 Modulation, Unison, and Workflow — Implementation Report

Date: 2026-09-01

Status: Automatable Definition of Done complete

Starting commit: `e83214642c8d793decd06c13a316f45f240f1bec`

Implementation commit: `aea82e795a6ac27509ad27696686ddb324ea4643`

Header alignment correction: `fa39df8772cd87dd8889d747207052f467ca64a2`

## Outcome

V0.10.4 completes the six requested refinements while preserving plugin identity, all sixty-two parameter IDs and their order/version hints, automation, state and preset compatibility, factory parameter values, the no-input/stereo-output contract, fixed sixteen-voice ownership, and the fixed 1536 x 900 editor.

- LFO Spread uses direction-dependent available room. Full positive or negative movement remains active at base Spread 0% and 100%, reaches the applicable opposite endpoint, and stays bounded to 0..1.
- Two-, three-, and four-slot Unison settings now form a progressive deterministic voicing. Mean absolute detune and phase span increase with the count, while `N^-0.90` normalization limits maximum coherent growth to 1.149 at four slots.
- Master Random and Undo are stacked on the raised preset-control line beside a slightly lower rotary Amount control. Amount, Master Tune, and Output use the same value-field baseline, height, and Teal text colour.
- LFO and Amounts use equal 145-pixel rows matching the FX module rows and leave the lower Modulation page clear for future work.
- Effects Rack Random, Lock, and Reset Order moved from the colliding lower strip to a dedicated top header.
- The obsolete nonfunctional footer `100%` text was removed. The editor remains deliberately non-resizable.

## DSP and realtime behavior

The new Spread mapping is continuous, allocation-free, branch-bounded, deterministic, and remains inside the existing 16-sample control interval plus 20 ms pan-gain smoothing. It never writes an effective value back to APVTS or automation. Unison changes only immutable arithmetic tables and one fixed normalization exponent; no allocation, lock, lookup, random source, or new state was added to the audio path. Unison count remains latched at Note-On, while Detune, Spread, and LFO Spread remain live and smoothed.

The four-slot coherent normalization metrics are:

| Slots | Normalization | Maximum coherent factor |
|---:|---:|---:|
| 1 | 1.000000 | 1.000000 |
| 2 | 0.535887 | 1.071770 |
| 3 | 0.372041 | 1.116120 |
| 4 | 0.287175 | 1.148700 |

Automated modulation stress peaks remained between 0.195706 and 0.271425 across the four LFO waveforms, below the 0.95 project headroom ceiling.

## GUI verification

Fresh Debug and Release GUI snapshots were generated and reviewed at native 1536 x 900 resolution:

- header controls are visible, aligned, and non-overlapping;
- Random starts on the preset-control line and Undo sits directly below it;
- Amount is rotary, sits on the same vertical control grid as Master Tune/Output, and retains its percent value and Hover Help;
- both Modulation panels match the FX row height and leave a large unobstructed lower area;
- the FX action header is fully above Chorus and does not touch the plugin footer;
- Chorus, Delay, and Reverb retain their exact vertical control columns;
- the footer contains credits, product, and version only;
- all four pages retain the established visual language and control size contracts.

## Build environment

- Windows 11 x64
- Visual Studio 2026
- MSVC 19.51.36256.0
- Windows SDK 10.0.26100.0
- CMake 4.4.3
- JUCE 9.0.1
- C++20

The successful fresh configure used:

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

The first sandboxed configure attempt could not discover the installed MSVC compiler. Repeating the identical command with access to the installed toolchain succeeded. This was an execution-environment permission boundary, not a source or project failure.

## Debug result

- Visual Studio build: passed
- Compiler errors: 0
- New compiler warnings: 0
- Automated tests: 28/28 passed in 48.71 seconds
- VST3: present
- Standalone: present
- Project-local copies: present and byte-identical
- Artifact metadata: 0.10.4
- Standalone smoke: window handle `723680`, graceful close accepted, no residual process

## Release result

- Visual Studio build: passed
- Compiler errors: 0
- New compiler warnings: 0
- Automated tests: 28/28 passed in 16.22 seconds
- VST3: present
- Standalone: present
- Project-local copies: present and byte-identical
- Artifact metadata: 0.10.4
- Standalone smoke: window handle `658268`, graceful close accepted, no residual process

## Artifact verification

| Configuration | Format | Bytes | SHA-256 |
|---|---|---:|---|
| Debug | VST3 binary | 28,418,560 | `BD5FFB55710E47B517FED2941368B4D17D0BB20A81D0A4F8CBA581237BF9E403` |
| Debug | Standalone | 28,861,440 | `C173BC9E009064E823824806C5476C56520A1CE20FF073F6D02885CF37CC3A63` |
| Release | VST3 binary | 9,424,896 | `379ABD74E53E48061E5C26CD51834DF5037FCF340AF6C66EEB685B4C28C95AEA` |
| Release | Standalone | 9,444,864 | `B2B4B9741DC8B73E6FA27C2A84D52B319B478EBCED9A0BC0FE024CD372EEA349` |

Debug and Release VST3 `moduleinfo.json` plus Standalone FileVersion/ProductVersion resolve to 0.10.4. The artifact-version tests confirm build/local-copy byte identity.

## Compatibility and repository safety

No parameter, plugin ID, preset value, state schema, attachment count, bus, or effect-routing contract changed. Existing saved states and automation therefore retain the same identities and values; only the sound produced by the deliberately refined LFO Spread and Unison algorithms changes.

`COPY_PLUGIN_AFTER_BUILD` remains `FALSE`. Both builds copied only to `Artifacts/<configuration>`. The pre-existing system VST3 remained the prior 9,424,384-byte binary with SHA-256 `45553B76BC74C5271E2D3C0605AF5E7F3DFB6026707C2C164EEEF76AFEC2B5F9`; no system directory was written.

Git ignores `/build/` and `/Artifacts/`, and neither contains tracked or staged files. No file inside `JUCE/` changed. All pre-existing untracked user files, including `CubaseTest/`, reference images, and milestone master prompts, remained untracked and were not staged or edited.

## Documentation changed

- `README.md`: V0.10.4 behavior, compatibility, GUI layout, build baseline, and manual validation checklist;
- `ARCHITECTURE.md`: progressive Unison tables/normalization, endpoint-aware Spread formula, GUI ownership/layout, version flow, and regression coverage;
- `AGENTS.md`: confirmed V0.10.4 reference environment;
- `CMakeLists.txt`: authoritative 0.10.4 version and milestone description;
- this implementation report.

## Remaining manual checks

1. In Cubase, confirm V0.10.4 is recognized as the same VST3 instrument and exposes exactly sixty-two automation parameters in the unchanged order.
2. Reopen representative projects/states from V0.1.0 through V0.10.35 and confirm preset/state/automation recall.
3. Compare Unison 1, 2, 3, and 4 on newly triggered notes at low, default, and higher Detune/Spread values. Confirm that each step is musically clearer without excessive loudness growth, transient weakness, or mono loss.
4. Compare LFO Spread with base Spread at 0%, 35%, 50%, and 100%, positive and negative Amount, several rates/waveforms, headphones/stereo monitors, and mono monitoring. Confirm audible movement, smooth automation, stable centre, and no clipping.
5. Confirm the stacked Master Random/Undo and rotary Amount layout, compact Modulation rows, reserved lower space, top FX Rack actions, non-overlapping footer, and absent `100%` footer text at Windows display scaling 100%, 125%, and 150%.
6. Exercise preset workflows, Random/Lock/Undo, FX order/Reset Order, realtime playback, offline bounce, multiple instances, and real audio/MIDI device operation in Standalone.

V0.10.4 is automatable-complete. Cubase integration, musical Unison/LFO listening acceptance, and real-device operation remain manual.
