Repository navigation
v0.2.0 — Tier A eased moves + Tier B music-driven moves + Tier D move pools (with codex-loop hardening)
The Insta360 movement upgrade. v0.1.x reframed via static stock moves (orbit at
constant speed, dolly-zoom linear); v0.2 makes camera motion cinematic and
music-aware.
Added — Tier A: eased motion primitives
Every move (orbit, tilt_reveal, dolly_zoom, crowd_reveal) now uses
cosine ease-in-out instead of linear ramps. Two new combined-motion primitives:
counter_motion: yaw turns one direction while pitch oscillates and h_fov
breathes. Three orthogonal motions from one cheap source.dolly_with_drift: push-in plus slow yaw drift. Subject-lock effect.
Added — Tier B: music-driven moves
bpm_sync_orbit: yaw rotates exactly N bars per full turn, BPM-locked.kick_pulse_fov: h_fov pumps at BPM frequency for subliminal beat sync.drop_impact: 4-phase preset (freeze → whip → dolly-zoom → hold) for
the moment of impact.build_tension: quadratic-ease h_fov tightening into the drop.breakdown_drift: ultra-slow yaw + slow pitch tilt for breakdowns.
Added — Tier D: stochastic move pools
lib/selector.pick_move_for_event: weighted RNG pick, intensity-biased,
with 3-pick avoid-repeat window. Same set rendered twice → different cuts.presets/styles/{aggressive,clean,signature}.json: weight overrides.
aggressiveships drop_impact every drop + whip-pans dominating;cleanis
cinematic and slow;signatureis the balanced default.presets/references/{anyma,fisher,rinse}.json: artist-style packs.--style,--reference,--seedCLI flags ondj-edit edl.
Fixed — codex round 1 + 2 (CRITICAL)
TIis normalized [0,1] in sendcmd, NOT seconds. Rewrote every move's
math to useT(absolute seconds) instead of bareTI. The v0.1 expressions
like45*TImeant "45 degrees TOTAL" — not "45 deg/sec" as designed.- Commas inside sendcmd expressions break parsing (verified in ffmpeg
n8.1.1). Replaced piecewiseif(lt(x,a),b,c)with multi-line time-windowed
commands (each command on its own line, no nested if). Replacedpow(T,2)
withT*T. - Render cache only hashed EDL JSON, not cmd file contents. Tweaking a
move generator while EDL JSON stayed byte-identical → cache served stale
video. Now hashes EDL plus every referenced.cmdfile's content. _generate_move_cmdreturned a relative cmd path. Broke whenrender.sh
was invoked from a different cwd. Now returns.resolve()absolute path.target_yaw or 60.0made explicittarget_yaw=0.0impossible. Now uses
target_yaw is Nonecheck.load_pool_overridessilently fell back to defaults on--style typo.
Now warns to stderr (with the resolved file path) for missing pack files,
malformed JSON, or pack entries referencing unknown move names.- Intensity not clamped. Negative or >1 event intensities could produce
zero or negative weights in pool selection. Clamped to [0, 1].
Added — Tests + CI hardening
- 131 pytest tests (up from 41 in v0.1.x). Includes:
- 21 lib/moves invariant tests (
no-pow,no-if,no-commas,uses-T) - 14 selector pool-selection tests (weight bias, avoid-repeat, packs load)
- 60 shipped-preset hygiene tests (12 presets × 5 invariants) — this
test set automatically catches the codex round 1 regression class (where
presets weren't regenerated after a lib rewrite).
- 21 lib/moves invariant tests (
- Full quickstart
--demoend-to-end smoke verified: drop detected, set_9x16- set_16x9 + highlight + per-drop clip all produced in ~8 seconds.
Verified end-to-end
All 12 generated .cmd files render through real ffmpeg n8.1.1 sendcmd (orbit,
drop-impact, build-tension, kick-pulse-fov tested with rgbtestsrc input;
frames at t=0 and t=1s have different md5sums → motion confirmed).
Upgrade
brew upgrade dj-edit