Motion

Every item is made of named parts, and any part takes any move. The moves combine freely, or the engine choreographs the whole item from a mood and a seed.

volito info lower-third        # lists its parts: scrim, spine, plate, name, role
volito render lower-third \
  --motion name.in=typewriter --motion plate.in=iris --motion "*.ease=bouncy" \
  --motion role.emphasis=pulse@2 --motion spine.idle=pulse --out priya.mov

Settings

SettingTakes
in, outAny of the 36 moves below. An exit plays its move backwards; out=none stays to the end.
easebrand linear in out inOut smooth sine expo back elastic bounce snappy punchy bouncy calm gentle wobbly stiff spring(f,d) steps(n) cubic(x1,y1,x2,y2), or spring(f,d), steps(n), cubic(x1,y1,x2,y2)
from, outFromThe side a move comes from or leaves to: left right up down top bottom up-left up-right down-left down-right
dur, delay, at, outAt, distance, intensity, origin, blurTiming, travel, scale, pivot (center left right top bottom top-left top-right bottom-left bottom-right) and motion blur.
idleA loop while the part holds: none float bob pulse breathe wiggle sway drift jitter spin heartbeat shimmer
emphasisHits at a time, a beat or a spoken word, "shake@1.2, pop@now": pulse pop shake jump wobble flash spin rubber tada
split, order, staggerText whole or by none lines words letters, in order forward reverse center edges random
keysYour own keyframes, any path: [{"t":0,"x":-300,"op":0},{"t":0.8,"x":0,"op":1,"ease":"bouncy"}]

The moves

MoveWhat it does
nonealways there, no entrance
appearcuts in at its time
fadefades in
riserises into place
dropdrops into place
slideslides in from a side (from: left | right | up | down)
smearslides in fast with motion blur
arcswoops in on a curve
popsprings up from half size
zoomzooms up from small
pushsettles down from big
growscales up from nothing
grow-xgrows across (origin: left | center | right)
grow-ygrows up (origin: bottom | center | top)
unfoldunfolds down from the top
wipewiped on from a side (needs the part's box)
irisrevealed by a growing circle
shutterrevealed in horizontal slats
blindsrevealed in vertical slats
diagonalrevealed by a diagonal sweep
blurcomes into focus
flipflips down like a card
turnturns in like a page
spinspins in from small
rollrolls in from a side
swingswings down from its top edge
skewskids in, leaning
stretchjelly: stretched wide, springs back
squashfalls in squashed, springs back
bouncefalls and bounces
elasticsnaps in on an elastic
slamslams down from big with a jolt
tiltrises in tilted
floatdrifts up gently
glitchglitches in: RGB split, sliced, flickering
flickerflickers on
typewritertext typed letter by letter with a caret
scrambleletters scramble, then settle

Aliases: fade-in is fade, slide-up is rise, slide-down is drop, zoom-in is zoom, scale is grow, type is typewriter, reveal is wipe, motion-blur is smear, punch is push, jelly is stretch.

Moods and seeds

Or let it choreograph itself. A mood picks moves, timing and eases for every part; a seed gives a new take on the same mood, and the same number always moves the same way.

volito sheet title-card --mood playful --seed 7     # look at it first
volito render title-card --mood cinematic --seed 3 --speed 1.2 --out title.mov

Moods: energetic elegant playful cinematic glitchy minimal retro kinetic.

On the voice

Give a transcript and text lands on the words that say it: --words transcript.json takes [{w, s, e}] or Whisper JSON, and --offset 12.5 when the graphic starts 12.5 s into it. Hits can name a word too: emphasis=pop@launch.

In a program

Programs you write get the same kit. Ask for an animator and draw each element as a part; it then takes every move, mood and seed from the command line too.

function frame(t, $) {
  const M = motion($, t), k = $.k;
  const box = { x: $.W / 2 - 320 * k, y: $.H / 2 - 110 * k, w: 640 * k, h: 220 * k };
  return M.part("card", { at: 0.1, in: "pop", box }, $.card(box.x, box.y, box.w, box.h)) +
    M.text("title", { at: 0.3, in: "rise", split: "letters", ...$.font("display"), size: 80 * k, x: $.W / 2, y: $.H / 2 - 44 * k, anchor: "middle" }, "Hello");
}

M.part(name, options, markup) poses any markup; M.text(name, options, string) draws text that can split by lines, words or letters; M.progress(name, options) gives the eased progress of a part's entrance for things an item draws itself, like a counter or a line's length. volito api prints the whole kit; Write your own has the rest.