daniel
9d38f87a2d
instrument: one VELOCITY deck for all three velocity curves, bipolar and off by default for pitch and filter
...
Payload v12 appends the new velocity->pitch curve and folds the retired filter velAmount into its now-bipolar curve, so pre-v12 projects reopen sounding identical. Preview button takes a drawn play triangle.
2026-07-31 19:15:17 -04:00
daniel
3cb22e984d
loop: fix the crossfade seam's residual discontinuity, plus six review minors
...
Normalizes crossfadeWeight over crossfade-1 so the last rendered frame lands at exactly the incoming tap instead of a residual step; corrects the CLAUDE.md invariant and seam test to match. Shares lerpSource/crossfadedSource/maxCrossfade, fixes stale docs/constants, and clears crossfade on the loop-OFF gesture.
2026-07-31 17:59:58 -04:00
daniel
0fe4166d7d
loop: crossfade the Gate sustain seam, and unshadow the loop handles that made loop points look gone
2026-07-31 17:36:36 -04:00
daniel
2fa1405b06
instrument: fix AHD node-tracking/tie-break/live-latch defects and close staged-envelope-curve test gaps
2026-07-31 09:52:17 -04:00
daniel
13e8c5c4d9
instrument: one staged-envelope system — per-segment curves, the sustain-less AHD, and a shared overlay for all three envelopes
...
Trigger's fade pair folds into the AHD (and goes live); the release anchors right;
Preserve rings its synthetic tail out instead of cutting it. Payload v10.
2026-07-31 08:37:57 -04:00
daniel
8d4ccbf841
Retire the zone system: one capture = one parameter set, and re-seam the engine and Sample face into bands
2026-07-30 07:15:54 -04:00
daniel
847936f813
Q-W1 pt2: core/shell/app relocation + sub-namespaces; one concrete ui::Rect (LTRB fork retired); slot_map split from bank_book; BankIndex→BankModel; 59/59 green
2026-07-28 21:34:09 -04:00
daniel
15d293b42f
fix(q-w0): six audit fix-nows — linked-lag stereo SOLA, playable-span prime bound, declick dead-state, provenance cursor hardening, rate-derived gain ramp + fade ceiling
2026-07-28 19:28:48 -04:00
daniel
93e28f4ea5
fix(vst): reopen heal without the editor — bounded main-thread retry timer, re-armable first-poll heal, unconditional preview-off consume + Mono/drain preview tests
2026-07-28 10:56:40 -04:00
daniel
81c4658711
Preview rides the real note path: mailbox drains into VoiceEngine noteOn/noteOff at the root note; PreviewCard retired; first-poll reopen heal reloads a silent-but-should-be-loaded instrument
2026-07-28 10:30:51 -04:00
daniel
4f7e15390f
fix(pitch_shift): re-anchor fadePos_ on freeze so gNew is continuous at the freeze frame; guard left cast; add step-detector + loop-never-freezes regression
2026-07-28 10:09:23 -04:00
daniel
917626a287
fix(preserve): GA3 tail wind-down — freeze the SOLA writer at source exhaustion so the tail recycles frozen real content (no DC-splice chop through the final window + release)
2026-07-28 09:50:28 -04:00
daniel
a23ee1b000
Merge pS-ga2-clicks: bounded-blend takeover declick (mono retrig + preview + poly steal), soundingNote() gating — click-free voice restarts
2026-07-28 09:10:23 -04:00
daniel
3e9f5b3b48
fix(sampler_core): bounded-blend declick (no overshoot), soundingNote() gates cap + legato
...
Replaces frozen-difference declick with bounded blend (out*(1-w)+ref*w, bounded by max(|ref|,|out|)). soundingNote() gates activePreserveVoices and mono-Legato retune away from ramp-only past-end voices. Magnitude-bound test asserts |v|<=1 across the ramp.
2026-07-28 09:10:04 -04:00
daniel
5d3289f0bc
fix(vst): declick rev 2 — difference-seeded ungated takeover ramp (rev-1 (1-amp) gate zeroed it on Trigger/zero-attack); preview card opt-in
2026-07-28 08:49:07 -04:00
daniel
2ef3514bc7
fix(preserve): prime SOLA rings with real source (zero-latency, gap-free onset) + sub-sample splice alignment — clean repitch C1..C8
2026-07-28 08:49:05 -04:00
daniel
157eb8c624
Merge pS-ga-voicesteal: declick every takeover (mono retrig + poly at-cap steal), gated on envelope complement; over-cap steal proven exactly-one
2026-07-28 07:00:24 -04:00
daniel
39ea6ce7db
fix(sampler_core): gate takeover declick by (1-amp) to remove zero-attack +6 dB blip and long-attack notch; clamp seed to +/-1; add zero-attack test
2026-07-28 06:59:05 -04:00
daniel
056ccd003e
fix(voice): declick every takeover of a sounding voice — mono retrig/fallback and poly at-cap steal; same-block double-steal keeps its seed; over-cap repro proves the engine steals exactly one voice per note-on
2026-07-28 06:37:36 -04:00
daniel
3e6629a867
fix(vst): pin output bus to stereo (mode is decode-only) killing the hard-right pan; auto-default channel mode from the loaded capture (state v9)
2026-07-28 06:19:28 -04:00
daniel
080a7be8ca
fix(voice): CC 120 hard-stops voices (incl. Trigger); Mono sizes voices_ to 1; comments corrected
...
CC 120 -> allSoundsOff/hardStop (immediate silence, stops Trigger one-shots); CC 123 -> allNotesOff/releaseAll (release, unchanged). Mono VoiceEngine sizes voices_ to 1 structurally. Legato same-note re-press edge documented. Three new tests.
2026-07-27 22:08:56 -04:00
daniel
cc64def2d0
fix(voice): Trigger legato keys on held-stack depth, CC123 allNotesOff clears mono stack, voice-param edits rebuild from decoded PCM (no re-decode), mono sizes 1 shifter ring
2026-07-27 21:54:03 -04:00
daniel
885b7f29a2
Phase S voices: user-set polyphony, mono stack (retrig|legato), isolated preview card, idle-drain retirement; unity bypass preview-only (v7)
2026-07-27 21:29:30 -04:00
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
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
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
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
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
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
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
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
a04ef54eec
fix(tests): rework testNoteOffReleasesNewestSameNote to actually prove newest-first release; add single-frame-loop test; add two comments in sampler_core.cpp
2026-07-27 04:07:08 -04:00
daniel
74d2e976e7
S3: pure sampler core — voices, ADSR, keymap, loop-aware repitch
...
REAPER-free and VST3-free voice engine with bounded stealing, ADSR
envelope, key/velocity keymap resolution, and repitch from root note
with loop-point sustain. Test target links neither SDK.
2026-07-27 04:07:08 -04:00