wizz-method 2.21.0 → 2.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD-PARTY-NOTICES.md +24 -0
- package/package.json +4 -2
- package/removals.txt +3 -0
- package/skills-registry.yaml +133 -4
- package/src/bmm-skills/1-analysis/research/wizz-market-research/steps/step-06-research-completion.md +27 -0
- package/src/bmm-skills/1-analysis/wizz-set-feature/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-code-review/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-create-story/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +8 -1
- package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +2 -2
- package/src/bmm-skills/4-implementation/wizz-quick-dev/step-03-implement.md +2 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-status/SKILL.md +1 -1
- package/src/core-skills/wizz-party-mode/customize.toml +3 -3
- package/src/modules/lowticket/README.md +2 -1
- package/src/modules/lowticket/module.yaml +1 -1
- package/src/modules/lowticket/skills/wizz-clone-do-expert/SKILL.md +86 -0
- package/src/modules/lowticket/skills/wizz-clone-do-expert/references/clone-prompt-template.md +21 -0
- package/src/modules/lowticket/skills/wizz-lowticket-trafego/references/reguas.md +2 -0
- package/src/modules/wizz/_shared/cerebro.md +1 -1
- package/src/modules/wizz/_shared/organizacao.md +2 -2
- package/src/modules/wizz/_shared/video-pipeline.md +2 -0
- package/src/modules/wizz/agents/wizz-copy/SKILL.md +1 -0
- package/src/modules/wizz/agents/wizz-copy/customize.toml +5 -0
- package/src/modules/wizz/agents/wizz-copy/knowledge/playbook.md +3 -2
- package/src/modules/wizz/agents/wizz-growth/customize.toml +7 -2
- package/src/modules/wizz/agents/wizz-growth/knowledge/playbook.md +3 -2
- package/src/modules/wizz/agents/wizz-social/knowledge/blueprint-roteiro-viral.md +14 -0
- package/src/modules/wizz/agents/wizz-social/knowledge/legenda-instagram.md +12 -0
- package/src/skills-lib/wizz-cerebro/SKILL.md +18 -5
- package/src/skills-lib/wizz-design-needs/SKILL.md +7 -0
- package/src/skills-lib/wizz-design-needs/references/design-state.md +34 -2
- package/src/skills-lib/wizz-design-needs/references/gap-analysis.md +1 -1
- package/src/skills-lib/wizz-design-needs/scripts/design_state.py +305 -0
- package/src/skills-lib/wizz-design-needs/scripts/tests/test_design_state.py +143 -0
- package/src/skills-lib/wizz-impeccable/references/design-rules.md +18 -0
- package/src/skills-lib/wizz-ios-build/SKILL.md +61 -0
- package/src/skills-lib/wizz-motion-3d-director/references/motion-paths.md +2 -0
- package/src/skills-lib/wizz-offer-forge/SKILL.md +2 -2
- package/src/skills-lib/wizz-paid-ads/SKILL.md +2 -1
- package/src/skills-lib/wizz-paywall-upgrade-cro/SKILL.md +1 -0
- package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/README.md +13 -13
- package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/SKILL.md +11 -7
- package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/assets/template.html +8 -21
- package/src/skills-lib/wizz-pesquisa-de-publico/references/interview-mode.md +69 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/SKILL.md +6 -2
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/audit-protocol.md +7 -34
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/component-sources.md +25 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/design-sources.yaml +325 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/mandatory-process.md +1 -1
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/mining-rubric.md +123 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/source-first-protocol.md +10 -4
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/web-access-and-evidence.md +1 -1
- package/src/skills-lib/wizz-premium-landing-ui-researcher/scripts/design_sources.py +221 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/scripts/tests/test_design_sources.py +130 -0
- package/src/skills-lib/wizz-router/references/routing-table-flat.md +7 -1
- package/src/skills-lib/wizz-seo-audit/SKILL.md +4 -0
- package/src/skills-lib/wizz-seo-audit/references/gsc-regex-perguntas.md +64 -0
- package/src/skills-lib/wizz-signup-flow-cro/SKILL.md +1 -0
- package/src/skills-lib/wizz-signup-flow-cro/references/trial-abuse.md +40 -0
- package/src/skills-lib/wizz-taste-skill/references/anti-slop-tells.md +8 -0
- package/src/skills-lib/wizz-ui-component-curator/SKILL.md +8 -7
- package/src/skills-lib/wizz-ui-ux-pro-max/SKILL.md +1 -1
- package/src/skills-lib/wizz-ui-ux-pro-max/references/common-rules-checklist.md +11 -0
- package/src/skills-lib/wizz-video-effects/LICENSE-motionmaxxing.txt +202 -0
- package/src/skills-lib/wizz-video-effects/SKILL.md +7 -2
- package/src/skills-lib/wizz-video-effects/assets/chrome/collect_layout.js +113 -0
- package/src/skills-lib/wizz-video-effects/assets/effects.config.template.json +45 -0
- package/src/skills-lib/wizz-video-effects/references/data-contract.md +32 -1
- package/src/skills-lib/wizz-video-effects/references/gates.md +4 -1
- package/src/skills-lib/wizz-video-effects/references/one-take.md +41 -0
- package/src/skills-lib/wizz-video-effects/scripts/check_chrome.py +376 -0
- package/src/skills-lib/wizz-video-effects/scripts/check_dead_frames.py +193 -0
- package/src/skills-lib/wizz-video-effects/scripts/check_one_take.py +159 -0
- package/src/skills-lib/wizz-video-effects/scripts/config.py +13 -0
- package/src/skills-lib/wizz-video-effects/scripts/test_chrome.py +181 -0
- package/src/skills-lib/wizz-video-effects/scripts/test_dead_frames.py +171 -0
- package/src/skills-lib/wizz-video-effects/scripts/test_one_take.py +126 -0
- package/src/skills-lib/wizz-video-styles/LICENSE-lemo-opuscar.txt +21 -0
- package/src/skills-lib/wizz-video-styles/SKILL.md +16 -7
- package/src/skills-lib/wizz-video-styles/assets/film-styles/dark-keynote.html +78 -0
- package/src/skills-lib/wizz-video-styles/assets/film-styles/remotion/Riso.tsx +63 -0
- package/src/skills-lib/wizz-video-styles/assets/film-styles/risograph.html +69 -0
- package/src/skills-lib/wizz-video-styles/assets/film-styles/swiss-motion.html +84 -0
- package/src/skills-lib/wizz-video-styles/references/check-ins.md +25 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/DIRECTOR.md +139 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/archive-lighttable.md +109 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/art-deco.md +112 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/ascii-crt.md +115 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/backrooms.md +125 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/blueprint.md +120 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/brick-toy.md +114 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/briefing-board.md +122 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/caption-news.md +137 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/cel-anime-80s.md +119 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/city-symphony.md +142 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/countdown.md +132 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/crayon-book.md +109 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/dark-keynote.md +117 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/data-physical.md +119 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/dataviz.md +123 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/engraving.md +123 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/game-show.md +118 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/glass-product.md +110 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/halftone-dossier.md +122 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/hd-2d.md +111 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/hologram-hud.md +129 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/impasto.md +124 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/ink-wash.md +120 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/iso-infographic.md +117 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/kino-montage.md +151 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/lidar-survey.md +118 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/living-screencast.md +124 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/lowpoly-island.md +112 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/microgame.md +122 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/microscope.md +108 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/midcentury-toon.md +124 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/news-package.md +158 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/newsreel.md +136 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/one-line.md +114 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/paper-lantern.md +116 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/paper-popup.md +119 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/papercut-red.md +110 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/pictogram-motion.md +119 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/pixel-rpg.md +117 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/risograph.md +125 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/rubber-hose.md +112 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/satellite-briefing.md +116 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/scifi-toon.md +121 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/shadow-puppet.md +124 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/silent-film.md +109 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/silkscreen-poster.md +140 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/spy-titles.md +116 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/stained-glass.md +123 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/swiss-motion.md +115 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/teardown.md +127 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/telestrator.md +137 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/tilt-shift.md +107 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/ukiyoe.md +112 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/urban-sketch.md +126 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/visual-investigation.md +140 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/watercolor.md +113 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/white-model.md +115 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/whiteboard.md +118 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/woodcut.md +122 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles.md +140 -0
- package/src/skills-lib/wizz-video-styles/references/insert-recipes.md +33 -0
- package/src/skills-lib/wizz-video-styles/references/motion-laws.md +62 -0
- package/src/skills-lib/wizz-video-styles/references/styles/desafio-numero.md +1 -0
- package/src/skills-lib/wizz-video-styles/scripts/beat_grid.py +38 -6
- package/src/skills-lib/wizz-video-styles/scripts/blind_review.py +159 -0
- package/src/skills-lib/wizz-video-styles/scripts/taste.mjs +110 -0
- package/src/skills-lib/wizz-video-styles/scripts/test_blind_review.py +82 -0
- package/src/skills-lib/wizz-vsl/LICENSE +49 -0
- package/src/skills-lib/wizz-vsl/SKILL.md +122 -0
- package/src/skills-lib/wizz-vsl/references/assembly-qa.md +123 -0
- package/src/skills-lib/wizz-vsl/references/blocks-and-leads.md +149 -0
- package/src/skills-lib/wizz-vsl/references/diagnosis.md +95 -0
- package/src/skills-lib/wizz-vsl/references/intake.md +200 -0
- package/src/skills-lib/wizz-vsl/references/mechanisms.md +138 -0
- package/src/skills-lib/wizz-vsl/references/niches.md +40 -0
- package/src/skills-lib/wizz-vsl/references/offer.md +91 -0
- package/src/skills-lib/wizz-vsl/references/production.md +75 -0
- package/src/skills-lib/wizz-web-security/SKILL.md +2 -0
- package/tools/hooks/README.md +10 -9
- package/tools/hooks/wizz-arrumar.js +1 -0
- package/tools/hooks/wizz-artifact-guard.js +31 -5
- package/tools/hooks/wizz-cerebro-lib.js +36 -13
- package/tools/hooks/wizz-feature-lib.js +4 -1
- package/tools/hooks/wizz-feature.js +66 -76
- package/tools/hooks/wizz-sprint-archive-lib.js +311 -0
- package/tools/installer/core/hooks-settings.js +1 -0
- package/tools/installer/core/installer.js +6 -0
- package/tools/installer/guided/labels.js +16 -0
- package/tools/installer/install-text.js +2 -0
- package/tools/installer/modules/cli-config.js +3 -0
- package/tools/installer/modules/core-seed.js +72 -0
- package/tools/installer/modules/mcp-config.js +3 -0
- package/tools/installer/ui.js +22 -26
- /package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/prompts.md +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
<!-- Vendored from lemo-opuscar (https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/whiteboard), MIT, (c) 2026 LemoLab; see ../../LICENSE-lemo-opuscar.txt. Paths under demo/ and core/ name that repo's engine, which is not shipped here: build the look in HyperFrames (../film-styles.md). -->
|
|
2
|
+
|
|
3
|
+
# Whiteboard Explainer — Style Prompt
|
|
4
|
+
|
|
5
|
+
> An explainer drawn live on one glossy dry-erase board: single-line handwriting that is actually *written* stroke by stroke, floating markers with no hand, magnets that can move, an eraser that can rewind, and a camera that travels across the board instead of cutting.
|
|
6
|
+
> References (grammar only): RSA Animate / Cognitive Media (one continuous board, the camera travels instead of cutting, a full-board view); minutephysics (one sentence = one drawing, the simplest geometry that carries the idea); Steve Reich's *Piano Phase* (two copies of one figure at two tempi as a structure). Never copy their drawings, characters, hands or music.
|
|
7
|
+
|
|
8
|
+
Suits explainers, usually science or "how does X work"; the length follows how many ideas the board has to hold.
|
|
9
|
+
|
|
10
|
+
## 1. Essence, and what it is not
|
|
11
|
+
|
|
12
|
+
- **One physical whiteboard.** Everything the viewer learns is drawn in dry-erase marker in front of them, in real handwriting order.
|
|
13
|
+
- **The board is a map**: each idea lives in its own region; the camera travels between regions, often led by the pen. Distance on the board = distance in the argument.
|
|
14
|
+
- **Real marker, not animated text**: ink pools where the nib lands, dry streaks and speckle, strokes overshoot and don't quite close, ghosts of old lessons remain, a glossy sheen drifts slower than the board, and **every stroke makes a sound**.
|
|
15
|
+
- **No hands.** Markers float with a real cast shadow that grows when they lift, park outside the frame between phrases and fly back in. Magnets and the eraser move on their own. Never draw a hand, an arm or a cursor.
|
|
16
|
+
|
|
17
|
+
Not Blueprint (no blue sheet, no drafting conventions), not Crayon Picture Book (no wax texture, no children's story), not a kinetic-type explainer (text is handwritten stroke by stroke, never animated as blocks).
|
|
18
|
+
|
|
19
|
+
## 2. Materials & rendering
|
|
20
|
+
|
|
21
|
+
- **Board**: a warm white gradient, a faint scuff and micro-scratch tile, a few dozen **ghost marks** (old words, circles, arrows) at 5–10 % in grey or pale blue, and a soft diagonal **window sheen** (white, 10–16 %) moving at ~0.35× the camera: this one detail sells "glossy".
|
|
22
|
+
- **Ink**: alpha ~0.94, composited with **multiply** so overlaps darken like real marker. Width 6–11 px for drawing, ~13 % of cap height for lettering.
|
|
23
|
+
- **Stroke character**: resampled every ~0.6 × width; low-frequency hand wobble along the normal (a few px, long wavelength) plus a finer tremor; chisel-tip width modulated by direction; a pressure ramp at the start and a small taper at the end; circles start at an angle and **overlap past closure**; rectangles are four strokes with small corner overshoot; a darker pooled dot *inside* the start of long strokes.
|
|
24
|
+
- **Dry-marker texture**: a speckle-and-streak tile subtracted from the ink layer (destination-out), locked to board space, faded out when the camera is wide.
|
|
25
|
+
- **Lettering**: a single-line (single-stroke) font written in stroke order, each glyph with small rotation, baseline and scale jitter. Missing symbols (μ ≈ → × − ✓ ² ° ±) are hand-defined.
|
|
26
|
+
- **Props**: dry-erase markers (white barrel, colour band and cap in the ink colour, felt nib), a felt eraser, magnets (glossy, with specular highlight and soft cast shadow). Frame, tray and wall appear only if the camera ever goes past the board edge.
|
|
27
|
+
|
|
28
|
+
## 3. Colour logic
|
|
29
|
+
|
|
30
|
+
- **Three marker colours at most**, each with a meaning held for the whole film: one dark ink for things and structure, one for signals / measurement / process, one accent for the thing that matters (one accent per region).
|
|
31
|
+
- **Monochrome variant**: everything in the dark ink, one element in the accent (the "only colour").
|
|
32
|
+
- Ghost marks and board stay neutral; the accent never appears on props except its own marker cap and the hero magnet.
|
|
33
|
+
- Example sets: black `#23262c` / blue `#2a5cb3` / orange `#d97757`; black / green `#2e8b57` / red `#c8363a`; navy `#1f2a44` / teal `#1f8a8a` / purple `#7a4fb3`.
|
|
34
|
+
|
|
35
|
+
## 4. Type & subtitles
|
|
36
|
+
|
|
37
|
+
- **Handwriting only**: a single-line hand (e.g. EMS Tech, OFL) for all board text; titles large (~120–200 px cap height), labels 30–70 px.
|
|
38
|
+
- **Title and end card are written on the board** in the same hand.
|
|
39
|
+
- **Burned subtitles**: an off-white rounded label (~90 %), a handwriting-like face (e.g. Architects Daughter ~44 px), dark text, a short accent-colour marker dash. Split at clauses, ≤ 44 characters per line, bottom ~12 % of the frame kept free for them in every shot. Hold ≥ max(1.8 s, speech + 0.6 s).
|
|
40
|
+
- **Writing finishes on the word**: a term appears exactly when the narrator says it.
|
|
41
|
+
- A label is fully in or fully out of every shot it appears in.
|
|
42
|
+
|
|
43
|
+
## 5. Motion quality
|
|
44
|
+
|
|
45
|
+
- **Hand speed**: every stroke follows a slow-fast-slow curve (`u − sin(2πu)/2π × 0.8`). Strokes are scheduled into a **time window** and the engine solves the speed, so writing always finishes on time.
|
|
46
|
+
- **Pen hops** between strokes lift in proportion to distance (shadow slides and blurs); long gaps send the pen off-frame to park and back shortly before its next stroke.
|
|
47
|
+
- **Magnet**: drop with a shrinking shadow; slide with a small lift; lift-off and sink possible.
|
|
48
|
+
- **Eraser**: constant speed along a path, a wide band at ~90 % strength (a ghost always remains).
|
|
49
|
+
- **Speed**: faster than real hands (a sped-up lesson) but never so fast the stroke order is lost: a label ~0.3–0.8 s, a title ~3 s.
|
|
50
|
+
- Camera on ones with real motion blur when it moves fast.
|
|
51
|
+
|
|
52
|
+
## 6. Camera grammar
|
|
53
|
+
|
|
54
|
+
A 2D camera over a large board (e.g. 8000 × 4500): position, zoom interpolated in 1/z so pushes feel like dollies, a little roll. A vocabulary, not a route. Opening and ending come from the topic.
|
|
55
|
+
|
|
56
|
+
| Move | What it expresses | Can serve |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| Pull back from a tiny drawing | scale | a surprising size; context |
|
|
59
|
+
| Ride the line the pen is drawing | one idea leads to the next | a transition; a process; a path |
|
|
60
|
+
| Hold still | read now | an equation; a definition; a list |
|
|
61
|
+
| Whip to a new region | a new idea after a pause | a twist; a "but" |
|
|
62
|
+
| Return to an earlier region | a callback, for free | reusing a result; a comparison |
|
|
63
|
+
| Split view of two regions (zoomed out enough for both) | two things at once | a duet; before/after |
|
|
64
|
+
| Slow push into one symbol | this term is the point | a unit; a variable; a name |
|
|
65
|
+
| Track along a long diagram | sequence, time | a timeline; a pipeline; a journey |
|
|
66
|
+
| Pull back past the board edge to the wall | the whole lesson as one picture | a summary; a scale jump |
|
|
67
|
+
|
|
68
|
+
Motion blur: when the camera moves more than ~14 px per frame, render and average sub-frames (≤ 4 px apart). No cuts on the board; if a cut is needed, it is a whip.
|
|
69
|
+
|
|
70
|
+
## 7. Sound palette
|
|
71
|
+
|
|
72
|
+
- **Every stroke sounds**: band-passed felt-on-gloss noise (a hiss band ~2–7.5 kHz + body ~0.5–1.5 kHz) enveloped by the stroke's own speed curve, a tiny nib tick at the start, stick-slip grains, and on some long strokes the **dry-erase squeak** (a 1.5–2.6 kHz sine with 7–13 Hz vibrato). Each colour sounds slightly different. Pan = the stroke's screen x; closer camera = louder.
|
|
73
|
+
- **Props**: magnet on steel = click + metal modes + a low board thump; eraser = felt rub modulated by its zig-zag; cap off/on; marker tray bounce.
|
|
74
|
+
- **Room**: low room tone; a single diegetic ticker (a wall clock, a fridge hum, a projector fan) can own a silence.
|
|
75
|
+
- **Music** options: a solo piano figure; a small jazz trio with brushes; plucked strings and kalimba; a synth arpeggio for tech topics; clockwork minimalism (marimba, pizzicato, woodblock, glockenspiel). Mickey-mouse details: a rising whistle for growth, pings for signals, a harp run for a fall.
|
|
76
|
+
- **Techniques to pick from**: adding one instrument per step of a mechanism; a key change when the frame of reference changes; a full stop into silence before a surprise; the previous cue reversed and squeezed for a rewind; two copies of one figure at two tempi (phasing) for anything that diverges, snapping into unison when resolved.
|
|
77
|
+
- **Mix**: voice on top (compressed, light room), music well under voice and ducked further under speech, foley ~11 dB under voice; −14 LUFS.
|
|
78
|
+
|
|
79
|
+
## 8. Native moves
|
|
80
|
+
|
|
81
|
+
A menu: use the ones your story needs.
|
|
82
|
+
|
|
83
|
+
- **Writing in stroke order.** The reveal is the explanation: a formula term by term as it is spoken. *Fits content like:* compound interest; the Drake equation; a recipe's ratios.
|
|
84
|
+
- **The pen leads the camera.** Transitions are drawn lines the camera rides. *Fits content like:* a nerve signal; a supply chain; the water cycle.
|
|
85
|
+
- **Magnets.** The only things allowed to move on a board: give the hero to a magnet; slide, lift, drop, sink it. *Fits content like:* a delivery truck on a route; a cell in a bloodstream; a player on a pitch.
|
|
86
|
+
- **The eraser rewinds.** Wiping a trail backwards reads as undoing time. *Fits content like:* an undo in software; reversing a chemical reaction; "what if we hadn't…".
|
|
87
|
+
- **Two pens at once.** A live duet comparing two quantities. *Fits content like:* two savings plans; two runners; a population vs its food supply.
|
|
88
|
+
- **Ghosts of the old lesson.** A faint previous drawing becomes relevant. *Fits content like:* a theory replaced; last year's forecast; a first draft.
|
|
89
|
+
- **The full-board view.** Every region seen at once as one picture. *Fits content like:* a system diagram; a history; a map of a field.
|
|
90
|
+
|
|
91
|
+
## 9. Pitfalls of the medium
|
|
92
|
+
|
|
93
|
+
- **One pen, too many jobs** drifts later and later → give each drawing a deadline window and let overlapping jobs go to another pen.
|
|
94
|
+
- **Minimum stroke duration × many dashes** makes a dashed line take seconds → dashes need their own floor.
|
|
95
|
+
- **A pooled-ink dot bigger than the stroke start** leaves halos on every letter → keep it inside.
|
|
96
|
+
- **Punctuation vanishes** (a font period is a 1 px stroke) → render sub-width strokes as dots.
|
|
97
|
+
- **Labels half-cut by a push-in** look sloppy.
|
|
98
|
+
- **Motion blur with few sub-frames** strobes text.
|
|
99
|
+
- **Eraser paths** crossing labels you want to keep.
|
|
100
|
+
- **Voice and phoneme set mismatch** (a British voice with US phonemes) mispronounces → match the language code to the voice; ASR-check.
|
|
101
|
+
|
|
102
|
+
## 10. Engine
|
|
103
|
+
|
|
104
|
+
`demo/engine/wb.js`: hand-drawn shapes (`line`, `curve`, `poly`, `arc`, `circle`, `rect`, `arrow`, `dashed`, `hatch`), `text()` in writing order from a single-line font (`loadFont`), `Stroke`, floating `Pen`s, `Timeline.draw(pen, shapes, t, {by})` (solves hand speed to a deadline), `Timeline.erase`, `Timeline.cue`, keyed `Camera`, `Board` (ink multiply, dry texture, erasers, sheen, props), prop drawers. API table and a minimal example that draws something new: [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/whiteboard/DEMO.md#engine-reference).
|
|
105
|
+
|
|
106
|
+
## 11. Variation space
|
|
107
|
+
|
|
108
|
+
You decide the topic's object, the board layout, the colours within the logic, the voice, the music family, the camera route, the opening, the ending and the length.
|
|
109
|
+
|
|
110
|
+
All far from our demo:
|
|
111
|
+
|
|
112
|
+
- Structures: **a proof** (one claim at the top, the board fills downward step by step, each step boxed when proven); **a debate** (two pens, two halves of the board, each drawing its side until the drawings meet in the middle); **a timeline** (one long horizontal line ridden left to right, with events hanging off it).
|
|
113
|
+
- Openings: **a question mark** drawn huge in the centre, then shrunk to become a dot in the first diagram; **an erased board** where the ghost of a wrong answer is still visible; **a magnet dropping** onto an empty board with a clack.
|
|
114
|
+
- Endings: **the answer circled** twice and the pen capped; **the board wiped** except for one line that survives; **a push into the smallest symbol** on the board, which becomes the title.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
How our demo was made (story, shots, score, end card, build): [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/whiteboard/DEMO.md). Read it after your treatment exists.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<!-- Vendored from lemo-opuscar (https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/woodcut), MIT, (c) 2026 LemoLab; see ../../LICENSE-lemo-opuscar.txt. Paths under demo/ and core/ name that repo's engine, which is not shipped here: build the look in HyperFrames (../film-styles.md). -->
|
|
2
|
+
|
|
3
|
+
# Woodcut Print — Style Prompt
|
|
4
|
+
|
|
5
|
+
> A relief print that carves itself: every frame is a black wood block, and light only exists where a knife has cut it away. One colour at most, and only for the thing that burns.
|
|
6
|
+
> References (grammar only): Frans Masereel *Passionate Journey* (1919) and Lynd Ward *Gods' Man* (1929), wordless woodcut novels told as a sequence of self-contained plates; Käthe Kollwitz's woodcuts, where emotion lives in the direction of the gouge; Gustave Doré's engraving, where line spacing and direction build light and volume. Never copy their plates, figures, borders or titles.
|
|
7
|
+
|
|
8
|
+
## 1. Essence, and what it is not
|
|
9
|
+
|
|
10
|
+
Each shot is **one printed plate**: black ink on laid paper, framed by a paper margin. It follows three rules of real relief printing:
|
|
11
|
+
|
|
12
|
+
1. **Black is the wood, white is what the knife removed.** Light is *carved*: a bright area is many wide cuts, a dark area untouched wood.
|
|
13
|
+
2. **Pictures appear by being carved.** Nothing fades in: cuts grow stroke by stroke along the form, coarse gouges first, fine lines after.
|
|
14
|
+
3. **The block is a mirror.** Letters read backwards until the paper is pulled; that reversal is the style's own transition.
|
|
15
|
+
|
|
16
|
+
Not copperplate engraving (no swelling burin lines on white, no crosshatch built up from white ground), not linocut poster art (no flat colour areas), not a black-and-white photo run through a threshold filter (the cuts must follow the form).
|
|
17
|
+
|
|
18
|
+
## 2. Materials & rendering
|
|
19
|
+
|
|
20
|
+
- **Print frame**: the printed image area sits inside a paper margin; the wider bottom margin holds captions. The image edge is the block edge: ragged ink, never a clean rectangle.
|
|
21
|
+
- **Knife classes** (widths in 1080p pixels at 1× camera):
|
|
22
|
+
|
|
23
|
+
| Tool | Width | Use |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| Knife `k` | 1.2–2 | contours, the white outline that separates a black figure from a black ground |
|
|
26
|
+
| V-gouge `v` | 2–8 | hatching, hair, beard, fine light |
|
|
27
|
+
| U-gouge `u` | 10–22 | rays, sky sweeps, the first rough-out |
|
|
28
|
+
| Stab `stab` | r 3–8 | snow, sparks, flecks of loam, wood chips |
|
|
29
|
+
|
|
30
|
+
- **Hatching (Doré grammar in wood)**: line **direction follows form** (a round object is wrapped in arcs, slopes follow the fall line, fire and light radiate, cloth follows its folds). **Width follows tone**: bright = wide cuts almost merging into white, mid-tone = thin cuts, dark = no cuts. Far = dense and fine, near = sparse and coarse. Every line is a separate cut (30–160 px, blunt entry, tapered exit, chipped edge), never a continuous machine line.
|
|
31
|
+
- **Figures**: black silhouette + white knife halo + grazing-light hatching on the lit edge only (light z ≈ 0.2, so flat areas stay black). **Skin carved white, features left black** (the wordless-novel rule).
|
|
32
|
+
- **Close-ups (hands, objects)**: sculpt a small height field (capsules, blobs, planks, creases), light it and run it through `woodcutFilter` (§10), so cuts follow the isophotes like an engraver's.
|
|
33
|
+
- **Printing**: the mask (white = cut) goes through a WebGL2 compositor: knife burr on edges, ±6 % ink unevenness, wood-grain streaks, specks where ink didn't take, a mottled colour plate with a small fixed misregistration. Block mode: glossy inked wood with grain sheen, pale wood in the grooves.
|
|
34
|
+
|
|
35
|
+
## 3. Colour logic
|
|
36
|
+
|
|
37
|
+
- Two values carry everything: near-black ink and warm laid-paper white. The raw wood colour appears only in shots that show the block itself.
|
|
38
|
+
- **At most one colour plate**, printed only where white has been carved, so it glows out of the cuts and never sits on the black. A colour plate over ink is nearly invisible, so plan it on carved white.
|
|
39
|
+
- The colour is reserved for the one thing that matters (a flame, molten metal, a heart, a signal lamp). It can spread at a peak and shrink to a single highlight afterwards; it is never decoration.
|
|
40
|
+
- Examples of a plate: a burnt copper-orange for heat; a cold Prussian blue for water or night; a deep oxblood for a wound or a seal. Choose it from the topic.
|
|
41
|
+
|
|
42
|
+
## 4. Type & subtitles
|
|
43
|
+
|
|
44
|
+
- **Captions are letterpress in the paper margin**, below the plate, like a plate caption in a woodcut novel. They never cover the image. A letterpress old-style face (IM Fell English, OFL) around 40–44 px, in ink, pushed through the same print shader. The ink comes up in 0.1 s with no slide and fades over 0.15 s. Hold ≥ max(1.8 s, speech + 0.6 s).
|
|
45
|
+
- **Titles are carved, not typed**: cut into the block (IM Fell English SC), mirrored if the block is shown before the print is pulled.
|
|
46
|
+
- Any closing text is a fresh print: letterpress in the margin or carved out of a black panel.
|
|
47
|
+
|
|
48
|
+
## 5. Motion quality
|
|
49
|
+
|
|
50
|
+
- **Characters on twos (12 fps)**; camera, particles, fire and light on ones (24 fps). Hatching lives in each body part's local space, so cuts move with the limb and don't boil; only fire and liquids re-cut every 2 frames, as deliberate boil.
|
|
51
|
+
- **Anticipation / action / follow-through** on every key action: a few frames back → a 2-frame strike → settle + a short shake.
|
|
52
|
+
- **Carve reveal**: each stroke has its own start time and speed (0.08–0.35 s). Reveal keys: `light` (bright areas first, coarse to fine), `radial` (from a point: rays, a pour), `down`, or any function.
|
|
53
|
+
- **Hard cut = a new impression**: two frames of misregistration (a few pixels, then back).
|
|
54
|
+
- **Paper transition** (the one transition grammar): brayer rolls ink (a wet highlight sweeps) → paper lays down → baren spirals, the image soaks through → the sheet peels on a cylinder toward camera, heavy then fast, its back showing the mirrored show-through.
|
|
55
|
+
- What never moves: the paper margin.
|
|
56
|
+
|
|
57
|
+
## 6. Camera grammar
|
|
58
|
+
|
|
59
|
+
The camera moves over the paper; the margin stays fixed. The knife tip, or the brightest cut, is the focus.
|
|
60
|
+
|
|
61
|
+
| Move | What it expresses | Can serve |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| Track with the knife tip | Making; the line is the story | a first mark; a route drawn on a map; a signature |
|
|
64
|
+
| Continuous pull-back as cuts spread | A line becomes a world; scale | a city from one street; a family tree; a reach of sound or news |
|
|
65
|
+
| Locked plate | A page of a wordless novel; reading time | a decision; a portrait; the aftermath |
|
|
66
|
+
| Slow macro push on a sculpted close-up | Patience, touch, labour | hands at work; a tool; a letter being read |
|
|
67
|
+
| Snap zoom and hold | Shock; the detail that breaks | a crack; a wrong number; a face turning |
|
|
68
|
+
| Frame in a frame (door, window, arch) | Distance, exclusion, waiting | a crowd outside; a sickroom; a border |
|
|
69
|
+
| Hard cuts on the beat, each a new impression | Accumulation, a series of prints | offerings; days passing; a list of names |
|
|
70
|
+
| Crane up from a detail to the whole | Consequence | a flood reaching a village; a light reaching faces |
|
|
71
|
+
| Rack between two plates via the peel | One state printed over another | before/after; a promise kept; generations |
|
|
72
|
+
|
|
73
|
+
Opening and ending come from the topic. Framing: black masses on carved white or white on uncut black, never grey on grey; text only in the margin. Transitions: hard cut (new impression) or the peel; never a dissolve.
|
|
74
|
+
|
|
75
|
+
## 7. Sound palette
|
|
76
|
+
|
|
77
|
+
- **Instruments**: low strings (contrabass, cellos; spiccato, pizzicato), wood and skin (log drum, woodblock, frame drum), gran cassa, timpani, one tam-tam, synthesised struck metal (modal: 3–5 inharmonic partials + hammer transient); a bowed saw or hurdy-gurdy drone for a folk colour.
|
|
78
|
+
- **Options**: withhold the timbre of the story's object until it appears; a metric modulation instead of a tempo jump; a modal shift inside a long decay; one drone under a locked plate.
|
|
79
|
+
- **Foley follows the material**, all synthesisable: knife into wood (transient + band-passed fibre tearing tied to knife speed), chips, brayer tack, paper air, baren rasp, the wet peel; metals by size (large = low, small = high and pure); resonant objects as modal models plus echoes for distance.
|
|
80
|
+
- **Silence is a tool**: near-silence with one faint ambience, or true digital silence before the loudest moment; the first sound after it is chosen.
|
|
81
|
+
- **J/L cuts** carry sound across plates and peels.
|
|
82
|
+
- **Mix**: music ducks ~8 dB under voice and a little under key foley; **foley ducks too** under voice. Pan hard transients off centre. −14 LUFS.
|
|
83
|
+
- **Voice**: few lines, low and plain, like captions spoken; the plates tell the rest.
|
|
84
|
+
|
|
85
|
+
## 8. Native moves
|
|
86
|
+
|
|
87
|
+
A menu: use the ones your story needs.
|
|
88
|
+
|
|
89
|
+
- **Light is carved.** A burst of radial cuts from a point. *Fits content like:* a power grid switched on; a scientific insight; a lighthouse restored.
|
|
90
|
+
- **Carving = time.** Patient work on screen, cut by cut. *Fits content like:* a year of training; a building rising; a craft apprenticeship.
|
|
91
|
+
- **Mirrored block → true print.** A backwards word reads true when the sheet is pulled. *Fits content like:* a vote result; a name cleared; a misunderstanding put right.
|
|
92
|
+
- **Stab cuts as texture.** White dots can freeze mid-air or be inked back in until the black is clean. *Fits content like:* stars going out over a city; rain stopping; a disease receding on a map.
|
|
93
|
+
- **The one colour plate spreads and withdraws.** *Fits content like:* a blood donation; a sunrise over a harvest; a single lit window in a blackout.
|
|
94
|
+
- **Filter a sculpt or a frame** into form-following cuts. *Fits content like:* a portrait of a real person drawn from a photo; a machine part; an archive image re-cut.
|
|
95
|
+
- **Wordless-novel sequencing.** Self-contained plates, few or no lines; a gap can be silent. *Fits content like:* a migration; a strike; a life in seven plates.
|
|
96
|
+
|
|
97
|
+
## 9. Pitfalls of the medium
|
|
98
|
+
|
|
99
|
+
- **White marks on white areas are invisible** → stab cuts need dark masses behind them.
|
|
100
|
+
- **Hatching every surface looks like fur or rain** → grazing light; 3–6 cuts on the lit edge only.
|
|
101
|
+
- **Black faces with white cuts don't read small** → skin white, features black, a black keep-line around white parts.
|
|
102
|
+
- **Hand-drawn close-up props look like mittens and blobs** → height field + `woodcutFilter`.
|
|
103
|
+
- **Short hatch segments with a tonal wobble turn into zig-zag chevrons** → long cuts (14–50 × spacing), one broad highlight band, a thin rim light, a stronger halo.
|
|
104
|
+
- **Steam or smoke on top of the subject reads as flames** → draw it behind, so only wisps escape.
|
|
105
|
+
- **Lazily cached strokes shared between shots** make frames depend on the render worker → every cache builds itself on first use.
|
|
106
|
+
- **Fine hatching + ink noise + grain inflate the file** → a higher CRF with `-tune grain`; check a 1:1 crop. `woodcutFilter` NaN in flat areas → clamp before `sqrt`.
|
|
107
|
+
|
|
108
|
+
## 10. Engine
|
|
109
|
+
|
|
110
|
+
`demo/engine/index.js` (imports only `/core/lib.js`) carves and prints **any path or shape**, on two canvases: a **mask** (black = uncut, white = cut) and an optional **colour plate**. Main functions: `shape` (carved solid with halo and form-following hatching), `cutAlong` (a path as hand-cut strokes), `hatch` (streamline hatching of a region), `flecks` (stab cuts), `rays` (carved light), `drawStrokes`, `plate`, `woodcutFilter` (image or frame → cuts), `makePrinter(W,H).render` (print / block compositor). Reusable demo pieces: `demo/trans.js` (paper peel), `demo/hands.js` (height-field sculpts). Option table, a minimal example and the filter recipe: [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/woodcut/DEMO.md#engine-reference).
|
|
111
|
+
|
|
112
|
+
## 11. Variation space
|
|
113
|
+
|
|
114
|
+
You decide the story, characters (or none), plates, opening, ending, camera path, pacing and what the one colour is for. All far from our demo:
|
|
115
|
+
|
|
116
|
+
- Structures: **a book of hours** (seven locked plates, one per hour, no moves inside a plate); **the same block recut** (carved deeper each scene, the image changing as wood goes); **two blocks printed in turn** (two places alternate impressions until one sheet carries both).
|
|
117
|
+
- Openings: **the finished print on a wall** (then back into the block to see it cut); **white paper** (an inked block pressed onto it: the first image arrives whole); **wood grain** that becomes water or a field as the first cuts follow it.
|
|
118
|
+
- Endings: **the block cleaned** (ink washed off, pale carved wood remains); **a stack of prints** (rising over many sheets of one plate); **an uncarved corner** (holding on black wood the knife never reached).
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
How our demo was made (story, shots, score, end card, build, engine reference): [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/woodcut/DEMO.md). Read it after your treatment exists.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Film styles: 59 looks drawn in code (lemo-opuscar)
|
|
2
|
+
|
|
3
|
+
A second catalogue, next to the measured one. These are **art-directed film styles**, each a full prompt (`STYLE.md`) for a medium drawn entirely in code: ink wash, risograph, Swiss grid, dark keynote, pixel RPG, newsreel and 53 more. They come from [lemo-opuscar](https://github.com/lemomo-ai/lemo-opuscar) (commit `413a6bd6`, MIT, (c) 2026 LemoLab; licence in `../LICENSE-lemo-opuscar.txt`). The cards are copied verbatim into `film-styles/`, one file per style; their demo films stay upstream (CC BY 4.0) and are linked below.
|
|
4
|
+
|
|
5
|
+
**Not measured.** Nothing here passed `scripts/analyze.sh`: these are looks, not reach data. The measured catalogue ([style-picker.md](style-picker.md)) still decides what a Reel should look like when the goal is reach; a film style is for when the piece wants a distinct visual medium (a launch film, a brand story, an explainer that should not look like every other explainer).
|
|
6
|
+
|
|
7
|
+
## How to use one
|
|
8
|
+
|
|
9
|
+
1. Pick a style from the index below by what the piece is for ("Good for") and by the material: most styles need nothing but a voice or a music track, the Evidence Films want real data or imagery.
|
|
10
|
+
2. Read its card in `film-styles/<slug>.md` whole, then [film-styles/DIRECTOR.md](film-styles/DIRECTOR.md) for the directing method (benchmark first, one subject, one turn, hook in 3 s, one native move at the peak).
|
|
11
|
+
3. Run the check-ins of [check-ins.md](check-ins.md): story, look (2 to 4 frames in the card's palette and type), storyboard.
|
|
12
|
+
4. **Build in HyperFrames or Remotion, not with the card's engine.** Section 10 ("Engine") and every `demo/` or `core/` path in a card describe lemo-opuscar's own toolkit, which is not shipped here. Rebuild the look with HTML, CSS, SVG and GSAP (or Canvas/WebGL inside HyperFrames when the card's material really needs a shader). The three examples in `../assets/film-styles/` show how: risograph plates are layers with `mix-blend-mode: multiply` and halftone tints are a dotted CSS mask; the Swiss grid is DOM lines with the card's `cubic-bezier(.7,0,.2,1)`; the dark keynote UI kit is plain divs. The same risograph rebuilt as a Remotion component (frame-driven `interpolate`, steps by `Math.floor`, the kick with `Easing.elastic`) is in `../assets/film-styles/remotion/Riso.tsx`.
|
|
13
|
+
5. **Recompose for 9:16 and the safe zone.** The cards are written for 1920×1080 with edge-to-edge material. In a Reel, keep every textured or typeset element inside the profile's safe zone (`safe_zones.*` in `wizz-video-effects`): the paper or stage colour can bleed, but halftone, grid notes, cards and type cannot. Run `check_safe_zone.py`, `measure_density.py` and `check_dead_frames.py` on the render.
|
|
14
|
+
6. Hand over to `wizz-video-effects` as usual; the card's sound palette (section 7) replaces this skill's audio defaults.
|
|
15
|
+
|
|
16
|
+
## What the test renders taught (2026-10-25)
|
|
17
|
+
|
|
18
|
+
Three styles were rebuilt as 6 s vertical pieces in HyperFrames 0.8.198 (`swiss-motion`, `risograph`, `dark-keynote`), rendered with one worker and gated:
|
|
19
|
+
|
|
20
|
+
- All three render with the current pipeline; no new engine was needed. The card's rules (one signal colour, overprint mixing, misregistration kick, one accent, grid snaps on the beat) translate directly to CSS and GSAP.
|
|
21
|
+
- **The first renders all failed the organic safe zone**: Swiss notes at the top edge, the risograph halftone sky bleeding to the top, keynote cards down to the bottom. After recomposing inside y = 250..1570 all three passed safe zone, density and dead frames. Expect this on every card.
|
|
22
|
+
- HyperFrames lint refuses `random()` in tweens and a CSS `transform` on an element GSAP moves; set initial offsets with `tl.set` at 0 and derive "random" values from the index.
|
|
23
|
+
- **Remotion works too.** The risograph was ported to Remotion 4.0.527 (React 18, 24 fps, one worker): same frames as the HyperFrames render, same blend modes and masks, and it passed safe zone, density and dead frames. The Swiss and keynote pieces use only transforms and opacity and were not ported.
|
|
24
|
+
- A held end card triggers the frozen-picture warning; in the keynote it is the point (the number holds), so read the warning, do not chase it.
|
|
25
|
+
|
|
26
|
+
## Index
|
|
27
|
+
|
|
28
|
+
### Cartoon & Anime
|
|
29
|
+
|
|
30
|
+
| Style | Card | Good for | Demo film |
|
|
31
|
+
|---|---|---|---|
|
|
32
|
+
| 80s Cel Anime | [`cel-anime-80s`](film-styles/cel-anime-80s.md) | Music videos, Game trailers, Nostalgia | [City Lights, 1987](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/cel-anime-80s) |
|
|
33
|
+
| Mid-century Cartoon | [`midcentury-toon`](film-styles/midcentury-toon.md) | Set-up guides, Help centres, How-to | [Meet Pip](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/midcentury-toon) |
|
|
34
|
+
| 1930s Rubber Hose Cartoon | [`rubber-hose`](film-styles/rubber-hose.md) | Food & drink, Retro ads, Kids | [Coffee Cup Chase](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/rubber-hose) |
|
|
35
|
+
| Sci-Fi Sitcom Toon | [`scifi-toon`](film-styles/scifi-toon.md) | Comedy, Tech brands, Social shorts | [Coffee Run](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/scifi-toon) |
|
|
36
|
+
|
|
37
|
+
### Cinema & Eras
|
|
38
|
+
|
|
39
|
+
| Style | Card | Good for | Demo film |
|
|
40
|
+
|---|---|---|---|
|
|
41
|
+
| Liminal Found Footage | [`backrooms`](film-styles/backrooms.md) | Horror, Mystery & ARG, Game teasers | [Night Shift Orientation](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/backrooms) |
|
|
42
|
+
| 1920s Silent Film | [`silent-film`](film-styles/silent-film.md) | Comedy, Retro brands, Silent storytelling | [The Runaway Loaf](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/silent-film) |
|
|
43
|
+
|
|
44
|
+
### East Asian Traditions
|
|
45
|
+
|
|
46
|
+
| Style | Card | Good for | Demo film |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| Paper-cut Lightbox | [`paper-lantern`](film-styles/paper-lantern.md) | Festivals, Gift brands, Cultural stories | [A Mooncake's Longing](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/paper-lantern) |
|
|
49
|
+
| Red Paper-cut | [`papercut-red`](film-styles/papercut-red.md) | Lunar New Year, Festive greetings, Folk tales | [Nian Comes to Town](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/papercut-red) |
|
|
50
|
+
| Shadow Puppetry | [`shadow-puppet`](film-styles/shadow-puppet.md) | Myths & folklore, Heritage, Festivals | [Hou Yi Shoots the Suns](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/shadow-puppet) |
|
|
51
|
+
| Ukiyo-e | [`ukiyoe`](film-styles/ukiyoe.md) | Travel, Japanese culture, Poetry | [Toward the Mountain](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/ukiyoe) |
|
|
52
|
+
|
|
53
|
+
### Edit & Documentary
|
|
54
|
+
|
|
55
|
+
| Style | Card | Good for | Demo film |
|
|
56
|
+
|---|---|---|---|
|
|
57
|
+
| Caption News | [`caption-news`](film-styles/caption-news.md) | Social news, Report explainers, Data shorts | [The Bee Ledger](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/caption-news) |
|
|
58
|
+
| Time-lapse Symphony | [`city-symphony`](film-styles/city-symphony.md) | City films, Music montages, Openers | [One Day in New York](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/city-symphony) |
|
|
59
|
+
| Live Countdown Split-screen | [`countdown`](film-styles/countdown.md) | Launches, Countdowns, Live events | [Counting Itself Down](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/countdown) |
|
|
60
|
+
| Constructivist Montage | [`kino-montage`](film-styles/kino-montage.md) | Industry histories, Milestones, Collective effort | [410 Days](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/kino-montage) |
|
|
61
|
+
| Broadcast News Package | [`news-package`](film-styles/news-package.md) | News round-ups, Bulletins, Market updates | [The Week in AI](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/news-package) |
|
|
62
|
+
| 1920s Newsreel | [`newsreel`](film-styles/newsreel.md) | History stories, Fads & eras, Anniversaries | [Knock-Knee Alert](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/newsreel) |
|
|
63
|
+
| Sports Telestrator | [`telestrator`](film-styles/telestrator.md) | Sports analysis, Match recaps, Coaching | [Freeze Frame](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/telestrator) |
|
|
64
|
+
| Visual Investigation | [`visual-investigation`](film-styles/visual-investigation.md) | Reconstructions, Fact-checks, Incident reports | [The Hindenburg: Four Minutes, 32 Seconds](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/visual-investigation) |
|
|
65
|
+
|
|
66
|
+
### Evidence Films
|
|
67
|
+
|
|
68
|
+
| Style | Card | Good for | Demo film |
|
|
69
|
+
|---|---|---|---|
|
|
70
|
+
| Archive Light Table | [`archive-lighttable`](film-styles/archive-lighttable.md) | Brand history, Archive stories, Museums | [Two Seconds Short](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/archive-lighttable) |
|
|
71
|
+
| Engineering Briefing Board | [`briefing-board`](film-styles/briefing-board.md) | Engineering, Option comparisons, Briefings | [The Ship Decides](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/briefing-board) |
|
|
72
|
+
| Data Physicalization | [`data-physical`](film-styles/data-physical.md) | Annual reports, Investor decks, Energy data | [Two Spirals](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/data-physical) |
|
|
73
|
+
| LiDAR Survey | [`lidar-survey`](film-styles/lidar-survey.md) | Heritage, Environment, Site surveys | [The Fields Under the Forest](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/lidar-survey) |
|
|
74
|
+
| Microscope Story | [`microscope`](film-styles/microscope.md) | Biomedicine, Materials science, Skincare science | [Measured Blue](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/microscope) |
|
|
75
|
+
| Satellite Briefing | [`satellite-briefing`](film-styles/satellite-briefing.md) | Climate, News explainers, Geography | [The Map Still Says Sea](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/satellite-briefing) |
|
|
76
|
+
| Exploded Teardown | [`teardown`](film-styles/teardown.md) | Hardware launches, Product pages, Spec explainers | [21 Keys, Opened](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/teardown) |
|
|
77
|
+
| Projection on White Model | [`white-model`](film-styles/white-model.md) | Urban planning, Exhibitions, City data | [How a Flattened City Grew Back](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/white-model) |
|
|
78
|
+
|
|
79
|
+
### Games
|
|
80
|
+
|
|
81
|
+
| Style | Card | Good for | Demo film |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| Game Show Flat | [`game-show`](film-styles/game-show.md) | Tech timelines, Year in review, Variety shows | [Rhythm of AI, 1997 → 2026](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/game-show) |
|
|
84
|
+
| HD-2D | [`hd-2d`](film-styles/hd-2d.md) | Game trailers, Fantasy, Story films | [The Lampbearer](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/hd-2d) |
|
|
85
|
+
| Microgame Frenzy | [`microgame`](film-styles/microgame.md) | Game trailers, Onboarding, Social shorts | [Five-Second Astronaut](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/microgame) |
|
|
86
|
+
| 16-bit Pixel RPG | [`pixel-rpg`](film-styles/pixel-rpg.md) | Game trailers, Recaps, Nostalgia | [The Last Save Point](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/pixel-rpg) |
|
|
87
|
+
|
|
88
|
+
### Graphic & Type
|
|
89
|
+
|
|
90
|
+
| Style | Card | Good for | Demo film |
|
|
91
|
+
|---|---|---|---|
|
|
92
|
+
| Art Deco | [`art-deco`](film-styles/art-deco.md) | Luxury & hospitality, Galas, Invitations | [Midnight at the Starlight Hotel](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/art-deco) |
|
|
93
|
+
| ASCII / CRT Terminal | [`ascii-crt`](film-styles/ascii-crt.md) | Developer tools, Sci-fi, Tech brands | [Tranquility.log](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/ascii-crt) |
|
|
94
|
+
| Blueprint | [`blueprint`](film-styles/blueprint.md) | Engineering, Hardware launches, Tech explainers | [Patent Pending: The Cloud Catcher](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/blueprint) |
|
|
95
|
+
| Pictogram Motion | [`pictogram-motion`](film-styles/pictogram-motion.md) | Sports events, Visual identity, Event openers | [Aichi-Nagoya 2026 — All 43 Sports](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/pictogram-motion) |
|
|
96
|
+
| 60s Spy Title Sequence | [`spy-titles`](film-styles/spy-titles.md) | Title sequences, Event openers, Trailers | [The Velvet Cipher](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/spy-titles) |
|
|
97
|
+
| Stained Glass | [`stained-glass`](film-styles/stained-glass.md) | Legends, Heritage, Holiday stories | [The Dragon of the East Window](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/stained-glass) |
|
|
98
|
+
| Swiss Motion Graphics | [`swiss-motion`](film-styles/swiss-motion.md) | Brand identity, Events, Design education | [Five Rules for a Poster](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/swiss-motion) |
|
|
99
|
+
|
|
100
|
+
### Hand-drawn & Painting
|
|
101
|
+
|
|
102
|
+
| Style | Card | Good for | Demo film |
|
|
103
|
+
|---|---|---|---|
|
|
104
|
+
| Crayon Picture Book | [`crayon-book`](film-styles/crayon-book.md) | Picture books, Bedtime stories, Kids' learning | [The Moon Can't Sleep](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/crayon-book) |
|
|
105
|
+
| Impasto Oil Painting | [`impasto`](film-styles/impasto.md) | Music videos, Art & culture, Emotional ads | [The Colour of Rain](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/impasto) |
|
|
106
|
+
| Chinese Ink Wash | [`ink-wash`](film-styles/ink-wash.md) | Wuxia, Cultural brands, Poetry | [The Swordsman and the River](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/ink-wash) |
|
|
107
|
+
| One-line Drawing | [`one-line`](film-styles/one-line.md) | Brand stories, Life milestones, Minimal ads | [The Line That Never Lifted](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/one-line) |
|
|
108
|
+
| Urban Sketch · Pen & Wash | [`urban-sketch`](film-styles/urban-sketch.md) | City & travel, Architecture, Lifestyle brands | [Where the Wind Went](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/urban-sketch) |
|
|
109
|
+
| Watercolor Brush | [`watercolor`](film-styles/watercolor.md) | Nature documentary, Travel, Science explainers | [Follow the Rain](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/watercolor) |
|
|
110
|
+
| Whiteboard Explainer | [`whiteboard`](film-styles/whiteboard.md) | Explainers, Online courses, Science | [Einstein in Your Pocket](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/whiteboard) |
|
|
111
|
+
|
|
112
|
+
### Information & Keynote
|
|
113
|
+
|
|
114
|
+
| Style | Card | Good for | Demo film |
|
|
115
|
+
|---|---|---|---|
|
|
116
|
+
| Dark Tech Keynote | [`dark-keynote`](film-styles/dark-keynote.md) | Product launches, SaaS, Keynotes | [Room to Think](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/dark-keynote) |
|
|
117
|
+
| Data Storytelling | [`dataviz`](film-styles/dataviz.md) | Data journalism, Reports, Climate & science | [A Hundred Summers](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/dataviz) |
|
|
118
|
+
| Sci-fi Hologram HUD | [`hologram-hud`](film-styles/hologram-hud.md) | Spec walkthroughs, Launch videos, Trade shows | [Volt · Spec Scan](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/hologram-hud) |
|
|
119
|
+
| Isometric Infographic | [`iso-infographic`](film-styles/iso-infographic.md) | Process explainers, Supply chains, Annual reports | [From Bean to Cup](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/iso-infographic) |
|
|
120
|
+
| Living Screencast | [`living-screencast`](film-styles/living-screencast.md) | Product tutorials, Feature launches, Onboarding | [Clawd Moves In](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/living-screencast) |
|
|
121
|
+
|
|
122
|
+
### Materials & 3D
|
|
123
|
+
|
|
124
|
+
| Style | Card | Good for | Demo film |
|
|
125
|
+
|---|---|---|---|
|
|
126
|
+
| Brick Toy | [`brick-toy`](film-styles/brick-toy.md) | Toys & kids, Product builds, Space | [Rocket from Spare Parts](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/brick-toy) |
|
|
127
|
+
| Glass Product Render | [`glass-product`](film-styles/glass-product.md) | Product launches, Consumer tech, Beauty | [Aura — Hear the Light](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/glass-product) |
|
|
128
|
+
| Low-poly Isometric Island | [`lowpoly-island`](film-styles/lowpoly-island.md) | Game trailers, World building, Calm content | [The Island That Grew](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/lowpoly-island) |
|
|
129
|
+
| Paper Pop-up Book | [`paper-popup`](film-styles/paper-popup.md) | Children's books, Game trailers, Story films | [Pip's Paper Adventure](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/paper-popup) |
|
|
130
|
+
| Tilt-Shift Miniature | [`tilt-shift`](film-styles/tilt-shift.md) | City promos, Real estate, Transport | [Toy Town Rush Hour](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/tilt-shift) |
|
|
131
|
+
|
|
132
|
+
### Print & Printmaking
|
|
133
|
+
|
|
134
|
+
| Style | Card | Good for | Demo film |
|
|
135
|
+
|---|---|---|---|
|
|
136
|
+
| Copperplate Engraving | [`engraving`](film-styles/engraving.md) | Museum labels, Science explainers, Brand heritage | [The Honeybee, Plate VII](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/engraving) |
|
|
137
|
+
| Halftone Dossier | [`halftone-dossier`](film-styles/halftone-dossier.md) | Humour, Pet content, Social shorts | [Case File: Chubby](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/halftone-dossier) |
|
|
138
|
+
| Risograph Print | [`risograph`](film-styles/risograph.md) | Indie brands, Zines, Lifestyle | [Sunday Ride](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/risograph) |
|
|
139
|
+
| Silkscreen Travel Poster | [`silkscreen-poster`](film-styles/silkscreen-poster.md) | Destination guides, Tourism, Event posters | [Three Trails](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/silkscreen-poster) |
|
|
140
|
+
| Woodcut Print | [`woodcut`](film-styles/woodcut.md) | Folk tales, Craft brands, Book trailers | [The Bell Founder](https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/woodcut) |
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Insert recipes: b-roll treatments that sit inside a style
|
|
2
|
+
|
|
3
|
+
An insert is a short silent clip under the narration, cut into a style that already exists (talking head, motion editorial, explainer). It is not a style: it never carries a whole piece, and it does not enter `data/recipes.json` or the style picker. **Nothing on this page was measured**; the recipes come from open-source projects and are written here so they run without a paid API.
|
|
4
|
+
|
|
5
|
+
## Collage b-roll (paper cutout, halftone)
|
|
6
|
+
|
|
7
|
+
Source: idea from [gbro-collage-broll](https://github.com/pyang5166/gbro-collage-broll) (MIT), which generates the clip with Gemini. Here it is drawn in code (HyperFrames), so no key is needed.
|
|
8
|
+
|
|
9
|
+
**When it fits:** one abstract sentence of the script that has no footage ("money leaks every month", "the algorithm decides") in a talking head or a motion editorial. One or two per piece; more and the piece turns into a collage film.
|
|
10
|
+
|
|
11
|
+
**Output:** 9:16, about 5 s, 24 fps, silent (the narration and the style's music carry the sound).
|
|
12
|
+
|
|
13
|
+
**Look**
|
|
14
|
+
|
|
15
|
+
- One flat, saturated paper background per insert (deep purple, mustard, red, teal), with a faint paper grain.
|
|
16
|
+
- Photo cutouts in black and white halftone, with a rough white cut edge and a small hard shadow; one or two cardstock accents in a second colour (arrow, circle, torn strip).
|
|
17
|
+
- Three to five elements at most, each a literal object of the metaphor.
|
|
18
|
+
|
|
19
|
+
**Motion**
|
|
20
|
+
|
|
21
|
+
- The frame starts **empty** (only the paper). Elements arrive one at a time, slide in from the edge and land in place, in the order the sentence says them.
|
|
22
|
+
- Stop-motion feel: hold each pose for 2 frames (12 fps steps at 24 fps) and give each landing a 1 to 2 degree settle. Never a fade or a slow zoom on a finished collage.
|
|
23
|
+
- The last element lands about 1 s before the end; hold the finished collage.
|
|
24
|
+
|
|
25
|
+
**Three gates (keep them; only the generator changes)**
|
|
26
|
+
|
|
27
|
+
1. **Metaphor:** for each sentence, write the core meaning, the 3 to 5 objects, the background colour and the order of arrival. Show it before drawing anything; only approved sentences move on.
|
|
28
|
+
2. **Still:** render the finished last frame plus a contact sheet. Approve the composition before animating.
|
|
29
|
+
3. **Clip:** animate, then check frames once per second: the first frame is empty paper, the last frame matches the approved still.
|
|
30
|
+
|
|
31
|
+
**Material:** cutouts come from real photos (the project's own, or licensed via `get-brolls`), turned into halftone in code (an SVG/CSS halftone filter or ffmpeg). No generated faces of real people.
|
|
32
|
+
|
|
33
|
+
**Do not:** collage over the whole piece, more than one background colour inside an insert, moving the camera over the collage, or an insert that does not illustrate a specific sentence.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Motion laws: how things move inside a style
|
|
2
|
+
|
|
3
|
+
The style cards say **what** moves (captions, counters, cards, b-roll). This page says **how** it moves when the card is silent: durations, curves, scale, fades and word cadence.
|
|
4
|
+
|
|
5
|
+
## Where these numbers come from (read first)
|
|
6
|
+
|
|
7
|
+
Every number here is a measurement by [motionmaxxing](https://github.com/Tejashmakwana/motionmaxxing) (Apache-2.0, credited in `THIRD-PARTY-NOTICES.md`): about 4,300 moves sampled frame by frame from 53 professional moments, plus whole films ranked by one human rater. Two limits follow from that sample:
|
|
8
|
+
|
|
9
|
+
- It is **horizontal** (16:9) **brand and product launch films**, mostly 3 to 7 s UI-forward moments. It is **not** vertical Reels, talking heads or captioned shorts. Nothing here was measured on the catalogue in `data/references.json`.
|
|
10
|
+
- Frames are counted at 30 fps (`f`). 1 f = 0.033 s, 6 f = 0.2 s, 10 f = 0.33 s, 15 f = 0.5 s.
|
|
11
|
+
|
|
12
|
+
So: **when a style card states a number, the card wins** (it was measured on vertical shorts). Use these laws for what the card leaves open, mostly in screens drawn in code (HyperFrames, the Remotion templates) and in motion graphics over footage.
|
|
13
|
+
|
|
14
|
+
## The laws
|
|
15
|
+
|
|
16
|
+
### 1. Land decelerates, leave accelerates
|
|
17
|
+
|
|
18
|
+
- An element that arrives eases **out**: most of its travel happens in the first 4 to 8 f, then a long tail, no bounce. 58% of measured landings ease out.
|
|
19
|
+
- An element that leaves eases **in** and exits at peak speed: 37% of leaving moves accelerate (42% of scale exits, 63% of blur exits). Not every exit: shrink-to-centre and moves swept by a camera may stay linear.
|
|
20
|
+
- Median move: **10 f** (0.33 s). Translate and scale entries about 12 f, opacity 6 f, blur 7 f; p25 to p75 roughly 6 to 24 f. A film where everything takes 20 to 30 f is slower than the whole sample.
|
|
21
|
+
|
|
22
|
+
### 2. Nothing grows from zero
|
|
23
|
+
|
|
24
|
+
- An object with identity (logo, key word, card, cursor) **arrives from oversize and scales down** to rest: logos from about 3.5x, a cursor 2 to 5x, an opening word from about 0.39 of the frame height down to 0.09.
|
|
25
|
+
- Growth from small is the content only in a few cases: tiles in a 1-frame cascade, an object that becomes the next scene, an identity object that starts no smaller than about 0.3 to 0.6x.
|
|
26
|
+
- Spend scale once. Most type is small; the ending usually gets smaller. This is about arrival, not a licence for a giant cropped word in every beat.
|
|
27
|
+
|
|
28
|
+
### 3. Cut on motion
|
|
29
|
+
|
|
30
|
+
- A cut lands mid-move, at peak speed, never on a settled frame. The next shot opens already moving.
|
|
31
|
+
- A piece ends in motion or on a designed stillness, not on a fade to black by default.
|
|
32
|
+
- In this pipeline the **instant** of a cut comes from a speech breath (`wizz-video-effects`, `fill_breaths.py`). The law adds the picture side: at that instant something should still be moving, so the cut does not land on a held frame.
|
|
33
|
+
|
|
34
|
+
### 4. Almost nothing fades
|
|
35
|
+
|
|
36
|
+
- Elements arrive and leave by **moving** (offset, scale, blur decaying), by a hard 1-frame cut, or by unmasking. Measured: 3,392 transform entries against 584 opacity fades; exits 60% moves, 15% fades, 25% hard steps.
|
|
37
|
+
- Opacity is a 4 to 6 f helper under a move, not the move. A UI row or a word that should read as a state change hard-cuts on.
|
|
38
|
+
- Fades are for single objects, not between scenes; a slow fade is a calm-brand choice with a stated reason.
|
|
39
|
+
|
|
40
|
+
### 5. One spring per film
|
|
41
|
+
|
|
42
|
+
- Overshoot is rare and late: 8.8% of moves overshoot by more than 3%, and 88% of those peak after 35% of the move (a slow lean past the mark and back), not a fast bounce.
|
|
43
|
+
- At most **one visible spring** per film, on the payoff that deserves a physical reward. A bounce on every pop is the most common generated-video tell.
|
|
44
|
+
- The Remotion templates use `spring()` for entries; keep their damping high enough that only one element per piece visibly bounces.
|
|
45
|
+
|
|
46
|
+
### 6. Words move at speech rhythm
|
|
47
|
+
|
|
48
|
+
Whole words, never letters (letter-by-letter typing belongs only inside the product's own input field). Gaps between word onsets:
|
|
49
|
+
|
|
50
|
+
| Situation | Gap |
|
|
51
|
+
|---|---|
|
|
52
|
+
| Fast hook, inside a phrase | 2 to 4 f (0.07 to 0.12 s) |
|
|
53
|
+
| Standard headline | 4 to 6 f (0.12 to 0.20 s), tightening toward the end |
|
|
54
|
+
| Voice-led, thoughtful | 8 to 12 f (0.25 to 0.40 s), irregular |
|
|
55
|
+
| Before the payoff word | 1.5 to 2x the base gap, once |
|
|
56
|
+
|
|
57
|
+
With narration, captions follow the `wizz-ctc-align` timestamps (the voice is the clock) and on-screen words land 0 to 2 f before they are heard. The table is for type without a voice, or for building a headline word by word.
|
|
58
|
+
|
|
59
|
+
## Related
|
|
60
|
+
|
|
61
|
+
- What breathes and what is dead on the final file: `wizz-video-effects`, `check_dead_frames.py` (no run of flat frames; frozen picture warns).
|
|
62
|
+
- Corner labels, counters, progress bars and slide layouts: `wizz-video-effects`, `check_chrome.py`.
|
|
@@ -27,6 +27,7 @@ Food, money, products, everyday economics. The highest single reach in the set (
|
|
|
27
27
|
**Look**
|
|
28
28
|
|
|
29
29
|
- A visible progress device fixed on screen: time icons (1 s / 1 min / 1 h) changing colour per stage, emoji checklist, price tags on each ingredient.
|
|
30
|
+
It is measured for this style, so the chrome lint of `wizz-video-effects` takes `chrome_allow: ["P1", "C3"]` in the timeline (progress and stage counter).
|
|
30
31
|
- Close hands, real places (market, street), a reaction at the end.
|
|
31
32
|
|
|
32
33
|
**Palette:** Warm natural colours; tags in bright yellow with black outline; red/green icons for stages.
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
"""Beat grid of a song: tempo, beats and downbeats, so scene cuts can snap to the music.
|
|
2
2
|
|
|
3
|
-
Usage: python3 beat_grid.py <audio_file> [--meter 4] [--fps 30] > grid.json
|
|
3
|
+
Usage: python3 beat_grid.py <audio_file> [--meter 4] [--fps 30] [--hits 3] > grid.json
|
|
4
4
|
|
|
5
5
|
Prints JSON: {"bpm", "meter", "duration_s", "beats": [s...], "downbeats": [s...],
|
|
6
|
-
"downbeat_frames": [frame...]
|
|
6
|
+
"downbeat_frames": [frame...], "hits": [{"t", "frame"}...], "drops": [{"t", "frame"}...]}.
|
|
7
|
+
`hits` are the loudest beats (in time order): the payoff lands on the loudest one.
|
|
8
|
+
`drops` are downbeats where the next bar is clearly louder than the previous one. Needs librosa + numpy (same Python as analyze.sh;
|
|
7
9
|
set VIDEO_STYLES_PY and call it with that interpreter).
|
|
8
10
|
|
|
9
11
|
Downbeats are estimated, not detected: of the `meter` possible phases, the one
|
|
10
12
|
whose beats carry the most low-frequency onset energy is taken as beat 1. Check
|
|
11
13
|
two or three of them by ear before cutting a whole film on the grid.
|
|
14
|
+
librosa trims weak beats at the start and end, so a very quiet intro can fall
|
|
15
|
+
outside the grid (and a drop out of it goes unreported).
|
|
12
16
|
"""
|
|
13
17
|
|
|
14
18
|
import argparse
|
|
@@ -20,6 +24,8 @@ import numpy as np
|
|
|
20
24
|
|
|
21
25
|
HOP = 512
|
|
22
26
|
LOW_HZ = 150
|
|
27
|
+
# A downbeat is a drop when the bar after it is this many times louder (RMS) than the bar before.
|
|
28
|
+
DROP_RATIO = 1.6
|
|
23
29
|
|
|
24
30
|
|
|
25
31
|
def downbeat_phase(y_perc, sr, beat_frames, meter):
|
|
@@ -31,7 +37,27 @@ def downbeat_phase(y_perc, sr, beat_frames, meter):
|
|
|
31
37
|
return int(np.argmax(scores))
|
|
32
38
|
|
|
33
39
|
|
|
34
|
-
def
|
|
40
|
+
def loud_hits(rms, beat_frames, count):
|
|
41
|
+
at_beats = rms[np.minimum(beat_frames, len(rms) - 1)]
|
|
42
|
+
loudest = np.argsort(at_beats)[::-1][:count]
|
|
43
|
+
return sorted(int(i) for i in loudest)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def drop_indexes(rms, downbeat_frames):
|
|
47
|
+
drops = []
|
|
48
|
+
for i in range(1, len(downbeat_frames) - 1):
|
|
49
|
+
before = rms[downbeat_frames[i - 1]:downbeat_frames[i]].mean()
|
|
50
|
+
after = rms[downbeat_frames[i]:downbeat_frames[i + 1]].mean()
|
|
51
|
+
if before > 0 and after / before >= DROP_RATIO:
|
|
52
|
+
drops.append(i)
|
|
53
|
+
return drops
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def marks(times, fps):
|
|
57
|
+
return [{"t": round(float(t), 3), "frame": int(round(t * fps))} for t in times]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def beat_grid(path, meter, fps, hits=3):
|
|
35
61
|
y, sr = librosa.load(path, sr=22050, mono=True)
|
|
36
62
|
_, y_perc = librosa.effects.hpss(y)
|
|
37
63
|
_, beat_frames = librosa.beat.beat_track(y=y_perc, sr=sr, hop_length=HOP)
|
|
@@ -40,6 +66,9 @@ def beat_grid(path, meter, fps):
|
|
|
40
66
|
beats = librosa.frames_to_time(beat_frames, sr=sr, hop_length=HOP)
|
|
41
67
|
phase = downbeat_phase(y_perc, sr, beat_frames, meter)
|
|
42
68
|
downbeats = beats[phase::meter]
|
|
69
|
+
rms = librosa.feature.rms(y=y, hop_length=HOP)[0]
|
|
70
|
+
hit_times = beats[loud_hits(rms, beat_frames, hits)]
|
|
71
|
+
drop_times = downbeats[drop_indexes(rms, beat_frames[phase::meter])]
|
|
43
72
|
return {
|
|
44
73
|
# librosa's tempo and single beat intervals are quantised to the hop; the slope of a
|
|
45
74
|
# line fitted through every beat time averages that out.
|
|
@@ -49,6 +78,8 @@ def beat_grid(path, meter, fps):
|
|
|
49
78
|
"beats": [round(float(t), 3) for t in beats],
|
|
50
79
|
"downbeats": [round(float(t), 3) for t in downbeats],
|
|
51
80
|
"downbeat_frames": [int(round(t * fps)) for t in downbeats],
|
|
81
|
+
"hits": marks(hit_times, fps),
|
|
82
|
+
"drops": marks(drop_times, fps),
|
|
52
83
|
}
|
|
53
84
|
|
|
54
85
|
|
|
@@ -57,10 +88,11 @@ def main():
|
|
|
57
88
|
parser.add_argument("audio")
|
|
58
89
|
parser.add_argument("--meter", type=int, default=4)
|
|
59
90
|
parser.add_argument("--fps", type=int, default=30)
|
|
91
|
+
parser.add_argument("--hits", type=int, default=3)
|
|
60
92
|
args = parser.parse_args()
|
|
61
|
-
if args.meter < 2 or args.fps < 1:
|
|
62
|
-
sys.exit("--meter must be >= 2 and --
|
|
63
|
-
json.dump(beat_grid(args.audio, args.meter, args.fps), sys.stdout, indent=1)
|
|
93
|
+
if args.meter < 2 or args.fps < 1 or args.hits < 1:
|
|
94
|
+
sys.exit("--meter must be >= 2, --fps >= 1 and --hits >= 1")
|
|
95
|
+
json.dump(beat_grid(args.audio, args.meter, args.fps, args.hits), sys.stdout, indent=1)
|
|
64
96
|
print()
|
|
65
97
|
|
|
66
98
|
|