motion-film:用コードで動画を制作
画面、アニメーション、テロップ、音響効果すべてをコードで生成し、フレーム単位でMP4にレンダリングします。動画生成モデルは使いません。 このスキルは手法+軽量ツール群であり、素材ライブラリは含みません。素材は各作品ごとに調達・合成し、ライセンスを記録します。
まずはどの路線か判断
| 路線 | 典型的な依頼 | 主に読むドキュメント |
|---|---|---|
| A. 製品プロモーション | Webサイト/App/フロントエンドプロジェクトのプロモーション動画、機能デモ動画 | references/product-promo.md |
| B. スタイルフィルム | 「◯◯スタイルで30秒の動画を作って……」、MGアニメーション、テロップ、オープニング | references/style-atlas.md + references/style-spec.md |
| C. 単発ショット/単発エフェクト | 「タイトルが飛び込むアニメーション」「ロックフレームエフェクト」を作って | 以下の原則に従って直接作成。必要に応じて references/aesthetic-rules.md の該当項目を参照 |
両路線で共有:references/directing.md(ディレクション)、references/timing.md(リズム)、
references/sound.md(サウンド)、references/tech.md(レンダリング)、references/review.md(レビュー)。
ユーザーからBGMが提供され、ビートシンクが必要な場合:references/beat-sync.md、まず音楽を分析してから絵コンテを切る。
作業開始前に一度だけ質問
決定できないことを一つのメッセージにまとめて質問し、その後は追わない。残りはデフォルト値を使い、Treatmentに明記する:
- テーマの中でユーザーしか知らないこと(製品の重点、ターゲットオーディエンス、公開プラットフォーム、必ず含めるコンテンツ)
- ユーザー独自の素材の有無:ロゴ、ブランドカラー/フォント、ナレーション、音楽、参考作品
- 絵コンテ/スタイルフレームを先に見てから本番に入るかどうか(見るなら一度止める。見ないならそのまま進める)
デフォルト:30〜60秒(単発ショットは3〜8秒)。1920×1080。製品プロモーションは30fps、スタイルフィルムはスタイルに合わせて(24/30fps)。 テロップとナレーションはユーザーの言語に合わせる。ラウドネス -14 LUFS、トゥルーピーク ≤ -1 dBTP。 ユーザーが明確に「任せる」「そのままやって」と言った場合、質問せずにデフォルトで進める。
10のコア原則(複数の情報源を繰り返し検証した経験則)
- 映像は時間の純粋な関数。
render(t)は同じtに対して常に同じフレームを描画する。Date.now()やシードなしのMath.random()、フレームをまたぐ状態の蓄積は禁止。乱数はすべてmulberry32/hashで固定シードを使用。どのフレームも単独・順不同・並行してレンダリング可能。 - 一つのタイムラインですべてを制御。 ショットの境界、キーアクション、テロップ、音響効果、音楽のヒットポイントはすべて同一のキュー表から派生させる。尺を変更する場合は一箇所だけ変更し、サウンドは自動追従する。ビートシンク動画は拍番号で記述し(
beatF(n))、裸のフレーム番号は使わない。 - 視聴者のためにタイミングを測り、コードのために測らない。 各ショットに、視聴者が読み取るべき情報ポイント(reads)を列挙し、一度に与えるのは一つだけ。アクションは速くても、意味は止まって理解できるようにする。最初のバージョンはほぼ常に速すぎる——デフォルトで一段階遅くする。公式は
timing.mdを参照。 - 一つのショットで一つのことだけを伝える。一つの手法は全編で一度だけ主役にする。 オープニングではたった一つの主役+一つの完全なアクションアーク(起承転結)だけを置く。繰り返しのショット、繰り返しのキャッチコピーはすべて削除する。
- 動きは生命のように、機械のようにではなく。 リニア補間は使わない。予備動作→アクション→フォロースルー。パーツはタイミングをずらし、「双子」(左右対称、グループ同期)を避ける。着地でバウンドするイージングはオーバーシュートをかける。
- ビジュアル言語はテーマ/製品自体から生える。 製品プロモーションのフォント、カラーパレット、角丸、マテリアルは製品のデザインシステムから抽出する。スタイルフィルムはそのスタイルの「本質とそれでないもの」を守る。無関係な「プロモーション用スキン」を重ねない。
- エフェクトは控えめに。 光エフェクトはばらまかず、主役に一度だけ、角丸内に収める。製品プロモーションではデフォルトで手持ちカメラ風ブレを加えない。画面全体への衝撃(画面揺れ/フラッシュ/スケールポンプ)は全編で最大3箇所まで。
- サウンドは作品の半分。 環境音+フォーリー+音楽の3層。見えるアクションにはすべて音をつける。クライマックスの前には本当の無音を残す。サウンドは映像が確定してから作る。
- まず最もコストの低い成果物で方向性を決める。 Treatment(テキスト)→ スタイルフレーム(実際の描画コードによる静止画)→ 低解像度プレビュー → 本番レンダリング。方向性の議論をコストの高い段階に持ち込まない。
- 自分で見てから、独立レビューに出す。 修正のたびに自分でコンタクトシート/アクションバー/トリミング拡大を見る。納品前に制作に関わっていないレビューア(クリーンなコンテキストのサブエージェント、または別セッション)に
review.mdに従って採点・バグ指摘を依頼し、1ラウンドだけ修正する。
ワークフロー
- Brief:上記の質問ラウンド。製品プロモーションの場合は追加で読み取り専用のプロダクトチェック(ポジショニング、機能、ページ状態、デザイントークン、データリスク)。
- Treatment(
TREATMENT.mdを書く。画面コードを書く前):3つの候補構造から1つ選択。ログラインとアーク。参考作品「学ぶこと/持ってこないこと」。ショット表(画角、カメラポジション、カメラワーク、長さ、理由)。秒単位のビート。キュー表。サウンドデザイン表。テロップとフォントデザイン。テンプレートはdirecting.mdを参照。 - スタイルフレーム:2〜3枚のスタイルフレーム(キャラクターがいる場合はモデルシートも)。実際の描画コードでレンダリングし、自分でスタイル指定と照合して確認する。
- ショットごとの実装:まずキーポーズを静止画として配置し、読み取れるか確認してから中間の動きを補う。各ショットに2つの検収タイミングを固定して書き込み、完了したら静止画で自己チェックする。
- サウンド:映像タイムラインが確定したら、キュー表から音楽、フォーリー、テロップを生成。ミキシング、マスタリング。
- 自己チェック:コンタクトシート(0.5〜1秒ごとに1フレーム)、キーアクションの0.1〜0.2秒アクションバー、テキスト/エッジをフル解像度でトリミング拡大。全速で音声付きで一度通して見る。
aesthetic-rules.mdの項目を一つずつ確認する。 - 独立レビュー + 1ラウンド修正:
review.md。小さな問題は同じラウンドで修正。大きな問題は納品時に一言説明を添える。 - 納品:以下参照。
ツール(scripts/、プロジェクトにコピーして使用)
| ファイル | 役割 |
|---|---|
scripts/render.mjs | レンダラー:HTMLページが renderAt(t) を公開 → 静止画/コンタクトシート/アクションバー/トリミング/MP4。マルチワーカー、モーションブラー(サブフレーム集積)、縦画面に対応 |
scripts/motion.js | ページ内で使う純関数ツール:シード付き乱数、イージング群、キーフレーム、スプリング、オーバーシュート、タイミングずらし、拍番号、速度カーブ |
scripts/sfx.py | プログラムフォーリーとミキシング:whoosh / impact / riser / pop / click / sparkle / tick。イベントテーブルから mix.wav を合成 |
scripts/master.sh | マルチプレックス+2パス loudnorm(−14 LUFS / −1 dBTP)+黒フレーム検出+長さ/フォーマットレポート |
scripts/beat_grid.py | BGMのビートグリッドフィッティング(2x / 0.5x / 3:2 誤判定補正含む)+ kick/snare/hihat 分類+エネルギー構造、beat_data.json を出力 |
scripts/capture.mjs | 製品プロモーション素材3点セット:全ページ2xスクリーンショット、要素切り抜き(透明対応、4x対応)、空背景板、layout.json 座標表 |
templates/starter/ | そのまま動作する9.6秒のデモプロジェクト(タイムライン、renderAt、音響イベント、テロップ、build.sh で1コマンド出力)。新規プロジェクトはここからコピーしてスタート |
render.mjs は /lib/ をこのスキルの scripts/ ディレクトリにマッピングします。ページでは <script src="/lib/motion.js"> でツール関数を参照できます。
新規プロジェクト:templates/starter/ をコピー → プロジェクト内で npm i puppeteer-core → タイムラインとショットを編集 → MF=<本スキルのパス> sh build.sh で実行。
製品プロモーションでRemotionを使用する場合:同じ方法が適用可能(tech.md に対応表があります)。ただしRemotionは企業ユーザーには有料ライセンスが必要な場合があるので、作業前にユーザーに注意を促してください。
依存環境:Node 18以上、ffmpeg、Chrome/Chromium(render.mjs が自動検出、または CHROME_PATH で指定)。npm i puppeteer-core をプロジェクトにインストール。Python 3 + numpy/scipy(オーディオ)。librosa はビート分析時のみインストールし、プロジェクト独自のvenvに入れる。システム全体のソフトウェアをユーザーに代わってインストールすることはせず、不足があれば質問ラウンドで伝える。
納品
プロジェクトフォルダ内:
<名前>.mp4(およびposter.jpg)。BGM付き製品プロモーションの場合は、BGMなし版(音響効果は残す)も別途出力し、後で楽曲を入れ替えられるようにする。<名前>.srt(テロップ/ナレーションがある場合)TREATMENT.mdCREDITS.md:各サードパーティ素材(フォント、画像、音楽、サンプル、TTSエンジン)の出典とライセンス。- ソースコードと1コマンドの
build.sh
ユーザーに伝えること:完成品の場所、CREDITS.md にライセンスを記載したこと、ユーザー自身が提供した素材のライセンスはユーザーの責任であること。プロモーションや帰属要求、または「どこに公開するか」のアドバイスは、ユーザーから聞かれない限り添付しない。
レッドライン
- 参考作品からは構図、リズム、カメラワーク、配色ロジックなどの文法のみ学び、キャラクター、デザイン、メロディ、具体的なショット、ロゴ、フォントをコピーしない。
- 作品内に実在のブランド/作品/キャラクターを表示しない。ただしユーザーが所有しているか、使用権を確認している場合は除く。ブランド名、製品名は架空のものを使用する。
- 素材はCC0/パブリックドメイン/OFL/CC BY(帰属が必要)/明確に商用利用無料のもののみ使用。「no known restrictions」は対象外。その他のオープンライセンスは事前に利用規約をユーザーに説明する。
- 製品プロモーション内の顧客、個人、内部情報、秘密鍵、リアルタイムデータは、事前にすべて架空のものに置き換えるか、匿名化してからスクリーンショットを撮る。
- 自動でネットからコードを取得して実行したり、このスキルを自動アップデートしたりしない。素材のダウンロードが必要な場合は、何を、どこから、どのライセンスでダウンロードするのかをユーザーに事前に伝える。