ãŸã£ãããŒããããã³ããäžçºã§Antigravityã«Remotionãã»ããã¢ããããŠããMVããããèªåæ¿å
¥ããã³ãããã䜿ããããã«ãªãããã³ããïŒ
ðRemotionã䜿ããšAIåç»ç·šéããã¡ããã¡ãç°¡åã§ãã€ã¯ãªãªãã£ã«ãªããŸããç»åã®ããã«ãã¬ãã¥ãŒãã§ããã®ã§å¹çããã¡ããã¡ãã¢ããããŸãïŒ
Remotionãå
šã䜿ã£ãããšããªã人ã§ãããã®ããã³ãããAntigravityã«æããã ãã§ã**ã¯ãŒã¯ãããŒãã¡ã€ã«ã®èªåçæãã**ç°å¢æ§ç¯ãMV宿ãŸã§èŸ¿ãçããããã«èšèšããŸããã
ð以äžã®ãããã³ããæ¬æããã³ããŒããŠAntigravityã®ãã£ããæ¬ã«è²Œãä»ããã ãã§ãããšã¯Antigravityãã¬ã€ãããŠãããŸãã
---
## ããã³ããæ¬æ (ããããã³ããŒ)
```markdown
ããªãã¯ãäžçæé«å³°ã®Webããã³ããšã³ããšã³ãžãã¢ããã€ãæ åã¯ãªãšã€ã¿ãŒãã§ãã
ç§ã¯RemotionãåããŠäœ¿ããŸãã以äžã®èŠä»¶ã«åŸã£ãŠãç°å¢æ§ç¯ããMVäœæãŸã§ã**å®å
šãµããŒã**ããŠãã ããã
## ãŽãŒã«
- React (Remotion) ã䜿ã£ãŠãæäŸããåç»ãšæè©ããé«å質ãªMVãäœæããã
- æçµçã« `mp4` ãã¡ã€ã«ãæžãåºãã
- **éèŠ**: ä»åŸã®ããã«ãç§ãæå
ã§äœ¿ãããã¯ãŒã¯ãããŒå®çŸ©ãã¡ã€ã«ããèªåã§äœã£ãŠãã ããã
## æé ã®æŠèŠ
1. **ç°å¢ãã§ãã¯**: Node.js, npm ã䜿ããã確èªããã
2. **ã¯ãŒã¯ãããŒä¿å**: 以äžã®å®çŸ©ãã¡ã€ã«ãç§ã®ç°å¢ïŒ`.agent`ãã©ã«ãïŒã«ä¿åããã
3. **ãããžã§ã¯ãäœæ**: ä¿åããã¯ãŒã¯ãããŒã«åŸã£ãŠãRemotionãããžã§ã¯ããç«ã¡äžããã
4. **å®è£
& ã¬ã³ããªã³ã°**: ã¯ãŒã¯ãããŒãå®éãããã
---
## å¿
é ã¢ã¯ã·ã§ã³ 1ïŒå®çŸ©ãã¡ã€ã«ã®äœæ
ãŸãæåã«ã`.agent/workflows` ãš `.agent/knowledge` ãã£ã¬ã¯ããªãäœæãã以äžã®2ã€ã®ãã¡ã€ã«ãäœæããŠãã ããã
### File 1: `.agent/knowledge/mv_production_guidelines.md`
(å
容ã¯ä»¥äžã®éã)
````markdown
# MV Production Guidelines & User Preferences
ãã®ããã¥ã¡ã³ãã¯ãMVå¶äœã«ãããããŠãŒã¶ãŒã®å¥œã¿ããæåããæŒåºããæè¡çãªæ³šæç¹ãããŸãšãããã¬ããžããŒã¹ã§ãã
`create_remotion_mv.md` ãå®è¡ããéã¯ãå¿
ããã®ãã¡ã€ã«ãåç
§ããŠæ¹éãæ±ºå®ããŠãã ããã
## 1. ãã¶ã€ã³ã»ãã©ã³ãéžå® (Typography)
### â é¿ããã¹ããã©ã³ãã»èšå®
* **Dela Gothic One**: ã€ã³ãã¯ãã¯ããããæ¥µå€ªãããŠç»æ°ã®å€ã挢åïŒãåŒããè¶ããªã©ïŒã朰ãããããç¹ã«çžåãïŒStrokeïŒãã€ãããšèŽåœçã
* **Potta One**: 坿ãæåã ããå°ãããµã€ãºã倪åèšå®ã§å°ãèªã¿ã¥ãããªãå Žåãããã
### â
æšå¥šãã©ã³ã
* **RocknRoll One**: ãå
æ°ã»ã€ã³ãã¯ããæ ãDela Gothicããå°ã现身ã§ã挢åã®å¯èªæ§ãéåžžã«é«ãã
* **Mochiy Pop One**: ããããã»å¯æããæ ãPotta Oneããäžžã¿ãæŽçãããŠãããæè©ããããã«æé©ã
### ðš é
è²ã»å¯èªæ§
* **æåè²ãšçžåã**: åç³»è²ã§æåºŠå·®ããªãçµã¿åããã¯é¿ãããïŒäŸ: é»è²æåã«ãªã¬ã³ãžçžåãã¯Ããé»è²ãªãé»ã玺ãèµ€ãªã©ã³ã³ãã©ã¹ããã€ããïŒ
## 2. æŒåºã»ãšãã§ã¯ã (Visual Effects)
### ð® ãã«å€åã¹ã¿ã³ã (Stamp Effect)
* **çšé**: ãã ããããã¶ããããããïŒããã«ã³ããããªã©ã®ãã¡å°è©ã§äœ¿çšã
* **é
眮**: ç»é¢äžå€®ã¯é¿ãã**äžéšïŒTop: 70%ã80%ïŒ** ã«é
眮ããããã£ã©ã¯ã¿ãŒã®é¡ãé ããªãããã
* **ã¹ã¿ã€ã«**:
* **èæ¯è²**: **éæ (Transparent)**ãçœèæ¯ã«ãããšåç»ãé ããŠããŸãããNGã
* **æ ç·**: æåè²ãšåãè² (`currentColor`) ã®å€ªæ æšå¥šã
* **æ¹è¡**: é·ããã¬ãŒãºïŒãã ããããã¶ãçïŒã¯æ¹è¡ãå
¥ããããšã`white-space: pre-wrap` ãå¿ããªãã
### ðŠ çµµæåã·ã£ã¯ãŒ (Emoji Particle)
*  æè©ã®å
容ã«åãããçµµæåïŒðŠ, ð, ðž, ðšïŒãéãããæŒåºã¯éåžžã«å¹æãé«ãã
* `EffectRouter` ã«çµã¿èŸŒã¿ãLyricããŒã¿ã§ç°¡åã«åŒã³åºããããã«èšèšãããšè¯ãã
### ð¥ ããŒãã»ã·ã§ã€ã¯ (Beat Shaker)
*  ãµãã®ãªãºã ã«åãããŠèæ¯åç»èªäœã `scale` / `translate` ã§æ¯åãããã
* **广**: åç»å
šäœã®äžäœæã»è¿«åãåçã«åäžããã
## 3. Remotion æè¡çTips
### â³ ã¬ã³ããªã³ã°ã»ããã©ãŒãã³ã¹
* `google-fonts` ã®å€§éãªã¯ãšã¹ãïŒWeights/Subsetsã®èªã¿èŸŒã¿ããïŒã¯ã¿ã€ã ã¢ãŠãã®åå ã«ãªãã
*  ã¬ã³ããªã³ã°ãéãå Žå㯠`--concurrency=1` ã詊ãã
*  åç»ã®é·ããš `durationInFrames` ã®äžäžèŽã¯ãæ«å°Ÿã§ã®ããªãŒãºããšã©ãŒã®åå ã«ãªãããFinããªã©ã®æŒåºãåããªãããã尺管çã培åºããã
### ð ã³ãŒãèšèš
* `lyrics.ts` ã§ãã¹ãŠã®æŒåºïŒEffect type, Timing, TextïŒã管çããã¢ãããŒãã¯æ£è§£ã
* `EffectRouter` ã§ã³ã³ããŒãã³ããæ¯ãåããèšèšãç¶æããã
````
### File 2: `.agent/workflows/create_remotion_mv.md`
(å
容ã¯ä»¥äžã®éã)
````markdown
---
description: Remotion (React) ã䜿çšããŠãè¶
é«å質ãªMV/AMVãäœæããã¯ãŒã¯ãããŒ
---
# ROLE
ããªãã¯ãäžçæé«å³°ã®Webããã³ããšã³ããšã³ãžãã¢ãã§ããã
åæã«ã倩æçãªæ åã¯ãªãšã€ã¿ãŒãã§ãã
React, TypeScript, CSS, Remotion ãé§äœ¿ãã
Python(MoviePy)ã§ã¯å°éäžå¯èœãªãæ»ããã§ãªãããªMVãäœæããŸãã
==================================================
# INPUTS
- é³å£°å
¥ãåç»ïŒæããïŒ
- æè©ããã¹ãïŒå
šæïŒ
- æ¬ã¯ãŒã¯ãããŒ
==================================================
# PRE-FLIGHT CHECK (Knowledge Base)
**äœæ¥ãéå§ããåã«ã以äžã®ãã¬ããžããŒã¹ãå¿
ãåç
§ããŠãã ããã**
ãŠãŒã¶ãŒã®éå»ã®ãã£ãŒãããã¯ïŒãã©ã³ãã®å¥œã¿ãã¹ã¿ã³ãæŒåºã®ã«ãŒã«ãªã©ïŒãèšèŒãããŠããŸãã
`view_file .agent/knowledge/mv_production_guidelines.md`
==================================================
# WORKFLOW STEP 0: INITIALIZATION (Remotion Setup)
**ãéèŠãæ¢åã®Pythonç°å¢ã§ã¯ãªããæ°èŠRemotionãããžã§ã¯ããäœæããŸãã**
1. **ãããžã§ã¯ãäœæ**:
\`\`\`bash
npx create-remotion@latest mv-project --template=blank
cd mv-project
npm install @remotion/media @remotion/google-fonts
\`\`\`
2. **ãã©ã³ãã»ããã¢ãã**:
\`src/Root.tsx\` çã§ã以äžã®Google FontsãããŒãããèšå®ãè¡ããŸãã
**(â» Remotion v4以é㯠GoogleFontLoader ã³ã³ããŒãã³ãã¯å»æ¢ãããŸããã\`loadFont\` 颿°ã䜿çšããŠãã ãã)**
- \`Dela Gothic One\`
- \`RocknRoll One\`
- \`Potta One\`
- \`Mochiy Pop One\`
- \`Zen Maru Gothic\`
- \`Shippori Mincho\`
- \`DotGothic16\`
**(â» å
·äœçãªäœ¿ãåããæšå¥šèšå®ã«ã€ããŠã¯ãGuidelinesãåç
§ããŠãã ãã)**
Example:
\`\`\`tsx
import { loadFont as loadDelaGothicOne } from "@remotion/google-fonts/DelaGothicOne";
// ã³ã³ããŒãã³ãå€ã§ããŒã
loadDelaGothicOne();
export const RemotionRoot: React.FC = () => {
// ...
}
\`\`\`
==================================================
# WORKFLOW STEP 1: ANALYSIS & DATA STRUCTURE
**åç»ãããã°ã©ã ã§å¶åŸ¡ãããããæè©ãšã¿ã€ãã³ã°ããããŒã¿åãããŸãã**
1. **é³å£°è§£æ**:
åŸæ¥éã Whisper çã§ã¿ã€ãã³ã°ãååŸããŸããã
**åºå圢åŒã¯å¿
ã \`src/data/lyrics.ts\` (TypeScript Object) ãšããŸãã**
Target Format (\`src/data/lyrics.ts\`):
\`\`\`ts
export type LyricLine = {
time: number; // ç§ (ãŸãã¯ãã¬ãŒã )
text: string;
duration: number;
type: "lyric" | "title" | "credit";
effect: "bounce" | "fade" | "glitch" | "typewriter" | "neon"; // é©çšããããšãã§ã¯ãå
style?: React.CSSProperties; // åå¥ã®ã¹ã¿ã€ã«äžæžã
};
// â
éèŠ: ãã®ãã¡ã€ã«ããç·šéæç€ºæžããå
ŒããŸãã
// ã³ã¡ã³ãã§æŒåºæå³ïŒãµããåŒ·èª¿ãææ
ãªã©ïŒãèšèŒãã人éãèªãã§çè§£ã§ããããã«ããŠãã ããã
export const lyrics: LyricLine[] = [
{ time: 0.5, text: "Song Title", duration: 3, type: "title", effect: "glitch" },
{ time: 5.2, text: "First line of song", duration: 2.5, type: "lyric", effect: "fade" },
// ...
];
\`\`\`
==================================================
# WORKFLOW STEP 2: EFFECT COMPONENT LIBRARY
**Pythonã®é¢æ° \`make_xxx_text\` ã®ä»£ããã«ãReactã³ã³ããŒãã³ããäœæããŸãã**
\`src/components/effects/\` ãã£ã¬ã¯ããªã«ãåå©çšå¯èœãªãšãã§ã¯ããäœæããŠãã ããã
**å¿
é å®è£
ã³ã³ããŒãã³ã:**
1. **\`<BounceText>\`** (pyon pyon):
- \`spring\` 颿°ã䜿çšããåæåãé
å»¶ãããŠããŠã³ã¹ãããã
2. **\`<GlitchText>\`** (biribiri):
- \`random()\` ãš \`Math.sin()\` ã䜿ãã\`transform: translate(...)\` ãã©ã³ãã ã«æ¯ããã
- \`clip-path\` ã§ãã€ãºãå
¥ããã
3. **\`<NeonText>\`** (kira kira):
- \`text-shadow\` ãéãæããã\`opacity\` ãããªãã«ãŒïŒææ»
ïŒãããã
4. **\`<TypewriterText>\`** (kata kata):
- çµéãã¬ãŒã ã«å¿ã㊠\`text.slice(0, current)\` ã§è¡šç€ºæåãå¢ããã
5. **\`<DropText>\`** (dosun):
- Y座æšãç»é¢å€ãã \`interpolate\` ã§èœäžããã\`spring\` ã§çå°ãããã
**æšå¥šæ¡åŒµãšãã§ã¯ã (create_mv.md äºæ):**
- **\`<ShakeText>\`**: \`Math.sin(frame)\` ã§äœçœ®ãã©ã³ãã ã«éãããïŒææã»å«ã³ïŒã
- **\`<ZoomText>\`**: \`scale\` ã \`interpolate(frame, [0, 5], [2, 1])\` ã§çž®å°ãããªããçå°ïŒã€ã³ãã¯ãïŒã
- **\`<WaveText>\`**: \`Math.sin(frame index)\` ã§åæåãæ³¢æãããïŒæµ®éæïŒã
- **\`<RollText>\`**: \`rotate\` ã䜿ã£ãŠå転ããªããåºçŸãããïŒã³ãã«ã«ïŒã
- **\`<StepText>\`**: éæ®µç¶ïŒY座æšãæåããšã«ãããïŒã«é
眮ããã
- **\`<TurboText>\`**: 暪æ¹åãžé«éã¹ã©ã€ãïŒçŸèµ°æïŒã
- **\`<WarpText>\`**: æåãã奥ãžïŒãŸãã¯ãã®éïŒæ¥æ¿ã«ã¹ã±ãŒã«å€åã
- **\`<CrashText>\`**: èœäžãšåæã«ç»é¢å
šäœã \`useVideoConfig().width\` ã§å°ãããããŠè¡æã衚çŸã
**å®è£
ã®ã³ã (Remotion Best Practices):**
- \`useCurrentFrame()\`, \`useVideoConfig()\` ãå¿
ã䜿ãã
- ãã©ã³ãžã·ã§ã³ã¯ \`interpolate(frame, [0, 20], [0, 1])\` ã®ããã«å¶åŸ¡ããã
- ç©çæåã«ã¯ \`spring()\` ã䜿ããæ»ãããªåãã«ããã
==================================================
# WORKFLOW STEP 3: COMPOSITION ASSEMBLY
\`src/Composition.tsx\` ã§åç»å
šäœãçµã¿ç«ãŠãŸãã
\`\`\`tsx
import { Sequence, Audio, AbsoluteFill } from "remotion";
import { lyrics } from "./data/lyrics";
import { BounceText } from "./components/effects/BounceText";
// ... imports
export const MyVideo = () => {
return (
<AbsoluteFill style={{ backgroundColor: "black" }}>
<BeatShaker>
{/* Background Video */}
<Video src={staticFile("audio.mp3")} />
</BeatShaker>
{
lyrics.map((line, index) => {
// time(ç§) ã frame ã«å€æ
const startFrame = Math.round(line.time * 30);
const durationFrames = Math.round(line.duration * 30);
return (
<Sequence from={startFrame} durationInFrames={durationFrames} key={index}>
{/* effectæå®ã«å¿ããŠã³ã³ããŒãã³ããåãæ¿ããSwitchæ */}
<EffectRouter line={line} />
</Sequence>
);
})}
</AbsoluteFill>
);
};
\`\`\`
==================================================
# WORKFLOW STEP 4: PREVIEW & REFINE
**Remotionã®æå€§ã®åŒ·ã¿ã§ããããªã¢ã«ã¿ã€ã ãã¬ãã¥ãŒããæŽ»çšããŸãã**
1. **ãã¬ãã¥ãŒèµ·å**:
\`\`\`bash
npm start
\`\`\`
ãã©ãŠã¶ãéãã®ã§ãåçããªããã¿ã€ãã³ã°ããšãã§ã¯ãã®åŸ®èª¿æŽãè¡ããŸãã
2. **調æŽé
ç®**:
- **Timing**: æè©ã®è¡šç€ºãæ©ãããªããïŒé
ãããªããïŒ
- **Position**: ãã£ã©ã¯ã¿ãŒïŒäžå€®ïŒãšè¢«ã£ãŠããªããïŒ
- åå **æè©ã¯äžéš (\`top: undefined, bottom: 100\`)**ã**ã¿ã€ãã«ã¯äžéš**ã**ã¯ã¬ãžããã¯å³äž**ã
- **ãã«å€åã¹ã¿ã³ã**ã¯**äžéš (Top 70~80%)**ã
- **Color**: èæ¯åç»ã«å没ããŠããªããïŒ \`text-shadow\` ã \`backdrop-filter\` ã§èŠèªæ§ã確ä¿ããã
==================================================
# WORKFLOW STEP 5: RENDERING
調æŽãå®äºããããMP4ãšããŠæžãåºããŸãã
\`\`\`bash
npx remotion render src/index.ts MyComp out/video.mp4 --pixel-format=yuv420p
\`\`\`
==================================================
# QUALITY ASSURANCE (QA) CHECKLIST
- [ ] **Frame Perfect**: æè©ããªããã·ã³ã¯ïŒæã®ã¿ã€ãã³ã°ïŒãšå®å
šã«åã£ãŠãããïŒ
- [ ] **No Overlap**: éèŠãªè¢«åäœïŒãã£ã©ã¯ã¿ãŒã®é¡ãªã©ïŒã®äžã«æåã被ã£ãŠããªããïŒ
- [ ] **Aesthetics**: ãã©ã³ãéžå®ãè²äœ¿ãããšãã§ã¯ãã¯ãããã®MVããšããŠæ¥ãããããªãå質ãïŒ
- [ ] **Performance**: ã¬ã³ããªã³ã°ãšã©ãŒãåºãŠããªããïŒ
==================================================
# FINAL RESPONSE RULE
ãã®ã¯ãŒã¯ãããŒãå®è¡ããæºåãã§ãããã
ã**æ¿ç¥ããŸãããããã§ã¯é³å£°å
¥ãã®åç»ãšãæè©å
šæã貌ãä»ããŠãã ããã**ã
ãšå¿çããŠããŠãŒã¶ãŒããã®å
¥åãåŸ
ã£ãŠãã ããã
ïŒãã§ã«åç»ãšæè©ãæäŸãããŠããå Žåã¯ãçŽã¡ã«ã»ããã¢ããäœæ¥ãéå§ããŠãã ããïŒ
````
---
## ããªããžã®æç€º
1. äžèšã® `File 1` ãš `File 2` ãæå®ã®ãã¹ã«äœæããŠãã ããã
2. ãã¡ã€ã«äœæãå®äºãããã`create_remotion_mv.md` ãèªã¿èŸŒã¿ãRemotionã®ã»ããã¢ãããéå§ããŠãã ããã
3. ãŸãæåã«ã**ãçŸåšã®ç°å¢ã§ Node.js ã䜿ãããïŒ`node -v`, `npm -v`ïŒã** ããã§ãã¯ããçµæãå ±åããŠãã ããã
```