soundtrack について
soundtrackは、Web Audioで映像に合わせた音楽を作り、カットと同期させるスキルです。同期検査に加え、AI生成曲やユーザー提供の音源を使う方法も記載しています。
主な機能
- 01Web Audioで独自のスコアを作成
- 02シーンのカットを拍に合わせる
- 03同期ずれと音量変化を検査
- 04スコアをレンダリングしてMP4に多重化
- 05AI生成曲やユーザー提供曲に対応
活用シーン
- 01短編映像専用のスコアを作成
- 02シーンや場面内のカットに音楽を同期
- 03拍ずれや不自然な音量変化を検出
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ iart-ai/ javascript-animation-skills --skill soundtrackインストール後、Claude Code で/soundtrackを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/ai-music.mdscripts/sync-check.mjstemplates/groove.jsscore.js詳細
サウンドトラック
映画に合わせて音を作る
映画のサウンドは、その映画のために作ります。Web Audioで独自の楽器、リズム、ハーモニーを一から組み立て、window.SCORE = ac => { … } に記述します(オシレーター、ノイズ、フィルター、エンベロープ、ディレイなど、楽曲に必要なものは何でも使えます)。ドラム、グルーヴ、オルゴールのような伴奏も、同じようにその映画のために作ります。テンプレートを使い回すことがないため、どの映画も同じ音にはなりません。templates/groove.js と templates/score.js は、ユーザーから指定があった場合にのみ使用する、すぐに使えるスコアです。それぞれのファイルにオプションの説明があります。
javascript-animation スキルの render.mjs は、OfflineAudioContext を使って window.SCORE をオフラインでレンダリングし、<out>.wav に書き出して MP4 に多重化します。ページのライブプレビューでは、クリックすると同じスコアを再生します。
最初に音楽のソースを選ぶよう、ユーザーに求めないでください。納品時に、AI 生成音楽やユーザー自身のトラックも使えることを一文で伝えてください。
音楽を映像に合わせる方法
- テンポマップを使う。 シーンごとに小節数を整数で割り当てます(シーンごとにテンポを変えてもかまいません)。これにより、すべてのカットが強拍に重なります。
- 音量ではなく、ハーモニーでカットを示す。 各シーンでは属音に向かって解決し、カットの瞬間に主音へ到着させます。カットに大きなアクセントを加える(ベースと明るいチャイムを同時に鳴らす)と、ジャンプスケアのように聞こえます。ユーザーからは、+7〜+10 dB の音量差は驚かされる一方、和音の変化を伴う +3〜+5 dB の音量差なら自然な編集に聞こえるとの報告がありました。
- 最初のカットまでに小節が1つしかない場合、その冒頭の小節を薄くしないでください。 まばらなイントロからフルのテクスチャへ移ること自体が、驚きを生みます。
- カットの強拍に余分なアクセントを加えないでください。 通常の強拍のアクセント(大きめのベース音と最初の音)でさえ、短い作品では +6 dB を超えることがありました。直前の小節の音が減衰しているためです。和音の変化だけで十分です。
- シーン内のハードカットも対象です。
window.CUESにも追加し、同じ強拍に揃えてください。 - 目で追えるものを用意してください。 パーカッションのないレガートな音楽には、カットの着地点となるアクセントがありません。安定したグルーヴがあれば、アクセントはリズムの一部なので驚かせることはありません(チェックでは一瞬の静かな箇所ではなく、直近数秒と比較します)。
- レイヤーは小節ごとに1つか2つずつ加えてください。 静かなイントロのあとにキックとベースを同時に加えたところ、音量差は +11 dB(驚かせる)でした。1小節ずつずらして加えると +3.5 dB でした。
- ブレイクを入れてください。 見せ場の前に小節まるごと無音にすると、短編では最も強いビートになります。
sync-checkは、無音へのカットをビートに合ったものとして認めます。
その他の音源(依頼があった場合のみ)
- AI 生成音楽(例:OpenRouter 経由の Lyria):
references/ai-music.mdを参照してください。 - ユーザー自身のトラック:ffmpeg で多重化してください。
自分で制御できない音楽を使う場合は、手順を逆にします。映像を音楽に合わせてください。 レンダリングして多重化し、チェックを実行したら、報告されたオフセットに合わせてページの SCENES テーブル内のシーン境界を移動し、再レンダリングします。各シーン関数はスターターの実装どおりローカル時間(シーン開始時を 0 とする時間)を受け取るため、シーン境界を動かしてもシーンのコードには触れずに済み、作業コストも小さくなります。
必ずチェックする
node scripts/sync-check.mjs piece.mp4 --cues-file piece.cues.json # check the declared CUES (preferred)
node scripts/sync-check.mjs piece.mp4 # fallback: detect cuts in the picture (fast camera moves can read as cuts)
各イベントについて、最も近い強い音の立ち上がりまでのオフセットと、そのイベントに入るときの音量差を表示します。拍からのずれが ±100 ms(約3フレーム)を超えると OFF-BEAT、直前の1秒間と比べて +6 dB を超えると STARTLE として失敗します。冒頭の1秒間と最後のフェードはチェック対象外です(比較する直前の音がなく、フェードアウトはカットではないため)。「強い」とは、±2秒以内の立ち上がりのなかで目立つことを意味します。そのため、静かなパッセージのアクセントも対象になります。無音へのカットは着地として扱い、ブレイク後に音楽が戻る場合は、直前4秒間の標準的な音量と比較します。音声ストリームのない動画は、そのように報告されます。すべてのカットと、チェックしたいシーン内のヒット(ショット内のハードカット、ギャグの衝撃音など)を window.CUES に追加してください。合格するまで修正して再実行するか、残った STARTLE がすべて意図したスティンガーだと説明できる状態にしてください(コメディの衝撃音は驚かせるためのものですが、子守歌のカットはそうではありません)。
制限
コードで合成する音楽:オルゴール、ピアノのような撥弦音、パッド、ベル、控えめなパーカッションは問題ありません。リアルな歌声、オーケストラ、ジャンル特有の音作りには対応していません。その場合はAI音楽または実際の楽曲を使用してください。