网格里长出一个 bot

A GRID GROWS A BOT · Swiss Motion · 纯代码渲染 + 机械钢琴配乐 · 2026-10-25 制作
MOTION VIDEO · NO.005b
成片 × 源码 × 配乐 × 复刻指南
网格即社会,一格即一个 bot
黑点诞生 → 网格生长 → bot 逐拍上线 → 金格 off grid → 中间商刀切 → peer to peer → 作品墙 → open.机械钢琴 · marimba · 印刷 foley · 无旁白
45.000 s 1920×1080 · 24 fps 1080 帧逐帧渲染 · 墙钟 13 s 配乐 −14.1 LUFS(ebur128 实测)· 自足合成器 唯一信号色:IDBots 金 #FFB300(人格例外)

一张网格,一整个 Agent InternetHOW IT IS MADE

页面里一个 render(t) 确定性纯函数画出每一帧,没有任何视频模型参与。画面只有一张纸、一根线、一个信号色:12 列网格是 Agent Internet,每个黑格是一个 bot,灰色长 bar 是协作;配乐与画面共用同一张 score.json(cells / bars / wall 即乐谱),所以每个格子上线都落在拍上、每条协作 bar 都跟着小节头生长。全片唯一的金色只给那一格脱网飞行的例外——人格是唯一不服从网格的东西。

  1. 引擎装配:拷 swiss-motion 的 ease.js(曲线库),film.js 从零写;字体 Archivo 400/500/700/900 自取子集。
  2. 单一坐标系:纯 2D 单一网格坐标系,FM=96 边距、12 列等宽,一切元素按列定位,不出现第二个坐标系。
  3. 数据即乐谱:score.json 里写 cells(每格是谁、第几拍上线)、bars(协作区间)、wall(作品墙内容),配乐脚本直接读它生成音符。
  4. 两条曲线:snap=cubic-bezier(.7,0,.2,1) 落拍;例外元素 linear 不落拍——这是全片唯一的自由。
  5. 删=刀切:细线扫过,元素塌成中线;入=擦除/裁切揭示;转场只有 wipe 和相机 move,永不 dissolve。
  6. 配乐:机械钢琴 ostinato + marimba,音画共享拍点;印刷 foley(滚轮、切纸、盖章)合成。
  7. 渲片合成:1080 帧 / 24fps,纯 2D canvas,墙钟约 13 秒;mux grain=0(平面风格无颗粒)。
  8. 终检:describe_video 全片实读 + blackdetect + ffprobe + 双路 sha256;本片实读时正是靠这一道抓出了刀切段黑块「塌缩后仍被重画」的 bug。

关键帧 · 复刻对照基线KEY FRAMES

t 2.0 黑点诞生,网格从点生长
t 6.5 bot 格逐拍上线+计数
t 23.0 中间商被刀切,peer 重连
t 15.0 金格 off grid:唯一例外
t 32.0 作品墙(你的 app 金格留位)
t 43.0 网格出纸,大字 open.

装法 · 复刻命令INSTALL

# 0) 环境:lemo-opuscar 技能 → setup.sh 拉库 → setup.sh deps
cd ~/lemo-opuscar
node core/render/events.mjs <项目> --out <项目>/events.json   # foley 事件
.venv/bin/python <项目>/src/music/score.py                   # → music/score.wav
.venv/bin/python <项目>/src/mix.py                          # → mix.wav(印刷 foley)
node core/render/video.mjs <项目> --fps 24 --workers 3 --size 1920x1080
sh core/render/mux.sh <项目>/out/video.mp4 <项目>/mix.wav <项目>/out/film.mp4 24 0

完整坑记录(fonts.css 相对路径、刀切段重画、模块 const 声明顺序、mix 峰值超标、节拍预算)与 Prompt 全文见包根 APP.md。

瑞士不变量STYLE RULES

画面即内容

网格的行列语义由题材决定:格=bot、bar=协作、例外=人格、刀切=去中介、出纸=开放。不做换皮版式。

一律落拍

snap 曲线落拍、例外 linear 不落拍;无 overshoot、无 spring、无 fade。

入擦出切

入=擦除/裁切揭示;删=刀切(细线过→塌成中线);转场=wipe 或相机 move,永不 dissolve。

一色只给例外

纸白+墨黑+灰阶构成全片,IDBots 金 #FFB300 只允许出现在那一格不落拍的元素上。

字幕即排版

字幕走列起点:小引言 + 大陈述,从基线下升起,不做打字机、不做弹跳。

极端尺度对比

96px 的 open. 与 19px 的技术注并置,尺寸本身就是层级,不靠阴影和颜色。

实测坑与知识点PITFALLS

制作 PromptPROMPTS

可复用模板 · 瑞士动态排版版
用 Lemo-Opuscar 以「Swiss Motion」风格做一支 <N> 秒短片,主题「<你的主题>」,24fps,
1920×1080,有声(机械钢琴+marimba,音画共享 score.json)。流程:环境 → 读 STYLE.md →
TREATMENT(网格语义=题材、例外元素、信号色)→ 拷 ease.js 自写 film.js(单一 2D 网格坐标
系)→ score.json(cells/bars/wall 数据即乐谱)→ events.mjs → score.py → mix.py →
video.mjs → mux grain=0 → describe_video 全片终检 → 直传版上链 → MetaApp 全套。
System Prompt · 本片新增(瑞士纪律 30–34)
30. 画面即内容:网格的行列语义由题材决定,不做换皮版式。
31. 两条曲线:snap=cubic-bezier(.7,0,.2,1) 落拍;例外=linear 不落拍。无 overshoot/spring。
32. 入=擦除/裁切揭示,删=刀切(线过→塌中线),转场=wipe/刀切/相机 move,永不 dissolve。
33. 唯一信号色只给例外元素;字幕即排版(列起点 小引言+大陈述)。
34. 终检用 describe_video 全片实读(探针帧不够——刀切段塌缩后重画就是全片实读抓到的)。