motion-design: ワークショップ (Remotion, テーマ, サウンド, ミュージック) は何をしますか?
すべてローカルかつ決定論的です。同じコード = 同じMP4。AIによる画像や動画は生成しません。
スタック
| 要素 | ツール | 場所 |
|---|---|---|
| アニメーション | Remotion 4.0.529 (React / TSX)、バージョンは package.json で固定 | src/; モジュール追加は npx remotion add <package> |
| テーマ | 色、フォント、サイズ、マージン | src/illustration/theme.ts (src/illustration/scenes/kit.tsx の C と F 定数から読み取り)、フォントは public/fonts/ |
| Remotion モジュール | transitions, effects, gsap, three, noise, paths, shapes, motion-blur, light-leaks, starburst, rough-notation, captions, layout-utils, lottie | package.json |
| グラフィック合成 | BrandedVideo (フルスクリーンシーン), LowerThirdTrack (ローワーサード、セクションタイトル), Screencast (サイトデモ), Scene (シーンカタログ), ControleTexte (テキストチェック), FondAnime (ループアニメーション背景; グレインは scripts/make-grain.py で生成) | src/illustration/、Compositions.tsx で宣言、src/Root.tsx で配線 |
| 共有キュー | 秒単位のキータイム、アニメーションとサウンドの両方から読み取り | src/<project>/cues.json |
| 音楽 | Python で記述されたスコア (numpy シンセサイザー scripts/synth.py: FMエレクトリックピアノ、パッド、ベース、パーカッション、ビニールノイズ、リバーブ) | music/<project>.py、モデル: music/example_pad.py |
| 効果音 | シンセサイズされたパレット: サウンド操作前に reference/sound-palette.md を読むこと。シンセレシピ scripts/make-sfx.py -> public/sfx/*.wav + palette.json; ジェスチャーボキャブラリ scripts/son.py (計画はジェスチャー名を指定し、ファイル名は指定しない; リストはデフォルトでアイテムごとに1枚のカード、son.LISTES; son.releve: ビデオのサウンドの番号付きリスト、番号でレビュー); scripts/palette-import.py (実際の録音パレット、同じファイル名、デフォルトにフォールバック); scripts/sfx.py (追加のサウンド: シャッター、フォーカスチック、ウーシュ) | scripts/ |
| ミックス | 音楽 + 効果音 + ボイス、ボイス下で音楽をダッキング、EBU R128 ターゲットラウドネス、トゥルーピーク -1.5 dBTP 制限 (オーバーサンプルリミッター、オーバーシュート時のみ) | scripts/mix.py |
| チェック | オクターブごとのトーンバランス、ラウドネス | scripts/ltas.py, mix.py |
ライセンス. Remotionは個人および従業員3人以下の企業は無料です。それ以上の規模の企業では企業ライセンス (remotion.pro) が必要です。キットを大企業で商用利用する前に LICENSE.md を読んでください。フォント Inter と Source Serif 4 は OFL ライセンスです (public/fonts/OFL-*.txt); サウンドとサンプル音楽はここでシンセサイズされたもので、第三者の権利はありません。他から見つけた音楽: ライセンスを確認してください (収益化チャンネルでは CC-BY-NC は使用不可)。
セットアップと node_modules 行の役割
プラグインは一度だけインストールします:
bash "${CLAUDE_PLUGIN_ROOT}/install.sh" --data "${CLAUDE_PLUGIN_DATA}"
(Claude Code がこのファイルを読み取るとき、両方の変数を実際のパスに置き換えます。) データフォルダを使用する理由: プラグインフォルダはプラグイン更新のたびに置き換えられ、node_modules のサイズは約 1 GB です。そのため npm ci はプラグインのデータフォルダ (${CLAUDE_PLUGIN_DATA}) で一度だけ実行され、これは更新後も保持され、skills/motion-design/node_modules はそのシンボリックリンクになります。プラグイン更新後に node_modules が見つからない場合 (新しいプラグインフォルダにリンクがない)、上記の行を再実行してください: 不足分だけを行い、すぐに再リンクします。
手動インストール (4つの skills/ フォルダを ~/.claude/skills/ に並べてコピー): キットルートで bash install.sh を実行; node_modules は通常のフォルダとして npm ci でインストールされます。Python 側: python3 -m pip install numpy scipy soundfile pillow、そして brew install ffmpeg。詳細とチェーン全体の確認: キットの INSTALL.md。
このスキルのコマンドはすべてワークショップフォルダ (skills/motion-design) から実行してください。
モーションデザインビデオの全パイプライン
- フレーム設定: 尺、フォーマット (デフォルトは 1920x1080 @ 30fps; 縦型リールは 1080x1920; 正方形は 1080x1080)、用途、プラットフォーム制約。
src/<project>/cues.jsonを記述: キータイムが映像とサウンドの両方を駆動。 - アニメーション: デリバラブルごとに
src/<project>/に合成を作成、src/Root.tsxで宣言、プロップスは zod で型付け。すべてuseCurrentFrame()から派生: フリーの CSS アニメーションは禁止、Math.random()は禁止 (random(seed)またはnoise2Dを使用)。テーマの色とフォントのみを使用。 - レンダリングせずに映像をチェック:
npx remotion still src/index.ts <Id> out.png --frame=Nでキーフレームを確認、その後 MP4 のコンタクトシート (ffmpegtile)。電話サイズで評価: 390 px 幅に縮小しても判読可能でなければならない。 - ナレーション (ある場合): ユーザーが録音 (48 kHz WAV)、
--voice-atで配置。キットは声のクローンを生成しない。 - 音楽と効果音:
python3 music/<project>.py <duration> music.wav; サウンドはson.pyを通して、映像と同じ瞬間に配置 (計画はson.releve(...)を呼び出して聴くための番号付きリストを作成);python3 scripts/ltas.py music.wavでチェック (緩やかな傾斜に対して約 6 dB 以上の穴がないこと)。 - ミックス:
python3 scripts/mix.py --music ... --sfx ... [--voice ... --voice-at s] --lufs -16 --out public/audio/<project>_mix.wav(リールは -14、YouTube は -16;--sfx-voix-ref -22は実際の声に対して効果音をリスケール)。 - レンダリング:
npx remotion render src/index.ts <Id> out.mp4 --props='{"audio":"audio/<project>_mix.wav"}' --codec=h264 --crf=16 --audio-bitrate=320k。 - 納品: 既存のデリバラブルを上書きせず (サフィックス
-v2)、プレビュー付きで。
Premiere に配置するレンダリング (グラフィックス)
- シーン、フルスクリーングラフィック、またはローワーサードにロゴは不要: 画像を無駄に読み込むだけ。
- 29.97 fps シーケンス用のファイルは、クリップ全体をカバーする必要があります: n シーケンスフレームは n x 1.001 / 30 秒続きます。
src/illustration/の合成はtailFramesを受け入れます:TenirFinコンポーネント (src/illustration/tenir-fin.tsx) は、その尺にわたってアニメーションを再生し、最後のフレームを保持します; 終了アニメーションは移動しません。overlaysスキルのscripts/render-segments.pyがtailFramesを計算します。 - グラフィックス合成は
overlaysスキルのscripts/render-segments.py、scripts/screencast-render.py、scripts/montage-tella.pyによってレンダリングされます (ワークフォルダ = このワークショップ、PNG フレーム、4 コア)。remotion stillチェック以外で手動で行わないでください。staticFileを通して呼び出されるメディアはpublic/scenes/<video>/に置きます。
自分好みにカスタマイズ (テーマの変更)
キットにはニュートラルなテーマが同梱されています: アクセントカラー #2F5BEA、Inter と Source Serif 4、1つのテーマファイル src/illustration/theme.ts。独自のブランドを使用するには:
- 色:
src/illustration/theme.ts(color: base, contrast, inkSoft, muted, surface, line, accent, accentDark, accentWash, darkBg, paperWarm); シーンはCを通して読み取ります。アクセントとその薄い色合いはまだいくつかの場所にハードコードされています:grep -rn "#6B8CFF\|rgba(47,91,234\|rgba(214,224,252" src/(preuves.tsx、Screencast.tsx、compositions/FondAnime.tsxのPALETTESバリアント内のハイライト)、新しいアクセントに合わせます。1つのアクセント、信号として使用され、塗りつぶしとしては使用しません。 - フォント:
.woff2ファイルをpublic/fonts/に配置し、ロードリスト (src/illustration/scenes/kit.tsx、compositions/BrandedVideo.tsx、compositions/LowerThirdTrack.tsx、compositions/Screencast.tsx) とtheme.ts(font.display、font.sans) 内のファイル名とファミリ名を変更します。フォントに数字とアクセントがあることを確認してください ("latin-ext" サブセットだけでは数字も基本文字も含まれておらず、すべてが Georgia にフォールバックします)。ファミリ名に数字を含めないか (または CSS で引用符で囲む)。 - アニメーションカーブ:
scenes/kit.tsxのeaseStdとscripts/make-sfx.pyのEASINGは連動します (サウンドは映像のカーブに従います)。 - チェック:
npx tsc --noEmitを実行し、次に各合成 (引用、ローワーサード、セクションカード、数字など) のremotion stillを実行し、その後次のrender-segments.py実行で--forceを指定します (そのキャッシュはすでにsrc/illustration/のコードに従っています)。
シーンまたはサウンドの追加
- シーン:
src/illustration/scenes/opaque.tsx(フルスクリーン) またはalpha.tsx(オーバーレイ) にコンポーネント、その上にdataコントラクトをコメントとして記述、レジストリscenes/Scene.tsxに1行、overlaysSKILL.md のカタログに1行。すべての瞬間はcuesから来ます。チェック: 複数のフレームでremotion still、クリップのフレーム上に合成されたオーバーレイを確認。 - サウンド:
reference/sound-palette.mdの「サウンドの追加または調整」を参照。
同期フォルダの落とし穴
ワークショップが同期フォルダ (Dropbox、iCloud、Drive など) にある場合、別のマシンがファイルの古いバージョンを送り返し、良いファイルを「競合コピー」にリネームする可能性があります。症状: Could not find composition with ID ...。対処法: find . -name '*conflicted copy*' -not -path './node_modules/*'、比較して最新版を保持。webpack キャッシュ (node_modules/.cache) も競合する可能性があります: 削除すると Remotion が再構築します。可能であれば node_modules を同期から除外してください。