# DeepPluck V0.11.0 Parameter Review and Compatibility Freeze — Implementation Report

## Result

The complete automatable V0.11.0 scope is implemented and verified. DeepPluck still exposes exactly 62 host parameters with unchanged indices, IDs, host names, concrete JUCE types, version hints, defaults, choice orders, plugin identity, Factory values, state schema, preset schema, buses, and DSP topology. Only the two approved range maxima changed: `ampAttack` and `filterAttack` now end at 2.0 seconds instead of 5.0 seconds.

Starting HEAD: `47c48c596b428773aa23901e22c10bc45abc4769`

Implementation commit: `cacabe58128cd39cd5cd690254258d7c7547e16a` (`feat: freeze V0.11.0 parameter compatibility`)

This report is intentionally committed separately; its containing documentation commit is reported in the final handoff because a commit cannot truthfully contain its own final hash.

## Normative inputs and scope control

- `Docs/Sound/DeepPluck_Sound_Manifest_v1.0.md`, the V0.11.0 master specification, repository rules, current code, prior milestone reports, and the clean V0.10.4 build/test baseline were read before implementation.
- No file below `JUCE/` changed.
- No oscillator, envelope DSP, filter DSP, voice, effects, processor audio path, parameter ID, Factory value, preset identity, or editor geometry changed.
- `CMakeLists.txt` is the only version source and now declares `0.11.0`; the description is `DeepPluck parameter compatibility freeze`.
- `COPY_PLUGIN_AFTER_BUILD` remains `FALSE`; only project-local `Artifacts/<config>` copies are produced.

## Complete 62-parameter before/after manifest

The `other contract` column covers index, host name, concrete type, version hint 1, interval/choice order, raw unit/meaning, and default. `=` means byte-for-byte/semantically unchanged from the verified V0.10.4 contract. ARCHITECTURE.md records every frozen host name, type, interval, choice list, and midpoint individually, and the automated parameter suite asserts all of them.

| # | ID | V0.10.4 raw range / default | V0.11.0 raw range / default | Other contract |
|---:|---|---|---|---|
| 0 | `outputGain` | -60..6 / -3 | -60..6 / -3 | = |
| 1 | `masterTune` | 420..460 / 440 | 420..460 / 440 | = |
| 2 | `ampAttack` | 0.001..5 s / 0.003 | 0.001..2 s / 0.003 | only maximum changed |
| 3 | `ampDecay` | 0.001..5 s / 0.320 | 0.001..5 s / 0.320 | = |
| 4 | `ampSustain` | 0..1 / 0 | 0..1 / 0 | = |
| 5 | `ampRelease` | 0.001..10 s / 0.180 | 0.001..10 s / 0.180 | = |
| 6 | `filterEnabled` | Bool / on | Bool / on | = |
| 7 | `filterCutoff` | 20..20000 Hz / 1800 | 20..20000 Hz / 1800 | = |
| 8 | `filterResonance` | 0..1 / 0.18 | 0..1 / 0.18 | = |
| 9 | `filterDrive` | 0..18 dB / 3 | 0..18 dB / 3 | = |
| 10 | `filterKeyTracking` | 0..1 / 0.35 | 0..1 / 0.35 | = |
| 11 | `filterEnvAmount` | -5..5 oct / 2.50 | -5..5 oct / 2.50 | = |
| 12 | `filterAttack` | 0.001..5 s / 0.002 | 0.001..2 s / 0.002 | only maximum changed |
| 13 | `filterDecay` | 0.001..5 s / 0.280 | 0.001..5 s / 0.280 | = |
| 14 | `filterSustain` | 0..1 / 0 | 0..1 / 0 | = |
| 15 | `filterRelease` | 0.001..10 s / 0.180 | 0.001..10 s / 0.180 | = |
| 16 | `transientEnabled` | Bool / on | Bool / on | = |
| 17 | `transientLevel` | -60..0 dB / -18 | -60..0 dB / -18 | = |
| 18 | `transientDecay` | 0.001..0.100 s / 0.012 | 0.001..0.100 s / 0.012 | = |
| 19 | `transientTone` | 0..1 / 0.55 | 0..1 / 0.55 | = |
| 20 | `noiseEnabled` | Bool / on | Bool / on | = |
| 21 | `noiseLevel` | -60..0 dB / -27 | -60..0 dB / -27 | = |
| 22 | `noiseDecay` | 0.005..1.500 s / 0.120 | 0.005..1.500 s / 0.120 | = |
| 23 | `noiseTone` | 0..1 / 0.35 | 0..1 / 0.35 | = |
| 24 | `osc2Enabled` | Bool / on | Bool / on | = |
| 25 | `osc2Level` | -60..0 dB / -15 | -60..0 dB / -15 | = |
| 26 | `osc2Octave` | integer -1..1 / 0 | integer -1..1 / 0 | = |
| 27 | `osc2Semitone` | integer -12..12 / 0 | integer -12..12 / 0 | = |
| 28 | `osc2FineTune` | -50..50 ct / -7 | -50..50 ct / -7 | = |
| 29 | `unisonVoices` | integer 1..4 / 2 | integer 1..4 / 2 | = |
| 30 | `unisonDetune` | 0..30 ct / 4 | 0..30 ct / 4 | = |
| 31 | `stereoSpread` | 0..1 / 0.35 | 0..1 / 0.35 | = |
| 32 | `lfoRate` | 0.020..12 Hz / 0.25 | 0.020..12 Hz / 0.25 | = |
| 33 | `lfoSync` | Bool / Free | Bool / Free | = |
| 34 | `lfoSyncDivision` | choice 0..6 / 4 | choice 0..6 / 4 | = |
| 35 | `lfoWaveform` | choice 0..3 / 0 | choice 0..3 / 0 | = |
| 36 | `lfoRestartMode` | choice 0..1 / 1 | choice 0..1 / 1 | = |
| 37 | `lfoFilterAmount` | -2..2 oct / 0 | -2..2 oct / 0 | = |
| 38 | `lfoPitchAmount` | -50..50 ct / 0 | -50..50 ct / 0 | = |
| 39 | `lfoSpreadAmount` | -1..1 / 0 | -1..1 / 0 | = |
| 40 | `osc1Waveform` | choice 0..4 / 0 | choice 0..4 / 0 | = |
| 41 | `osc1PulseWidth` | 0.05..0.95 / 0.50 | 0.05..0.95 / 0.50 | = |
| 42 | `osc2Waveform` | choice 0..4 / 0 | choice 0..4 / 0 | = |
| 43 | `osc2PulseWidth` | 0.05..0.95 / 0.50 | 0.05..0.95 / 0.50 | = |
| 44 | `chorusBypass` | Bool / bypassed | Bool / bypassed | = |
| 45 | `chorusRate` | 0.05..4 Hz / 0.35 | 0.05..4 Hz / 0.35 | = |
| 46 | `chorusDepth` | 0..1 / 0.25 | 0..1 / 0.25 | = |
| 47 | `chorusWidth` | 0..1 / 0.65 | 0..1 / 0.65 | = |
| 48 | `chorusMix` | 0..1 / 0.20 | 0..1 / 0.20 | = |
| 49 | `delayBypass` | Bool / bypassed | Bool / bypassed | = |
| 50 | `delaySync` | Bool / Sync | Bool / Sync | = |
| 51 | `delayTime` | 0.010..2 s / 0.375 | 0.010..2 s / 0.375 | = |
| 52 | `delaySyncDivision` | choice 0..6 / 1 | choice 0..6 / 1 | = |
| 53 | `delayFeedback` | 0..0.75 / 0.32 | 0..0.75 / 0.32 | = |
| 54 | `delayTone` | 800..18000 Hz / 6000 | 800..18000 Hz / 6000 | = |
| 55 | `delayMix` | 0..1 / 0.22 | 0..1 / 0.22 | = |
| 56 | `reverbBypass` | Bool / bypassed | Bool / bypassed | = |
| 57 | `reverbSize` | 0.10..0.92 / 0.55 | 0.10..0.92 / 0.55 | = |
| 58 | `reverbPreDelay` | 0..0.120 s / 0.018 | 0..0.120 s / 0.018 | = |
| 59 | `reverbDamping` | 0..1 / 0.55 | 0..1 / 0.55 | = |
| 60 | `reverbMix` | 0..1 / 0.18 | 0..1 / 0.18 | = |
| 61 | `fxOrder` | choice 0..5 / 0 | choice 0..5 / 0 | = |

Automated comparison result: exactly two maximum values differ and zero defaults differ.

## Mapping and text result

Normalized midpoint tests pass for Amp/Filter Attack `0.04472136 s`, Amp/Filter Decay `0.07071068 s`, Amp/Filter Release `0.1 s`, Cutoff `632.45553 Hz`, Delay Time `0.14142136 s`, Delay Tone `3794.73319 Hz`, Chorus Rate `1.0 Hz`, and Reverb Pre-Delay `0.040 s`. LFO Rate remains `0.5 Hz`, Unison Detune remains `5 ct`, the existing Transient/Noise logarithmic Decays remain unchanged, and every declared linear parameter remains linear. Dense 101-point mapping checks prove finite monotonic conversion and raw roundtrip for all 62 entries.

Host `getText` and visible slider text use the same formatter/parser. Exact automated examples include `3 ms`, `280 ms`, `1.25 s`, `850 Hz`, `1.80 kHz`, `6.00 kHz`, `440.0 Hz`, `0.25 Hz`, `4.00 Hz`, `-15.0 dB`, `3.0 dB`, `18 %`, `65 %`, `+2.50 oct`, `-7 ct`, `4.0 ct`, `+7 st`, whole voices, and `18 ms`. Point/comma, compact ms, unitless seconds, Hz/kHz, and percent parsing pass. Formatting and parsing do not write parameter state or quantize persisted raw values.

## Random audit

- Amp Attack: logarithmic `[0.001,0.015] / [0.015,0.080] / [0.080,0.500] / [0.500,2.000]`, weights `70/23/6/1`.
- Filter Attack: logarithmic `[0.001,0.020] / [0.020,0.100] / [0.100,0.800] / [0.800,2.000]`, weights `75/20/4/1`.
- All other 58 randomizable parameters retain their verified V0.10.4 strategy, weights, values, and ranges. Output and Master Tune remain excluded.
- Deterministic 10,000-sample tests for every declared weighted distribution stayed within the existing three-percentage-point tolerance; every extreme branch was reached. Additional 20,000-draw Attack checks kept each value in its selected branch and at or below 2 seconds. Deterministic seeds, Amount interpolation, Locks, RNG no-op ordering, FX Order 70/30 behavior, and one-step Undo remain unchanged.

## State, preset, and automation compatibility

Host-state merge explicitly canonicalizes both Attack IDs before APVTS replacement:

- finite `< 0.001 s` -> `0.001 s`;
- finite `0.001..2.0 s` -> unchanged;
- finite `> 2.0 s` -> `2.0 s`;
- nonfinite -> the parameter default (`0.003 s` Amp, `0.002 s` Filter).

Old finite preset Attack values use current parameter-aware canonicalization and values above 2 seconds load as 2 seconds. Known nonnumeric or nonfinite preset data remains a transactional rejection. All earlier partial-state/default migrations, self-contained host recall, Factory matching, preset scanning/schema/path rules, Random Locks/Undo, and FX order remain intact.

Host automation is normalized, so old normalized automation points for the two Attack parameters map through the new 0.001..2.0 range and cannot simultaneously preserve every raw time produced by the old 0.001..5.0 range. Raw state/preset values through 2 seconds are preserved. No other normalized parameter mapping changed.

## Files changed

- `Source/Parameters/DeepPluckParameters.cpp/.h`: two Attack maxima, shared text/parser attributes, required midpoint mappings, and explicit raw host-state canonicalization.
- `Source/Randomization/DeepPluckRandomization.cpp`: only the two approved Attack mixtures.
- `Source/GUI/DeepPluckEditorComponents.cpp`: GUI sliders use the shared parameter text/parser service.
- `Source/GUI/DeepPluckGuiSupport.cpp`: Attack display geometry uses the new 2-second visual maximum; DSP is unchanged.
- `Tests/TestMain.cpp`: complete frozen manifest, mapping, text, migration, preset, Random, and display tests.
- `CMakeLists.txt`: central version and description.
- `README.md`, `ARCHITECTURE.md`, `AGENTS.md`: behavior, full freeze contract, migration/automation limitation, workflow, and durable project rule.
- This report.

## Build and verification evidence

Confirmed environment: Windows 11 x64; Visual Studio 2026; MSVC 19.51.36256.0 (`14.51.36231` tools); Windows SDK 10.0.26100.0; CMake 4.4.3; JUCE 9.0.1; C++20.

Configure used `cmake --fresh -S . -B build -G "Visual Studio 18 2026" -A x64` and selected the confirmed SDK/compiler.

- Debug build: passed; no compiler errors and no compiler warnings. CTest: 28/28 passed in 48.41 s.
- Release build: passed; no compiler errors and no compiler warnings. CTest: 28/28 passed in 16.07 s.
- Debug Standalone smoke: launched, accepted normal close, exit 0.
- Release Standalone smoke: launched, accepted normal close, exit 0.
- Generated target/version precheck: Debug and Release resolve to 0.11.0.
- Actual VST3 module metadata and Standalone FileVersion/ProductVersion: 0.11.0 in both configurations.
- Build and local-copy artifacts are byte-identical:
  - Debug VST3: 28,428,800 bytes, SHA-256 `A538B4287F27F88E615782C5BFA5C2EDA116BD4E8A50621802C0A3F6F5A48F8E`.
  - Debug Standalone: 28,870,656 bytes, SHA-256 `8734F01337026EC2061F8F8F2B696E4D09C2811916A20ABA8B890F4EA2469C27`.
  - Release VST3: 9,422,848 bytes, SHA-256 `E7620E3B61986BB126181070D9DBE85592639A0978C21F5001281653F826DB9A`.
  - Release Standalone: 9,442,304 bytes, SHA-256 `1EAA12EE30D53F288A17A17DF70CAB884210E95A474F9C0E69DC3A3F041225AB`.
- `build/` and `Artifacts/` remain ignored and unstaged. No automatic system-folder installation occurred.
- Protected untracked Cubase projects, autosaves, prompts, and reference images remained untracked and were not modified or staged.

## Manual verification still pending

Cubase must still confirm same-plugin discovery, the unchanged 62-entry automation list, V0.10.4-and-earlier project/state/preset recall, the documented handling of Attack values above 2 seconds, and the unavoidable behavior of old normalized Attack automation. Manually test 1 ms/2 s endpoints, all mapping feel, point/comma unit entry, field fit at 100/125/150% Windows scaling, Factory sounds, Random's musical balance and rare long Attack branch, project save/reopen, realtime playback, offline bounce, multiple instances, Standalone MIDI/audio, and listening/headroom comparisons.

automatable DoD complete; manual V0.11.0 verification pending
