298 improve simple synth#313
Merged
Merged
Conversation
- 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>
Sportinger
approved these changes
Jul 18, 2026
Sportinger
left a comment
Owner
There was a problem hiding this comment.
Reviewed after local full build/lint/test, focused MIDI parity coverage, and independent read-only review. Audio/MIDI pictogram suppression and live/offline voice-cap parity are clear.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#298