docs: record post-S-VIEW DAW-fix pass + voice-system redesign (parameterized voices, mono, preview card, two-tier panic, v7)
This commit is contained in:
@@ -2615,3 +2615,60 @@ state persists via the index.
|
||||
|
||||
Slot model + slot↔sample assignment.
|
||||
"Capture to slot N" / "insert slot N" actions, MIDI-bindable.
|
||||
|
||||
---
|
||||
|
||||
## Post-S-VIEW DAW-fix pass + voice-system redesign (2026-07-27)
|
||||
|
||||
> **Merged to dev 2026-07-27. Integrated suite 52/52 green.** These items were found during
|
||||
> Daniel's post-S-VIEW DAW testing (fixes) and a subsequent Daniel directive (voice redesign) —
|
||||
> not tracked as PLAN points. PLAN.md has no corresponding entries to move.
|
||||
|
||||
**Envelope node editing (DAW-fix):** Every Gate stage (A/H/D/S/R incl. a visible in-bounds
|
||||
Release) and Trigger's zero-fade-out node are now fully grabbable in both modes. `envelope_edit`
|
||||
uses param-domain schematic scaling (`kGateNodeSepPx = 8` minimum node separation enforced by the
|
||||
forward map in `envelope_overlay`); all nodes clamped in-canvas. Previously only a subset of nodes
|
||||
was editable.
|
||||
|
||||
**Gap-free waveform render (DAW-fix):** `columnMinMax` moved to `peaks`; `waveformColumnCount`
|
||||
moved to `component_geometry`. The dock panel and VST editor now share one gap-free per-column
|
||||
min/max algorithm via `draw_kit::drawWaveform`.
|
||||
|
||||
**Radial Knob primitive (DAW-fix):** `param_slider` gained a `Knob` control kind (7→5 o'clock arc,
|
||||
needle, vertical-drag) as the foundation for the Wave B control deck. `ControlKind::Knob` added
|
||||
to the enum; `computeKnob`/`knobHitTest`/`knobValueAngleDeg` pure helpers added.
|
||||
|
||||
**Zone-bleed fix 3a (DAW-fix):** `reconcileSingleCaptureZones` added to `sample_map` — fixes
|
||||
stale full-range zone shadowing so the engine plays the zone the editor draws. Called on load
|
||||
(`setState`), on bank-assign, and on capture-confirm in the editor.
|
||||
|
||||
**Voice-system redesign (Daniel directive):**
|
||||
- `sampler_core` — user-parameterized voice count (1–32, default 16 via `kDefaultVoiceCount`);
|
||||
`VoiceMode` enum (Poly/Mono: last-note held-note stack, `MonoTrigger` Retrigger/Legato toggle);
|
||||
isolated `PreviewCard` class (dedicated preview voice outside the MIDI pool — never steals
|
||||
from/into it; unity-Preserve zero-latency bypass scoped to it); two-tier panic (`allNotesOff`
|
||||
= CC 123 release, `allSoundsOff` = CC 120 immediate hard-stop including Trigger one-shots).
|
||||
- Processor — `process()` sums `PreviewCard` alongside the engine + drain; `retireIdleDrain()`
|
||||
retires fully-idle drain snapshots on the UI-timer cadence (idle-drain retirement); voice-param
|
||||
setters (`setVoiceCount`/`setVoiceMode`/`setMonoTrigger`) rebuild the engine from the
|
||||
already-decoded keymap via the drain-slot swap — no bank re-read, no WAV re-decode, ringing
|
||||
tails not cut.
|
||||
- `ComponentState` envelope bumped **v6→v7**: three voice bytes added (voiceCount 1–32 / voiceMode
|
||||
Poly|Mono / monoTrigger Retrigger|Legato). Pre-v7 blobs lift to `{16, Poly, Retrigger}` —
|
||||
reproduces pre-Phase-S behavior exactly. Zones-payload axis untouched.
|
||||
|
||||
- [x] `envelope_edit` + `envelope_overlay`: all Gate and Trigger nodes draggable; `kGateNodeSepPx`
|
||||
separation enforced; param-domain schematic scaling; in-canvas clamp.
|
||||
- [x] `columnMinMax` homed in `peaks`; `waveformColumnCount` homed in `component_geometry`;
|
||||
`draw_kit::drawWaveform` shared by dock panel and VST editor — gap-free at any bins-to-pixels ratio.
|
||||
- [x] `param_slider` `Knob` control kind: `computeKnob`/`knobHitTest`/`knobValueAngleDeg` pure
|
||||
helpers; 7→5 o'clock arc; vertical-drag pixel mapping.
|
||||
- [x] `reconcileSingleCaptureZones` in `sample_map`: stale full-range zone shadowing fixed; called
|
||||
on `setState`, bank-assign, and editor capture-confirm.
|
||||
- [x] `VoiceMode` / `MonoTrigger` enums and `PreviewCard` class in `sampler_core`.
|
||||
- [x] `VoiceEngine` constructible with user voice count; `allNotesOff` (CC 123) / `allSoundsOff`
|
||||
(CC 120) two-tier panic.
|
||||
- [x] Processor: `PreviewCard` summed in `process()`; `retireIdleDrain()` on UI-timer cadence;
|
||||
voice-param rebuild via drain-slot swap (no disk I/O).
|
||||
- [x] `ComponentState` envelope v6→v7; `voiceCount`/`voiceMode`/`monoTrigger` on `ComponentState`;
|
||||
back-compat lift in `deserializeComponentState`.
|
||||
|
||||
Reference in New Issue
Block a user