Add zoom
add_zoomPROJECT-SCOPED: this call acts only on the explicit project_id and returns the project identity with its result. Camera move (sub-pixel, eased) on a time range of the FINAL edited video, in output seconds. OPTIONAL, never a rule: a steady, well-framed picture is the default, and a zoom needs a clear editorial reason (the word the story turns on, a real cut between ideas, a thing the viewer must look at) — zooms where nothing calls for them make an edit look childish, so never one on every cut, sentence or hold. When a move is earned, each one has a job and lands on a real beat: 'punch' = fast expo snap in (~0.15s), held, hard cut back out at end — THE punch-in on a stressed word, number or payoff; end it on the next cut or sentence turn so the step back reads as a second camera, and add overshoot 0.05-0.15 for a slam that settles on the biggest beats. 'landing' = starts pushed in (strength 0.12-0.18) and settles to the wide in ~0.35s — start it EXACTLY on a cut (end ~start+0.4) so the new shot arrives with momentum. 'push_in' = slow continuous push (strength 0.05-0.12) across a long hold (3s+) that builds toward something; 'pull_out' = the release/reveal. 'ease' (default) = smooth ramp in, hold, ramp out — a gentle push onto a subject mid-shot. An edge within 4 frames of a cut lands ON the cut and holds through it: no ramp straddles a cut, and a punch/ease starting on a cut is in on its first frame (it ramps from the wide instead when the frame before the cut is already pushed in about as far). 'pulse' = 1 -> 1+strength -> 1 in ~0.3s on a beat or hit word (strength 0.05-0.08). 'shake' = a decaying impact shake (strength unused; shake 0.3-0.8). Vary mode, strength and spacing — never the same punch on a metronome. Knobs: ramp_s = how long the move takes (punch ramp_s=0 is a hard one-frame step; a landing or pulse needs >= 0.06), overshoot 0-0.5 (punch/ease), rotate = degrees of roll riding the move (+ clockwise, 1-3 for a dynamic punch), shake 0-1 with shake_hz/shake_decay on ANY mode (punch + shake 0.4 = an impact hit). strength 0.05-4.5 (default 0.15; pulse 0.07; above 1.0 is a dramatic 2x+), capped so the footage is never enlarged past 3x in total (framing x zoom — the result says when). TWO ways to aim, and they answer different requests: rect=[x0,y0,x1,y1] (fractions of the output frame, read off look_at's grid) FRAMES A REGION — the tool solves strength and centre so that box fills the frame with margin, THE way to 'zoom into the message / that button / this panel', and its result reports where the region lands on screen. cx/cy instead PIN A POINT: that point keeps its exact screen position while everything magnifies around it — right for a punch on a face that is already well-composed, and wrong for framing a thing near an edge (an edge point stays at the edge at any strength — it never slides to centre). Pass rect OR cx/cy, not both; if both arrive the rect wins (it already determines the centre) and the call still succeeds. Omitting all targets uses the frame center and returns a quality advisory. Coordinates may come from look_at, the filmstrip, user direction, or the editor's own judgment; no prior evidence call is required. punch_in_on_emphasis places punches on the measured vocal stress peaks in one call. If the zoom should MOVE while pushed in — 'then move it to X', 'keep it and go to the next message', 'follow the cursor' — that is ONE add_zoom_path (its keyframes take rect too), never a chain of static zooms.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cx | No | ||
| cy | No | ||
| end | Yes | ||
| mode | No | ||
| rect | No | ||
| shake | No | ||
| start | Yes | ||
| ramp_s | No | ||
| rotate | No | ||
| purpose | No | The nameable narrative or visible reason for this zoom. | |
| shake_hz | No | ||
| strength | No | ||
| overshoot | No | ||
| project_id | Yes | Required immutable scope for this call. Copy the id from list_projects/open_project/project_state; the active-project pointer is never used to guess. | |
| shake_decay | No | ||
| motion_motif | No | Active Blueprint motion motif id this event executes; never 'hold'. | |
| target_evidence_ids | No |