@@ -150,10 +150,17 @@ takes only those, and the bed keeps its low end and its top, so it is still musi
150150while the voice is still intelligible.
151151
152152** It is a relationship, not an effect.** The settings live on the * bed* — the
153- track that gets processed — and they name the voice to listen to, exactly as a
153+ track that gets processed — and they name the voices to listen to, exactly as a
154154sidechain compressor does: you select the track that gets quieter and pick what
155- makes it quieter. ** Never put a carve on the voice track.** A voice carved
156- against itself is a bug, not a subtle mix choice.
155+ makes it quieter. ** Never put a carve on a voice track.** A voice carved against
156+ itself is a bug, not a subtle mix choice.
157+
158+ ** Every voice, not one of them.** ` sources ` is a list, because a bed usually runs
159+ under a whole sequence — a narrator, an interview answer, a second presenter. They
160+ are summed onto the bed's own clock before anything is measured (` mixCarveSources ` ),
161+ so one analysis covers all of them: the bands come from all the speech there is, and
162+ the envelopes rise wherever any of it is happening. Voices that never play while the
163+ bed does are left out; they cannot mask it.
157164
158165** One knob.** ` strength ` is 0..1 and derives everything: how deep to cut, how
159166many bands, how wide, how far to favour intelligibility over raw voice energy,
@@ -172,13 +179,11 @@ polish step to get to if there is time. Place both tracks, run the command below
172179listen. Skip it only when there is no narration for the music to sit under — a
173180music video, a title card, a montage cut to the track.
174181
175- ** Static or dynamic — dynamic unless you know otherwise.** A static carve holds
176- its cuts for the whole clip, including every pause, so the bed is thinned where
177- there is nothing to make room for. Dynamic turns every value into an envelope of
178- the voice's own level: silence leaves the bed alone, a loud passage pushes the
179- carve to full depth. That is what almost every voiceover wants, so it is the
180- default. Reach for ` --static ` only for wall-to-wall narration with no real gaps,
181- where an envelope is hundreds of breakpoints describing a constant.
182+ ** It always follows the voice.** There is no static mode: a fixed depth thins the
183+ bed through every pause, and once you have heard both there is no reason to want it.
184+ Every value becomes an envelope of the speech's own level — silence leaves the bed
185+ alone, a loud passage pushes the carve to full depth — written as ordinary automation,
186+ which is why the lanes show up in the timeline and can be edited afterwards.
182187
183188** Level matching is part of it.** Spectral carving cannot fix a bed that is
184189simply louder than the voice. So the carve also measures how far over the voice
@@ -187,8 +192,13 @@ driven by an envelope for a dynamic one. That envelope releases slowly on
187192purpose — music that snaps back to full the instant a word ends sounds like a
188193machine doing it.
189194
190- ** Running it.** In Studio: pick the voice in the bed's Voiceover carve control;
191- turning it on adds the modules and strength adjusts what is there. Headless —
195+ ** Running it.** In Studio the carve is one module at the top of a track's effect
196+ rack — voice, strength, dynamic, and the analysis it produced, in one card. It is
197+ there whenever another track could be the voice, and a bed with exactly ** one**
198+ candidate above it is carved by default, dynamically, at the default strength:
199+ that is what a bed under narration wants, and the module is where you change or
200+ switch it off. Several candidates leaves the picker waiting rather than guessing.
201+ Headless —
192202which is the path when you are authoring a composition rather than editing one:
193203
194204``` bash
@@ -206,20 +216,17 @@ bands 400Hz -6dB q1.4, 1000Hz -3dB q1.4, 1600Hz -3.17dB q1.4
206216level 216-point envelope, floor -6 dB
207217```
208218
209- Name the pair with ` --bed ` / ` --voice ` when the composition has several plausible
210- tracks, ` --strength ` to push it, ` --static ` to hold one depth, ` --dry-run ` to see
211- that report and write nothing.
212-
213- ** How it picks the pair.** Names first, because that is what you already told it
214- and the answer is explainable: a track whose id or filename looks like music
215- (` music ` , ` bgm ` , ` bed ` , ` score ` …) is the bed, one that looks like a voice
216- (` voice ` , ` vo ` , ` narration ` , ` speech ` …) is the voice, and SFX-shaped names are not
217- candidates for either. If one role is filled and a single track is left, that
218- track takes the other role. Only when names decide nothing does it listen: it
219- measures how much of each track is quiet, and the one that stops between phrases
220- is the voice. ** When two tracks are too close to call it refuses and asks you to
221- name them** rather than carving the wrong one — a bed carved against a bed is
222- silent and confusing, and typing two ids is cheap.
219+ Name the tracks with ` --bed ` / ` --voice ` (repeatable) when the automatic choice is
220+ wrong, ` --strength ` to push it, ` --dry-run ` to see that report and write nothing.
221+
222+ ** How it picks the tracks.** Names first, because that is what you already told it
223+ and the answer is explainable — ` classifyAudioName ` in core, the same classifier
224+ Studio's own picker uses, so the two cannot disagree. A track whose id or filename
225+ looks like music (` music ` , ` bgm ` , ` bed ` , ` score ` …) is the bed; everything else that
226+ plays over it and is not SFX-shaped is a voice. Audio elements are preferred: video
227+ counts only when no audio track is left to be the voice, or every B-roll clip in the
228+ composition would read as somebody talking. ** It refuses when it cannot tell which
229+ track is the bed** rather than carving the wrong one — typing one id is cheap.
223230
224231Same analysis functions as the panel, so the result is identical. Needs ` ffmpeg `
225232on PATH and ` @hyperframes/core ` installed in the project (`npm i -D
0 commit comments