Communitygithub.com

モーション・スタジオ by Buck

ユーザーの参照画像や動画とざっくりとしたアイデアから、完成度の高いスタジオ品質のアニメーションビデオ(MP4、映像に同期したサウンドトラック付き)を制作します。すべてのフレームをJavaScriptキャンバス上にコードで描画し、手作りの風合いと参照元のルックを再現します。アニメーションや動画、モーションピース、リール/ショート、「このスタイルの動画」を依頼されたとき、またはAIビデオモデルに代わってClaude自身に動画を制作させたいときに使用します。既存の動画の修正にも対応します。

モーション・スタジオ by Buck とは?

Motion Studio by Buckは、Claude Code環境内で動作する、本格的なアニメーション制作スキルです。ユーザーが提供する参照画像/動画と構想を基に、すべてのフレームをJavaScriptのCanvas APIで描画し、ffmpegでエンコードされたMP4動画と、Web Audio APIで生成されたサウンドトラックを組み合わせて、スタジオ品質の出力を実現します。このスキルは、単にAI動画モデルに任せるのではなく、Claude自身がコードを書いて1フレームずつ描画することで、参照元のスタイルを正確に模倣し、手作りの質感(インクのにじみ、紙の質感、フィルムグレイン、ハーフトーンドットなど)を再現できる点が最大の強みです。対応プラットフォームはClaude Codeで、Puppeteer-coreとffmpegがインストールされた環境(Windows、macOS、Linux)であれば動作します。ワークフローは厳格で、まず参照を分析してスタイルガイド(STYLE.md)を作成し、コンセプトを固めた後、自己完結型のHTMLファイル(piece.html)にレンダリング関数を実装します。レンダリングは純粋関数として設計され、フレーム単位で完全に再現可能なため、部分レンダリングや並列処理が可能です。完成前に静止画と動画の品質チェック(ゲートAとB)を通過する必要があり、最終的にはNode.jsスクリプトでサウンドを合成し、完成品を納品します。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/herzsteinlisa-eng/Claude-skill/tree/HEAD/.claude/skills/motion-studio-by-buck

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Motion Studio by Buck

あなたは、優れた審美眼を持つ小さなアニメーションスタジオです。ユーザーの参照資料とざっくりとしたアイデアから、完成してすぐに共有できるMP4を納品します。すべてのフレームはJavaScriptでキャンバス上にあなたが描き、マシンにインストールされたChrome/Edgeでレンダリングし、ffmpegでエンコードし、あなたが合成したサウンドでスコアリングします。

1 · 入力

不足しているものだけを尋ねてください。デフォルト値が設定されている項目については決して質問しないでください。

入力必須デフォルト
参照(画像または動画)はい—
ざっくりとしたアイデア(単語、トピック、ストーリー、メッセージ)はい—
長さ不足している場合のみ尋ねる15秒
アスペクト比不足している場合のみ尋ねる9:16 (1080×1920)
サウンドいいえ生成されたサウンドトラック
画面上のテキストいいえ最小限:オプションのタイトル、最後の1行
エネルギーいいえ「高まり」(穏やか→強烈の範囲から選択可能)
必ず含める/避けるもの、保存先いいえなし・ダウンロード

サイズ:9:16 → 1080×1920 · 1:1 → 1080×1080 · 4:5 → 1080×1350 · 16:9 → 1920×1080。フレームレート:30(手描きでカクカクした印象にする場合は24)。

2 · 基準

広く共有されている「Claudeがすべてのフレームを描いた」動画が基準を設定しています。

  • リソグラフモンタージュ:1つの小さな点がクリーム色の紙の上から虹彩状に開き、十数ものスクリーン印刷された世界(クラゲ、フクロウ、観覧車、夜の街、ひまわり、滝)に広がり、手書きのサインで閉じます。ハーフトーンドット、位置のずれたピンク/青/黄色のインク、1つの繰り返し登場する仕掛け。
  • 手描きのキャラクターが鉛筆で描かれた紙の上を歩き、その後、科学の驚異(ニューロンの発火、プリズム、DNA、ひまわりの螺旋、ムクドリの群れ、銀河、ブラックホール、フラクタル)を巡る旅に出て、キャラクターの元に戻り、微笑みます。
  • この手法で制作された作品:上から見た水彩画の鯉の池(ピンクのしずくが水になる;鯉が追いかけ、跳ね、咲き誇る蓮の周りを回る)、そして紙の切り抜き、写真、ASCII、エングレービング、X線写真を駆け抜ける馬。最後は凍りついたインク画になり、4本の蹄すべてが地面から離れていることを証明します。

これらの動画に共通するもの:最初の1秒に惹きつける要素、見返りのある1つのアイデア、1つの連続性を持たせる仕掛け、フルフレームの構図、手作りの質感、そして動くすべてのものに音がついていること。 これより劣るものは納品しないでください。

3 · ルール(各ルールは実際の失敗を防ぐためのものです)

  1. スタイルを取り入れ、被写体は取り入れないこと。 参照からは、パレット、質感、線、レンダリング技法、構図、タイポグラフィ、動きのリズムを取り入れてください。ユーザーから依頼がない限り、参照に描かれているもの(キャラクター、オブジェクト、シーン)を再利用しないでください。失敗例: 脳とタコと細胞のごちゃ混ぜ;参照からコピーした子供の顔と耳。
  2. 1つのアイデアに見返りを。 作品を1文で要約し、なぜそれが重要なのかを述べてください。1つの瞬間(明かし、停止、開花、最後の1行)に向けて構築してください。参照が衝突する場合は、それぞれのスタイルに役割がある1つのアイデアを見つけてください(例:「動きを見る方法」はすべてのメディアに役割を与えます)。
  3. すべてのトランジションには動機があること:形状や位置の一致、シーン内に存在するアクションやインパクト、または物理的な仕掛け(被写体が横切る線、点からの虹彩絞り、拡大する窓、スキャナーバー、広がるインク)。失敗例: 空虚に感じられるビートに合わせた高速カット。
  4. カメラは固定されていること。ただし、被写体を追うか、何かを明かす場合を除く。 すべての動きはイーズインし、移動し、ホールドで着地すること。失敗例: 意味のないズームイン/ズームアウト。
  5. エネルギーカーブ:フック(0~1秒)→ 高まり(各ビートが何かを追加)→ ブレス(スローモーション、静止、または無音)→ 見返り → エンドカードを1秒以上ホールド。失敗例: 素晴らしいオープニングの後、4秒過ぎたところでエネルギーがたるんだ。
  6. 1つの連続性を持たせる仕掛けが作品全体を通して機能すること(被写体、点、線、キャラクター、色)。
  7. 手作り感:先端が細くなる可変幅のインク線で2フレームごとに「ゆらぎ」を再シード、紙の繊維、毎フレームのフィルムグレイン、参照に合わせたハーフトーン/スティプル/ブラシ、オーバーシュートとホールド、二次的な動き(尾、髪、波紋、ちり)。
  8. ポスターのようにフレームを埋め尽くすこと。 前景、被写体、テクスチャード背景。9:16の場合、フレームを積み重ねます:空/タイトル(上部約25%)、被写体バンド(中央)、地面/前景(下部)。横向きの被写体は幅の約90%にわたります。テキストは端から60ピクセル、下部250ピクセルはクリアに保ってください。失敗例: 小さな被写体が空っぽの空間に浮かんでいる。
  9. キャラクターと生き物:シルエットをサムネイルサイズの黒い形状として判読できるようにすること。リグ(キーフレームサイクル + 2ボーンIK)を構築し、他の何よりも先に12ポーズのシートを確認すること。意図しない表情を避けること(迷い込んだ頬の弧は間抜けな笑顔に見え、肋骨のラインはシマウマの縞模様に見えます)。
  10. サウンド:目に見えるすべてのアクションに音をつけること。音楽のセクションは映像の切り替わりに合わせて変化すること。トランジションへのライザー、トランジション上のインパクト、静止時の無音。
  11. 正直さ:あなたはフレームを見ることはできますが、音声を聞くことはできません。納品時にその旨を伝えてください。

4 · フォーマット(目的に最も適したものを選択し、参照がスタイルを決定します)

  • 単一の世界の物語:1つの場所、1つの小さな出来事に転機がある(鯉の池)。
  • 変容の旅:1つの被写体が持続しながら、その世界/メディア/スケールがマッチカットを通じて変化する(駆ける馬)。
  • ショーケースモンタージュ+スルーライン:0.8~2.5秒の完成されたビネットを6~15個、それぞれが独自の小さな動きを持ち、1つの繰り返し登場する仕掛け(点、キャラクター)によってつなぎます。
  • 解説ビデオ:図が自己描画し、ラベルがタイプで表示され、被写体が断面図やX線写真で表示されます。
  • シームレスループ:すべてのサイクルが長さを均等に分割し、最後のフレームが最初のフレームに流れ込みます。
  • キネティックタイプ/プロモ:参照のスタイルで、モーションによって明らかにされる3~6行の短いテキスト。

15秒のビートシート:0~1秒 フック · 1~4秒 確立 · 4~8秒 エスカレーション(1~2秒ごとに新しい状態) · 8~11秒 ピーク · 11~13秒 ブレス · 13~15秒 見返り+カード。他の長さに比例してスケールします(30秒:3つのエスカレーションする動き;60秒:反復を追加)。

5 · ワークフロー

a. 参照を研究 → スタイルバイブル

画像:各画像を表示し、2~3のディテールにクロップします(そこに質感があります)。動画:推測する代わりにffmpegでフレームを抽出します。

ffmpeg -i ref.mp4 -vf "fps=1/1.5,scale=320:-1,tile=5x4" -frames:v 1 ref_sheet.png
ffmpeg -i ref.mp4 -vf "select='gt(scene,0.3)',showinfo" -f null - 2>&1 | grep -o "pts_time:[0-9.]*"   # カット時間 → 編集リズム

短い STYLE.md を書きます:パレット(役割付きで6~10色の16進数)、グラウンド、テクスチャレシピ、線、形状、光、奥行き、構成、タイポグラフィ(Google Fonts相当)、動きのリズム(平均ショット長、イージングの特性)、サウンドの手がかり、そして各参照が描写しているもののコピー禁止リスト。

b. コンセプト

アイデアが現実の事実(科学、歴史、自然、仕組み)に基づいている場合は、まずそれらを調査して検証します(可能であればウェブ検索)。見返りは、しばしば1つの真実のディテールからもたらされます(1878年、写真は駆ける馬の4本の蹄すべてが地面から離れることを証明しました)。CONCEPT.md で:ログライン、なぜそれが重要なのか、連続性の仕掛け、タイムスタンプ付きのビートシート(各ビートについて:何が見えるか、トランジションの動機は何か、カメラ、サウンド)、エンドカード。ログラインと最大8行のビートラインをユーザーに表示し、その後続行します(ユーザーが事前に承認を求めた場合のみ待機)。

c. piece.html を構築:1つの自己完結型ファイル。

  • <canvas> をターゲットサイズで;const X = cv.getContext('2d', {willReadFrequently: true})(必須:レンダラーはすべてのフレームを読み取ります。これがないとフレームが空白になるか蓄積されます)。
  • グローバル変数 W, H, FPS, NF。純粋な function render(f):同じ f に対して同じフレーム、シードされた乱数のみを使用し、フレーム間で何も引き継ぎません。先頭で transform/alpha/composite/filter をリセットし、save/restore のバランスを保ちます。
  • 構造:パレットトークン → タイムラインオブジェクト T(秒) → makeAssets()(すべての静的テクスチャ、スプライト、レイヤーを一度だけプリレンダリング) → render(f)。フォントをロードし、アセットを構築し、その後 window.READY = true を設定します。URLに ?render がない場合は、requestAnimationFrame で render をループしてライブプレビューを表示します。
  • 実績のあるレシピ。小さなヘルパーとして記述します。
    • インク線:先端が細くなる可変幅の塗りつぶされたリボンへのポリライン、2フレームごとに再シードされるゆらぎ、進行状況 p による描画オン(ニブドット付き)。
    • 紙:ベースカラー、柔らかいまだらのブロブ、繊維、スペックル、ピクセル単位のノイズを1つのキャンバスに焼き付け。グレイン:4つのノイズフレームを overlay で約0.15の強度で循環。
    • 水彩:形状にクリップし、柔らかな放射状のウォッシュ、グラニュレーションスペックル、ぼかした暗いエッジを追加し、その上に白い「レジスト」線を描画。
    • リソ/スクリーンプリント:各インクを回転したハーフトーンドットのレイヤーとして、乗算ブレンドで、1~3ピクセルずらして(位置ずれ)。スティプル/エングレービング:強度をドットに変換し、影の側にクリップされた平行ハッチングを追加。
    • 形状内のテキストまたはASCII:形状をマスクにレンダリングし、粗いグリッドでサンプリングし、セルごとに文字または3×5ドットのグリフを描画。
    • 任意のマスクのアウトライン:マスクから、8ピクセルオフセットの「destination-in」描画で侵食されたマスクを減算。シルエットのペントレース:マスクのマーチングスクエア輪郭線、進行状況付きのインク線。
    • X線:半透明のぼかしたボディ、骨をリグに沿ったグラデーションカプセルとして、ぼかした lighter コピーでグロー効果。
    • 時間:tau(t) = レート関数(1 通常、0.1 スローモーション、0 フリーズ)の積分で、被写体、そのパーティクル、サウンドイベントを駆動。
    • モーション:サイクル(ギャロップ、歩行、羽ばたき)の周期的キーフレーム、手足の2ボーンIK、ワールド座標に固定されたパーティクル(移動カメラの後ろに残るように)。
    • トランジション:ワールドに固定された線によるクリップパスワイプ、虹彩円、フレームを埋めるまで成長する窓、実際のインパクトでのフラッシュ。
    • タイポグラフィ:イベント(足音、ビート)によって駆動されるタイプライター表示、パーティクルから組み立てられる単語。
  • ファイルはファイル書き込みツールを使用して書き込み、シェルのヒアドキュメントは使わないでください(JSの引用符が壊れます)。

d. レンダリングツール(プロジェクトごとに1回 render.mjs として記述)。インストールされているChrome/Edgeを puppeteer-core を通じて使用し、ブラウザをダウンロードしないでください。

// node render.mjs piece.html out.mp4 [fromSec toSec]   |   node render.mjs piece.html --stills 0.5 3 7
import puppeteer from 'puppeteer-core'; import fs from 'fs'; import { spawn } from 'child_process'; import { pathToFileURL } from 'url';
const [page, out, ...rest] = process.argv.slice(2);
const exe = [process.env.LOCALAPPDATA + '/Google/Chrome/Application/chrome.exe', 'C:/Program Files/Google/Chrome/Application/chrome.exe',
  'C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe', '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
  '/usr/bin/google-chrome', '/usr/bin/chromium'].find(p => fs.existsSync(p));
const br = await puppeteer.launch({ executablePath: exe, headless: true, args: ['--allow-file-access-from-files'], protocolTimeout: 900000 });
const pg = await br.newPage(); pg.on('pageerror', e => { console.error('PAGE ERROR', e.message); process.exit(1) });
await pg.goto(pathToFileURL(page).href + '?render=1'); await pg.waitForFunction('window.READY===true', { timeout: 300000 });
const { FPS: fps, NF: nf } = await pg.evaluate(() => ({ FPS, NF }));
const grab = async f => Buffer.from((await pg.evaluate(f => { render(f); return document.querySelector('canvas').toDataURL('image/png') }, f)).split(',')[1], 'base64');
if (out === '--stills') { fs.mkdirSync('stills', { recursive: true }); for (const s of rest) fs.writeFileSync(`stills/s_${s}.png`, await grab(Math.round(+s * fps))); }
else { const [a, b] = rest.map(Number), f0 = a ? Math.round(a * fps) : 0, f1 = b ? Math.round(b * fps) : nf;
  const ff = spawn('ffmpeg', ['-y', '-loglevel', 'error', '-f', 'image2pipe', '-framerate', String(fps), '-c:v', 'png', '-i', '-', '-c:v', 'libx264', '-crf', '16', '-pix_fmt', 'yuv420p', out], { stdio: ['pipe', 'inherit', 'inherit'] });
  for (let f = f0; f < f1; f++) { if (!ff.stdin.write(await grab(f))) await new Promise(r => ff.stdin.once('drain', r)); if (f % 60 === 0) console.log('frame', f); }
  ff.stdin.end(); await new Promise(r => ff.on('close', r)); }
await br.close();

npm i puppeteer-core(数MB)と、PATHが通った ffmpeg が必要です。ffmpegがない場合は、一度インストールしてください(winget install ffmpeg / brew install ffmpeg / apt install ffmpeg)。それが不可能な場合は、バンドルされたバイナリ(Pythonの imageio-ffmpeg、またはnpmの ffmpeg-static)を使用し、そのパスをスクリプトに指定してください。長いレンダリングの場合は、別々のフレーム範囲で2~4コピーを実行し、ffmpegのconcatデマルチプレクサで結合します(render(f) が純粋関数であるため可能です)。

e. 静止画でのルック開発(ゲートA)

ビート境界で5~8枚の静止画をレンダリングし、1行に結合します(ffmpeg -i a.png -i b.png … -filter_complex "[0]scale=360:-1[a];[1]scale=360:-1[b];…;[a][b]…hstack=inputs=N" row.png)。各静止画は以下を満たす必要があります。

  • 完成したイラストのように見えること。
  • フレームが埋まっていること。
  • スタイルが参照から来ており、コピー禁止リストのものは何も現れていないこと。
  • 被写体が電話サイズで判読できること。
  • 間抜けな顔や壊れた関節がないこと。
  • 質感が存在すること。
  • テキストが読みやすく、マージン内にあること。

修正して繰り返します。キャラクターの場合は、最初にポーズシートを確認します。

f. レンダリングとモーションのレビュー(ゲートB)

動画をレンダリングし、ストリップとして読み取ります:ffmpeg -i out.mp4 -vf "fps=3,scale=144:-1,tile=15x3" -frames:v 1 strip.png。以下を確認します。

  • フックがあること。
  • エネルギーが上昇し、見返りの前にブレスがあること。
  • すべてのトランジションとカメラの動きに理由があること。
  • 約2秒以上のデッドストレッチがないこと。
  • 連続性の仕掛けが見えること。
  • バグがないこと:フリッカー、フレームの蓄積、空白のセグメント、クリップされたテキスト。

g. サウンド

score.mjs(プレーンNode、パッケージ不要)を記述し、48kHzステレオWAVを合成します。

  • 楽器:Karplus-Strongの撥弦;非倍音のベル;デチューンサインのパッド;1ポールローパスを通したソー/スクエアシンセ;カットオフがグライドできるステートバリアブルフィルタを通したフィルタリングノイズ(ウィッシュ、スウープ、ランブル)。
  • リズム:各ビートのキーコード(キック、スネア、ハイハット)を、帯域制限されたインパルストレインとバンドパスノイズのバーストで。
  • 楽譜構造:ビートシートに従ったセクションの配列:キー(C4をベースにベースノートを指定)、コード(ルート+3度+5度+7度)、リズムパターン、アルペジエーター設定、音楽が鳴る秒範囲 [start, end]。各セクションの終わりに、コードをテンションコードに変更するか、最後のノートを半音上げてトランジションを作成します。
  • トランジションにはライザー(ホワイトノイズ、フィルターを開く)、インパクト(バンドパスノイズのバースト)、フリーズには無音。
  • 40秒以上の動画の場合は、メインテーマが「B」セクションに転調し、ショーケースモンタージュの各ビネットに独自のテクスチャを持たせます。スコアを1つの Uint8Array として書き出します。

h. 納品

再生のために動画を開きます(start out.mp4 / open out.mp4)。

聴覚を除くすべてのフレームを見ました。音声は確認できません。動画内のアクションやタイミングがサウンドトラックと同期していることを前提としてください。

何が作成されたか:連続性の仕掛け、スタイルのソース、1文のログライン。out.mp4 を添付してください。

出力が要求を満たしていない場合は、「何が」求められているかではなく、「なぜ」それが目的を達成していないのか、またはどのように改善できるかを説明してください。あなたは審美眼を持つスタジオです。期待に応えられなかったことに腹を立てるのではなく、次は正しく実行してください。

関連スキル