動画をコードで書く言語

mophila
mophila という、動画を生成するためのインタプリタ言語を作った。
.moph のスクリプトを実行するとプレビューが表示され、オプションを付けると実際に動画を書き出せる。
- mophila のコード
let v = View(box = (16, 9))
let c = Circle(position = Pos(8, 4.5), radius = 1, fill = #ffb454)
v.place(c)
let grow = context c as o {
motion (t) {
0s: o.radius = 1
3s: o.radius = 3 :ease
}
}
let track = Timeline()
track.place(grow, at = 1s)
v.addTrack(track)
output v
- 動画ファイルにレンダリング
mophila render circle.moph -o circle.mp4 --size fhd --fps 30
ちょうどいい言語を探す
ベクタ画像をアニメーションさせて動画を作るプログラミング言語が無いかと探したが、ちょうど良いものが見つからなかった。
こんな感じの言語があったらいいなという程度の仕様を適当に起こして、Claude Code に作ってもらった。
ベタ塗りでも動かせば表現力はある
ベクタ画像はラスタ画像より容量が小さい。
特にベクタ画像でよくあるベタ塗りの絵は圧縮効率が良く、png や webp にするとかなり小さくなる。
ベタ塗りでも、アニメーションさせれば表現力はそれなりに出るはずで、プレゼンやビジュアライゼーションに使えそうだと思っている。
グラフィックエンジン
プログラミング言語を書くなら Rust が良いということで、Rust のグラフィックエンジンを調べたら Vello というものが見つかった。
まだ安定版ではないようだが、個人のプロジェクトなら十分。
レンダリングは Vello の API に合わせてできるものを実装していく形にして、動画ファイルへの書き出しは ffmpeg のライブラリでコンテナに各トラックを配置している。
丸と四角を動かすところから
最初は丸や四角が動くだけのものを書いてみた。
プレビューは時刻に合わせてリアルタイムにレンダリングする。fps は安定しないが、意外とスムーズに動く。
60fps で render すると、かなり滑らかになる。毎フレーム描き直してファイルを作っているらしい。
基本図形を組み合わせれば複雑なものも作れそうだったので、モジュールシステムを用意した。音楽ファイルを import して track に含めることもできる。
言語で書いているだけなので、フレームレートは 5fps でも 60fps でも好きに出せる。fps を上げても中間の状態を余分にレンダリングするだけだし、動画のサイズを大きくしても広いスケールで絵を描くだけ。滑らかに、細かくするほど時間はかかるが、それだけで済む。
ドキュメントを書いたらバグが見つかった
docgen でドキュメントを作った。
作ってみると、バグが見つかったり、設計の穴や足りない機能に気づいたりした。
人に教えるという工程は、AI にも効くのかもしれない。
フラクタルを拡大する動画
マンデルブロ集合を描いたらおもろいんじゃないかと思って、書かせてみた。
フラクタルの画像の計算は、同じ関数のパラメータを変えるだけでいろんなバリエーションが出せるらしい。
エスケープタイム系フラクタルという変なライブラリモジュールを作った。
これによっていろんなフラクタル画像を生成できる。
以下は、マンデルブロ集合を拡大していく4K動画