feat(core,studio): the character presets pitch shift unlocks - #3277
Conversation
miga-heygen
left a comment
There was a problem hiding this comment.
Review
Approve. Independent read at exact head.
Three character presets — chipmunk (+7st + high shelf sparkle), giant (-5st + low shelf weight + compressor glue), monster (-8st + tanh saturate growl + close reverb). Each builds a chain with the new pitchshift plus supporting FX, following the existing preset pattern exactly.
PRESET_PROBLEM strings, FX_PRESET_STYLE entries, and plans doc all updated. The plans doc honestly notes what's still out of scope (robot/alien need ring mod).
No issues. Ship it.
— Miga
terencecho
left a comment
There was a problem hiding this comment.
Independent read at head cd95622
Concurring with @miga-heygen's approve on the shared verification: three additive character presets, no existing preset touched, style + copy + plan updates in lockstep.
Additional checks I ran on top of that:
- Defense-in-depth on the pitch clamp. The three semitone values (7 / -5 / -8) sit inside both bounds: the effect registry (
audioFx.tsmin/max[-12, 12]) AND the worklet's own runtime clamp (Math.max(-12, Math.min(12, p.semitones ?? 0))in theHfPitchshiftprocessor from #3276). So even if a future spec-only widening let a param through, the worklet still caps it — musically comfortable + safe. - Non-pitch params also in-range against
audioFx.ts: highshelf freq 4000Hz / +3dB, lowshelf freq 150Hz / +4dB, compressor threshold -18dB / ratio 3, saturate tanh, reverb size 0.3 / wet 0.22. All within registered mins/maxes. - Structural non-regression. The three new
preset(...)calls are appended afterdoofus-worbleand before thespaceblock'sroom-tight.pa-system/intercom/doofus-worble(immediately before) androom-tight(immediately after) are byte-identical to prior. No sibling drift. - No new plumbing — presets are pure data written into
data-fx-chain. The "scoped gate" question reduces to "did the author touch anyone else's chain?" — they didn't.
CI: all required checks green; regression / player-perf / preview-regression all SUCCESS; no cascade gotchas triggered.
— Review by tai (pr-review)
0ec9de4 to
1fb7d0a
Compare
The base branch was changed.
cd95622 to
e470beb
Compare
Chipmunk, Giant, and Monster ship as presets on the pitchshift worklet P1 added: Chipmunk pitches up and adds sparkle, Giant pitches down with weight and a compressor to hold the extra low end together, Monster pitches down further with saturation growl and a close, tight reverb. Every param verified against the live effect registry rather than sketched — the compressor/reverb/saturate/shelf keys all match exactly. Each gets its own title treatment (font, size, tracking, hue) so the FX rack's per-preset styling coverage and hue-distance/background-uniqueness tests extend cleanly to the three new entries, and complaint-line copy in the non-voice vocabulary the audit test enforces (no speech words — "Giant" over CapCut's "Deep Voice", as the design doc records). Updates plans/audio-fx-presets.md's two limits paragraphs to record that pitch shift landed and this half of the character list now ships; Robot and Alien stay out of scope (ring modulation, still unbuilt). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
e470beb to
ba7500a
Compare
Summary
pitchshiftworklet effect P1 added — pure data + copy, no new plumbing.audioFx.ts) rather than trusted from the step doc's sketch —pitchshift/saturate/reverb/compressor/shelf keys all matched exactly.giant, not a speech word like CapCut's "Deep Voice" (per the design doc's own near-miss).plans/audio-fx-presets.md's two limits paragraphs to record that pitch shift landed and note Robot/Alien are still out (ring modulation, unbuilt).Stack
Depends on and stacks on:
Should merge after all three.
Test plan
bun run buildcleanpackages/corefull suite: 2344/2344 passpackages/core/src/audioFxCopy.test.ts(vocabulary audit): 28/28 passpackages/studiopropertyPanelFxSection.test.tsx+propertyPanelFxPresetStyle.test.ts: 108/108 pass🤖 Generated with Claude Code