모션 비디오
10~30초 길이의 모션 그래픽 스팟을 실제 코드로 만듭니다: Swift 신디사이저가 악보를 작성하고, Swift CoreGraphics/CoreImage 렌더러가 동일한 비트 그리드(서브프레임 모션 블러, 실제 가우시안 블러, 프로스트 글라스, 필름 그레인 포함)에 맞춰 모든 프레임을 그리며, AVFoundation이 H.264 + AAC를 인코딩합니다. 필요한 모든 것은 이 스킬 폴더 안에 있습니다. macOS + Xcode 커맨드라인 도구가 유일한 의존성입니다.
기준은 "모션 디자이너의 쇼릴"이며, 데모가 아닙니다: 모든 큐가 음악 위에 정확히 떨어지고, 화면의 어느 것도 장식적인 노이즈가 아니며, 모든 주장은 사실입니다.
폴더 맵
engine/—audio_core.swift+audio_main.swift(악보 엔진),video_core.swift+video_main.swift(렌더 엔진). 프로젝트별로 편집하지 마세요. 프로젝트 코드는 프로젝트 폴더에 들어갑니다.scripts/mv.sh— 빌드 + 실행:audio,stills <beats>,video [out].levels.py,sheet.py,probe.swift가 이 스크립트에 의해 사용됩니다.- 완전한 작업 프로젝트는 동반 스킬
app-3d-video에 있습니다(template/:score.swift,scenes.swift,project.env, 추가로 SceneKit 레이어s3d.swift). 2D 전용 비디오의 경우, 그project.env와score.swift를 복사하고references/engine-api.md를 참조하여 새scenes.swift를 작성하세요. examples/scores/energetic-128bpm.swift— 고에너지 런치 스코어(드롭, 필, 드롭아웃).references/motion-direction.md— 톤별 페이싱, 이징, 전환, 레이아웃, 스토리텔링 패턴, 리뷰 체크리스트. 씬 계획 전에 읽으세요.references/score-guide.md— 템포/키/편곡 레시피, 브랜드 사운드 키 매칭, 라우드니스 목표. 스코어 작성 전에 읽으세요.references/engine-api.md— 모든 드로잉/오디오 함수와 시그니처. 코드 작성 시 읽으세요.
워크플로우
1. 브리핑 (결과를 바꾸는 질문만 유지)
확정: 목적 및 대상, 지속 시간, 화면 비율(기본 1080×1920 세로; W/H를 통해 1920×1080 또는 1080×1350), 톤, 화면 텍스트 언어. 사용자가 신경 쓰지 않으면 기본값: 15초, 세로, 영어 텍스트, 제품 도메인에 맞춘 톤. 요청된 콘텐츠가 톤에 맞는 속도로 지속 시간에 맞지 않으면, 억지로 넣기보다 어떤 것을 포기할지(지속 시간 또는 콘텐츠) 질문하세요. (헬스 앱이 차분한 페이싱 과 15초를 원했다면, 답은 속도를 높이는 것이 아니라 씬을 없애는 것이었습니다.)
2. 참인 것이 무엇인지 조사
화면의 모든 것은 방어 가능해야 합니다:
- 출시된 것: 마지막 몇 번의 버전 범프 이후
git log, CHANGELOG, 릴리스 노트. - 정확한 제품 텍스트: 알림 제목/본문, 버튼 레이블, Siri/인텐트 대화 문자열, 스니펫 제목, 온보딩 텍스트에 대해 코드를 읽으세요. 인용하세요; 약속으로 의역하지 마세요.
- 예시적인 것(샘플 이름, 개수, 시간)을 표시하고 전달 시 사용자에게 알리세요.
- 스토리를 내부적으로 일관성 있게 유지하세요: 씬 1이 9시 41분에 메트포르민을 기록했다면, 씬 2에서 "메트포르민을 마지막으로 언제 복용했나요?"라고 묻고 "13시간 전"이라는 응답을 들을 수 없습니다. 다른 약물을 사용하세요.
3. 에셋
실제 브랜드 에셋 수집: 앱 아이콘(가장 큰 PNG), 로고, 브랜드 색상(디자인 토큰/에셋 카탈로그), 제품이 이미 사용하는 공식 배지(예: "Works with Apple Health"), 그리고 제품 자체 사운드(알림/소닉 로고 WAV). 신디사이저용 원샷 변환: afconvert -f WAVE -d LEF32@48000 -c 1 in.wav assets/name.wav; SVG → PNG는 sharp/resvg (리포지토리에 있다면) 또는 qlmanage -t -s 1024.
원시 스크린샷보다 하나의 데이터 세트(하나의 배경화면, 하나의 시계 시간, 하나의 이름 세트)로 재현된 벡터 UI를 선호하세요. 서로 다른 소스(다른 시간, 기기, 데이터, 프레임)의 스크린샷을 나란히 놓으면 부자연스러워 보이며, 시청자가 즉시 알아차립니다. 스크린샷을 사용해야 한다면, 한 세션에서 xcrun simctl status_bar booted override --time 9:41 …로 캡처하고, 이후에 지우고, 우연히 열려 있는 다른 앱은 절대 캡처하지 마세요.
4. 비트 그리드에서 계획
지속 시간 = 마디 × 4 × 60 / BPM, 따라서 BPM과 마디 수를 함께 선택하세요(15초 = 96 BPM에서 6마디, 128 BPM에서 8마디). 프로젝트에 plan.md를 작성하세요: 마디 → 씬 → 각 비트의 큐(단어 등장, 카드 배치, 체크 표시, 전환) 테이블. 마디당 하나의 아이디어; 중요한 순간(로고, 주요 기능, 엔드 카드)은 다운비트에 위치합니다. 톤 프리셋과 패턴은 references/motion-direction.md를 참조하세요.
5. 프로젝트 폴더
~/Movies/MotionVideo/<slug>/에서 작업하세요(나중에 수정을 위해 유지됨):
mkdir -p ~/Movies/MotionVideo/<slug> && cp ~/.claude/skills/app-3d-video/template/{project.env,score.swift} ~/Movies/MotionVideo/<slug>/
project.env(BPM, DURATION, W, H, FPS)를 편집하고, 브랜드 에셋을 assets/에 넣은 다음, score.swift를 다시 작성하고 scenes.swift를 작성하세요. scenes.swift 상단에서 브랜드에 맞게 팔레트 변수(INK, TEAL, MINT, GREEN, GLOW, PAPER, DARKTEXT, ORANGE, DARK_MID, LIGHT_GLOW_A/B)를 재할당하세요.
6. 먼저 스코어
score.swift를 작성하고(레시피는 references/score-guide.md 참조), mv.sh <dir> audio를 실행하세요. 소리를 들을 수는 없습니다. — 레벨 출력을 읽으세요: 톤에 맞는 목표 범위의 RMS, 클리핑 없음, 의도한 대로의 섹션 대비(조용한 인트로, 드롭에서의 리프트, 드롭아웃을 위한 딥). 비디오는 오디오 반응 요소를 위해 music.wav를 읽으므로, 스틸보다 먼저 오디오를 렌더링하세요.
7. 씬, 그다음 스틸 리뷰 — 최소 두 라운드
func render(_ t: Double, frame: Int)를 정의하는 scenes.swift를 작성한 후:
~/.claude/skills/motion-video/scripts/mv.sh <dir> stills 0.5,2,4.25,6,8.5,10,13,16,20,22.5
<dir>/sheet.png를 읽기로 열고 references/motion-direction.md의 체크리스트(스프링 오버슈트에서 겹침, 잘린 디센더, 너무 작은 텍스트, 지저분한 크로스페이드, 일관성 없는 UI, 죽은 공간)를 확인하세요. 또한 정지 상태뿐만 아니라 전환 중간 비트도 선택하세요. 라운드가 깨끗하게 나올 때까지 수정하고 다시 촬영하세요. 스틸 렌더링은 약 0.1초/프레임이므로 자유롭게 반복하세요.
8. 최종 렌더링 및 검증
mv.sh <dir> video <dir>/out.mp4 — SUB=5 모션 블러 사용 시 약 0.3–0.5초/프레임(15초 @ 60fps ≈ 5–8분)이므로 백그라운드에서 실행하세요. 프로브는 지속 시간과 트랙을 출력합니다. 또한 몇 개의 프레임을 추출하여(.build/probe out.mp4 <dir> 2,5,9,12) 확인하세요.
9. 전달
~/Downloads/<Product>_<Topic>_<duration>s[_vN].mp4로 복사하고, SendUserFile로 보내고, 보고하세요: 비트별 스토리(초), 어떤 에셋과 문자열이 실제인지, 무엇이 예시용인지, 측정으로만 오디오를 판단했음을 알리고, 사용자를 위한 짧은 체크리스트(볼륨으로 듣기, 휴대폰에서 가독성, 브랜드/배지 사용법)를 제공하세요. 수정 시 이전 버전(v1/)은 유지하세요.
수정하기
대부분의 피드백은 하나의 노브에 매핑됩니다: 느리게/차분하게 → 더 낮은 BPM + 더 적은 씬 + 감쇠된 스프링(k≈5, w≈6) + 더 긴 등장(0.9–1비트) + 휘핑 대신 랙 포커스/아이리스 전환; 더 에너지 넘치게 → 에너제틱 스코어, 오버슈트가 있는 스프링, 휘핑, 드롭에서의 플래시; "기능 X를 이해하지 못하겠어요" → 하나의 기기에서 전체 원인과 결과(요청 → 응답 → 결과)를 제품의 실제 응답 텍스트와 함께 보여주고, 기능 이름이 아닌 가치로 제목을 지정하세요.