Poem Film
One classical Chinese poem becomes a vertical ink-painting film drawn in code: a short backstory prologue, one shot per line chosen by the poet's mood, matched transitions and the whole poem as a scroll.
One classical Chinese poem becomes a vertical ink-painting film drawn entirely in code. A short backstory prologue sets up why the poet wrote it, then each line gets one shot chosen by the poet's state of mind, shots join with matched transitions (a seal that becomes the sun, a cloud wipe, a dive into the map, a rock, leaf or snow wipe, a ripple or a moon match) and the film ends on the whole poem as a hanging scroll with a seal. No image or video model draws anything: every frame is painted with Canvas 2D in headless Chrome.
How it works
Plan a 2-3 beat backstory prologue, one far, mid or near shot per line chosen by mood, matched transitions and the scroll finale
Write poem.json, timeline.json and the shot code against the shared painters and one style pack (blue-green qinglv, light-ochre qianjiang, snow-ink xuejing, woodblock nianhua or frontier biansai, or a pack the project brings in styles/)
Check the rules, look at stills, score it in code (or add an optional MiniMax Music instrumental through SandBase) and render the 1080 × 1920 film in Chrome with FFmpeg
Frequently asked questions
What does the music cost?
The default score is synthesized in code and costs nothing: 早发白帝城 uses the original plucked score (a guqin-like line, gibbon calls, wind, leaves, river and drums), and 静夜思 the 0.3.1 ambient score (water, insects, wind, a breathy xiao-like pad and one short guqin phrase per line). audio.mjs --music minimax prints the plan first and makes one paid call only with --confirm: a MiniMax Music 2.6 instrumental through SandBase, about $0.15, mixed under the code sound effects; 登高, 江雪, 山居秋暝 and 水调歌头 use that. --music file mixes an instrumental you already have. Since 0.3.1 every soundtrack is normalised to -16 LUFS and -3.0 dBTP.
Why are there no close-ups of the poet?
The poet acts inside the landscape (bowing, raising a cup, opening his arms, climbing with a cane) and the scenery carries the mood. When the poem's key action is a figure's action, the method prefers a near shot of the prop or the body part it works on (needle and thread, the cup, stamping feet); a mid shot is used only when the figure can be drawn well, and faces are never shown in close-up.
Why are numbers like 万里 or 百年 never counted on screen?
Numerals in classical poems are usually figurative: 万里 means far away, 百年 means a whole life. The film shows distance and time with images, and check.mjs rejects counters and numeric labels unless poem.json cites a source for a real figure, such as the 千二百里 from Baidi to Jiangling in 《水经注》.
What if my poem has a rare character?
The bundled LXGW WenKai subset covers about 9,300 common characters. check.mjs lists any character the font lacks; pass --font with a full TTF to render it.
How is this different from Chronicle Scroll?
Chronicle Scroll turns a topic (a historical person, a landmark, a place or an animal) into a fact-checked 2-3 minute ink-painting knowledge film. Poem Film starts from one poem: its backstory, one shot per line chosen by the poet's mood and the whole poem written out at the end, with no narration.