# DeepPluck

## Completed milestone: V0.13.0 Release Candidate

V0.13.0 is a feature-frozen release-candidate hardening pass over the committed
V0.12.75 product. It adds no sound, host parameter, MIDI feature, Factory sound
or GUI area. The release work is limited to compatibility, stability, host and
Standalone smoke coverage, finite-audio and performance-regression checks,
version/artifact consistency, project-local packaging preparation, documentation
and small reproduced bug fixes if any are found.

The reconciled start is commit fedb8ac7665cc43e956fd15900b1199596699dbf with
a clean tracked tree. The public contract remains exactly 62 parameters, the
active Factory library remains the 116 user-approved presets in eight categories,
and the VST3/Standalone layouts remain fixed at 1536 x 900 and 1536 x 980. The
separate final Factory gate remains 696 native renders per configuration:
116 presets at 44.1/48/96 kHz, dry and wet.

The historical V0.11.5 D96/64 deadline finding remains OPEN/deferred. V0.13.0
must prove that it adds no relevant performance regression, but functional tests
must not be described as a hard deadline PASS. On 2026-09-05 the user explicitly
accepted this still-open finding as a known V1.0 release risk. That decision
clears the release-risk decision gate without converting the technical finding
into a PASS.

The Release build can be assembled only into a new ignored
Artifacts/V0.13.0 subtree with Tests/PrepareReleaseCandidatePackage.ps1. Its
allowlist contains only the complete Release DeepPluck.vst3 bundle and
DeepPluck.exe; it records relative paths, sizes and SHA-256 beside the package.
No installer, system copy, signing, upload or push is performed. The complete
workflow is documented in Tests/ReleaseCandidate.md.

The final automatable V0.13.0 gate passes with warning-free Debug and Release
builds, 40/40 CTests in each configuration, one 696/696 Factory corpus per
configuration, native VST3 and Standalone smokes, version/local-copy identity,
bounded performance verification and an allowlisted Release package. The
[implementation report](Docs/DeepPluck_V0.13.0_Release_Candidate_Implementation_Report.md)
records the evidence and the manual Cubase, device, DPI and listening scope.
The D96/64 risk decision is accepted and no longer blocks readiness;
on 2026-09-05 the user then reported that the current synth runs without
recognizable errors and declared V0.13.0 complete. This is the practical
milestone-level manual acceptance; it does not invent separate results for each
unreported checklist item. V0.13.0 is therefore **READY FOR V1.0 RELEASE
PREPARATION**.

## Preserved V0.12.75 Standalone virtual MIDI keyboard

V0.12.75 adds a compact mouse-playable piano strip exclusively to the
Standalone application. The VST3 remains exactly 1536 x 900 and creates no
keyboard or reserved keyboard area. Standalone remains non-resizable but is now
1536 x 980: the existing 1536 x 900 interface is unchanged and an 80-pixel strip
is appended below it. `Oct -` and `Oct +` move the visible range in exact
12-semitone steps from the MIDI-36 (C2) startup position, clamped to lowest
visible keys 0..60. All playable notes remain inside MIDI 0..127.

The panel uses JUCE's `MidiKeyboardState` and horizontal
`MidiKeyboardComponent`. In the production Standalone wrapper its state feeds
the existing `AudioProcessorPlayer` `MidiMessageCollector`, so mouse notes and
external MIDI share the normal sample-positioned stream before DeepPluck's
unchanged `processBlock()`. Closing the editor releases only keyboard-held notes
before detaching the listener. Computer-key mappings and piano focus are
deliberately disabled; QWERTZ control is deferred. The keyboard adds no host
parameter, APVTS value, preset field, preference, randomization state, DSP path,
timer, or persistence.

The focused `DeepPluck.standalone_keyboard` suite covers real wrapper identity,
layout, state neutrality, JUCE keyboard-state gestures, octave boundaries,
external/virtual collector coexistence, same-note ordering, cleanup,
voice-stealing, and an unused-keyboard bit-identical audio comparison. The full
V0.12.75 automated result and remaining manual checks are recorded in the
[implementation report](Docs/DeepPluck_V0.12.75_Standalone_Virtual_MIDI_Keyboard_Implementation_Report.md).

The final V0.12.75 gate passes with warning-free Debug and Release builds, 40/40
CTests in each configuration, byte-identical version-0.12.75 local artifacts,
native VST3 and Standalone process smokes, plus exactly one 696/696 approved
Factory audio corpus per configuration. The historical V0.11.5 D96/64 deadline
finding remains explicitly OPEN/deferred under the user's 2026-09-04 baseline
authorization; these successful functional regressions do not relabel it as a
performance PASS. Real Standalone mouse/audio-device/focus, VST3/Cubase and
listening acceptance remain manual and OPEN.

## Preserved V0.12.5 Welcome / About / final UX polish

V0.12.5 keeps the approved V0.12.0 Factory library and the complete frozen
62-parameter/audio contract unchanged. The first-run Welcome card now presents
the visible product name `Just A Lil' PluckSynth`, a short three-step orientation,
`Start Playing`, the persistent `Don't show this again` option, Hover Help hint,
and the exact Tonetrax/ChatGPT-Codex/website credits. SETTINGS remains one of the
four existing tabs: its left panel contains only Hover Help, Welcome Screen, and
Show Welcome Now, while the structured ABOUT panel shows the centrally generated
version, VST3/Standalone, 64-bit Windows, JUCE attribution, product description,
credits, and the explicit `https://www.tonetrax-music.de` link. The link is opened
only by a user click; there is no prefetch, embedded browser, telemetry, or other
automatic network action.

GUI preferences remain process-shared and outside APVTS, presets, and host state
at `User Application Data/ToneTrax/DeepPluck/GUI.properties`. Missing, malformed,
or wrong-root files fall back to a safe first run. Hover Help acts immediately;
Welcome Screen On re-arms the next editor, and Show Welcome Now opens only the
requesting instance. The preserved VST3 geometry is the fixed, non-resizable
1536 x 900 layout.

The final V0.12.5 automated gate passes in the confirmed VS2026 x64 environment:
fresh configure, warning-free Debug and Release builds, 39/39 CTests in each
configuration, native VST3 factory and Standalone window smokes, version and
byte-identical project-local artifact checks, plus exactly one 696/696 approved
Factory audio run in Debug and one in Release. Real VST3/Standalone visual,
Windows 100/125/150% DPI, website-click, Cubase, audio-device/MIDI and listening
acceptance remain explicitly manual and open.

## Preserved V0.12.0 Factory Presets baseline

Technical Gate A remains OPEN for the extreme 96-kHz/64-sample timing finding.
The user completed the 160-candidate listening pass and explicitly selected every
latest `Keep` decision as final Factory content. The active, embedded library now
contains **116/116 approved presets**: 14 Deep, 13 Warm, 12 Bright, 15 Emotional,
17 Atmospheric, 10 Arp, 19 Poly and 16 Experimental. Their reviewed source bytes
and approval hashes are preserved exactly. The previous four browser entries are
removed from the active library; `factory:0..3` remain compatibility-only and
still restore their original sounds for old states.

Final Debug and Release builds pass without new compiler warnings. All 38 Release
CTests pass; Debug covers all 38 after two test-only expectation corrections.
The real final-content matrix passes 696/696 renders in each configuration at
44.1, 48 and 96 kHz, dry and wet. Versions, project-local copies, native VST3
loading and Standalone window smokes pass. Final Cubase and real Standalone
audio/MIDI validation remain manual. No DSP or host parameter changes.

Read and follow [Sound Manifest v1.0](Docs/Sound/DeepPluck_Sound_Manifest_v1.0.md)
before implementing any milestone or making content/audio-quality decisions.
See [Factory workflow](Tests/FactoryPresets.md) and the
[live V0.12.0 report](Docs/DeepPluck_V0.12.0_Factory_Presets_Implementation_Report.md)
for reproducible commands, test evidence and open manual decisions.

V0.12.0 registers the four Factory infrastructure suites plus the approved real
content suite (38 total in each configuration). They include 8,192 fixed-seed
properties, raw-float cross-configuration goldens, negative codec/path/promotion
fixtures, real Processor load/state/Undo paths and all 116 embedded files.
Generator, PresetAudit and Developer Audition are separate build targets; none is
included in the VST3/normal Standalone bundle or copied to a system folder.

DeepPluck is a specialised polyphonic synthesizer for modern emotional deep-house plucks. V0.11.25 is the manually accepted Tone & Voicing Refinement baseline. It retains the complete V0.11.0 sixty-two-parameter freeze, identity, presets, randomization, gain structure and GUI. Only the internal Amp Decay/Release contour is slightly fuller; numerical endpoint bounds also prevent tiny envelope rounding rebounds. No drift, phase variation, new saturation, effect or control is introduced.

## Historical baseline: V0.11.5 practically confirmed; timing follow-up deferred

The user amendment of 2026-09-03 replaces the large Cartesian CPU benchmark with
39 representative short-window reference, one-factor scaling and stress cases.
Existing full audio evidence is preserved and reused. Profiling is limited to
Typical, Dense and the measured selected Worst; sound and compatibility remain
unchanged. The current protocol and its limits are documented in
`Tests/CPUProfilingBenchmark.md`.

The internal Amp Decay/Release target ratio changes from 0.0001 to 0.0002. Filter Decay/Release stays at 0.0001; both Attacks stay at 0.30; live Sustain smoothing stays at 0.0001 over 15 ms. Scheduled stage durations and current-level live updates do not change. Earlier shared Amp/Filter candidates were rejected for excessive measured peak growth. The user subsequently confirmed “0.11.25 test bestanden”; the historical [implementation report](Docs/DeepPluck_V0.11.25_Tone_Voicing_Refinement_Implementation_Report.md) retains its original pre-acceptance status.

V0.11.5 is a measurement-first CPU milestone, not another voicing change. The original binaries, sources and user-file inventory were preserved before fresh Debug/Release baseline builds (29/29 original tests passed in each configuration). The legacy 7,920-case audio corpus is retained; current CPU acceptance uses 39 representative cases. Their short baseline renders exactly match the old raw prefixes. A filter-cache experiment was rejected and fully removed. The current settled-waveform-mix candidate confirms +5.43% / +5.01% median paired improvement in the preselected Worst case across two independent runs, with exact tested audio equivalence. However, eleven candidate block-deadline misses in the second run leave the hard realtime gate **FAILED**; a later clean final matrix does not erase them. Both current builds and all 33 CTests per configuration pass, as do versions/local artifacts and Standalone process smokes. At that historical checkpoint PROJECT_VERSION was 0.11.5. The user-assisted elevated trace was collected and analysed, but event loss and missing per-block correlation leave the earlier misses unexplained. On 2026-09-03, after the requested Debug/Release build, the user confirmed that everything works and requested continuation along the roadmap. This is the user's practical approval of V0.11.5, not a retroactive technical timing PASS. Further diagnosis is deferred; no automatic milestone commit has been created. V0.12.0 Factory Presets is now being implemented separately; see the current status above. See the [CPU benchmark workflow](Tests/CPUProfilingBenchmark.md) and [current implementation report](Docs/DeepPluck_V0.11.5_CPU_Profiling_DSP_Optimization_Implementation_Report.md).

The plugin is an instrument with no audio input, one stereo output, MIDI input, and no MIDI output. Each of the fixed 16 musical voices contains one to four internal Unison slots. Every slot runs both waveform-selectable oscillators with the same symmetric detune ratio and a deterministic stereo position. One centred transient and one centred filtered-noise source are then added once per musical voice before independent left/right instances of the nonlinear four-pole low-pass and the shared Amp Envelope. A 17th note deterministically prefers the quietest released voice before considering louder active voices; its two-millisecond residual fade retains both stereo channels.

The sixty-two host-automatable and persisted controls retain the complete forty-four-parameter V0.8.0 prefix and append:

- `Output`: -60 to +6 dB, default -3 dB
- `Master Tune`: 420 to 460 Hz, default 440 Hz (A4 reference)
- `Attack`: 0.001 to 2 seconds, default 0.003 seconds
- `Decay`: 0.001 to 5 seconds, default 0.320 seconds
- `Sustain`: 0 to 1, default 0
- `Release`: 0.001 to 10 seconds, default 0.180 seconds
- `Filter`: on/off, default on, with an internal 10 ms click-free crossfade
- `Filter Cutoff`: 20 Hz to 20 kHz, default 1800 Hz
- `Filter Resonance`: 0 to 100%, default 18%
- `Filter Drive`: 0 to 18 dB, default 3 dB
- `Filter Key Track`: 0 to 100%, default 35%
- `Filter Env Amount`: -5 to +5 octaves, default +2.50 octaves
- `Filter Attack`: 0.001 to 2 seconds, default 0.002 seconds
- `Filter Decay`: 0.001 to 5 seconds, default 0.280 seconds
- `Filter Sustain`: 0 to 1, default 0
- `Filter Release`: 0.001 to 10 seconds, default 0.180 seconds
- `Transient`: on/off, fresh default on; 5 ms click-free crossfade
- `Transient Level`: -60 to 0 dB, default -18 dB
- `Transient Decay`: 0.001 to 0.100 seconds, default 0.012 seconds
- `Transient Tone`: 0 to 100%, default 55%
- `Noise`: on/off, fresh default on; 5 ms click-free crossfade
- `Noise Level`: -60 to 0 dB, default -27 dB
- `Noise Decay`: 0.005 to 1.500 seconds, default 0.120 seconds
- `Noise Tone`: 0 to 100%, default 35%
- `Oscillator 2`: on/off, fresh default on; 5 ms click-free crossfade
- `Oscillator 2 Level`: -60 to 0 dB, default -15 dB; 20 ms gain ramp
- `Oscillator 2 Octave`: -1 to +1 octave, integer, default 0
- `Oscillator 2 Semitone`: -12 to +12 semitones, integer, default 0
- `Oscillator 2 Fine Tune`: -50 to +50 cents, default -7 cents
- `Unison Voices`: 1 to 4 internal slots, integer, fresh default 2; changes affect newly started notes
- `Unison Detune`: 0 to 30 cents, default 4 cents; 20 ms multiplicative smoothing
- `Stereo Spread`: 0 to 100%, default 35%; 20 ms linear pan-gain smoothing
- `LFO Rate`: 0.020 to 12 Hz, default 0.25 Hz; 20 ms multiplicative smoothing
- `LFO Sync`: Free/host-sync switch, default Free
- `LFO Sync Division`: 4/1, 2/1, 1/1, 1/2, 1/4, 1/8, or 1/16; default 1/4
- `LFO Waveform`: Sine, Triangle, Saw, or Square; default Sine
- `LFO Restart`: Free Running or Retrigger First Note; default Retrigger First Note
- `LFO Filter Amount`: -2 to +2 octaves, default 0
- `LFO Pitch Amount`: -50 to +50 cents, default 0
- `LFO Spread Amount`: -100% to +100%, default 0
- `Oscillator 1 Waveform`: Saw, Triangle, Square, Sine, or Pulse; default Saw
- `Oscillator 1 Pulse Width`: 5% to 95%, default 50%; audible only for Pulse
- `Oscillator 2 Waveform`: Saw, Triangle, Square, Sine, or Pulse; default Saw
- `Oscillator 2 Pulse Width`: 5% to 95%, default 50%; audible only for Pulse
- `Chorus Bypass`: default bypassed
- `Chorus Rate`: 0.05 to 4 Hz, default 0.35 Hz
- `Chorus Depth`: 0 to 100%, default 25%
- `Chorus Width`: 0 to 100%, default 65%
- `Chorus Mix`: 0 to 100%, default 20%
- `Delay Bypass`: default bypassed; existing tail may finish
- `Delay Sync`: Free/host-sync switch, default Sync
- `Delay Time`: 0.010 to 2 seconds, default 0.375 seconds
- `Delay Sync Division`: 1/4, 1/8 dotted, 1/8, 1/8 triplet, 1/16 dotted, 1/16, or 1/16 triplet; default 1/8 dotted
- `Delay Feedback`: 0 to 75%, default 32%
- `Delay Tone`: 800 Hz to 18 kHz, default 6 kHz
- `Delay Mix`: 0 to 100%, default 22%
- `Reverb Bypass`: default bypassed; existing tail may finish
- `Reverb Size`: 10 to 92%, default 55%
- `Reverb Pre-Delay`: 0 to 120 ms, default 18 ms
- `Reverb Damping`: 0 to 100%, default 55%
- `Reverb Mix`: 0 to 100%, default 18%
- `FX Order`: the six permutations of Chorus, Delay, and Reverb; default Chorus > Delay > Reverb

V0.11.0 freezes the range, default, interval, type, host name, index, version hint, choice order, normalized mapping, and value-text meaning of this manifest. Amp/Filter Attack use a 44.721 ms normalized midpoint; Decay uses 70.711 ms; Release 100 ms; Cutoff 632.456 Hz; Delay Time 141.421 ms; Delay Tone 3794.733 Hz; Chorus Rate 1.0 Hz; Reverb Pre-Delay 40 ms; LFO Rate remains 0.5 Hz and Unison Detune remains 5 ct. All other continuous parameters retain their documented linear or established nonlinear mappings.

Host and GUI value fields now share one formatter/parser. Envelope times use ms below one second and seconds above it; Cutoff and Delay Tone use Hz below 1 kHz and exactly two-decimal kHz above it; Pre-Delay always uses ms. dB, percentage, octave, cent, semitone, voice, Tune, and rate controls use compact fixed semantic units without float tails. Inputs accept point or comma plus the applicable ms/s, Hz/kHz, percentage, dB, oct, ct, and st units. Formatting changes display only and never round persisted raw values.

Attack, Decay, Sustain, and Release update active voices continuously. A note-off always enters Release immediately from Attack, Decay, or Sustain. Shortening or extending Release while a voice is already fading recalculates only its remaining curve from the current level, so the envelope never restarts or jumps.

The dedicated Filter Envelope is a second independent instance of the same project-owned live envelope. It has the same immediate Note-Off and live-time contracts. Cutoff is modulated per sample in octave space by its smoothed base value, key tracking around MIDI note 60, and the bipolar envelope amount. Drive, resonance, key tracking, amount, and bypass are also smoothed. The filter applies a documented resonance-dependent output compensation of `1 + 1.5 * resonance²`, bounded to 2.5 (+7.96 dB) and ramped over 20 ms. This reduces excessive perceived loudness loss at high resonance without limiting, clipping, or hiding unstable samples.

Transient and Noise are one-shot sources. Their Decay values define the time from the post-micro-attack peak to -60 dB. Changing Decay while a one-shot is active recalculates only the remaining curve from its current level, without a jump or retrigger. Transient Tone moves a short sine wavelet from soft/woody toward bright/focused. Noise Tone controls a stable two-pole low-pass after a fixed 60 Hz DC blocker. Each voice uses a deterministic but decorrelated xorshift sequence; no system time or entropy enters the audio thread.

Oscillator 2 starts every real Note-On at normalized phase 0.25 while the original oscillator keeps its phase-zero start. Octave, Semitone, and Fine Tune combine in equal-tempered pitch space and ramp multiplicatively over 20 ms. Level ramps in linear gain over 20 ms. The oscillator continues advancing while bypassed, so enabling it during a held note does not retrigger or reset phase. It shares the existing Filter and Amp Envelopes and participates in the same velocity, voice-stealing, and headroom contracts.

Both oscillators use the same fixed waveform engine. Saw retains the V0.7.0 PolyBLEP formula and unity calibration. Sine is calibrated to 0.82 peak. Square and Pulse share a dual-edge PolyBLEP core with DC removal, width-aware peak normalization, and a 0.60 gain; Pulse Width is safely constrained at high frequencies. Triangle integrates the bandlimited 50% Square with a deterministic leaky state. Live waveform changes use five permanently allocated one-hot weights and a 5 ms crossfade without resetting phase; Pulse Width uses an independent 20 ms smoother that continues running outside Pulse mode. New notes and stolen voices initialize their waveform, width, phase, and Triangle state deterministically.

Unison Voices is latched at Note-On; setting it to 1 is the complete Unison bypass. Detune and Spread remain live for held notes and ramp over 20 ms without resetting oscillator phase. Counts 2, 3, and 4 use fixed symmetric detune, pan, and phase tables whose detune density and phase span now increase progressively. Two slots use half-range detune, three add a centred anchor at full outer range, and four use two stronger inner offsets between the full outer pair. Stereo orientation alternates deterministically from voice index plus MIDI note, while the bounded `N^-0.90` normalization limits maximum coherent growth to `N^0.10` (1.149 at four slots). Each pan slot uses `left = sqrt(1-p)` and `right = sqrt(1+p)`, so Spread 0 returns exact dual mono after settling. There is intentionally no Phase Spread parameter or extra bypass.

One sample-synchronous global LFO advances once for every processed audio sample, including silence, and supplies the same bounded value to all 16 musical voices. Free mode covers 0.020..12 Hz. Sync mode derives its rate from the cached valid host tempo and the selected musical division, falling back to the last valid tempo and initially 120 BPM. Retrigger First Note resets only when a Note-On arrives after every prior voice and release tail is inactive; overlapping notes and voice steals do not reset it. Waveform changes preserve phase and use a two-millisecond output dezipper.

Filter modulation is applied in octave space before each existing per-channel filter, and Pitch modulation applies the same cents ratio to both oscillators before Unison detune. Spread modulation now moves proportionally from the base width toward the applicable 0% or 100% endpoint, so full Amount remains effective even when the base value itself is 0% or 100%; values remain continuously bounded. The three bipolar Amounts ramp over 20 ms. An Amount of exactly zero takes an explicit neutral path and never writes the effective value back to APVTS or host automation. No oscillator-mix target or general modulation matrix is present.

States saved by V0.1.0 through V0.10.4 remain usable and all earlier migration rules remain active. A state without V0.9.0 data receives the declared FX defaults with all three effects bypassed and canonical order, independently of the live state it replaces. Partial V0.9.0 states retain every supplied FX value and default only missing peers. During V0.11.0 host-state restore, finite Amp/Filter Attack values below 1 ms clamp to 1 ms, values from 1 ms through 2 s remain unchanged, values above 2 s clamp to 2 s, and nonfinite values use the respective declared default. Preset files apply the same finite range canonicalization but continue to reject nonnumeric or nonfinite known values transactionally. Plugin IDs, all sixty-two parameter IDs/order/hints, factory parameter values, and the instrument/bus contract are unchanged.

The Attack range change preserves raw state values up to 2 seconds but necessarily changes the raw result of pre-existing normalized host-automation points for `ampAttack` and `filterAttack`; normalized automation and a changed range cannot simultaneously preserve every old raw value. No other automation mapping changes in V0.11.0.

Randomization is a control-thread operation, never DSP. Master Random covers exactly sixty sound parameters in ten focused modules: the previous nine modules plus Effects Rack, which owns indices 44..61. Output Gain and Master Tune remain excluded. The rack lock excludes every FX value without consuming RNG or creating Undo; one-step Undo now restores all randomizable FX values and order too. The musical distributions favor subtle width, warm repeats, controlled space, and rare bounded extremes. FX Order stays unchanged on 70% of full-Amount rack draws and otherwise selects one of the other five valid permutations uniformly.

The V0.11.0 Random audit leaves every existing non-Attack distribution unchanged. Amp Attack now draws logarithmically from 1–15 ms / 15–80 ms / 80–500 ms / 500 ms–2 s with weights 70/23/6/1; Filter Attack uses 1–20 ms / 20–100 ms / 100–800 ms / 800 ms–2 s with weights 75/20/4/1. Thus the previous short-attack bias is preserved while the complete new range remains rarely reachable.

User presets live under the current user's Documents folder at `Tonetrax/Just a Lil' Pluck Synth/Presets`; no administrator rights or installer is involved. Editable files are stored in `Presets/User` with the case-insensitive extension `.deeppluckpreset`. Each UTF-8 JSON schema-1 file contains format `JustALilPluckPreset`, name, author, writing plugin version, all sixty-two parameter values, and optional metadata. Existing forty-four-value files load with neutral/default FX values. Missing known values load current defaults, unknown future values are ignored, and unsupported schema/format or invalid data is rejected without partial application. A User file is only a source of values: the Cubase/host state remains self-contained and does not store an external file ID or path.

Direct subfolders of `Presets` are read-only packs; an optional `pack.json` with format `JustALilPluckPack`, schema 1, and `packName` supplies the display name, otherwise the folder name is used. Nested folders become categories and preset files directly in the root appear under Imported. Scans run on a low-priority worker, are explicitly refreshable/coalesced, skip symbolic links and individual bad files, and are limited to depth 8, 2,000 preset files, and 1 MiB per file. Save/Save As use safe Windows filenames and atomic replacement. Only confirmed User targets can be overwritten or moved to the recycle bin; Factory, Pack, Imported, and path-escape targets are protected.

The permanent top bar offers the 116 approved V0.12.0 Factory sounds, grouped by their eight categories, plus grouped User/Pack/Imported entries and cyclic Previous/Next buttons. The previous four entries are no longer browsable, while their `factory:0..3` identities still restore the original sounds internally for old states. Save, Save As, Delete, Refresh, and Open Folder complete the file workflow. A deliberately saved User copy keeps its User name even when its values equal a Factory preset. A manual parameter edit or successful Random normally displays `Custom`; Undo restores the preferred name when its complete value fingerprint matches again.

The fixed 1536 x 900 editor follows the binding composition, colour hierarchy, mood, and visual language of `Docs/GUI/DeepPluck_V0.10_GUI_Target_Mockup.png`, with a vertically compact layout that fits the Standalone workflow more comfortably. Its permanent structure is Top Bar, Oscillator Row, MAIN/MODULATION/FX/SETTINGS tabs, active content, and footer. MAIN combines Filter, both Envelopes, Unison, Transient, and Noise. The two oscillator modules remain visible on every page. FX keeps its three compact modules, three GUI-only position proxies, and exactly one shared Effects Rack Random/Lock pair. V0.10.4 stacks Master Random and Undo beside a rotary Amount control, gives MODULATION two compact FX-height rows with an intentionally empty lower expansion area, and moves Random/Lock/Reset Order into a non-overlapping FX Rack header. The obsolete fixed `100%` footer text is removed. The editor still owns exactly sixty-two APVTS bindings, with only one binding for `fxOrder`; page selection remains non-persistent and audio-neutral.

V0.10.2 retains the shared label/control/value bands and the common 64-pixel rotary body, with Filter Cutoff as the only deliberate 112-pixel exception. Filter On and the large Cutoff occupy the left side while Resonance/Drive and Key Track/Env Amount form a strict two-by-two grid. The FX page keeps narrow aligned Bypass and Position columns; Mix, Rate/Free Time/Size, Depth/Feedback/Pre-Delay, and Width/Tone/Damping form four exact vertical axes, while Free/Sync and Division are stacked in one narrow auxiliary column. The preset action row remains indented, the meter occupies the complete header height, and the clearer vector padlock remains in use.

V0.10.3 changes no geometry. Every rotary now has a dark raised rim, inset face, radial top-left highlight, bottom-right shade, fine inner rings, and a small specular arc; the established Teal value arc and Amber pointer remain the foreground information. The same rendering scales to the sole large Cutoff. Random Undo is resolved before the general `random.*` icon rule and therefore displays a compact curved return arrow instead of a dice symbol; Master Random and all module Random buttons retain their dice.

V0.10.35 replaces the former single-style multiline header label with two independently sized bold-italic Amber labels. `JUST A LIL'` remains the small kicker and `PluckSynth` becomes the dominant line; no mountain, image, or other decorative mark is present. SETTINGS/About displays the human-facing credit as `Tonetrax`. The technical JUCE company metadata remains the established `ToneTrax` value so this presentation-only correction does not alter plugin identity.

The custom project-owned LookAndFeel uses a dark petrol/black surface hierarchy, cyan/teal interaction accents, amber waveform/envelope/pointer accents, and vector-drawn workflow, Random, Lock, Undo, and navigation icons without icon fonts or external assets. Buttons use a restrained modern relief with a subtle highlight, lower edge shade, fine teal-grey outline, and dim amber accent. Rotary bodies use bounded dark gradients and fine rings to create visible depth without gloss, chrome, animation, or decorative clutter. Static waveform and ADSR displays are driven only by existing parameter controls and use a crisp amber core with a controlled four-to-five-pixel glow. At the practical 0.001-second minimum, Attack is a vertical rise and Decay/Release are vertical falls; longer times widen only their corresponding segments while Sustain remains horizontal. Master Random and Amount provide explicit Hover Help, governed by the existing Hover Help preference. Hover Help and first-run Welcome preferences remain GUI-only, process-shared, stored outside APVTS/host state, and recover safely from missing or corrupt preference files. A compact processor-owned stereo peak meter observes the final post-Output-Gain samples through lock-free atomic peak accumulation; its unchanged -60 to +6 dB scale uses a restrained Teal-to-soft-Cyan-to-Amber gradient, so 0 dB intentionally remains below full height and +6 dB reaches the top. Consuming meter values never modifies audio.

The global signal path is the complete 16-voice stereo sum, then Chorus/Delay/Reverb in the selected order, then the existing 20 ms Output Gain. Chorus uses two preallocated mono JUCE chorus instances with fixed 6.5/9.5 ms centre delays and M/S wet width. Delay is a project-owned interpolated stereo ring buffer with a strict 0.75 feedback ceiling, smoothed Free/Sync timing, and a feedback-path tone low-pass. Reverb reuses JUCE's algorithm with a preallocated smoothed stereo pre-delay. Each Mix stage uses a deterministic nominal-power normalization derived only from its smoothed Mix value and fixed wet calibration. It is hard bounded to 1.75 (+4.86 dB), preventing the three serial Mix laws from multiplying into an excessive level loss without adding signal-dependent auto-gain, limiting, or clipping. Mix endpoints remain exact; Delay and Reverb bypass stop new feed while allowing tails to decay. Live order changes use a 15 ms dry bridge in each direction. All buffers and scratch space are prepared outside the audio callback, and the processor performs one shared host-position query per block.

## Confirmed development environment

- Windows 11 x64
- Visual Studio 2026 with the **Desktop development with C++** workload
- MSVC 19.51 x64 toolchain
- Windows SDK 10.0.26100.0
- CMake 4.4.3
- JUCE 9.0.1 at `JUCE/`
- C++20

This is the confirmed reference environment for V0.13.0. Other Visual Studio, MSVC, SDK, CMake, and JUCE versions are untested and are not project prerequisites. The project declares CMake 3.22 as its configuration minimum, but only CMake 4.4.3 is in the confirmed build baseline. CMake does not download JUCE or other dependencies.

## Configure, build, and test

Run from the project root in PowerShell or a Developer PowerShell:

```powershell
cmake --fresh -S . -B build -G "Visual Studio 18 2026" -A x64
cmake --build build --config Debug --parallel
ctest --test-dir build -C Debug --output-on-failure
cmake --build build --config Release --parallel
ctest --test-dir build -C Release --output-on-failure
```

The current build registers forty CTests in both Debug and Release. The new
`standalone_keyboard` suite verifies the Standalone-only 1536 x 980 layout and
80-pixel keyboard strip, the unchanged 1536 x 900 VST3/Undefined layout, exact
main-control bounds, 62-parameter/state neutrality, channel-1 notes, octave
clamping, disabled computer mappings/focus, deterministic gesture and same-note
ordering, external/virtual collector merging, cleanup, finite 17th-note voice
stealing, release reset, and audio identity when unused. The
expanded `gui` suite verifies the fixed 1536 x 900 geometry, four-tab hierarchy,
permanent oscillator row, exact sixty-two-binding/ten-module Random/Lock matrix,
structured ABOUT content and dynamic version, exact website URL without opening a
browser, complete Welcome text/bounds/focus order, Start Playing, Don't show this
again, re-arm/show-now, process-shared multi-instance behavior, safe preference
fallback, immediate Hover Help On/Off, generated Settings/Welcome snapshots, and
APVTS/audio neutrality. `DeepPluck.evidence_paths` additionally proves that the
final-evidence wrappers accept only repository-local V0.12.0, V0.12.5,
V0.12.75, or V0.13.0 subpaths, while RC packaging accepts only V0.13.0.
Existing DSP, effects, randomization, preset, migration, headroom, CPU,
Factory, and artifact-version suites continue to cover the complete sound contract.

V0.11.25 adds `DeepPluck.tone_voicing` to those unchanged twenty-eight suites, for twenty-nine total. This offline-only adapter exports measured envelopes, oscillator/filter sweeps, 711 corpus/partition cases, real gain-chain nodes, the full parameter/preset/random contract, and serialized cross-reader fixtures. CTest evidence is written under `build/TestData/ToneVoicing/<config>`; preserve versioned results under ignored `Artifacts/` before rerunning. No reference binary or listening WAV is committed.

The V0.11.5 work adds `benchmark_manifest`, `benchmark_determinism`, `audio_equivalence` and `benchmark_quick` (33 CTests total). Configure `DEEPPLUCK_BENCHMARK_REFERENCE` to the preserved external S/R25 audio root with Debug/Release subfolders; the equivalence test intentionally fails if this reference is missing. `DeepPluckToneAudit <output> - --cpu-null` additionally exports all 669 processor and 42 partition renders as raw float32 stereo. Full CPU acceptance uses controlled serial Release runs, not the quick CTest. Keep `DEEPPLUCK_PROFILE_SYMBOLS=OFF` for normal builds; an isolated ON build adds symbols and offline phase markers solely for profiling, never for acceptance timing.

Normal JUCE outputs:

- Debug VST3: `build/DeepPluck_artefacts/Debug/VST3/DeepPluck.vst3`
- Debug Standalone: `build/DeepPluck_artefacts/Debug/Standalone/DeepPluck.exe`
- Release VST3: `build/DeepPluck_artefacts/Release/VST3/DeepPluck.vst3`
- Release Standalone: `build/DeepPluck_artefacts/Release/Standalone/DeepPluck.exe`

Project-local copies refreshed by successful builds:

- `Artifacts/Debug/DeepPluck.vst3`
- `Artifacts/Debug/DeepPluck.exe`
- `Artifacts/Release/DeepPluck.vst3`
- `Artifacts/Release/DeepPluck.exe`

The complete VST3 bundle is copied recursively. `COPY_PLUGIN_AFTER_BUILD` remains disabled, so builds never install into a system plugin directory.

## Standalone smoke test

No installation is required:

```powershell
& ".\Artifacts\Debug\DeepPluck.exe"
& ".\Artifacts\Release\DeepPluck.exe"
```

The VST3 keeps the deliberately non-resizable 1536 x 900 editor. The Standalone
uses the same unscaled main interface at the top of a 1536 x 980 editor and adds
the virtual keyboard only in the bottom 80 pixels. Play white or black keys with
the mouse; drag uses JUCE's standard key-to-key behavior. `Oct -` and `Oct +`
change only the visible keyboard range, never synth tuning or external MIDI.

## Manual VST3 installation and Cubase validation

For V0.13.0, the manual checklist covered the preserved Standalone keyboard's
white/black keys, mouse-up, dragging, chords, rapid retrigger, octave limits,
external-plus-virtual MIDI, safe close with a held key, audio stop/start, reopen,
focus behavior and complete visibility. Its Cubase scope covered the unchanged
VST3 layout, external MIDI, preset/state recall and sound. On 2026-09-05 the user
reported that the current synth runs without recognizable errors and declared
V0.13.0 complete. This closes the manual gate at milestone level; individual
checklist outcomes were not separately itemized and are not inferred from the
automated tests.

For V0.11.25, explicitly compare with the preserved V0.11.0 A renders at matched level, in stereo and arithmetic mono. Listen to Fresh Default, all four factories, all waveforms, short/repeated attacks, releases, Unison 1–4, high Resonance/Drive and existing FX. Verify V0.11.0 host states and older migrations, unchanged 62-entry automation, file-independent save/reopen and realtime/offline bounce. Do not infer approval from earlier milestone confirmations. The historical V0.11.0 checks below remain useful regression checks, not a claim of a second mapping change in V0.11.25.

DeepPluck never installs itself. For a manual host test, copy the complete directory `Artifacts\Release\DeepPluck.vst3` to `C:\Program Files\Common Files\VST3\DeepPluck.vst3`, then rescan in Cubase. Administrator rights may be required. Do not copy only the inner binary.

Verify in Cubase that V0.11.0 is recognized as the same instrument and exposes exactly sixty-two automation parameters in the unchanged order. Load projects/states and user presets from V0.10.4 and earlier, including Amp/Filter Attack values below, at, and above 2 seconds; confirm the documented clamp and explicitly inspect old normalized Attack automation lanes. Check both Attack controls at 1 ms and 2 s, all declared skew midpoints, direct point/comma entry, every value-text unit, Random's rare long-Attack branch, all four Factory presets, project save/reopen, realtime/offline bounce, multiple instances, Standalone audio/MIDI, and Windows display scaling at 100%, 125%, and 150%. Compare Random and representative patches by ear to confirm that the revised Attack tails remain rare and musically controlled. These V0.11.0 host, automation, migration, text-entry, GUI, CPU, and listening checks are **MANUAL VERIFICATION REQUIRED**.

For the resonance compensation, manually level-compare low and high Resonance at several Cutoff and Drive settings. High Resonance may reshape the spectrum, but it should no longer cause an excessive perceived loudness drop and must not sound like limiting or automatic loudness maximization.

After testing, close Cubase and manually remove the copied system bundle if desired. DeepPluck has no uninstaller because the build performs no installation.

## Known limitations

- PolyBLEP substantially reduces aliasing in Saw, Square, Pulse, and the Square-derived Triangle, but these algorithms are not brick-wall band-limited and cannot promise complete alias freedom.
- The single focused filter deliberately provides no alternate modes or slopes.
- Both oscillators intentionally share the same five fixed waveform choices. Unison is limited to four deterministic internal slots; there is no waveform morphing, PWM modulation, phase control, random phase, oscillator sync, FM, sustained noise mode, alternate transient/noise type, general modulation matrix, per-voice LFO, additional effect types, preset ratings/favorites, preset generator, installer, or automatic updater.
- The functional preset browser is intentionally file-based and bounded to schema 1, depth 8, 2,000 files, and 1 MiB per file. Packs are ordinary folders, not installed packages.
- Host parameter values are snapshotted once per audio block; MIDI remains sample accurate, while host-sample-accurate parameter queues are outside the current architecture.
- Sample-accurate MIDI subdivision can increase CPU cost for pathologically dense MIDI event streams.
- The VST3 UI is deliberately fixed at 1536 x 900 and the Standalone at 1536 x 980; a free-scaling architecture is not part of this milestone.
- The virtual piano is Standalone-only and mouse-only. QWERTZ/computer-key control, sustain/hold, pitch bend, MIDI learn, arpeggiation and MIDI output are intentionally absent.
- The historical V0.11.5 D96/64 hard-deadline finding remains OPEN/deferred; passing functional and no-regression checks do not convert it into a timing PASS.
- Granular Cubase, device, DPI and listening results were not separately itemized; V0.13.0 carries the user's 2026-09-05 practical milestone-level acceptance.

A general modulation matrix, additional effect types, and a free-scaling GUI architecture remain separately scoped future milestones.

## JUCE licensing

This project uses JUCE 9 from the local `JUCE/` directory. Review `JUCE/LICENSE.md` and the current JUCE licensing terms to determine which licence applies to your use and distribution. This repository makes no legal determination on your behalf.
