Summary
Add .tremolo(rate, depth) as a chain method on all instruments. Tremolo is amplitude modulation — the volume oscillates at rate Hz with depth controlling the intensity (0–1). Essential for vintage organ, guitar, and lo-fi sounds.
Expected API
// Tremolo on a pad — slow, subtle wobble
Pad('C3').attack(0.3).tremolo(4, 0.3).volume(0.5)
// Faster tremolo on a plucked string
Pluck('E4').tremolo(8, 0.6).volume(0.7)
Where to make the change
packages/dsl/src/chain.ts — add readonly tremolo: (rate: number, depth: number) => T to ChainMethods<T> interface, implement in createPart()
packages/dsl/src/validators.ts — add validation: rate > 0, depth 0–1
packages/gui/src/renderer/types/score-dsl.d.ts — add to ambient declarations for Monaco IntelliSense
- Engine wiring in
packages/components/ — connect _tremolo descriptor prop to a TremoloNode (LFO → GainNode)
Notes
- Follow the pattern of existing fx chain methods:
.chorus(), .phaser() in chain.ts
- The LFO infrastructure is already in
@score/modulation — use it
- Must ship with tests and TSDoc
- Rate is in Hz (not BPM-synced — that's a separate
tremoloSync concern)
Good first issue — self-contained chain method addition, clear scope, no planning required.
Summary
Add
.tremolo(rate, depth)as a chain method on all instruments. Tremolo is amplitude modulation — the volume oscillates atrateHz withdepthcontrolling the intensity (0–1). Essential for vintage organ, guitar, and lo-fi sounds.Expected API
Where to make the change
packages/dsl/src/chain.ts— addreadonly tremolo: (rate: number, depth: number) => TtoChainMethods<T>interface, implement increatePart()packages/dsl/src/validators.ts— add validation:rate> 0,depth0–1packages/gui/src/renderer/types/score-dsl.d.ts— add to ambient declarations for Monaco IntelliSensepackages/components/— connect_tremolodescriptor prop to aTremoloNode(LFO → GainNode)Notes
.chorus(),.phaser()inchain.ts@score/modulation— use ittremoloSyncconcern)Good first issue — self-contained chain method addition, clear scope, no planning required.