Ukiyo-e 浮世绘

A Journey Toward the Mountain·44s·Lemo-Opuscarby Lemomo

Edo-period woodblock prints brought to life: flat colour blocks, carved ink lines, bokashi skies, paper you can feel, and a camera that moves over the print like an unrolling handscroll.

The demo: A traveller walks toward a distant mountain; every shot is a woodblock print, ending in a great wave.

TravelJapanese culturePoetry
Style prompt · STYLE.md

Edo-period woodblock prints brought to life: flat colour blocks, carved ink lines, bokashi skies, paper you can feel, and a camera that moves over the print like an unrolling handscroll. References (grammar only): Hokusai's Thirty-six Views (one constant subject placed differently each time; bold geometric cropping); Hiroshige's Fifty-three Stations and Hundred Famous Views (small figures, rain lines, extreme foreground framing); the anime Mononoke (2007) (print texture alive in motion, flat layers sliding, seals as screen language). Never reproduce a specific famous print (no copy of The Great Wave, Red Fuji, Sudden Shower over Ōhashi), and never copy their characters or compositions.

1. Essence, and what it is not

Every shot is a complete woodblock print: a sheet of washi, a thin double ink border, flat areas of colour printed from separate blocks, a black key-block line on top, a vertical title cartouche and a red seal. The world is flat on purpose. Depth comes from stacked horizontal layers, mist bands and bold cropping, never from perspective rendering, lighting or shading.

What makes it read as printed rather than vector:

  • Paper is always visible: warm washi, long fibres, slight edge ageing.
  • Each colour is its own block, slightly out of register (1.5–2.5 px) with the key line.
  • Large colour areas show woodgrain and baren rubbing (uneven ink density, circular streaks) and fine goma-zuri specks.
  • Bokashi, hand-wiped gradients, in skies and water.

Not a flat vector illustration with a paper overlay (no woodgrain, no misregistration), not Chinese ink wash (no bleeding washes, colour is printed, not painted), not anime cel shading (no light and shadow on forms).

2. Materials & rendering

  • The sheet is the frame: the print fills the screen at zoom 1, inside a thick + thin ink border, with a paper margin beyond. Sheets can sit on a long mounting scroll (darker tan paper, a roller at one end), so the camera can travel from print to print.
  • Blocks: draw each colour group into its own offscreen canvas, cached once (key lines; blues; greens / secondary; reds / figures). Composite each with a small fixed registration offset (1.5–2.5 px, a different direction per block).
  • Texture every colour block: woodgrain (source-atop, strongest in sky and water) → baren streaks → goma-zuri specks (both destination-out); the key block gets specks only; light paper fibres over the finished sheet so paper shows through the ink. Big dynamic fills get the same textures inside their clip. Woodgrain = iso-lines of a warped noise field; baren = blurred circular arcs + zigzag streaks (recipe and alphas in DEMO.md).
  • Bokashi is generated per pixel: a gradient whose top edge wanders by low-frequency noise per column (±20–30 px). Never strips of fillRect (vertical seams).
  • Line: key lines 2.4–3 px; large contours are variable-width filled strokes, tapered at both ends, with ±20–35 % low-frequency width jitter. Distant things get a grey key line or none.
  • Motifs of the medium: mist as long rounded flat bands (suyari-gasumi) fading at both ends; pines with flat-topped needle pads; fields as high, flat, parallel layers whose cross lines are parallel and slanted, never converging; rain as two sets of fine straight lines at slightly different angles under a sumi bokashi sky; water as banded blues with bokashi between bands, foam and spray left as paper.
  • Seal: characters cut out of red, chipped edges. Figures are small in the landscape (roughly 80–130 px at full sheet), flat, with a clear silhouette; faces in a few strokes.

3. Colour logic

  • A pigment set, not a colour wheel: 6–9 flat hues, each printed from its own block, over the paper ground. No gradients except bokashi, no shading on forms.
  • Sumi key line over everything; paper is the white (no white pigment for foam, snow, mist, blank sky).
  • One dominant hue family carries sky and water (in the 19th-century prints, Prussian blue); red is rare: seals, a sun, one garment or tab.
  • Far layers pale and low-contrast, near layers saturated with dark key lines.
  • Examples, one per film: an indigo-and-beni landscape (Prussian blue, pale blue, beni red, ochre, greens, sumi, as in our demo); a bijin-ga interior (pale pink, mauve, grey-green, lacquer black, a mica-grey ground); an autumn surimono (persimmon, ochre, grey-green, deep brown, one blue).

4. Type & subtitles

  • Subtitle = a horizontal cartouche: a cream slip with a thick + thin ink border and a small red seal at the left; Shippori Mincho (500) in sumi, centred near the bottom. It "prints" in with the reveal mask and fades out. Hold ≥ max(1.8 s, speech + 0.6 s). It covers the bottom ~150 px: keep ground lines and figures above it.
  • View cartouche: vertical cream slip, thick + thin border, a pale tab with the series title, the view title below in a brush font (e.g. Yuji Syuku), a seal beside: the "full stop" of each view. Titles live on the print as cartouches and seals, never as floating type.

5. Motion quality

  • Prints are still. Most of the frame does not move; each view has one or two small actions (steam, rain, a lantern, a falling leaf).
  • Figures and nature step at 8 fps; rain and fast water at 12 fps; the camera moves on ones (24 fps). A stepped camera judders.
  • Printing reveal: each block appears over ~0.3 s with a diagonal baren sweep with a noisy edge, sliding 5–6 px into registration as it lands (pure noise looks like mould).
  • Cartouches drop in (fade + a short slide); a seal stamps (scale ~1.35 → 1 in 0.2 s).
  • A native move needs a held beat of about a second to be read; a peak flashed in under a second reads as noise.

6. Camera grammar

The camera moves over prints and between them; it never rotates in 3D space inside one. Opening and ending come from the topic.

Move What it expresses Can serve
Locked frame on one sheet Reading a print on a wall a place; a portrait; a still moment
Handscroll slide, right → left through the mounting gap (shorter slides = urgency) Travel, the next station a journey; a sequence of steps; a race
Very slow push toward a framing device (a window, a fan, a gate) Attention narrowing discovery; longing; a detail that matters
Tilt past the border into the mount Something larger than the print a flood; a rumour; a giant
Pull-back from one sheet to many The series seen whole a summary; a timeline; a collection
Crash-zoom into the texture (grain, specks, fibres) The medium itself becomes the image a dream; a breakdown; a memory dissolving
Pan across a triptych (three sheets side by side) One scene too wide for one sheet a procession; a battle; a festival
Hard cut to a blank sheet Ma (間), a held breath aftermath; a pause before a decision

Framing: bold cropping and extreme foreground elements (a branch, a post, a lantern crossing the frame) are native; depth by stacking, never by perspective. Allowed transitions: scroll slides, printing reveals, a wash back to paper, a cut to blank. No cross-dissolves, no 3D flips.

7. Sound palette

  • Japanese instruments, not piano and pads: shamisen (core/audio/pluck.py shamisen, with sawari buzz), shakuhachi, koto, taiko and shime-daiko, kotsuzumi / ōtsuzumi calls, hyōshigi (wooden clappers), a small bell.
  • Modes: miyako-bushi (in scale), yō, ritsu; long breathy tones with a slide into each note and meri drops at phrase ends suit the shakuhachi; the shamisen can hold a pulse or an ostinato.
  • Techniques, as options: absolute silence as ma (cut reverb tails too); a single sawari note left ringing; free-rhythm breath phrases against a steady pulse; clappers that accelerate (the kabuki curtain call); a taiko heartbeat that tightens into a roll; a koto glissando for a turn of season; a drum call (kakegoe) before an entrance.
  • Foley follows the material: paper (baren rub = band-passed noise with a slow circular modulation; scroll slide; seal = low thump + tacky peel), wood (block set down, hollow steps), glass (wind chime), water, birds and insects of the season.
  • Voice: calm, few short lines, like a poem written beside the print. Duck music ~8 dB under voice, ambience ~4 dB. Loudness −14 LUFS; mux.sh grain 0 (the paper is the grain).

8. Native moves

A menu: use the ones your story needs.

  • A series of views. One constant subject in different compositions; the story is told by where it sits in the frame each time. Fits content like: one building through a century; a product in five homes; the same street in four seasons.
  • The handscroll. Scenes don't cut; the camera slides right to left and the next print arrives. Fits content like: a supply chain; the stations of a pilgrimage; the steps of a recipe.
  • Printing, block by block. Key line first, then each colour lands slightly off and snaps into register. Fits content like: a building going up; an idea taking shape; a character being "made" for the story.
  • Paper is the white. Foam, snow, mist and blank sky are unprinted paper; white can flood the frame and wash the print back to a blank sheet. Fits content like: a snowfall that erases a town; forgetting; a clean start.
  • The frame is an object. Border, cartouche and seal are physical; something big enough breaks out of the border into the mount. Fits content like: a festival that can't be contained; a legend; a runaway success.
  • Alternate impressions. The same key block reprinted with different colour blocks (day → night, spring → winter). Fits content like: before and after; a city lit at night; two lives in one house.
  • The triptych. A scene split across three sheets that join. Fits content like: three generations; a panorama of a harbour; a debate between three voices.

9. Pitfalls of the medium

  • Bokashi from fillRect strips leaves vertical seams → build it per pixel.
  • Too much speckle or fibre makes dark areas look like sandpaper or scratched film → specks α ≈ 0.3, fibres α ≈ 0.09.
  • A perspective grid for fields looks digital → parallel, slanted, flat layering.
  • Pine clusters drawn as half-discs look like parasols → flat pads with needle fans.
  • Offset curves self-intersect at tight bends → build inner lines from the gentle side of the contour; force control points x-monotonic.
  • Breaking out of the print must escape both the sheet clip and the frame clip.
  • A seal drawn with multiply vanishes on dark ground → source-over there.

10. Engine

In demo/: print.js (paper, woodgrain, baren, specks, blocks, bokashi, carved lines, reveal masks, cartouche, seals: the reusable core), nature.js (mountains, pines, rocks, rain, birds), wave.js (banded water, fractal claws, spray), traveler.js (flat figure rig), views.js (prints as cached blocks + per-frame paint()), main.js (camera, scroll, reveal, subtitles), music/score.py. Instrument recipes and commands: DEMO.md.

11. Variation space

You decide the constant subject (or none), the number of views, the characters, the opening, the ending, the camera path, the pacing and the pigment set. All far from our demo:

  • Structures: alternate impressions (one key block of a single street, reprinted for dawn, rain, festival night and snow); a triptych unfolding (three sheets revealed one at a time, the story only readable when all three join); a print being made (the carver's blocks, one per shot, each block's colour telling one chapter).
  • Openings: a close crop (an extreme foreground detail, a lantern or a sleeve, fills the sheet; the pull-back finds the print); the bare block (carved wood inked, the paper laid on, the baren rubs; lifted to reveal the first print); the mount first (a closed scroll unrolls to its first sheet).
  • Endings: a seal alone (the print fades back to paper, only the red seal remains); the album closes (sheets stack like pages, the cover lands); the last print left unfinished (key line only, colour blocks never land).

How our demo was made (story, shots, score, end card, build): DEMO.md. Read it after your treatment exists.

Director's notes for the demo film

One example among many. Don't reuse its story, arc, shots, props or timings.

Demo: Toward the Mountain · 山へ五景 (44 s) · ukiyoe.mp4 · source in demo/

Story & structure

A traveller in a straw hat walks from the rice fields toward a distant mountain: across a bridge in the rain, past a teahouse where the mountain waits in a round window, to a sea that stands up between them. The wave washes the print back to a blank sheet; the next print is the mountain, and he takes off his hat. Five views, one constant subject; the story is told by where the mountain sits in the frame each time (tiny on the horizon → framed by a window → dwarfed by a wave → filling the sheet). One character, one goal, one turn.

Arc: jo-ha-kyū (序破急), slow, open, still (jo) → gathering pulse (ha) → rapid rush to a peak (kyū) → a hard cut to silence (ma, 間) → a quiet resolution and a scale reveal. The old guide asked every film to rest on at least three of the five native moves with the strongest at the peak; that was this demo's choice, not a rule.

Native moves spent: a series of views (the whole film), the handscroll (every transition), printing block by block (the opening and the rebirth after the wave), paper is the white (the foam that erases the print), the frame is an object (the wave breaking out of the border). How the old guide suggested adapting a topic, for this kind of story: make it a journey or a series with one constant subject (a product launch → five views of the product in five places; a city → a day in five prints; a life → five ages, the same tree in every print).

Views: 一 田毎の朝 (rice fields at dawn) · 二 雨の橋 (bridge in the rain) · 三 茶屋の窓 (teahouse window) · 四 海立つ (the sea stands up) · 五 山 (the mountain).

Shots

Beat Camera
Opening Locked on a blank sheet; the first print is printed block by block in front of us
Early views Locked frame, like reading a print on a wall. The subject is small
Middle view A very slow push (1.00 → 1.065) toward a framing device (round window)
Transitions Handscroll slide right → left through the mounting gap, getting faster: 1.0 s → 0.9 s → 0.6 s
Climax First big move: tilt up past the top border into the mount, push in; then crash-zoom into the foam
After the climax Hard cut to a blank sheet, hold (間), then reprint
Ending Pull back from the last print to reveal the whole scroll: every view side by side (scale reveal); end card on the scroll

The climax got the only big camera move of the film, played in four beats (~4.5 s total; 25.4–30.4 s in the final cut):

  1. Rise (~1.9 s): the sea swells into a wall; the camera tilts up past the top border and widens slightly so the figure shrinks.
  2. Hang / 亮相 (~1.2 s): the crest stands outside the border in the mounting paper, claws open and nearly frozen (jitter ×0.25); the whole print is visible as an object. The drum roll peaks, then an 80 ms silent intake of breath.
  3. Fall (~1.2 s): the lip lengthens and rotates down toward the lens, claws grow ×2.5, camera pushes to 3× with a small roll.
  4. Foam (~0.7 s): fractal claws burst from the lip to fill the screen, fade to bare paper → hard cut to silence (ma, 30.4–32.2 s).

Then four reprints (32.2 / 32.7 / 33.2 / 33.7 s), the last line at 34.4 s, the final print at 38.4 s, the pull-back 38.9–40.9 s, the end card from 40.3 s. The first cut's climax lasted 0.7 s and read as "some foam flashed"; the four-beat version is why STYLE.md asks for a held beat of about a second.

Subtitles stay clear of the figure: bottom band ~80 px from the edge; figures were moved up where needed.

Score structure

Original score (demo/music/score.py) on shamisen, shakuhachi, taiko and hyōshigi, following jo-ha-kyū:

  • Hyōshigi claps accelerate over the opening printing (one clap per block), the kabuki curtain call.
  • Shakuhachi in free rhythm, miyako-bushi scale (D E♭ G A B♭), long tones with breath, a slide up into each note and meri drops at phrase ends.
  • Shamisen: slow pulse (72 BPM), then an ostinato (96 BPM) with a small tight drum; a fast rising run on the fastest scroll slide.
  • Taiko heartbeat that accelerates from 0.9 s intervals to a roll for the climax; one full hit on the crash; then absolute silence (reverb tails cut too). Four big taiko strokes reprint the last view. The opening shakuhachi motif returns and resolves; a long shamisen note with sawari rings out under the end card.

Instrument recipes (reusable):

  • Shakuhachi from samples: flute / recorder, flatten amplitude and pitch vibrato (divide by a 60 ms envelope; f0-track and counter-warp), add 1–4 kHz breath noise locked to the envelope, a muraiki breath burst on attacks.
  • Taiko from samples: gran_cassa + toms:low_mallet + frame_drum:large + a synthesized skin (pitch drop ~120 → 58 Hz) and a stick thud.

Foley specific to this film: baren rub with a ~9 Hz circular modulation, hollow bridge steps, wind chime partials 2.36 / 5.15 / 7.98 kHz, field trickle, rain bed with drops, sea swell every ~4 s, lark chirps, geese, a kite's pii-hyoro on the last view.

Voice: calm male storyteller, first person, 5 short lines (Kokoro am_adam, speed 0.84–0.88). Music ducked ~−8 dB under voice (−10 dB on the last line), ambience ~−4 dB. Subtitle hold in this demo: ≥ max(1.8 s, voice + 0.75 s).

Palette & props

Canvas & sheet. 1920×1080 sheet = screen at zoom 1. Ink border at x 44–1876, y 38–1042 (3.4 px) plus a thin outer line 9 px outside; paper margin beyond. Sheets sit on a long mounting scroll (#c9b690, 260 px gaps) with a wooden roller at the left end.

Palette (this film's pigment set):

Name Hex Use
Paper #eee2c6 washi base (with ±3 % mottling, fibres #fbf6e9 / #c7b893)
Prussian blue #1d3a66 · dark #13284a · light #4d6f98 skies, water, mountain, wave
Deep trough #0f2344 inside of the wave
Pale blue #8db0c6 · #bcd0d6 water reflections, lower sky
Sumi (key block) #231f1c all key lines
Beni red #b8412f · pale #e3a08a · peach #efc4a8 sun, felt bench, seals, dawn bokashi, cartouche tab
Ochre / straw #cf9f4a · #c9a45c hats, roads, obi
Greens #8aa152 · dark #50703c · pine #3e5a3a fields, trees
Indigo cloth #2c4a70 · gaiters #1d2c44 clothing

Blocks. g0 key lines · g1 blues · g2 greens / secondary · g3 reds / figures, composited with fixed registration offsets g1 (2.2,−1.3), g2 (−1.8,1.9), g3 (1.5,2.2). Printing reveal: ~0.34 s per block.

Texture recipe. On each colour block, in this order: woodgrain source-atop α ≈ 0.1–0.17 (sky/water strongest), baren streaks destination-out α ≈ 0.38 (0.2 on dark wood), goma-zuri specks destination-out α ≈ 0.3. Key block: specks only (α 0.12). Over the finished sheet, light fibres (α ≈ 0.09). Woodgrain = iso-lines of a warped noise field (u = y·0.035 + fbm·9 + knots), thin dark lines where |frac(u)−0.5| > 0.4 plus broad tonal bands. Baren = ~260 blurred circular arcs + zigzag streaks. Dynamic big fills (the wave) get woodgrain + a paper-coloured baren overlay inside their clip. Bokashi: per pixel, top edge wandering ±20–30 px per column.

Props:

  • Mountain: asymmetric concave slopes (y = s^1.55 left, s^1.8 right), a notched summit, snowcap as drips down the gullies: 12 fingers of random depth (some long), narrow and pointed, joined by a gently wavy snow line; right-side shade band; pale beni glow on the snow at dawn. An original silhouette, not Fuji's.
  • The wave: normalised outline (back slope → crest → forward lip → curl → hollow front). A vertical wall of water whose crest falls toward the lens, with the traveller on a rocky headland, deliberately not the boat-and-wave composition of The Great Wave. Body in three blue bands with bokashi between them (light blue by the crest → Prussian → deep trough), made from thick strokes of inward offsets of the back-slope curve; grouped white flow lines (3 lines per group, broken into long arcs). Foam rim along the crest; fractal claws: each big claw splits into 3 fingers, each finger splits again, all tips hooking inward; a pale-blue back layer offset behind the white front layer; spray in clusters (one big dot, a few medium, many small).
  • Claw roots grow out of the foam: taper the root to ~40 % width, then bury it in irregular white foam blobs (stroke all blobs first, then fill all → one union outline). Claws stuck straight onto the crest read as planks.
  • Bridge: a side-view arched (taiko) bridge, not the diagonal bridge-over-river composition.
  • The traveller (80–130 px): side view, low conical kasa hiding the upper face, tucked-up kimono with the back corner tucked into the obi, dark gaiters, straw sandals, staff, bundle knotted at the chest. Close views: shaved pate (pale blue-grey), folded topknot, one-stroke eye. Poses: walk / stand / hold hat / straw cape / sit & drink / back view / hat off.
  • Cartouche: cream #f3e7c6, pale beni tab with the series title.

Titles, subtitles & end card

  • Subtitle cartouche: cream rgba(243,231,198,.96) slip, 2.6 px + 1 px ink border, a small red seal "旅" at the left, Shippori Mincho 500 42 px in sumi, centred 72 px above the bottom. It prints in over 0.22 s with the reveal mask and fades out over 0.25 s.
  • View cartouche (vertical, Yuji Syuku): 一 田毎の朝 · 二 雨の橋 · 三 茶屋の窓 · 四 海立つ · 五 山, seal below/beside. Cartouche drop-in: fade + 14 px.
  • Title: a vertical cartouche 山へ五景 + a horizontal English slip Toward the Mountain laid on the first print, stamped with a seal, lifted away before the first line.

End card

The whole scroll across the middle on dark indigo #161a22; title above, UKIYO-E · a Lemo-Opuscar demo · LemoLab × Claude Opus 5.5 below, one seal (drawn source-over, not multiply, on the dark background). The "LemoLab × Claude Opus 5.5" sign-off belongs to this library's demo only; a user's film carries no LemoLab credit and no copy of this card.

Build notes

styles/ukiyoe/demo/
  print.js     paper, woodgrain, baren, specks, blocks, bokashi, carved lines, reveal masks, cartouche, seals
  nature.js    mountain + snow drips, pines, rocks, rain, geese, simple claws
  traveler.js  the traveler (walk / stand / hold hat / straw cape / sit & drink / back view / hat off)
  views.js     the five prints: cached blocks (g0–g3) + per-frame paint()
  wave.js      sea rows, wave geometry, banded body, fractal claws, spray clusters
  story.js     the timeline (single source of truth)     main.js  camera, scroll, sheets, reveal, titles, subtitles, events
  lines.json   voice   music/score.py  original score   mix.py  foley + voice + ducking + the silent ma   subs.py  cues → srt
  build.sh     one-command rebuild
  1. node core/render/still.mjs styles/ukiyoe/demo <t…> (--q nosub=1, --q test=trav for the character sheet, --q poster=1).
  2. core/tts/tts.py lines.json voices → core/tts/asr_check.py.
  3. node core/render/events.mjs styles/ukiyoe/demo → music/score.py → mix.py.
  4. node core/render/video.mjs styles/ukiyoe/demo --fps 24 --workers 3 (1056 frames ≈ 45 s, Canvas2D).
  5. core/render/mux.sh out/video24.mp4 mix.wav ukiyoe.mp4 24 0 → check_asr.py ukiyoe.mp4.

Or simply sh styles/ukiyoe/demo/build.sh.

Pitfalls tied to this demo's props:

  • A zig-zag snow line looks like a crown; smooth waves look like icing. Use narrow pointed drips of random length, and force control points to be x-monotonic (otherwise tiny self-intersecting loops appear).
  • The first wave looked like a waterfall curtain (flow lines fanning from the base). Flow lines must follow the back-slope contour; the body needs banded blues; claws must branch and hook inward: a single curled strip reads as a ribbon.
  • Offset curves self-intersect at the tight lip → only use the back slope for inner flow lines.
  • The wave breaking the border must escape both the sheet clip and the frame clip; its sides are clipped to the frame so only the top breaks out.
  • mountain() filled only when a flat colour was passed, so gradient bodies were transparent: watch option flags.
  • A seal drawn with multiply vanished on the dark end card and on the wave → source-over there.
  • The traveller walking past a foreground tree read as "in front of" it; keep low branches clear of the walking path.
  • The subtitle band covers anything in the bottom 150 px: ground lines and figures were raised.