Skip to content

Commit fe53f51

Browse files
vanceingallsclaude
andcommitted
fix(core): slow the voiceover carve's level release to 2.4s
At 1.6s the bed audibly came back at every sentence break on narrated builds, which reads as the effect switching off rather than the mix breathing. 2.4s lets it swell back over a breath. Band-filter release is unchanged; a notch closing is inaudible. Test timings move with the constant. Co-Authored-By: Claude Fable 5.1 <[email protected]>
1 parent 2e2b5c8 commit fe53f51

2 files changed

Lines changed: 10 additions & 8 deletions

File tree

‎packages/core/src/audioCarve.test.ts‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -348,8 +348,9 @@ describe("analyseCarveDuck", () => {
348348
// of that rather than right against it.
349349
expect(at(duck, 2)).toBe(0);
350350
// Back to inaudible by the end of a long tail rather than held down for the
351-
// clip; the envelope's last point is pinned at exactly no cut.
352-
expect(at(duck, 15)).toBeCloseTo(0, 1);
351+
// clip; the envelope's last point is pinned at exactly no cut. Ten seconds
352+
// after the last word is four release constants, so the residue has snapped.
353+
expect(at(duck, 15.9)).toBeCloseTo(0, 1);
353354
expect(duck.at(-1)?.v).toBe(0);
354355
});
355356

@@ -383,10 +384,10 @@ describe("analyseCarveDuck", () => {
383384

384385
// Still most of the way down a third of a second after the last word...
385386
expect(at(duck, 6.3)).toBeLessThan(atSpeech * 0.6);
386-
// ...noticeably recovered by a second and a half...
387-
expect(at(duck, 7.5)).toBeGreaterThan(atSpeech * 0.5);
388-
// ...and within a hair of flat a few seconds later, rather than held down.
389-
expect(at(duck, 11)).toBeGreaterThan(-0.6);
387+
// ...noticeably recovered two and a half seconds on...
388+
expect(at(duck, 8.5)).toBeGreaterThan(atSpeech * 0.5);
389+
// ...and within a hair of flat several seconds later, rather than held down.
390+
expect(at(duck, 13.5)).toBeGreaterThan(-0.6);
390391
});
391392

392393
it("finishes the release past the last word instead of snapping at the end", () => {

‎packages/core/src/audioCarve.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,13 +552,14 @@ const RELEASE_S = 0.25;
552552
* jumped to full the instant a word ended, and what you hear then is the effect
553553
* switching off rather than a mix breathing. Slower than any gap inside a
554554
* sentence, so it rides through the pauses between words and only recovers
555-
* between sentences.
555+
* between sentences. 1.6s still read as the bed "coming back" at every sentence
556+
* break on narrated builds; 2.4s lets it swell back over a breath instead.
556557
*
557558
* It also has to be well clear of the envelope's own step. A long voice is
558559
* measured about every 0.3s, so a release anywhere near that puts the entire
559560
* recovery inside one step — a jump, whatever the constant claims.
560561
*/
561-
const DUCK_RELEASE_S = 1.6;
562+
const DUCK_RELEASE_S = 2.4;
562563

563564
/**
564565
* Windows an envelope may spend. Held under `MAX_AUTOMATION_POINTS` with room

0 commit comments

Comments
 (0)