wizz-method 2.22.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 +7 -1
- package/package.json +1 -1
- package/removals.txt +3 -0
- package/skills-registry.yaml +93 -5
- package/src/bmm-skills/1-analysis/research/wizz-market-research/steps/step-06-research-completion.md +27 -0
- 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/wizz/_shared/video-pipeline.md +2 -0
- package/src/modules/wizz/agents/wizz-copy/customize.toml +1 -1
- package/src/modules/wizz/agents/wizz-copy/knowledge/playbook.md +2 -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/skills-lib/wizz-ios-build/SKILL.md +61 -0
- package/src/skills-lib/wizz-offer-forge/SKILL.md +2 -2
- 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/references/component-sources.md +23 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/design-sources.yaml +73 -0
- package/src/skills-lib/wizz-router/references/routing-table-flat.md +5 -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-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/SKILL.md +3 -1
- package/src/skills-lib/wizz-video-effects/assets/effects.config.template.json +10 -0
- package/src/skills-lib/wizz-video-effects/references/data-contract.md +2 -0
- package/src/skills-lib/wizz-video-effects/references/gates.md +1 -0
- package/src/skills-lib/wizz-video-effects/references/one-take.md +41 -0
- package/src/skills-lib/wizz-video-effects/scripts/check_one_take.py +159 -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 +12 -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/scripts/beat_grid.py +38 -6
- package/src/skills-lib/wizz-vsl/SKILL.md +1 -1
- package/src/skills-lib/wizz-vsl/references/assembly-qa.md +1 -1
- package/src/skills-lib/wizz-vsl/references/blocks-and-leads.md +1 -1
- package/src/skills-lib/wizz-vsl/references/diagnosis.md +2 -2
- package/src/skills-lib/wizz-vsl/references/intake.md +5 -5
- package/src/skills-lib/wizz-web-security/SKILL.md +2 -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/ui.js +6 -0
- /package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/prompts.md +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="pt-BR">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=1080, height=1920" />
|
|
6
|
+
<title>swiss-motion · 9:16 example</title>
|
|
7
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
8
|
+
<style>
|
|
9
|
+
body { margin: 0; background: #EAE9E5; }
|
|
10
|
+
#root { position: relative; width: 1080px; height: 1920px; overflow: hidden;
|
|
11
|
+
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; color: #111; }
|
|
12
|
+
.fill { position: absolute; inset: 0; background: #EAE9E5; }
|
|
13
|
+
.vline { position: absolute; top: 0; width: 1px; height: 1920px; background: #D3D1CB; transform-origin: top; }
|
|
14
|
+
.hline { position: absolute; left: 0; height: 1px; width: 1080px; background: #D3D1CB; transform-origin: left; }
|
|
15
|
+
#num { position: absolute; left: 60px; top: 330px; width: 900px; height: 760px; overflow: hidden; }
|
|
16
|
+
#num span { display: block; font-size: 900px; font-weight: 700; line-height: 760px; letter-spacing: -0.04em; margin-left: -40px; }
|
|
17
|
+
.row { position: absolute; left: 72px; height: 120px; overflow: hidden; width: 940px; }
|
|
18
|
+
.row span { display: block; font-size: 112px; font-weight: 700; line-height: 120px; letter-spacing: -0.03em; }
|
|
19
|
+
.lead { color: #8E8C86; }
|
|
20
|
+
#signal { position: absolute; left: 0; top: 1470px; width: 180px; height: 48px; background: #E30613; }
|
|
21
|
+
#readout { position: absolute; left: 72px; top: 1530px; font-size: 22px; font-weight: 500; width: 600px; }
|
|
22
|
+
.note { position: absolute; font-size: 21px; font-weight: 500; border-top: 1px solid #111; padding-top: 8px; width: 300px; }
|
|
23
|
+
#knife { position: absolute; left: 0; top: 700px; height: 4px; width: 1080px; background: #111; transform-origin: left; }
|
|
24
|
+
#end { position: absolute; left: 72px; top: 640px; height: 110px; overflow: hidden; width: 600px; }
|
|
25
|
+
#end span { display: block; font-size: 96px; font-weight: 700; line-height: 110px; letter-spacing: -0.03em; }
|
|
26
|
+
</style>
|
|
27
|
+
</head>
|
|
28
|
+
<body>
|
|
29
|
+
<div id="root" data-composition-id="main" data-width="1080" data-height="1920" data-duration="6" data-fps="24">
|
|
30
|
+
<section id="scene" class="clip" data-start="0" data-duration="6" data-track-index="1" style="position:absolute;inset:0">
|
|
31
|
+
<div class="fill"></div>
|
|
32
|
+
<div id="grid"></div>
|
|
33
|
+
<div id="num"><span>3</span></div>
|
|
34
|
+
<div id="knife"></div>
|
|
35
|
+
<div class="row" style="top:1100px"><span class="lead">regras para</span></div>
|
|
36
|
+
<div class="row" style="top:1220px"><span>um reel que</span></div>
|
|
37
|
+
<div class="row" style="top:1340px"><span>segura o dedo.</span></div>
|
|
38
|
+
<div class="note" style="left:72px;top:270px">grade 6 col · 72 px</div>
|
|
39
|
+
<div class="note" style="left:708px;top:270px">120 bpm · 0.5 s</div>
|
|
40
|
+
<div id="signal"></div>
|
|
41
|
+
<div id="readout">x 0 · no grid</div>
|
|
42
|
+
<div id="end"><span>wizz.</span></div>
|
|
43
|
+
</section>
|
|
44
|
+
</div>
|
|
45
|
+
<script>
|
|
46
|
+
// Grid: 6 columns, 72 px margins, 24 px gutters, rows every 120 px
|
|
47
|
+
const grid = document.getElementById("grid");
|
|
48
|
+
const colW = (1080 - 2 * 72 - 5 * 24) / 6;
|
|
49
|
+
for (let i = 0; i <= 6; i++) {
|
|
50
|
+
const x = 72 + i * (colW + 24) - (i === 6 ? 24 : 0);
|
|
51
|
+
const v = document.createElement("div"); v.className = "vline"; v.style.left = x + "px"; grid.appendChild(v);
|
|
52
|
+
}
|
|
53
|
+
for (let y = 120; y < 1920; y += 120) {
|
|
54
|
+
const h = document.createElement("div"); h.className = "hline"; h.style.top = y + "px"; grid.appendChild(h);
|
|
55
|
+
}
|
|
56
|
+
const ease = (t) => { // cubic-bezier(.7,0,.2,1)
|
|
57
|
+
let lo = 0, hi = 1, x;
|
|
58
|
+
for (let i = 0; i < 30; i++) { const m = (lo + hi) / 2; x = 3*(1-m)*(1-m)*m*0.7 + 3*(1-m)*m*m*0.2 + m*m*m; if (x < t) lo = m; else hi = m; }
|
|
59
|
+
const m = (lo + hi) / 2; return 3*(1-m)*m*m + m*m*m;
|
|
60
|
+
};
|
|
61
|
+
window.__timelines = window.__timelines || {};
|
|
62
|
+
const tl = gsap.timeline({ paused: true });
|
|
63
|
+
tl.from(".vline", { scaleY: 0, duration: 0.5, ease: "none", stagger: 0.03 }, 0);
|
|
64
|
+
tl.from(".hline", { scaleX: 0, duration: 0.5, ease: "none", stagger: 0.015 }, 0.1);
|
|
65
|
+
tl.from(".note", { clipPath: "inset(0 100% 0 0)", duration: 0.25, ease }, 0.25);
|
|
66
|
+
// numeral climbs one module at a time, landing on the beat at 1.0
|
|
67
|
+
[0.1, 0.225, 0.35, 0.475].forEach((t, i) => tl.fromTo("#num span", { y: 760 - i * 190 }, { y: 760 - (i + 1) * 190, duration: 0.12, ease, immediateRender: i === 0 }, t));
|
|
68
|
+
// words rise out of their clip rect, each landing on a beat
|
|
69
|
+
tl.from(".row span", { y: 130, duration: 0.25, ease, stagger: 0.25 }, 0.6);
|
|
70
|
+
// the exception: linear, unsnapped, pauses mid-flight
|
|
71
|
+
tl.fromTo("#signal", { x: -200 }, { x: 430, duration: 0.6, ease: "none" }, 2.9);
|
|
72
|
+
tl.to("#signal", { x: 1100, duration: 0.7, ease: "none" }, 3.8);
|
|
73
|
+
tl.set("#readout", { textContent: "x 430 · fora do grid" }, 3.1);
|
|
74
|
+
tl.set("#readout", { textContent: "x — · saiu" }, 4.5);
|
|
75
|
+
// knife cut through the numeral, which collapses to its midline
|
|
76
|
+
tl.from("#knife", { scaleX: 0, duration: 0.25, ease: "none" }, 4.0);
|
|
77
|
+
tl.to("#num", { scaleY: 0, transformOrigin: "50% 50%", duration: 0.25, ease }, 4.25);
|
|
78
|
+
tl.to("#knife", { scaleX: 0, transformOrigin: "right", duration: 0.2, ease }, 4.5);
|
|
79
|
+
tl.to("#readout", { y: -40, opacity: 0, duration: 0.2, ease }, 4.75);
|
|
80
|
+
tl.from("#end span", { y: 120, duration: 0.25, ease }, 4.75);
|
|
81
|
+
window.__timelines["main"] = tl;
|
|
82
|
+
</script>
|
|
83
|
+
</body>
|
|
84
|
+
</html>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Check-ins for a piece drawn in code
|
|
2
|
+
|
|
3
|
+
For pieces with no footage, built in HyperFrames (motion editorial, animated explainer, UI morph, kinetic typography, collage inserts). Drawing a whole film and then hearing "that's not it" wastes the most time; three short approvals before the build catch it while it is cheap. Idea from [cth9191/animate](https://github.com/cth9191/animate) (MIT), written here for this pipeline.
|
|
4
|
+
|
|
5
|
+
Each check-in shows something and waits. Nothing from the next step is made before the user answers.
|
|
6
|
+
|
|
7
|
+
1. **Story.** A numbered beat table: what each beat says, its length, the fact it claims (checked on the web when it is a fact). Approve or change the beats.
|
|
8
|
+
2. **Look.** 2 to 4 still frames at full size in the chosen style card's palette and type. When the look comes from a reference, put each frame side by side with it. A thumbs up per frame; a rejected frame is redrawn, not argued.
|
|
9
|
+
3. **Storyboard.** One key frame per beat, with the sound under it and the transition into the next beat. The user answers by panel number ("4 and 7 no"); only the rejected panels change.
|
|
10
|
+
4. **Build.** No check-in: animate the approved panels, render, and run the checks of `wizz-video-effects`.
|
|
11
|
+
5. **Delivery.** The file plus the measured checks: cuts on the beat grid, the payoff on the loudest hit, loudness. The user's notes start a revision of the panels they name, and the verdict goes to `scripts/taste.mjs`.
|
|
12
|
+
|
|
13
|
+
## Beat map
|
|
14
|
+
|
|
15
|
+
With a music track, run `scripts/beat_grid.py <track> --fps <fps>` before the storyboard, so the panels are timed to the music and not to a guessed BPM:
|
|
16
|
+
|
|
17
|
+
- `downbeat_frames`: where the scene changes land.
|
|
18
|
+
- `hits`: the loudest beats; the payoff (the number, the reveal, the logo) goes on the loudest one.
|
|
19
|
+
- `drops`: where the energy jumps; the piece changes gear there (a new section, a faster rhythm).
|
|
20
|
+
|
|
21
|
+
Put the beat time on each storyboard panel, so the user approves the timing together with the image.
|
|
22
|
+
|
|
23
|
+
## A character that acts
|
|
24
|
+
|
|
25
|
+
When the piece has a character (a mascot, a drawn presenter), the emotions section of the `ANIMATION_GUIDE.md` in [JohnHeibel/ClaudeAnimationBase](https://github.com/JohnHeibel/ClaudeAnimationBase) (MIT) is the reference for acting: each emotion is a pose, eyes, mouth and a timing, not a face swap. Read it before the storyboard and give each panel the emotion the character plays. For a film where Claude itself appears, the kit is installable as the CLI `claude-animation-base` (designer area) and renders Clawd directly.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
<!-- Vendored from lemo-opuscar (https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/DIRECTOR.md), MIT, (c) 2026 LemoLab. Its references to AGENTS.md, TECHNIQUE.md and the render tools are that repo's; here the build is HyperFrames (../film-styles.md). -->
|
|
2
|
+
|
|
3
|
+
# Directing a Lemo-Opuscar film
|
|
4
|
+
|
|
5
|
+
The directing method behind every film in this library. Pair it with one `styles/<slug>/STYLE.md` (the style) and [`TECHNIQUE.md`](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/TECHNIQUE.md) (how to build).
|
|
6
|
+
|
|
7
|
+
You are the director, not a tech demo. A film is judged in this order: **sound, rhythm, camera, directing** (performance, staging, emotional arc). Good-looking frames are only the starting point.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Take the brief
|
|
12
|
+
|
|
13
|
+
The user gives a style and a topic, sometimes more (length, language, voice, must-have shots, brand rules). Everything else is your decision. Ask once, in a single message (AGENTS.md, Workflow), then no more questions. Defaults:
|
|
14
|
+
|
|
15
|
+
- Length **30–60 s**; shorter and tight beats padded. Beyond two or three minutes multiplies time and token cost: tell the user.
|
|
16
|
+
- 1920×1080 at 24 fps by default; an output frame rate set in the style's `STYLE.md` (30 or 60 fps, for example) wins, and is what you pass to `--fps` and `mux.sh`; other sizes (vertical 1080×1920, for example) with `--size WxH` on the render tools.
|
|
17
|
+
- Voice and subtitles in the language the user writes in. Subtitles burned in and exported as `.srt`.
|
|
18
|
+
- Loudness −14 LUFS.
|
|
19
|
+
|
|
20
|
+
Say it in the questions when it matters: a good Chinese voice uses Microsoft's online service (edge-tts) and needs a connection; offline, Kokoro reads Chinese but sounds plain (TECHNIQUE.md §4).
|
|
21
|
+
|
|
22
|
+
Requests that only change the plan:
|
|
23
|
+
|
|
24
|
+
- **No voice, or no subtitles.** Drop those steps and say so in the treatment.
|
|
25
|
+
- **Their own voice recording.** Use it as it is; transcribe it with faster-whisper for word timings.
|
|
26
|
+
- **Their own material**: logos, photos, footage, and for styles built from real material (the Evidence Films) their own data, scans, imagery or CAD. Ask whether they have any; what they give comes first, and the sources in the `STYLE.md` are the fallback. Before you download from those sources, tell the user what you will fetch, from where and under which licence. Rights: section 12.
|
|
27
|
+
|
|
28
|
+
## 2. Find a benchmark first
|
|
29
|
+
|
|
30
|
+
Before writing anything, pick one or two reference works (films, title sequences, games, ads) that set the bar for this style **and this topic**. They are your choice, made for the user's film; don't borrow the demo's. Write down:
|
|
31
|
+
|
|
32
|
+
- **What to learn**: composition, pacing, camera grammar, colour logic, score structure.
|
|
33
|
+
- **What not to take**: characters, designs, melodies, specific shots, logos, fonts.
|
|
34
|
+
|
|
35
|
+
The benchmark lifts quality more than any rule below.
|
|
36
|
+
|
|
37
|
+
## 3. Shape the story
|
|
38
|
+
|
|
39
|
+
- **One subject, one goal, one turn.** A character (or a single object, product or idea) wants something, something changes, it ends differently from how it began.
|
|
40
|
+
- **Hook in the first 3 seconds.** No slow logo reveal before anything happens.
|
|
41
|
+
- **An ending that echoes.** Bookend the opening, reveal the scale, or let the character do the thing right the second time.
|
|
42
|
+
- **One native move**: a moment only this medium can do (a fold that becomes a transition, ink that blooms into the next scene, a type grid that snaps into the logo). Put it at the emotional peak. `STYLE.md` lists the medium's native moves; pick or invent the one your story needs.
|
|
43
|
+
- **Cut the extras.** One gag the audience reads at thumbnail size beats three they can't. If a beat needs explaining, remove it.
|
|
44
|
+
|
|
45
|
+
## 4. Write the treatment
|
|
46
|
+
|
|
47
|
+
Write `TREATMENT.md` before drawing anything, and before you open the style's `DEMO.md` or demo code (an Edit & Documentary style gathers its material first: AGENTS.md, "Treatment first"):
|
|
48
|
+
|
|
49
|
+
1. **Three candidate structures**, a few lines each (for example: a single journey, a before/after, a countdown, a list that turns), then the one you chose and why. Choose the opening image, the ending and the shape of the score from the topic too; the first idea that comes to mind for a style is usually its cliché.
|
|
50
|
+
2. **Logline and arc**: one sentence, then setup → turn → ending.
|
|
51
|
+
3. **Benchmark**: learn / don't learn (section 2).
|
|
52
|
+
4. **Shot list**: for every shot, the framing (wide / full / medium / close / insert), angle, camera move (push, pull, pan, track, crane, zoom), duration, and **why** it is shot that way.
|
|
53
|
+
5. **Beat sheet**, second by second.
|
|
54
|
+
6. **Cue map**: tempo, bar grid, instrumentation per section, and on which beat every cut, key action and subtitle lands.
|
|
55
|
+
7. **Sound design table**: for each section, the ambience bed, the main foley and the music state.
|
|
56
|
+
8. **Subtitle and title design**: the type is part of the style.
|
|
57
|
+
|
|
58
|
+
## 5. Prove the look
|
|
59
|
+
|
|
60
|
+
- **With characters**: draw a model sheet (turnaround, 3–4 expressions, 2–3 key poses, palette) plus two style frames.
|
|
61
|
+
- **Without characters**: three style frames from the film, one of them the signature shot.
|
|
62
|
+
|
|
63
|
+
Render them with the real drawing code, not a mock-up, and check them yourself against the `STYLE.md` before going on.
|
|
64
|
+
|
|
65
|
+
### The storyboard (only if the user asked for one)
|
|
66
|
+
|
|
67
|
+
Render 6–9 key shots with the real drawing code, tiled into one sheet (`core/render/sheet.py`) with shot number, framing, duration and line under each. Send it with the logline and what you are least sure about, and **wait for approval**. If the user didn't ask for one, don't stop.
|
|
68
|
+
|
|
69
|
+
## 6. Sound is half the film
|
|
70
|
+
|
|
71
|
+
- **Every visible action has a sound**: landings, page turns, cuts, drips, clicks, cloth. Match the material (paper, wood, metal, ink and glass all sound different).
|
|
72
|
+
- **Three layers**: ambience (room, wind, rain, city), foley (tied to actions) and music. Duck the music under dialogue and key foley.
|
|
73
|
+
- **At least two real silences**, or near-silences, before the turn or the emotional peak. The first sound after the silence should be one of the most important sounds in the film.
|
|
74
|
+
- **Use sound as a transition** at least twice: bring the next scene's sound in early (J-cut) or let the last scene's sound run over the cut (L-cut).
|
|
75
|
+
- **Avoid generic "piano and strings".** Score in the instruments of the style's sound palette.
|
|
76
|
+
|
|
77
|
+
## 7. Rhythm: the music grid comes first
|
|
78
|
+
|
|
79
|
+
- Write the cue map before animating. The picture locks to the grid, and a script checks every cue (TECHNIQUE.md §3).
|
|
80
|
+
- **Vary the pace**: alternate fast and slow, include one clear acceleration or deceleration, and give the audience one breath (a long take or a held pause). A film at one even speed has failed.
|
|
81
|
+
- One action, one sound, one cut, but don't cut on every beat. Leave time to see.
|
|
82
|
+
- **Pace for the viewer, not the clock**:
|
|
83
|
+
- Hold every subtitle at least 1.8 s, and never shorter than the spoken line + 0.6 s.
|
|
84
|
+
- After text finishes animating in, hold it for roughly (letters ÷ 15 + 1.5) s in English, (characters ÷ 4.5 + 1.5) s in Chinese; `readcheck.mjs` checks this for you.
|
|
85
|
+
- Hold a title card at least 4 s.
|
|
86
|
+
- Give failures and gags enough time to be understood.
|
|
87
|
+
- Fast is fine; make it fast with fewer words per screen, not by cutting before people finish reading.
|
|
88
|
+
|
|
89
|
+
## 8. Camera: every shot needs a reason
|
|
90
|
+
|
|
91
|
+
- Use at least **four different camera moves** and real changes of framing. 2D has a camera too: push, pull, parallax, focus pulls, frames within frames.
|
|
92
|
+
- **One signature shot** people remember: a oner, a scale reveal, a transition made from the medium itself.
|
|
93
|
+
- **Design transitions inside the medium** (a page turn, a carved line growing, ink spreading), as one consistent grammar. Avoid default fades and hard cuts.
|
|
94
|
+
- At key moments the subject fills at least a third of the frame height, with clear staging and a readable silhouette.
|
|
95
|
+
|
|
96
|
+
## 9. Performance
|
|
97
|
+
|
|
98
|
+
- **Anticipation, action, follow-through** on every meaningful move. Characters change emotion. They do not just slide across the screen.
|
|
99
|
+
- **Motion continuity**, especially for characters built from code rigs:
|
|
100
|
+
- Blend every pose with keyframes and easing; never switch poses inside an `if`. The only exception is a deliberate one-frame comic pop.
|
|
101
|
+
- Check shoulders and arms on a large action test sheet (reach, raise, run, kneel) before shooting (TECHNIQUE.md §10).
|
|
102
|
+
- Held props sit **between the palms**, at a depth between the two arms. A hand-over interpolates from one palm to the other. A rolling object turns by distance ÷ radius.
|
|
103
|
+
- Step through key actions at 0.2 s intervals, enlarged.
|
|
104
|
+
- Check every expression at final size, especially eyebrow direction: "worried" and "angry" are one flip apart.
|
|
105
|
+
|
|
106
|
+
## 10. The failures we saw most
|
|
107
|
+
|
|
108
|
+
- Subject too small, too far away, or pushed against the frame edge.
|
|
109
|
+
- Too dark to read, or a colour laid on the same colour (red on red).
|
|
110
|
+
- Subtitles covering the subject.
|
|
111
|
+
- A gag or failure too fast to understand.
|
|
112
|
+
- Blank frames in transitions.
|
|
113
|
+
- A timed effect (iris, zoom, follow cam) that doesn't track the subject after the camera moves (one world → screen function, TECHNIQUE.md §2).
|
|
114
|
+
|
|
115
|
+
## 11. Before you deliver
|
|
116
|
+
|
|
117
|
+
- Run the review loop (TECHNIQUE.md §8): contact sheets, 0.2 s strips of key actions, one full-speed viewing with sound.
|
|
118
|
+
- **One fix round.** Fix everything the review and the checks below find in one round, then check once more. Small fixes that second check turns up (a level, a frame) belong to the same round; anything bigger, tell the user in one line when you deliver. The user's notes after delivery are new rounds: change only what they ask.
|
|
119
|
+
- **Not the demo again.** After the treatment, read `DEMO.md` and compare: structure, opening, signature shot, camera path, score shape, ending. At least four of the six must differ; rethink the ones that match. Before delivery, put your contact sheet next to the demo poster (`styles/<slug>/poster.jpg`) as a last check.
|
|
120
|
+
- Voice: every line transcribes back correctly (speech-to-text check). For Chinese, one misheard character in a short line is normal: listen, and if it is right, let the check expect what the model heard (TECHNIQUE.md §4).
|
|
121
|
+
- Loudness about −14 LUFS; no black frames, no NaN frames; subtitles in sync and not covering key action.
|
|
122
|
+
- Every row of the sound design table is actually in the mix.
|
|
123
|
+
- No LemoLab sign-off: `grep -rniE "lemo ?lab|opus 5\.5" <project folder>` finds nothing outside `LICENSE`, `CREDITS` and the library's path in `LIB=` lines, and you have watched the last seconds of the film (text drawn into an image can't be grepped).
|
|
124
|
+
|
|
125
|
+
**Deliver**, in the project folder (the complete list):
|
|
126
|
+
|
|
127
|
+
- `<name>.mp4` (24 fps unless `STYLE.md` sets another rate, about −14 LUFS) and `poster.jpg`;
|
|
128
|
+
- `<name>.srt`, when the film has narration, dialogue or subtitles;
|
|
129
|
+
- `TREATMENT.md`;
|
|
130
|
+
- `CREDITS`: every third-party asset in the film (sample libraries, music, fonts, images, the voice engine) with its source and licence (TECHNIQUE.md §11);
|
|
131
|
+
- the source, with a one-command `build.sh` (TECHNIQUE.md §2).
|
|
132
|
+
|
|
133
|
+
**Tell the user**, in their language: where the project folder and the film are; that `CREDITS` lists the third-party assets in the film and their licences; and that they are responsible for the materials they use in it.
|
|
134
|
+
|
|
135
|
+
## 12. Copyright red lines
|
|
136
|
+
|
|
137
|
+
- References teach grammar only. Don't copy characters, designs, melodies, shots, logos or type designs.
|
|
138
|
+
- No existing works, games, brands or events appear in the film unless the user owns them or has the right to use them. That includes the logos, photos and footage the user hands you: use them when they say they have the right, otherwise draw fictional stand-ins.
|
|
139
|
+
- Some of our demos are unofficial fan films of real events or characters. Keep the style, and never carry those names, marks or characters into a user's film.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<!-- Vendored from lemo-opuscar (https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/archive-lighttable), 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
|
+
# Archive Light Table — Style Prompt
|
|
4
|
+
|
|
5
|
+
> Real archive objects (glass negatives, slides, letters, telegrams, clippings, drawings) lie on a cool, backlit light table. A loupe comes down on one of them, and inside the glass the object comes alive: a negative turns positive, a line of type lights up, a number lifts off the page, a photograph opens into depth. Precise catalogue numbers, dates and readings are pinned to the objects. Clean, modern and quiet, with no vintage filter.
|
|
6
|
+
> References (grammar only): archive documentaries that push into still photographs; visual investigations that annotate real imagery (one line, one reading, one source per screen); product macro films (glass edges, transmitted light). Copy none of their layouts, typefaces, shots or music, and never name them in the film.
|
|
7
|
+
|
|
8
|
+
## 1. Essence, and what it is not
|
|
9
|
+
|
|
10
|
+
- **The objects are real**: scans of public-domain or licensed archive items, at their true proportions, with their real damage (broken corners, emulsion edges, folds, pencil marks). Nothing in them is drawn or generated.
|
|
11
|
+
- **Light comes from below**: the table glows a near-white cool grey; film and glass transmit it, paper glows warm at its edges, opaque things read darker than the table.
|
|
12
|
+
- **The loupe is the camera's door**: every dive into an object goes through a loupe that lands on it. The inside of the lens is where the object changes state.
|
|
13
|
+
- **Catalogue truth**: every object carries its real identifier, date and title from its holder; numbers on screen come from the record.
|
|
14
|
+
- **One signal colour** for marks, readings and anchors; everything else is the archive's own greys and paper tones.
|
|
15
|
+
|
|
16
|
+
**Sources and licences.** Open collections with masters and catalogue records: the Library of Congress (files on `tile.loc.gov`; records from its SRU server `lx2.loc.gov:210/lcdb` when loc.gov pages are blocked), Smithsonian Open Access (CC0), the Rijksmuseum (CC0), NARA, Europeana (check each item's rights statement). CC0, public domain and CC BY (credited) are fine. "No known restrictions", CC BY-SA and other terms are not CC0: name the terms to the user and ask. For brand history, ask the user for their scans, archive numbers and right to use them. Never stand a generated image in for an archive object. Keep a `FACTS.md` in the project folder (claim, source URL, quoted wording, or how a figure was derived) and deliver it with the film.
|
|
17
|
+
|
|
18
|
+
Not Halftone Dossier (no newsprint dots, no aged-paper grade), not Satellite Briefing (objects on a table, not the ground from orbit), not Data Storytelling (no charts; the numbers live on the objects), not a keynote (no slides or header bars).
|
|
19
|
+
|
|
20
|
+
## 2. Materials & rendering
|
|
21
|
+
|
|
22
|
+
- **One world, one camera**: every object is a textured quad on the table with a centre, rotation and scale (texture px → world units at true size). The camera is a 2D centre, zoom and roll; the table and every mark go through the same world → screen function.
|
|
23
|
+
- **The light table**: an emissive surface (≈ 0.97 white, slightly cool), soft falloff, diffuser noise, an aluminium frame and a dark desk beyond. It can be switched off (ambient ≈ 0.04) and flicker on.
|
|
24
|
+
- **Glass negatives**: transmission from the scan's positive, `T = 0.035 + 0.9 · (1 − pos)^1.25`, with a warm silver-gelatin tint; the emulsion mask comes from the scan (white margin touching the border = no glass), so broken corners show the table. Dust and scratches are procedural, anchored to the table.
|
|
25
|
+
- **Paper**: backlit, its colour is transmission (paper tone × light); lit lines get darker ink and brighter paper; unlit text can dim to bring one line forward.
|
|
26
|
+
- **The loupe**: inside the lens each pixel maps back to the table through the magnification (≈ 2.5×) with a pincushion term (k ≈ 0.16 at the rim), slightly different per RGB channel for colour fringes. Around it: a black ring with a bevel highlight and a clear acrylic skirt that refracts the table and glows at its foot. Landing and lifting, it scales by about 1.35× and casts a soft shadow.
|
|
27
|
+
- **The photograph space**: after the push the lens stops being a lens. A photo gains depth from a ground-plane nearness map (zero at the horizon, linear in the row below it), cut-out layers for upright subjects and a filled background; a dolly and a lateral shift drive parallax, and a subject layer may drift. Things left on the ground plane lean: centre the dolly between them.
|
|
28
|
+
- **Sampling**: all texture reads inside the branching lens code use explicit gradients (`textureGrad`), otherwise quads that cross a branch pick a wrong mip level and leave dashed seams.
|
|
29
|
+
- **Marks** live on a 2D canvas above the picture: hairlines 1.5–3 px, rings, crop corners, underlines, leaders. Table marks are clipped out under the loupe; marks inside a photograph use its forward mapping, parallax included.
|
|
30
|
+
- **Post**: a light vignette and fine moving grain (heavier inside photographs). No film damage, no sepia, no halftone.
|
|
31
|
+
|
|
32
|
+
## 3. Colour logic
|
|
33
|
+
|
|
34
|
+
- Neutral ground: the light table (near-white, cool) and the archive's own tones (silver greys, paper tans). Do not regrade the archive into a colour scheme.
|
|
35
|
+
- **One signal colour** (e.g. a signal orange) for marks, readings, anchors and the verdict; never as a fill behind pictures, never for decoration.
|
|
36
|
+
- Text is ink (near-black) on light areas and paper-white on dark caption plates; choose the contrast by the ground, never colour on colour.
|
|
37
|
+
- Positives inside the lens may be gently levelled (black and white points) so a weak scan reads; negatives stay as the glass gives them.
|
|
38
|
+
|
|
39
|
+
Example (our demo): table #F7F9FB, ink #15171A, signal #FF5A1F, caption plates rgba(14,15,17,0.74).
|
|
40
|
+
|
|
41
|
+
## 4. Type & subtitles
|
|
42
|
+
|
|
43
|
+
- **Roles**: a monospace for identifiers, dates and readings (e.g. IBM Plex Mono, 17–34 px; readings 74–120 px); a sans for labels in the film's language (e.g. Noto Sans SC or Inter, 21–36 px); a serif only for titles and the one name a photograph carries (60–76 px). OFL, self-hosted, CJK subset when needed.
|
|
44
|
+
- **Labels attach to objects**: an anchor dot and ring, a vertical leader, then the text. A reading sits in a dark caption plate with a small label above and the source (the catalogue number or the original wording) below.
|
|
45
|
+
- **Subtitles** are a caption strip at the bottom centre, on a dark plate with a 3 px signal-coloured edge. If the film is bilingual, the film's language goes on top. Hold ≥ max(1.8 s, speech + 0.6 s).
|
|
46
|
+
- **Quote the source when you can**: a crop of the actual line, or the record's wording in quotation marks, beats a paraphrase.
|
|
47
|
+
|
|
48
|
+
## 5. Motion quality
|
|
49
|
+
|
|
50
|
+
- 24 fps on ones; every camera parameter on smooth monotone curves through keys (no overshoot, no stepping).
|
|
51
|
+
- The camera glides across the table, slows to let the loupe land, then pushes. Speed lives in the glides and pushes; holds are for reading.
|
|
52
|
+
- The loupe lands with a fast ease-out (≈ 0.4 s), lifts the same way. Lines draw on in 0.3–0.6 s; text wipes in from its leader side; numbers count up and land with the voice.
|
|
53
|
+
- What never moves: the archive's own content outside a photograph space, and the table itself.
|
|
54
|
+
|
|
55
|
+
## 6. Camera grammar
|
|
56
|
+
|
|
57
|
+
| Move | What it expresses | Can serve |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| table glide (pan and roll) | surveying; moving to the next piece of evidence | a timeline of documents; a product family; an album |
|
|
60
|
+
| loupe landing + push into the lens | choosing one object; "look closer" | the claim; the key photograph; a signature |
|
|
61
|
+
| inside the lens: tracking along a line | reading | a letter, a ledger line, a caption, a spec |
|
|
62
|
+
| photograph space: dolly + parallax | being there | the event itself; the founding moment; the place |
|
|
63
|
+
| rise out of the lens | stepping back, the evidence noted | a transition; a summary |
|
|
64
|
+
| pull back to the whole table | scale; everything at once | an index, a timeline, a closing |
|
|
65
|
+
|
|
66
|
+
Framing: at a reading moment the subject fills at least a third of the frame height; readings and labels stay clear of the subtitle strip (bottom 140 px). Transitions are made by the loupe (land, push, rise, lift) and the glide; no cuts, fades to black or page turns between objects.
|
|
67
|
+
|
|
68
|
+
## 7. Sound palette
|
|
69
|
+
|
|
70
|
+
- **Ambience**: the light table's ballast hum (100 Hz and harmonics), starter clicks, room tone. Inside a photograph the hum gives way to that place's air.
|
|
71
|
+
- **Foley**: the loupe on glass (a clack with a high ring), paper sweeps for glides and lit lines, ticks for scales and counters, a pen stroke for a verdict, soft clicks as labels land.
|
|
72
|
+
- **Music**: restrained and small: a felt piano, a few strings, glass or bowed metal for the moments of seeing. Build by subdivision and register, not by drums. Leave real silences before a reveal or a verdict; the first sound after them should be the loupe, the place or the verdict.
|
|
73
|
+
- **Voice**: a calm narrator, short sentences that state what the object says. Music about 10 dB under the voice, ducked while it speaks; −14 LUFS.
|
|
74
|
+
|
|
75
|
+
## 8. Native moves
|
|
76
|
+
|
|
77
|
+
- **Negative to positive under the loupe.** A develop front spreads from the lens centre with a thin warm edge, turning the glass negative into its positive only inside the lens. *Fits content like:* a founder's portrait plate; a factory on a lantern slide; an X-ray film becoming the product inside.
|
|
78
|
+
- **The line lights up.** On paper inside the lens one line of type brightens while the rest dims, an underline draws under it, and one word or number lifts out into a reading card. *Fits content like:* a ledger entry; a patent claim; the first order on an invoice.
|
|
79
|
+
- **Into the photograph.** The lens rim grows past the frame while the view inside widens; the photograph gains layered depth and a subject drifts. *Fits content like:* the first shop front; a launch day crowd; an expedition camp.
|
|
80
|
+
- **Measuring on the photograph.** A ruler laid on the ground plane in perspective, with ticks that crowd toward the horizon and a counter that lands on the recorded figure, marked as a schematic when it is one. *Fits content like:* a race distance; a bridge span; a building's height.
|
|
81
|
+
- **Two records, held side by side.** Two caption cards, each with a crop of its source, held still until both are read before one is struck. *Fits content like:* a misprinted date; two versions of a founding story; specification against delivery.
|
|
82
|
+
- **The table becomes the index.** Pull back to the whole table; each object's tag flies into one list with its identifier and its reading. *Fits content like:* a company timeline; a collection catalogue; a product family.
|
|
83
|
+
|
|
84
|
+
## 9. Pitfalls of the medium
|
|
85
|
+
|
|
86
|
+
- **Over-magnifying a weak scan**: keep the lens interior under about 1.5 screen px per scan px; choose items by scan size.
|
|
87
|
+
- **The loupe sweeping over empty table**: lay objects close together, land the loupe straight onto the object (drop in, don't slide in), and glide the camera over objects, not gaps.
|
|
88
|
+
- **Shear in the photograph space**: one depth map for a photo with people or machines in it tears them apart. Cut upright subjects into layers, fill behind them, and keep 2.5D moves small enough that the fill is barely seen.
|
|
89
|
+
- **Labels that scroll away**: a label on a moving table leaves the frame before it is read; hold the camera, or fix the caption on screen.
|
|
90
|
+
- **Vintage creep**: no sepia, no halftone, no paper-ageing overlay. The age is in the objects, not the grade.
|
|
91
|
+
|
|
92
|
+
## 10. Engine
|
|
93
|
+
|
|
94
|
+
- `demo/film.js`: `IT` (objects: centre, rotation, scale), `toW()` / `toT()` (texture ↔ world), `CAM` keys and `w2s()`, `dive()` (loupe point, land/lift times, lens interior as tracks), `shot(t)`, `int2s()` (photograph → screen for marks), the shader (`lightTable`, `paper`, `negative`, `parallax`, rim and skirt), the overlay (`annot`, `measure`, `compare`, `indexPanel`).
|
|
95
|
+
- `demo/tools/prep.py`: emulsion masks from scans, difference matting of a subject against a smooth sky, ground-only cuts, push-pull fill.
|
|
96
|
+
- Minimal example, not in the demo: put one 35 mm slide (`IT.slide = {c, r, k, size}`), a loupe landing with `dive(toW(IT.slide, p), t0, t1, keysS, keysC)`, and light one line with `band()`.
|
|
97
|
+
- **Extra packages and packs**: none beyond `setup.sh deps voice music` (numpy, scipy, Pillow, soxr are in the core tier). A score in this palette needs sample libraries: `sh tools/fetch.sh instruments salamander` (piano), `vsco2ce` (strings), `vcsl` (glass, bowed vibraphone). Anything else a film needs goes into a private venv or `node_modules` in the project folder, never into `$LIB/.venv`.
|
|
98
|
+
|
|
99
|
+
## 11. Variation space
|
|
100
|
+
|
|
101
|
+
The agent decides the objects, their order, the story, which native moves to spend and where, the camera path, the subject of the photograph space, and the signal colour.
|
|
102
|
+
|
|
103
|
+
- **Three structures**: a company's founding told as five objects in date order, each dive revealing one person; a single photograph explored in three dives (the place, the people, the date on the back); a before/after pair of plans and photographs of one building.
|
|
104
|
+
- **Three openings**: the table switching on in the dark; a loupe already on a plate, rising to reveal the table; a hand-written date on an envelope filling the frame.
|
|
105
|
+
- **Three endings**: the index of everything on the table; the last photograph held in depth with one line of text; the light table switching off, leaving one object glowing.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
How our demo was made (story, shots, score, end card, build): [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/archive-lighttable/DEMO.md). Read it after your treatment exists.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<!-- Vendored from lemo-opuscar (https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/art-deco), 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
|
+
# Art Deco — Style Prompt
|
|
4
|
+
|
|
5
|
+
> Black lacquer, engraved gold line and airbrushed geometry: a 1930s poster that moves. Every composition has a centre axis, transitions open or close along it, and light arrives as bulbs switching on one by one.
|
|
6
|
+
> References (grammar only): **A. M. Cassandre** posters (giant geometry, steep perspective, airbrush inside hard edges); **Chrysler Building / Rockefeller Center ornament** (setbacks, sunbursts, chevrons); **Busby Berkeley** overhead numbers overheads (human kaleidoscopes); **The Great Gatsby (2013) title sequence** (gold line drawing itself on black); **Gershwin-era symphonic jazz** (clarinet, piano, muted trumpet). Never copy a poster layout, a real building, a character, a typeface design or a melody.
|
|
7
|
+
|
|
8
|
+
## 1. Essence, and what it is not
|
|
9
|
+
|
|
10
|
+
A world built from **gold keylines on warm black**, filled with **airbrushed hard-edged volumes** (Cassandre, Lempicka), organised around **one vertical axis**. Ornament *is* the picture: sunbursts are backgrounds, stepped arches are frames, a dial is a progress bar, a bulb marquee is a reveal. Motion is **mechanical and symmetrical**: things unfold from the centre, doors split along the seam, lights switch on in counted order. Native register: glamour with a clock ticking (an event, a deadline, a launch).
|
|
11
|
+
|
|
12
|
+
Not a gold-foil slideshow (things move and have volume), not Art Nouveau (no whiplash curves, no flowers), not a flat vector poster (volumes are airbrushed and rimmed), not a 60s spy title (no silhouettes on flat colour).
|
|
13
|
+
|
|
14
|
+
## 2. Materials & rendering
|
|
15
|
+
|
|
16
|
+
- **Ground**: warm lacquer black, never neutral grey-black; a night sky may drift toward a deep emerald near the horizon.
|
|
17
|
+
- **Gold is a banded metal gradient** (dark – light – hot – light – dark); animate its `sheen` offset for a light sweep.
|
|
18
|
+
- **The signature stroke** (`gline`): a dark engraved underline ~1.6 px wider than the line, the gold gradient line, and a hairline highlight on top. Optional glow and a parallel twin (`double`). Nothing gets a black cartoon outline.
|
|
19
|
+
- **Volumes**: hard edge + airbrush (`airbrush`): a directional gradient from shade to light inside the shape, one consistent light direction (upper left by default), a thin gold rim on the lit side.
|
|
20
|
+
- **Motifs** (sunburst, stepped arch / ziggurat, fish-scale, chevrons, fan, four-point sparkle, speed lines, clock face, dial) are structural (a background, a frame, a transition), not stickers.
|
|
21
|
+
- **Perspective is real**: true one-point (mode-7 floors) and two-point perspective through a pinhole camera, so dolly, tilt and pan change perspective instead of scaling flats.
|
|
22
|
+
- **Characters are deco too**: about 7 heads tall, tapered streamline bodies, faceted lacquer planes (Lempicka), almond or arc eyes, a one-stroke nose, airbrush + gold rim. Give each lead one or two silhouette marks readable at a quarter of frame height.
|
|
23
|
+
|
|
24
|
+
## 3. Colour logic
|
|
25
|
+
|
|
26
|
+
- Three constants: **warm black ground, gold line and metal, ivory** for paper, gloves, light and type.
|
|
27
|
+
- **One saturated accent reserved for the protagonist** (or the one object the story follows). It is the only large saturated area, so the eye finds it in any wide shot. A cooler jewel tone may carry secondary surfaces, never competing in area.
|
|
28
|
+
- **The one-colour exception**: any single element can be drawn in its own colour through the same fill + keyline + glow (`color` option) while everything else stays gold.
|
|
29
|
+
- Always expand hex to six digits in code (three-digit hex breaks colour mixing).
|
|
30
|
+
- Examples of the triad (accent / jewel / metal): burgundy / emerald / gold; coral / sapphire / pale gold; jade / plum / rose gold. Our demo's actual values are in DEMO.md.
|
|
31
|
+
|
|
32
|
+
## 4. Type & subtitles
|
|
33
|
+
|
|
34
|
+
- **Type (OFL)**: Limelight (titles), Poiret One (numbers, sign skeletons, plaques), Josefin Sans (subtitles, labels), Italiana (numerals).
|
|
35
|
+
- **Titles are architecture**: a stepped gold title bar over an arch or sunburst, optional badge and wings; drawn on in gold, then a sheen sweep.
|
|
36
|
+
- **Subtitle card** (`subtitleCard`): a lacquer bar (~88 % black) with stepped ends like the title bar, double gold keyline, Josefin Sans SemiBold ~40–42 px ivory, an optional small speaker icon per voice. It **unfolds from the centre** like every other title, so titles, subtitles and transitions are one system. Hold ≥ max(1.8 s, speech + 0.6 s).
|
|
37
|
+
- Numbers carry plot without narration: dials, clock faces, floor medallions, badges.
|
|
38
|
+
|
|
39
|
+
## 5. Motion quality
|
|
40
|
+
|
|
41
|
+
- **Characters step on twos (12 fps)**; camera, light, bulbs, gold draw-on and sheen run on ones (24 fps). A stepped camera reads as stutter.
|
|
42
|
+
- **Everything unfolds from the centre**: a point → a hairline → bars open symmetrically → text rises → wings and sparkle.
|
|
43
|
+
- **Draw-on follows the music**: a gold line grows at the speed of the phrase under it and lands on the hit.
|
|
44
|
+
- **Bulbs have an ignition overshoot** (~1.6× flash settling in ~0.18 s) and a relay "chunk"; once a sign is lit, a fast chase may run across it.
|
|
45
|
+
- **Mechanical easing**: doors, dials and hands move with firm ease-in-out and a small settle, like machinery; nothing floats.
|
|
46
|
+
- **Performance beats get anticipation** and escalation in threes (once, twice, mash).
|
|
47
|
+
- What never moves: the centre axis of a composition. Symmetry may rotate or open, but it never drifts off-centre.
|
|
48
|
+
|
|
49
|
+
## 6. Camera grammar
|
|
50
|
+
|
|
51
|
+
A vocabulary, not a route. Opening and ending come from the topic.
|
|
52
|
+
|
|
53
|
+
| Move | What it expresses | Can serve |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| Symmetric split (two door leaves hinged at the edges; or a revolving-door wipe) | a threshold crossed | a new place; a new chapter; a reveal behind a façade |
|
|
56
|
+
| Leaves sliding shut over the live shot | a door closing on a moment | leaving; a decision made; the end of an era |
|
|
57
|
+
| Extreme low-angle Cassandre tilt | scale and aspiration | a goal far above; a tower, a rocket, a monument |
|
|
58
|
+
| Architectural section (pull out to a cutaway of the whole building) | progress through a structure | climbing, descending, a process in stages; a company's floors |
|
|
59
|
+
| Busby Berkeley overhead, mirrored and rotating | people become pattern | a team, a release, a celebration, a system of parts |
|
|
60
|
+
| Push-in on a dial, medallion or clock | the number is the plot | a deadline; a count; a milestone |
|
|
61
|
+
| Match-cut on shape (circle → circle, ray → ray) | two places, one rhyme | jumping between departments, cities, eras |
|
|
62
|
+
| Low oblique along a sign or marquee | light travelling letter by letter | a name revealed; a launch; a score being counted |
|
|
63
|
+
| Pull back from detail to skyline | where the moment sits in the world | aftermath; a city-wide effect; scale |
|
|
64
|
+
|
|
65
|
+
Framing: the centre axis is sacred; an asymmetric frame must resolve to it within the shot. At an emotional peak the protagonist fills ≥ ~1/3 of frame height (smaller, the face reads as a prop in the ornament). Transitions: splits, revolves, arch openings, shape matches; never a generic dissolve or slide.
|
|
66
|
+
|
|
67
|
+
## 7. Sound palette
|
|
68
|
+
|
|
69
|
+
- **Symphonic jazz of the 1920s–30s, not a 60s big band.** Options: stride or concert piano, clarinet (trill; a glissando by time-varying resampling of a long note), strings (tremolo, rushes, pizzicato), muted trumpet commentary, trombone and sax section, walking pizz bass, brushes or sticks, tubular bells, harp glissandi, banjo, xylophone runs, celesta.
|
|
70
|
+
- Rhythm families to choose from: foxtrot, Charleston, tango, a slow torch-song ballad, a fanfare in the manner of a newsreel.
|
|
71
|
+
- **Techniques (options)**: one hit per unit of counted light; accelerate by dividing the beat; plant a theme in fragments so its full statement is a payoff; low-pass a band that is physically far away and open it as we approach; move a period narrator through acoustic spaces (horn, radio, PA, live mic) to make distance audible.
|
|
72
|
+
- **Foley by material**: brass clicks, bronze clang + chain, iron treads, marble heels, silver trays, wooden doors + spring twang, paper flutter, knife-switch "chunk" + filament hum, relay ticks, elevator ding, champagne cork.
|
|
73
|
+
- **Silence as a tool**: before the most important sound, drop to one small diegetic sound (a clock tick, wind) and cut back in with that sound alone.
|
|
74
|
+
- **J/L-cuts** carry architecture: the next room's sound enters a bar before its door opens.
|
|
75
|
+
- Mix: duck music ~−9 dB under voice (less under a period announcer who is part of the texture), beds −6 dB, −14 LUFS, light film grain.
|
|
76
|
+
|
|
77
|
+
## 8. Native moves
|
|
78
|
+
|
|
79
|
+
A menu: use the ones your story needs.
|
|
80
|
+
|
|
81
|
+
- **Counted light.** A bulb sign lights one letter per beat or per event, so the audience can count. *Fits content like:* the countdown to a product launch; the letters of a city name lighting as a train arrives; votes tallied into a winner.
|
|
82
|
+
- **Threshold doors.** Every scene change is a door split along the seam. *Fits content like:* the departments of a company; the rooms of a museum; stages of a career.
|
|
83
|
+
- **Machine kaleidoscope.** People or objects become a mirrored, rotating pattern that locks into a symbol. *Fits content like:* a team becoming a logo; gears of a supply chain; a choir becoming a clock.
|
|
84
|
+
- **Dials carry the plot.** A floor indicator, a clock or a gauge moves instead of narration. *Fits content like:* a funding thermometer; the altitude of a climb; a stock ticker at the opening bell.
|
|
85
|
+
- **The architectural cutaway.** Pull out until a building is a section and the protagonist a coloured dot with speed lines. *Fits content like:* data moving through a server stack; a letter through a post office; a skier down a resort.
|
|
86
|
+
- **Sheen sweep / draw-on.** Light crosses a gold object on a hit; a gold line engraves itself at the speed of a glissando. *Fits content like:* unveiling a trophy; a map route; a signature on a treaty.
|
|
87
|
+
- **The one colour.** One element keeps its own colour in a gold world. *Fits content like:* the one product among competitors; the patient among doctors; the new idea in an old firm.
|
|
88
|
+
|
|
89
|
+
## 9. Pitfalls of the medium
|
|
90
|
+
|
|
91
|
+
- Bulb signs from glyph skeletons break on curves (G, S, R): Zhang–Suen staircase pixels fool a neighbour-count junction test → use the **crossing number** and weld chain ends within ~14 px.
|
|
92
|
+
- A generic cartoon character looks pasted in → characters are deco (§2).
|
|
93
|
+
- Fish-scale reads as brickwork → lower half-circles row by row, each overlapping the previous row, plus an inner arc.
|
|
94
|
+
- Door leaves over a flat "interior" read as a blank frame → draw only the leaves, closing over the live shot.
|
|
95
|
+
- A gold point on pure black trips `blackdetect` → lift the background wedges and glow slightly.
|
|
96
|
+
- Period loudspeaker distortion is unintelligible under music → gentle drive; whisper-check every line on the final mix.
|
|
97
|
+
|
|
98
|
+
## 10. Engine
|
|
99
|
+
|
|
100
|
+
Canvas2D, deterministic in `t`, in `demo/engine/`: `deco.js` (gold gradient, `gline`, `airbrush`, motifs, `drawShape` for any path in the deco manner, `color` for the one-colour exception), `type.js` (title bar, digits, badges, dial, clock, `subtitleCard`), `bulbs.js` (any text → bulb sign, `litSequence`), `cam.js` (pinhole camera, `cardTransform`). `demo/frames.js` renders model sheets and style frames from the real engine. Signatures and a minimal example that draws something not in the demo: DEMO.md "Engine reference".
|
|
101
|
+
|
|
102
|
+
## 11. Variation space
|
|
103
|
+
|
|
104
|
+
You decide the structure, the characters (or none), the settings, the opening, the ending, the camera path, the pacing, the accent colour and what gets counted. All far from our demo:
|
|
105
|
+
|
|
106
|
+
- Structures: **the exhibition** (five pavilions of a world's fair, one idea of the topic behind each door); **the ocean liner** (three decks from engine room to ballroom, a horn per stage); **the trophy night** (nominees as sunburst panels, the winner revealed in light).
|
|
107
|
+
- Openings: **the machine room** (gold gears and pistons building to the first beat); **the engraved map** (a gold route crosses a continent before anyone appears); **the telegram** (ticker tape types the premise).
|
|
108
|
+
- Endings: **the lights go out** (letters switch off in reverse until one bulb remains); **the dawn** (lacquer black warms to a pale sky); **the poster** (the last shot flattens into a printed poster with a date).
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
How our demo was made (story, shots, score, end card, build): [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/art-deco/DEMO.md). Read it after your treatment exists.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<!-- Vendored from lemo-opuscar (https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/ascii-crt), 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
|
+
# ASCII / CRT Terminal: Style Prompt
|
|
4
|
+
|
|
5
|
+
> Everything on screen is a real character on a monospace grid, lit by the phosphor of an old monochrome CRT.
|
|
6
|
+
> References (grammar only): 1970s–80s monochrome terminals and teletype logs (typed output, cursor, status lines); ASCII art and demoscene text-mode pictures (images from glyph density); analog-synth film scores of the early 1980s (cold pulse, patient drones). Copy no film's interface text, fonts or logos, and use no real agency names.
|
|
7
|
+
|
|
8
|
+
## 1. Essence, and what it is not
|
|
9
|
+
|
|
10
|
+
A single monochrome terminal screen: **P3 amber** (or P1 green) phosphor glowing on dark glass, curved at the edges, with scanlines. Every image, including title, landscape, face, room and subtitles, is made of **real glyphs placed on a character grid** and chosen by ink density. The film has one camera, the screen itself. It moves only by changing the **font size of the grid**: bigger characters push in, smaller characters pull out.
|
|
11
|
+
|
|
12
|
+
The mood is cold, patient and machine-calm: typed text, a blinking cursor as suspense, and one warm surprise.
|
|
13
|
+
|
|
14
|
+
**Never** fake it with an image plus an "ASCII filter". Characters must be drawn as characters on a grid. Not a hacker-movie green rain, not a pixel-art game (no sprites, no free pixels), not a sci-fi HUD (no vector lines, no free-floating panels).
|
|
15
|
+
|
|
16
|
+
## 2. Materials & rendering
|
|
17
|
+
|
|
18
|
+
- **Font**: one monospace bitmap-style font (VT323, OFL); cell 0.4 em × 0.8 em (1:2). A large prerendered glyph atlas with a stroke for beam spread, scaled with `drawImage`, keeps zooms continuous and sharp.
|
|
19
|
+
- **Grids**: column count per shot (title ~20, terminal 80, picture 200+); a push-in can go until one cell holds a sub-grid of its own.
|
|
20
|
+
- **Density ramp**: each glyph's measured ink coverage × dim / normal / bold → about 20 levels, near-duplicates dropped; a small ordered-plus-hash dither per cell; cells below a threshold stay blank. **Negative space makes ASCII art readable.**
|
|
21
|
+
- **Picture pipeline**: paint grayscale into an offscreen "negative" aligned exactly to the grid (several samples per cell; channels for phosphor, second colour, a flag), average per cell, pick a glyph. Interiors get local contrast (`m + 0.9·(m − mean)`) to keep outlines.
|
|
22
|
+
- **Recognisable subjects**: silhouettes, not noise (real coastline polygons, a face from a few planes); dark = sparse dim glyphs, bright = dense bold, shadow sides sparse `.` only; an angle with a clear silhouette.
|
|
23
|
+
- **Depth on a grid**: far = darker and sparser, near = brighter and denser; a thin bright rim separates planes.
|
|
24
|
+
- **CRT post** (WebGL, adapted from `core/post/crt.js`):
|
|
25
|
+
- **Phosphor colour**: luminance maps along the phosphor's ramp (dim deep orange → amber → overexposed near-white for P3).
|
|
26
|
+
- **Glow**: multi-level bloom plus a faint halo.
|
|
27
|
+
- **Glass**: fine scanlines (narrower on bright areas), slight barrel curvature, rounded mask, warm near-black unlit glass, faint reflection, ~1 % flicker, fine noise. **No RGB grille: monochrome tubes have none.**
|
|
28
|
+
- **Afterglow**: text that disappears decays with τ ≈ 0.1 s, computed analytically so every frame is deterministic. Moving glyphs get one faint trail sample.
|
|
29
|
+
|
|
30
|
+
## 3. Colour logic
|
|
31
|
+
|
|
32
|
+
- **One phosphor** carries everything: amber, green or white, in its own brightness ramp. No second hue for decoration.
|
|
33
|
+
- **At most one soft second colour**, used for one thing only (the emotional object), switched on at a single moment, on a downbeat, and never taken back casually.
|
|
34
|
+
- Examples: amber screen with an ice blue-white for something far away; green screen with a warm pink for a living thing; white P4 screen with a pale gold for a memory.
|
|
35
|
+
- Brightness is the only other tool: dim / normal / bold and inverse video.
|
|
36
|
+
|
|
37
|
+
## 4. Type & subtitles
|
|
38
|
+
|
|
39
|
+
- **Subtitles are terminal output.** A reserved **LOG strip** at the bottom: a dim separator, an inverse-video tag, then a prompt and the line in uppercase at ~45 px. It is **typed word by word in sync with the voice** (whisper word timestamps) and holds ≥ max(1.8 s, speech + 0.6 s). It lives outside the zooming grid, like a status line, with the same scanlines and glow. When nobody speaks it can show system state (a progress bar, a waiting message).
|
|
40
|
+
- **On-screen text that the story shows** is picture, not subtitle; in the `.srt` it appears as `[SCREEN] …`.
|
|
41
|
+
- **Titles** are typed with key clicks, as a filename, a command or a header.
|
|
42
|
+
|
|
43
|
+
## 5. Motion quality
|
|
44
|
+
|
|
45
|
+
- **Characters never move off-grid, except in a declared transformation moment.** Typing, scrolling and counters jump from cell to cell. A roller flips digits discretely, fast then slowing.
|
|
46
|
+
- **Only three things move continuously**: grid scale (the camera), CRT physics, and particles in a transformation.
|
|
47
|
+
- **Typing speed is performance**: machine output is even and fast (~10–40 ms/char); dramatic lines slow to note values of the score; human typing is hand-timed, uneven, with pauses and bursts.
|
|
48
|
+
- **Particles** spawn from random points inside source glyphs, start small, fade in, ease to their cell, and flash briefly on landing, so they never stack into bright bars.
|
|
49
|
+
- **Push to a character**: hold where the whole glyph reads, then push until its inner text reads; inner text full brightness, outside text a few percent, neighbours dimmed, so the shape reads before the text.
|
|
50
|
+
|
|
51
|
+
## 6. Camera grammar
|
|
52
|
+
|
|
53
|
+
The only camera is the grid scale, plus CRT power states and one possible shot outside the screen.
|
|
54
|
+
|
|
55
|
+
| Move | What it expresses | Can serve |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| Static 80-column terminal | Waiting, procedure, machine time | a countdown; a queue; a log being read |
|
|
58
|
+
| Push in (cells grow) | Attention, intimacy | one line of dialogue; a name; a decision typed |
|
|
59
|
+
| Pull out (cells shrink) | Context, scale | a title becoming line 1 of a list; one entry among thousands |
|
|
60
|
+
| Push into a single glyph | Hidden depth; what a symbol is made of | a letter made of messages; a pixel made of people |
|
|
61
|
+
| Scroll (the buffer moves) | Accumulation, time passing | years of records; a changelog; a feed |
|
|
62
|
+
| Clear screen / hard redraw | A cut; a new state | a reboot; a new chapter; a crash |
|
|
63
|
+
| Text becomes image (grid shrinks as glyphs fall) | Words turning into world | a letter becoming a face; data becoming a map |
|
|
64
|
+
| Power on / off, degauss | Birth, death, sleep, shock | a machine waking; an ending; a jolt |
|
|
65
|
+
| Pull back off the glass into a drawn room | The screen is an object in a world | who is reading; where the machine is |
|
|
66
|
+
|
|
67
|
+
Opening and ending come from the topic. Framing: text stays in the safe area inside the curvature; keep the LOG strip clear. Transitions happen on the screen (clear, redraw, scroll, power), never a crossfade between two screens.
|
|
68
|
+
|
|
69
|
+
## 7. Sound palette
|
|
70
|
+
|
|
71
|
+
- **Music**: an original analog-synth score, rendered in code (numpy / numba): PolyBLEP saw and square oscillators, a resonant 4-pole ladder filter with moving cutoff, filter envelopes, square-wave sequencers, slow tape wow (± a few cents), long reverb on pads, gated reverb on hits; options also a sub-bass drone, sample-and-hold noise, a detuned unison lead. **Never chiptune.**
|
|
72
|
+
- **Technique options**: grow a single arpeggio as an image forms; hold the only major chord for one moment; drop everything, reverb tails included, to digital zero on a shock; open a chord on the colour change.
|
|
73
|
+
- **Silence is the main instrument**: room tone alone under typing and blinking cursors; a short near-silence before a transformation.
|
|
74
|
+
- **Foley** (all synthesised): relay click and degauss hum (mains hum plus harmonics with a thump); buckling-spring keys (plastic click, spring ping, key-cap thock; duller space bar, heavier Enter); teletype ticks for remote text; modem and phone-line tones (answer tone, FSK, band-limited noise); square-wave error beeps and BEL; clusters of tiny high ticks for particles; a dot-matrix printer or tape drive as options; room tone (fan, low hum, a **very quiet** flyback whine).
|
|
75
|
+
- **Mix**: music ducked about −8 dB under the voice; master −14 LUFS with no grain in the mux (the noise lives in the picture).
|
|
76
|
+
- **Voice**: when a machine speaks, process it (light ring modulation, a short comb, a telephone-ish band-pass, soft saturation) and check that whisper still reads every line. Few short lines.
|
|
77
|
+
|
|
78
|
+
## 8. Native moves
|
|
79
|
+
|
|
80
|
+
A menu: use the ones your story needs.
|
|
81
|
+
|
|
82
|
+
- **The picture is made of words.** A sentence breaks apart and its letters, sorted by ink density, become an image containing only those letters. *Fits content like:* a manifesto becoming a crowd; a recipe becoming the dish; a poem becoming a landscape.
|
|
83
|
+
- **Font size = camera.** Push until one character fills the screen and is itself made of smaller text. *Fits content like:* a company name made of employee names; a year made of its headlines; a heart glyph made of messages.
|
|
84
|
+
- **Typing rhythm = editing rhythm.** Even machine typing against uneven human typing; a blinking cursor is a performance. *Fits content like:* a job application; an apology; a password remembered.
|
|
85
|
+
- **CRT physics.** Power on as dot → line → frame, off to a dot; afterglow, bloom, curved glass. *Fits content like:* a hospital monitor; a night shift ending; an old archive reopened.
|
|
86
|
+
- **A single colour change.** One soft second colour appears once. *Fits content like:* a first green leaf in a data log; a blood-orange sunset in a weather report; a child's drawing in a server room.
|
|
87
|
+
- **The log file.** Timestamps, error codes, progress bars tell the story. *Fits content like:* a product launch day; a rescue; a migration.
|
|
88
|
+
|
|
89
|
+
## 9. Pitfalls of the medium
|
|
90
|
+
|
|
91
|
+
- **Inverse video**: `destination-out` only changes alpha, which the upload ignores → opaque black canvas, cut letters with a *black* atlas.
|
|
92
|
+
- **Negative not aligned to the grid** drifts across hundreds of columns → map with cell width / samples exactly.
|
|
93
|
+
- **Wrong cell centre**: cells are 2·cw tall, so the centre is `(j + .5)·2cw`, not `(j + 1)·cw`.
|
|
94
|
+
- **Every dark pixel becomes a character** (`-+-+` walls) → threshold, gamma ≈ 1.25, local contrast.
|
|
95
|
+
- **Noise-textured subjects read as textured blobs** → silhouettes, a dark sparse background, a dot-only shadow side.
|
|
96
|
+
- **Particles from letter centres stack into bars** → random points inside the glyph, small, faded in.
|
|
97
|
+
- **Stroked atlas glyphs close their counters** (`M`, `B`) → sample a thin fill-only glyph bitmap for masks.
|
|
98
|
+
- **Lazily built data never reaches the exporter** → build particle schedules and their sound events before `window.EV` is exported.
|
|
99
|
+
- **A power-on parameter at 0 still draws the centre dot** → exposure 0 before power-on, multiply the dot term by exposure.
|
|
100
|
+
|
|
101
|
+
## 10. Engine
|
|
102
|
+
|
|
103
|
+
In `demo/`: `term.js` (glyph atlas, grid drawing, density ramps, image → cells), `art.js` (procedural grayscale scenes for the negative), `crt.js` (monochrome phosphor CRT post, WebGL2), `main.js` (timeline, events `EV`, subtitles `SUBS`), `voice_fx.py` (machine-voice processing), `mix.py` (synthesised foley + ducking), `music/score.py` (analog-synth score), `tools/subs.mjs` (export `window.SUBS`). File map and commands: [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/ascii-crt/DEMO.md#build-notes).
|
|
104
|
+
|
|
105
|
+
## 11. Variation space
|
|
106
|
+
|
|
107
|
+
You decide who types, what the screen is for, the grids, the opening, the ending, the camera (grid) path, the pacing and whether the second colour appears at all. All far from our demo:
|
|
108
|
+
|
|
109
|
+
- Structures: **a chat log** (two users typing to each other across one night, timestamps as scene headers); **a system manual** (chapter headers, diagrams in ASCII, one page going wrong); **a boot-to-shutdown day** (one machine's day as a sequence of scheduled jobs, each drawing a picture of what it does).
|
|
110
|
+
- Openings: **mid-scroll** (a buffer already racing past; it stops on one line); **a printout** (a dot-matrix sheet feeding up, then the screen takes over); **an error first** (a crash dump, then we rewind to what caused it).
|
|
111
|
+
- Endings: **the buffer fills** (the story's text scrolls up and away until only the prompt remains); **the screen saver** (after the last line, a slow drifting pattern takes over the idle screen); **the cursor stops blinking** (no power-off, just a final state held).
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
How our demo was made (story, shots, score, end card, build): [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/ascii-crt/DEMO.md). Read it after your treatment exists.
|