Commit Graph

293 Commits

Author SHA1 Message Date
daniel d9321eaf3a FA1: unity-Preserve bypass kills preview onset latency; drain-slot reload keeps voices ringing through curve edits; velocity path proven end-to-end 2026-07-27 19:50:21 -04:00
daniel 2b8ab4abe4 Merge pS-fa3-waveform: gap-free per-column min/max waveform render (columnMinMax in peaks, shared across panel + editor) 2026-07-27 19:47:49 -04:00
daniel 69d5621f51 Merge pS-zonebleed: fix zone-bleed (3a) — Sample-face zone reconcile so the played zone matches the drawn one 2026-07-27 19:47:09 -04:00
daniel 6056302752 Merge pS-fa2-envmodel: fully-editable bounded amp envelope nodes (Gate + Trigger) 2026-07-27 19:47:02 -04:00
daniel 1e645adcef fix(draw_kit): reclaim 4x waveform oversample; relocate waveformColumnCount to component_geometry
kWaveformOversample set to 1 (was 4) — overbinning produced byte-identical pixels because columnMinMax exact partition already makes the draw gap-free. Comments credit columnMinMax, not oversampling.
2026-07-27 19:37:53 -04:00
daniel 7fd812bd34 fix(vst): zone-bleed (3a) — reconcile the Sample-face zone on load so the loaded sample zone is the one first-match resolve plays 2026-07-27 19:09:53 -04:00
daniel cf93d4dc50 fix(param_slider): 7->5 o'clock arc (50% straight up), seam contract single-sourced, boundary/normDeg/wrap-boundary fixes 2026-07-27 19:09:51 -04:00
daniel b3c9fad9ba fix(waveform): 4x-oversampled min/max envelope, columnMinMax homed in peaks, panel routed through shared drawWaveform — one gap-free algorithm on all surfaces 2026-07-27 19:09:50 -04:00
daniel 99f377db28 FA2: param-domain Gate schematic + 8px node min-sep (all nodes grabbable at defaults); cross-mode drag guard; double-clamp px overflow fix 2026-07-27 19:09:47 -04:00
daniel 6c0bb4c204 feat(param_slider): radial KNOB primitive — parameterized 6->4 o clock arc, needle endpoint, vertical-drag value map, circular hit-test (FA4) 2026-07-27 18:25:07 -04:00
daniel 20308c842e fix(waveform): per-column min/max envelope fill eliminates gaps in steep segments 2026-07-27 18:25:05 -04:00
daniel d5d1902ea4 FA2: bounded-schematic Gate envelope (15% sustain reserve, in-bounds release) + zero-fade-out grabbable via nearest-node hit-test; all nodes clamp in-canvas 2026-07-27 18:25:03 -04:00
daniel 0e8b1b72cf S-VIEW-10: velocity-curve editor UI — draggable spline box beside the Sample hero + in the Zone panel, all math through the pure velocity_curve module 2026-07-27 15:51:36 -04:00
daniel 21c3656bf7 Merge pS-w2-t2-velcurve: velocity->amp transfer curve (velocity_curve spline + zones-payload v7 + Voice::start apply) 2026-07-27 15:00:10 -04:00
daniel 026ca90217 vst: curve velocity_curve eval with a monotone cubic Hermite (Fritsch-Carlson) spline
True curved response, provably no overshoot outside [0,1]; collinear knots reproduce the exact linear ramp so linear()'s null-response stays bit-exact. Eval-only; v7 wire-format untouched. Adds spline tests.
2026-07-27 14:45:50 -04:00
daniel 8a7dc4b1c6 fix(trigger-seam): thread startFrame into both envelope converters; extract pure triggerPlayLength module + tests 2026-07-27 14:37:05 -04:00
daniel a1f9dcf6f8 S-VIEW-9: velocity->amp transfer curve (pure velocity_curve module + zones-payload v7 + Voice::start apply)
Default flat y=1 (R10-F1 Option A) replaces the linear velocity/127 at note-on — a deliberate, non-back-compat behavior change; v1-v6 blobs lift to the flat default.
2026-07-27 14:18:01 -04:00
daniel d38e4eef84 Merge pS-w1-t3-state: persist preview-trigger velocity as ComponentState v6 (S-VIEW-4 core) 2026-07-27 13:39:09 -04:00
daniel 912ce5b320 Merge pS-w1-t2-keytrk: per-zone keyTrack scalar + ratio math in both repitch engines (S-VIEW-6 core) 2026-07-27 13:38:56 -04:00
daniel 2b83447189 Merge pS-w1-t5-drop: fix drop-to-FX hotspot classifier, narrowed to tcp.fx/mcp.fx (S-VIEW-BUG-1) 2026-07-27 13:37:58 -04:00
daniel 33e38c69fb Merge pS-w1-t4-kbd: keyboard_strip isNaturalKey predicate (S-VIEW-7 core) 2026-07-27 13:37:32 -04:00
daniel 5870b18362 fix(instrument_drop): narrow FX hotspot to tcp.fx/mcp.fx, not bare tcp/mcp (S-VIEW-BUG-1) 2026-07-27 13:34:40 -04:00
daniel fef595be91 fix(drop): recognize TCP/MCP FX-button hotspot for instrument drop (S-VIEW-BUG-1)
The FX-hotspot classifier matched only fx_ (the FX-chain/floating windows),
so a drop on a track TCP FX button (info tcp*) never armed the drop and the
capture fell through to arrange as audio. Widen to fx_/tcp/mcp in a pure,
unit-tested predicate; shell calls it.
2026-07-27 13:26:10 -04:00
daniel 858f736466 feat(keyboard_strip): add isNaturalKey predicate for piano-pattern overlay (S-VIEW-7) 2026-07-27 13:26:08 -04:00
daniel b0b24c3e31 S-VIEW-4: persist preview-trigger velocity as ComponentState envelope v6
New top-level previewVelocity field (MIDI 1..127, mid default 64), sibling of
channelMode. Envelope bumped v5->v6; v5 and older blobs lift to the mid default.
Zones payload untouched (independent version axis). Round-trip + v5/v4-lift +
truncation tests added.
2026-07-27 13:26:07 -04:00
daniel 42dd30b2fe S-VIEW-6: per-zone keyTrack scalar (0-200%, default 100%) with pure ratio math in both repitch engines
keyTrackedRatio is bit-identical to pitchRatio at 100%; keyTrack threads through PerformanceZone->ResolvedZone->KeyZone into baseRatio_, so Varispeed and Preserve both inherit it. Zones payload bumped to v6; older blobs lift to 1.0.
2026-07-27 13:25:53 -04:00
daniel 12a7d072ac S-VIEW-3: add envelope_overlay + envelope_edit pure modules
AHDSR/Trigger params -> polyline forward map (overlay) and node hit-test +
clamped/monotonic pixel->param inverse map (edit) for the draggable Sample-view
envelope. Engine-free, unit-tested, wired into ctest. No shell changes.
2026-07-27 13:24:48 -04:00
daniel 774d753b4c Phase L L3: restyle VST editor + embed strip through the L1 kit (B pastel + spectral strip) 2026-07-27 05:30:44 -04:00
daniel 8887995d7a fix(design-view): adopt pre-existing track mode on drop to prevent lane strand
A bank-panel capture dropped onto a track with pre-existing content was
auto-tagged into the active mode, forcing a multi-mode lane split whose
toggle silenced the pre-existing items. New items now adopt the single
mode of their track's prior content; deliberate splits stay on the
explicit item-move path.
2026-07-27 04:59:03 -04:00
daniel 26e2bf2fc6 S17 drop-and-load onto track FX button; S13 editor drop-accept (relay degraded)
S17: drag_out InstrumentDrop gesture + instrument_drop blob reusing the
instrument's own serializer; bank_panel FX hover-track + add-VST/vst_chunk
inject. S13 relay deferred (read-only bridge) — editor shows drop affordance.
2026-07-27 04:34:01 -04:00
daniel 082c9b82c2 s12: thread project rate through v3 legacy lift; remove 44100 literals
kLegacyV3NominalRate removed. readZonesPayload, deserializePerformance, deserializeComponentState now take a projectRate for v3 frames→seconds. Rate fields default 0 (invalid). Four 44100 fallbacks replaced with assert+safe-return. 96k v3-lift test added.
2026-07-27 04:25:39 -04:00
daniel a54af277e4 S12: store wall-clock ADSR/pitch-env as seconds, resolve to frames at live rate
Kill kTier0Nominal*, adsrNeedsRateResolve, tier0Adsr, gateAdsr. Zones payload v5 carries
seconds; v3 legacy reads convert at the frozen authoring rate; v4 (branch-only) dropped.
Editor sliders now seconds. Engine takes frames resolved at keymap build.
2026-07-27 04:25:38 -04:00
daniel 1d338318e7 fix: S12 R2 — marker-drag sets selectedZone_, ADSR rate-resolve, gateAdsr doc
Marker drag now sets selectedZone_ so single-capture controls stay reachable. Lifted/default ADSR rescales nominal 44100-Hz frame counts by sampleRate/44100 via adsrNeedsRateResolve; v4-authored zones skip rescale. gateAdsr documented vestigial.
2026-07-27 04:20:34 -04:00
daniel 7fb778206c fix(S12 review): per-zone A/D/S/R reaches voice; zones payload v4 + v3 back-compat
Voice::start reads full zone ADSR instead of folding only holdFrames into instrument-wide gateAdsr. Wire format bumped to v4 (four new fields); v3 blobs lift A/D/S/R to kTier0Nominal* constants. Single-capture editor controls now reachable. Minor comment and geometry fixes.
2026-07-27 04:20:34 -04:00
daniel 4f30124ef7 S12: editor scale + S15/S16 control surfaces
Pure browser_scroll/note_entry/param_slider modules (+ CTest) for scroll,
type-to-filter search, numeric note entry, and the AHDSR/Trigger/pitch-engine/
pitch-env control panel. Editor shell draws + routes through them; params edit
the selected zone's ZonePlayParams via commitAndReload.
2026-07-27 04:20:34 -04:00
daniel f79b9cafa3 Merge ps-w10-vst-channel: S18 VST3 channel isolation 2026-07-27 04:20:34 -04:00
daniel 1193a52ea4 Merge ps-w9-t2-modes: S15/S16 sampling modes + pitch engines 2026-07-27 04:18:03 -04:00
daniel fe55a9a96e feat(vst): S18 VST3 channel isolation — beta ReaSampler 9000 pairs with beta extension only
Fork the VST3 class UID (beta UID minted+frozen), on-disk name, and display
name by the one channel bit via app_version; couple UID selection to the
channel at compile time so a refactor can't split identity from data.
2026-07-27 04:16:49 -04:00
daniel 1e1d6bddbb S15/S16: Gate(AHDSR)/Trigger play modes + Varispeed/Preserve pitch engines + AD pitch envelope
Per-zone play params on SampleData; hand-rolled pure pitch_shift OLA for Preserve (WDL drags
windows.h); zone-payload v3 tail; RT-safe pre-warmed shifters + Preserve voice cap.
2026-07-27 04:16:48 -04:00
daniel 77e7c39171 fix(review): embed asymmetry comment, single-lock assign-marker, dedup-collapse test 2026-07-27 04:15:59 -04:00
daniel 66d47fb410 feat(S9/S8): bank-generation change-detection + instrument-side assignment reader
Extension stamps a monotonic bank_generation counter, bumped at content
mutations; the VST3 instrument polls it off-thread on an editor timer and
consumes assignment requests, refreshing playback hands-free.
2026-07-27 04:15:59 -04:00
daniel 725f3e7d3c Merge ps-w7-ingest: S8 ingest through the bank (extension side) 2026-07-27 04:15:08 -04:00
daniel 7a191bde61 test: S7xS11 compose — stereo+startFrame+loop share one read head; v4 stereo envelope + v2 zone overrides round-trip together 2026-07-27 04:15:08 -04:00
daniel 75f717bd47 Merge ps-w8-t2-waveform: S11 waveform view + draggable loop points 2026-07-27 04:15:08 -04:00
daniel 373948c18a fix(ingest): convert-on-import to 32f WAV, undo-group bank+assign, overflow guards
Non-WAV sources decode via PCM_source::GetSamples and land as canonical 32f
RIFF/WAVE; hash taken post-conversion so re-imports dedup. Undo block covers
bank mutation + assign_request atomically. Overflow guards + adversarial tests.
2026-07-27 04:11:42 -04:00
daniel 8074e21057 feat(S8): ingest through the bank — capture/import/drop into bank + assign to active instance 2026-07-27 04:11:41 -04:00
daniel 38238c66ac fix S11 review: extract upsertPickedOverride, restore map_ on drag-cancel, clamp start to frames-1, pin startFrame>loopEnd wrap test 2026-07-27 04:09:50 -04:00
daniel 4a3551b3b9 S7: stereo channel mode — core channel dimension, v4 mode state, VST3 bus negotiation, editor toggle
Per-instance mono|stereo (default mono, byte-identical). Stereo grows SampleData a 2nd
channel + a per-channel VoiceEngine render; decodeChannels applies the cross-mode policy;
setBusArrangements pins the mode's arrangement and restartComponent(kIoChanged) re-negotiates.
2026-07-27 04:09:50 -04:00
daniel 9743547dff S11: waveform view with draggable start/loop markers + zero-crossing snap
Pure waveform_view module (frame<->pixel markers, zero-crossing snap); per-zone
loop/start overrides on PerformanceZone with self-versioning zone payload; core
start-point read offset; editor waveform surface with drag machine.
2026-07-27 04:09:50 -04:00
daniel b9ad1ee18f fix S10 code-review findings: WM_CAPTURECHANGED, proportional drag, paintSetup root source, Add Zone dedup, strip-area helpers 2026-07-27 04:09:50 -04:00