Skip to content

Staging#314

Merged
kfxs merged 10 commits into
masterfrom
staging
Jul 18, 2026
Merged

Staging#314
kfxs merged 10 commits into
masterfrom
staging

Conversation

@kfxs

@kfxs kfxs commented Jul 18, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

kfxs and others added 10 commits July 7, 2026 20:49
- Packet 1: durable schema (filter/filterEnv/LFOs/typed mod-matrix/
  pitchBendRange) + clip.automation on all clip variants; widen
  IMidiSynth.scheduleNote with a note-local automation window; slice
  helper; history snapshot/restore + full save/load round-trip.
- Packet 2: subtractive DSP (osc -> BiquadFilter -> amp, carrier-node
  additive matrix, linear filter env, keytrack, per-voice LFOs, live
  voice stealing + offline analytic voice cap). New simple-synth tracks
  default to a subtractive patch; legacy saved instruments stay bare.
- Packet 3: layout-agnostic synth panel sections (Oscillator/Filter/
  Envelope/Lfo/ModMatrix) + SVG CC breakpoint-envelope lanes with a lane
  selector in the piano-roll controller area (edits clip.automation).
- Packet 4: 8-patch built-in preset bank + user save/load (settingsStore)
  + preset picker that reflects the loaded patch's name.

Phase-1 complete; deferred follow-ups (motorized faders, absolute-cutoff
automation, cut/merge automation) tracked in the plan doc §13.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…§14)

General, instrument-agnostic channel so any instrument's UI shows the live
automated value of a parameter during playback. Re-derives value from
base patch + clip automation (never reads the DSP) — deterministic,
offline-parity, survives the future WASM DSP swap.

- instrumentParams/: param descriptors + registry + pure evaluateParamAt
- liveParamBus + activeMidiClip + useLiveInstrumentParams rAF driver
- SynthSlider paramId -> imperative ghost thumb/fill/badge (no re-render)
- wired cutoff, gain, pitch-LFO depth; shared CC-range consts in synthVoiceMath

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ollers

- SynthSlider gains a `scale` prop (linear/log/power); native range runs on
  normalized position and maps through the taper. Motorized ghost uses the
  same map so fader and ghost stay in lockstep.
- log: cutoff, LFO rate (equal travel per octave). power: gain, env A/D/R,
  filter LFO depth (fine low-end, reaches 0). Others stay linear.
- Piano-roll controller-area toggle relabeled Velocity -> Controllers
  (it now hosts velocity + the four CC lanes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- common/Knob: general rotary knob (taper + drag-to-turn + right-click reset
  + a11y). No MIDI dependency; a generic subscribeLive escape hatch drives the
  imperative automation overlay, so any live source can animate it.
- SynthKnob: thin wrapper binding paramId -> liveParamBus (mirrors SynthSlider).
- FilterSection rebuilt as a compact knob row (Cutoff/Res/Env Amt/Key Trk);
  Cutoff shows its live automated value. Saves vertical space.
- Move sliderScale to common/ (slider + knob share it).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- EnvelopeGraph: classic ADSR shape drawn under each envelope, redraws live on
  edit; capped width + centered.
- Oscillator (Gain, Bend Rng) and both ADSR envelopes now use knobs.
- Oscillator|Amp Envelope and Filter|Filter Envelope sit side by side.
- Knob: pointer-capture instead of pointer-lock (no cursor hide / panel scroll).
- Update OscillatorSection smoke test for the knob (keyboard nudge).

Docs: motorized-fader §14.6; new open-bug doc + ongoing index entry for the
pre-existing timeline section-split jitter (not fixed here).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Fix: history serialization guard flagged ANY key named `source` as a runtime
  handle, so a mod-matrix route's string `source` ('velocity', …) aborted project
  load ("not serializable plain data"). Only guard runtime-payload keys when the
  value is actually an object handle; plain primitives pass. Real handles are
  always objects, so media-clip protection is unchanged.
- LFO Rate/Depth and Mod Matrix Amount are now knobs; LFOs lay out two-up.
- Instrument+Preset share a row; Oscillator|Filter over Amp|Filter envelopes;
  LFO(2/3)|Mod Matrix(1/3); narrower LFO label column.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- EnvelopeGraph is now editable: drag the attack/decay/release/sustain
  breakpoints. Each of A/D/R maps its REAL value into its own fixed-width slot
  (independent — turning Decay never moves the attack curve); release is anchored
  to the right edge and measured backwards; sustain is the flexible plateau at
  its (linear) level. Absolute cursor tracking; edits flow through the same
  onChange as the knobs, so graph + knobs + audio stay in sync.
- Graph-only power taper (γ3) tuned so short A/D/R still render with visible
  width and presets fill their slots.
- Governance baselines: register the motorized-fader rAF hook in the getState
  policy (+1) and acknowledge #298 type-barrel imports (557->559); trim the
  policy file back under its 300-line registry budget.
- Docs: plan §14.6 updated for the knob UI + interactive envelope.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Resolve conflict in loadStateGeneratedClipRestore.ts: keep staging's helper
extraction/light-clip support plus this branch's `automation` field on
restored generated clips.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
MIDI (note bars) and audio (waveform) clips already canvas-draw their own body
preview, so the FileTypeIcon pictogram overlay (piano/speaker) was redundant
clutter sitting on top of the previsualization and hurting legibility.

Gate `showIcon` off for any clip type with a body preview. Record the rule as
an explicit invariant — "never perturb the clip previsualization" — in both the
overlay code and docs/Features/Timeline.md, and update the pictogram test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying masterselects with  Cloudflare Pages  Cloudflare Pages

Latest commit: f0d577c
Status: ✅  Deploy successful!
Preview URL: https://8755dfa5.masterselects.pages.dev
Branch Preview URL: https://staging.masterselects.pages.dev

View logs

@kfxs
kfxs merged commit 00874ed into master Jul 18, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant