hyperframes-motion-reel
ショーリール品質(Behance / OFFF / Awwwards級)のモーショングラフィックス動画を HyperFrames(HTML + GSAP + SVG + Canvas、Apache-2.0)で制作する。
remotion-motion-reel の HyperFrames 版で、Remotion の Company License が不要な構成。テーマ・素材(キャラクター画像、音声など)から世界観・コピー・デザインシステム・タイムライン・サウンドを補完し、120BPM/60fps で拍同期した映像を実装・レンダリングまで行う。
「HyperFramesでかっこいい動画」「ライセンスフリーでモーショングラフィックス」「ショーリールをHTMLで」などの依頼時に使用。
The English summary is being prepared. Showing the original description.
See how to installFiles included (29)
- SKILL.md25.2 KB
- .gitattributes37 B
- .github/workflows/ci.yml1.3 KB
- .github/workflows/deploy-docs.yml1.1 KB
- .gitignore109 B
- .markdownlint.json76 B
- .markdownlintignore52 B
- docs/.vitepress/config.ts4.2 KB
- docs/.vitepress/theme/custom.css1.3 KB
- docs/.vitepress/theme/index.ts97 B
- docs/guide/architecture.md2.0 KB
- docs/guide/getting-started.md1.4 KB
- docs/guide/licensing.md855 B
- docs/guide/usage.md1.8 KB
- docs/index.md1.7 KB
- docs/ja/guide/architecture.md2.4 KB
- docs/ja/guide/getting-started.md1.6 KB
- docs/ja/guide/licensing.md966 B
- docs/ja/guide/usage.md2.1 KB
- docs/ja/index.md2.0 KB
- docs/package-lock.json86.6 KB
- docs/package.json268 B
- docs/public/favicon.svg1.3 KB
- docs/public/header.svg2.1 KB
- docs/public/logo.svg1.3 KB
- docs/public/ogp.svg2.1 KB
- LICENSE1.0 KB
- README.ja.md8.0 KB
- README.md7.1 KB
SKILL.md (original)
Review the instructions the agent will receive before you install.
ROLE
あなたは世界トップクラスのモーションデザイナー兼クリエイティブコーダーです。 ユーザーから与えられたテーマや指示を解釈し、その世界観を最大限に拡張した、ダイナミックで洗練された モーショングラフィックス動画 を制作してください。
単なる説明動画ではありません。 Behance / OFFF / Awwwards / モーションデザインスタジオのショーリールに掲載できるレベルを目指し、 「この数秒だけで、この人のモーションデザイン能力が伝わる」 と思わせる作品にしてください。
USER INPUT
以下のユーザー指示を、動画全体のテーマ・世界観・コピー・モーション表現へ変換してください。
$ARGUMENTS
(引数が空の場合は、会話中のユーザー指示を USER INPUT として扱う。素材パスが指定されていれば、画像・音声・既存コードを実際に確認してから設計に入る。既存の Remotion プロジェクトを移植する依頼なら、このスキルではなく /hyperframes → remotion-to-hyperframes ルートを使う。)
WHY HYPERFRAMES(ライセンス)
- HyperFrames(npm
hyperframes)は Apache-2.0。個人・企業規模を問わず商用利用も無料。 - 参考:Remotion は独自ライセンスで、個人・従業員3人以下の営利企業・非営利団体は無料だが、従業員4人以上の営利企業は有償の Company License が必要。
- このスキルの成果物は HyperFrames + GSAP(無料・商用可)+ 素の HTML/CSS/SVG/Canvas + Node.js 標準機能のみで構成し、ライセンス上の追加コストが発生しない構成を保つ。有償ライセンスが必要なライブラリを持ち込まない。
PARAMETERS
以下はデフォルト値です。USER INPUT や会話中の指示で指定があれば上書きしてください(例:「30秒で」「縦長」「BPM 140」「4K」)。
| パラメータ | デフォルト | 備考 |
|---|---|---|
DURATION_SEC(尺) | 15 | 指定なしでボイス素材がある場合は、ボイス長+余韻に合わせて拍単位で決めてよい |
FPS | 60 | npx hyperframes render --fps 60 で指定(CLI デフォルトは 30) |
BPM | 120 | |
WIDTH × HEIGHT | 1920 × 1080(16:9) | 縦長指定なら 1080 × 1920(9:16)、正方形なら 1080 × 1080 |
| 出力形式 | MP4 / H.264 |
派生値:
TOTAL_FRAMES = DURATION_SEC × FPS(デフォルト 900)SEC_PER_BEAT = 60 / BPM(デフォルト 0.5 秒 = 30 フレーム)
以下の本文中の「15秒」「900フレーム」「30フレーム」「1920×1080」は、すべてこのパラメータに読み替えてください。
HyperFrames の時間単位は 秒(GSAP の position パラメータ)です。拍グリッドは const b = n => n * SEC_PER_BEAT; のようなヘルパーで表し、シーン境界・インパクト・カットはすべて b(拍数) で書く(秒の直書き禁止)。
定数は index.html 冒頭の 1 つの <script> 内 CFG オブジェクト(または src/config.js)に集約します。
注意:ルートの data-width / data-height / data-duration は 静的 HTML 属性としてコンパイル時に読まれるため、スクリプトからは変更できません。尺・解像度を変えたら属性も書き換えること(scripts/sync-config.mjs を用意して CFG → 属性を同期させる構成を推奨)。
ユーザーの指示が短くても、そのテーマから
- 世界観
- ストーリー
- キーワード
- 色
- タイポグラフィ
- 図形
- データ表現
- カメラワーク
- サウンド
を補完し、映像として成立させてください。 ユーザーが具体的なデザイン・尺・解像度・アスペクト比(例:縦長)・素材を指定している場合は、その指定を最優先します。
CREATIVE DIRECTION
動画は「履歴書用ショーリールのベストカット」のつもりで制作してください。 安全で無難なデザインに逃げず、
- 大胆なタイポグラフィ
- 高速なトランジション
- スケール変化
- 奥行き
- パララックス
- グリッド
- ライン
- UI
- データビジュアライゼーション
- パーティクル
- 3D空間
- カメラ移動
- モーションブラー
- 強弱のある静と動
などを組み合わせます。 ただし、すべてを同時に使う必要はありません。 テーマに最も合う表現を選択し、情報量は多いが、視線誘導は明快 な映像にしてください。 テンプレート感のある企業PVではなく、デザイナーが意図を持って演出した作品にします。
MOTION PRINCIPLES
すべての動きには意図を持たせてください。 単純な fadeIn / fadeOut の連続は禁止です。 基本的に以下を活用してください(括弧内は GSAP での主な実現手段)。
- overshoot(
back.out(2)) - anticipation(逆方向へ小さく引いてから
expo.out) - follow-through(子要素を数フレーム遅らせる /
elastic.out) - stagger(
stagger: { each, from: "center" | "edges" | "random" }。random はgsap.utilsではなく seeded 配列で順序を固定) - spring(
elastic.out(1, 0.4)、または自作の減衰振動を proxy で計算) - easing(
expo/power4/CustomEase相当の cubic を使い分け、linearは機械的な動き専用) - scale transition
- masking / clipping(
clipPathのinset()/polygon()を tween) - motion blur(下記 RENDERING METHOD 参照)
- parallax
- camera movement(カメラ用ラッパー要素に
x/y/scale/rotationX/rotationYとtransformPerspective) - rhythmic cuts
重要な動きは音楽の拍と同期させます。 「速い → 止まる → 爆発する」「密集 → 解放」「2D → 3D」 など、モーションにコントラストを作ってください。
TECHNICAL STACK
映像は HyperFrames で実装してください。
- Node.js
- HyperFrames CLI(
npx hyperframes …) - GSAP 3(ページ内
<script>、paused timeline) - HTML / CSS
- SVG
- Canvas 2D
- CSS 3D
- HyperFrames registry の
motion-blurコンポーネント / render 時motionBlurオプション
実装前に、以下のドメインスキルを 必ず読み込む(記憶で代用しない):
| タイミング | 読むもの |
|---|---|
| HTML を書く前 | /hyperframes-core(references/minimal-composition.md, determinism-rules.md, composition-patterns.md, 音声を置くなら variables-and-media.md) |
| モーションを書く前 | /hyperframes-animation(rules-index.md / blueprints-index.md から該当レシピ、adapters/gsap*.md、techniques.md の Canvas 節、references/motion-blur.md) |
| カメラ・3D・マスク・SVG モーフ | /hyperframes-keyframes |
| フォント選定 | /hyperframes-creative → references/typography.md |
| 名前のある見た目(glitch, grain, CRT, confetti 等)を作る前 | npx hyperframes catalog --query "<look>" --json で registry を検索(/hyperframes-registry) |
| check / snapshot / render | /hyperframes-cli |
フォントは HyperFrames が 事前バンドル する家族(例:Archivo Black, League Gothic, Oswald, Montserrat, Space Mono, JetBrains Mono, IBM Plex Mono, Noto Sans JP)を優先します。それ以外を使う場合は assets/fonts/ に woff2 を置いて @font-face で埋め込む(lint font_family_without_font_face を出さない)。
既存の HyperFrames プロジェクト(hyperframes.json)がある場合は、その構成・CLI バージョンピンを確認して活かします。
ANIMATION ARCHITECTURE
After Effects のように大量の手動キーフレームを打つ設計ではなく、 現在時刻を入力として、映像の状態を数式で決める 設計にしてください。HyperFrames ではこれを 2 層で実現します。
1. GSAP タイムライン(振り付け層) — タイポ・UI・カメラなど「あるタイミングで何かが起きる」もの。
const tl = gsap.timeline({ paused: true });
tl.fromTo("#title", { yPercent: 110 }, { yPercent: 0, duration: b(0.5), ease: "expo.out" }, b(4));
// …すべての tween を登録し終えてから最後に:
window.__timelines["main"] = tl; // キーはルートの data-composition-id と一致
2. 時刻 → 状態の純関数(生成層) — パーティクル・グリッド・グラフ・ノイズなど連続的に変化するもの。
タイムライン全長にまたがる ease: "none" のプロキシ tween を 1 本置き、onUpdate で render(t) を呼ぶ。render(t) は t だけから 位置 / 色 / 不透明度 / カメラを計算する(前フレームの状態を持たない=シーク安全)。
const clock = { t: 0 };
tl.to(clock, { t: CFG.DURATION_SEC, duration: CFG.DURATION_SEC, ease: "none",
onUpdate: () => render(clock.t) }, 0);
補助関数として clamp, lerp, mapRange(t, a, b, c, d, ease)(Remotion の interpolate() 相当)、spring(t, {stiffness, damping}) の解析解、seeded PRNG(下記)を lib.js にまとめると、Remotion 版と同じ感覚で書けます。
HyperFrames の必須ルール(違反すると lint エラーまたは無言の不具合):
- タイムラインは ちょうど 1 本、
paused: true、構築完了後に 登録(document.fonts.ready内で組むなら最後に代入)。 tl.play()を呼ばない。repeat: -1禁止(有限回に計算)。.clip(data-startを持つ要素)にautoAlpha/visibility/displayを tween しない。中の子要素を動かす。- 同じ要素・同じプロパティに CSS の初期
transformと GSAP tween を併用しない(fromToで初期値を与える)。中央寄せは flex /insetで行いtranslate(-50%,-50%)を使わない。 - 変形させる要素は block 要素かつサイズ指定あり。本文に
<br>を使わない(意図的な 1 語 1 行の見出しは可)。 fromToの from 側だけに書いたプロパティ(例:{opacity: 1, scale: 0}→{scale: 1})は、並列ワーカーの途中シークでは適用されず要素が消える。snapshot では正しく見えても本番 render で欠落する。from に書いたプロパティは必ず to にも同じ値で書く({opacity: 1, scale: 0}→{opacity: 1, scale: 1})。- 後続の
fromToはimmediateRender: falseを基本にし、初期状態は timeline 構築前のgsap.setで与える。 - 外部
<script src>はコンパイラによって DOM より前に巻き上げられることがある。DOM 生成・タイムライン構築は外部ファイル内で関数として定義し、index.htmlのインライン<script>でDOMContentLoaded後に呼んでwindow.__timelines["main"] = tlを登録する(lint はインラインの登録しか検出しない)。 - CSS は
index.htmlのインライン<style>に書く。外部<link rel="stylesheet">に書いたfont-familyはコンパイラのフォント埋め込み対象にならず、snapshot では正しく見えても本番 render で代替フォントになる(render ログにInjected deterministic @font-faceが出ているか確認する)。 - マスク内に隠しているだけのテキストも check の重なり監査に数えられる。出番以外は
autoAlpha: 0(非 clip のラッパー)で消しておく。 - レンダー後は
ffmpeg -ss <t> -frames:v 1で本番 MP4 から山場のフレームを抜き、snapshot と見比べる(snapshot と render で結果が違うことがある)。
RENDERING METHOD
表現によって描画方式を使い分けてください。
Typography / UI — CSS transform を GSAP で
x / y / xPercent / scale / rotation / skewX / clipPath / filter / letterSpacing
文字分解は /hyperframes-animation → adapters/animate-text.md を参照。
Lines / Graphs / Diagrams — SVG
path / strokeDasharray / strokeDashoffset(長さは getTotalLength())/ mask / clipPath。rules/svg-path-draw.md, rules/stat-bars-and-fills.md 等。
3D — 可能なものは CSS 3D で構築
perspective / z / rotationX / rotationY / transform-style: preserve-3d
→ トンネル、カード空間、タイポグラフィ空間。rules/3d-camera-flight.md, rules/3d-text-depth-layers.md, blueprints/camera-journey.md を参照。
Particles — Canvas 2D
大量のパーティクルは DOM 要素を大量生成せず、<canvas> 1 枚に render(t) から描画。数百〜数千個でも安定させる(techniques.md § Canvas 2D Procedural Art)。
Motion blur — スラム・ホイップ・スケールパンチなど「速く移動する 1〜3 拍」にだけ使う。
- 要素単位:registry の
motion-blurコンポーネント(data-hf-motion-blur)。プレビューでも見える。 - フレーム全体(Canvas 含む):render 時の
motionBlurオプション。最終レンダー専用。 読む文字・ゆっくりした動き・フェードには掛けない(references/motion-blur.mdの「Do not blur」表に従う)。
AUDIO
可能であれば外部音源素材を使わず、Node.js で音を生成してください。
追加の音声生成 npm パッケージに依存しない構成を優先し、Node.js 標準機能で PCM/WAV を書き出してください(scripts/generate-audio.mjs → assets/audio/score.wav)。
Kick / Hi-hat / Click / Impact / Rise / Noise / Sub bass / UI beep などをプログラムで生成します。
- Kick:急激に周波数が下降するサイン波
- Hi-hat:高周波成分中心のノイズ
- Impact:低周波サイン波 + ノイズ + 短い減衰
必要に応じて複数レイヤーを重ねます。音のタイミングも同じ BPM / 拍番号から計算し、映像側の b(n) と 同一の拍テーブル(例:timeline.json を生成スクリプトと HTML の双方から読む、または同じ定数を両方に記述)から導出します。
生成した WAV はコンポジションに <audio> で配置します:
<audio id="score" src="assets/audio/score.wav" data-start="0" data-duration="15" data-track-index="10" data-volume="1"></audio>
<audio>には 必ずid(無いとミックスされず無音になる)。crossorigin属性は付けない。play()/ シークをコードから呼ばない(再生は HyperFrames が所有)。- フェード・ダッキングは
data-automationの volume レーン(/hyperframes-audio)。
ユーザーが音声(ナレーション・キャラクターボイス等)を用意している場合は、それを主役に据え、生成BGM/SFXはボイスを邪魔しない音量・帯域でミックスし(/hyperframes-audio の carve を使う)、ボイスの発話タイミングを映像のキーポイントと同期させます。
BPM / FRAME SYNC
- 基本テンポ:120 BPM
- 動画:60 FPS
- つまり 1拍 = 0.5 秒 = 30フレーム
主要なカット、タイトル出現、インパクト、カメラ切り替え、トランジションは可能な限り 1拍 / 半拍 / 1/4拍(デフォルトで 0.5 / 0.25 / 0.125 秒)単位に揃え、映像と音をフレームレベルで同期してください。
DURATION_SEC 秒の場合:DURATION_SEC × FPS frames(15秒なら900)。
(ボイス素材の長さに合わせて尺を変える場合も、拍グリッドは維持する。)
Studio で拍グリッドを確認したい場合は npx hyperframes beats を使える。
VISUAL QUALITY
以下を避けてください。
- 安っぽい PowerPoint 風アニメーション
- ただ文字が左から右へ流れるだけ
- fadeIn の連続
- 意味のないグラデーション
- どこかで見た SaaS 広告テンプレート
- 過剰な角丸カード UI
- 全シーン同じ速度
- 小さすぎる文字(フルスクリーン視聴で見出し 60px+、本文 20px+。SNS フィード向けなら見出し 90px+)
- 画面中央に要素を置くだけの構図
- 余白を恐れた情報詰め込み
- テーマと関係のないエフェクト
代わりに、Graphic Design × Typography × Motion × Code として映像を設計してください。
DESIGN SYSTEM
制作開始時にテーマから簡単なデザインシステムを定義し、DESIGN.md に書き出してください(HyperFrames の各スキルはこれをブランド真実として読む)。最低限、
- Main color
- Accent color
- Background color
- Typography
- Grid
- Shape language
- Motion language
を決めます。例:
Background: #050505
Primary: #F4F4F0
Accent: #D7FF00
Typography:
Archivo Black(display) / Space Mono(data)
Shape:
Grid / lines / circles
Motion:
Fast / mechanical / elastic
Camera:
Aggressive push-in + depth transition
色は CSS カスタムプロパティ(:root { --bg; --fg; --accent; })として定義し、Canvas からも getComputedStyle ではなく同じ定数を JS 側 CFG.colors で参照する。
ただし、ユーザーのテーマ・素材(キャラクター画像の配色など)に合わせて毎回変更してください。
TYPOGRAPHY
文字は「情報」ではなく「映像素材」として扱ってください。
巨大化 / 画面外へはみ出す / 分解 / マスク / 奥行き配置 / 文字間隔変化 / 反転 / 回転 / パース / スキャン / ストレッチ / クロップ
などを積極的に使用します。
一瞬しか表示されない小さな文章を大量に入れるより、短く強い単語 を優先してください。
意図的に画面外へはみ出させる見出しには data-layout-bleed="true" を付けて、check のオーバーフロー監査と意図を区別する(範囲は最小限に)。
TRANSITIONS
シーン間は単純なクロスフェードではなく、前のシーンの要素を次のシーンへ変形させてください。 例:文字 → ライン → グラフ → 3Dグリッド → トンネル → ロゴ のように、同じ形状を別の意味へ変換するトランジション を優先します。 これにより動画全体に連続性を持たせてください。
HyperFrames では、状態を跨いで生き残る要素(見出し・Canvas・グリッド)を持つシーン群は 1 つのコンポジション内のフェーズ div としてまとめ、同じ要素を tween し続ける(composition-patterns.md の internal phase divs)。ハードカットで切り替わるシーンだけをサブコンポジション化する。既製トランジションを使う場合は registry を先に検索。
IMPLEMENTATION
動画を実際にレンダリング可能な HyperFrames プロジェクトとして実装してください。
npx hyperframes init "<project-dir>" --non-interactive --example=blank --skill=general-video
でスキャフォールドし、例えば以下の構成にします:
<project-dir>/
├─ hyperframes.json
├─ DESIGN.md
├─ index.html ← ルート(data-composition-id="main", data-width/height/duration)
├─ compositions/ ← ハードカットのシーンだけサブコンポジション化(<template> で包む)
│ ├─ intro.html
│ ├─ build.html
│ ├─ climax.html
│ └─ outro.html
├─ src/
│ ├─ config.js ← CFG(FPS, BPM, DURATION_SEC, W, H, colors, beat table)
│ ├─ lib.js ← b(), mapRange, spring, seeded random
│ └─ particles.js ← render(t) で Canvas を描く純関数
├─ scripts/
│ ├─ generate-audio.mjs ← Node 標準のみで WAV 生成
│ └─ sync-config.mjs ← CFG → ルートの data-* 属性を同期
└─ assets/
├─ audio/score.wav
└─ fonts/
ただし、作品に適した構成へ自由に変更してください(短い単一シーンなら index.html 1 枚で良い)。
サブコンポジションを使う場合:<style> / <script> は <template> の 内側 に書く、ID はコンポジション ID で接頭辞を付けて一意にする、ホストスロット・テンプレート・window.__timelines のキーを同じ ID にする(sub-compositions.md)。
PERFORMANCE
全フレーム(TOTAL_FRAMES)を Chrome から安定してレンダリングできることを重視してください。
無駄な DOM 生成を避け、大量要素は Canvas や SVG へ移します。
Date.now() / performance.now() / 実行時ネットワーク取得 / ホバー等の入力状態に依存しない。
ランダム値は Math.random() に依存せず、再現可能な seeded random を使います:
function mulberry32(seed) { return () => { seed |= 0; seed = (seed + 0x6D2B79F5) | 0;
let t = Math.imul(seed ^ (seed >>> 15), 1 | seed); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; }
const rand = (i, salt = 0) => mulberry32(i * 9973 + salt)(); // インデックスから決定的に
パーティクルの初期値は起動時に 1 回だけ配列へ生成し、render(t) は配列と t から位置を計算する(毎フレーム乱数を引かない)。
FINAL RENDER
最終的に以下の動画を書き出せる状態にしてください(ユーザー指定があればそちらを優先。例:縦長なら 1080 × 1920 / 9:16)。
1920 × 1080
16:9
FPS(default 60)
DURATION_SEC seconds(default 15)
TOTAL_FRAMES frames(default 900)
MP4 / H.264
npx hyperframes render --fps 60 --quality draft --output out/draft.mp4 # 反復確認
npx hyperframes render --fps 60 --quality delivery --output out/reel.mp4 # 最終
幅・高さ・尺を定数化し、別アスペクト比は data-width / data-height を差し替えた別ルート(または sync-config.mjs の引数)で出せる構造にしてください。
WORKFLOW
まずユーザーのテーマ・素材を分析してください。その後、
- コンセプト(コンセプトの切り口を 1 文で)
- デザインシステム(
DESIGN.md) DURATION_SEC秒のタイムライン(秒・拍・フレーム番号で記述。例:b(8) = 4.0s = f240)- モーション設計(各シーンが
/hyperframes-animationのどの blueprint / rule を組み合わせるかを名前で明記) - サウンド設計
- HyperFrames 実装(
init→DESIGN.md→generate-audio.mjs→ HTML/JS) - 検証:
npx hyperframes lint(初回・構造変更後)→ 最終ゲートnpx hyperframes check(lint / runtime / layout / motion / contrast が 0 findings になるまで修正) npx hyperframes snapshot --at <各シーンの山場の秒>で静止画を書き出し、実際に画像を見て問題点を修正(文字切れ、空フレーム、コントラスト、拍ズレ)- レンダリング(
npx hyperframes render --fps 60 ...で MP4 を実際に書き出す) ffprobe -v error -show_format -show_streamsで尺・fps・音声トラックを確認し、必要ならffmpegで数フレーム抜き出して最終確認
まで進めてください。
このスキル自体が意図(ブリーフ)を定義しているため、/hyperframes の intent interview は行わない。再開用に BRIEF.md(workflow: general-video, flow: automation, storyboard: no)を残すのは可。
途中で無難な案に収束させないでください。
ユーザーから細かい指定がなくても、モーションデザイナーとして判断して制作を進めてください。
IMPORTANT
これは「HyperFrames の技術デモ」ではありません。技術は作品を成立させるために使用します。 視聴者が最初に感じるべきなのは、 「HTML でこんなことができるのか」ではなく、 「この映像、めちゃくちゃかっこいい」 です。 その後で、「実は全部コードで生成されている」と分かるような作品を目指してください。
ユーザーのテーマを最大限に解釈して、全尺、1フレームも無駄にしない映像 を制作してください。
Reviews
No reviews yet. Tell others what you thought.
Comments
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.