ポッドキャスト用モーショングラフィックス
Motion 5.9 には AppleScript 辞書も CLI レンダラーもありません。ここで行う処理はすべて、Motion ファイルを XML (ozml) として扱い、Final Cut Pro がレンダリングを行う FCPXML を生成することで実現しています。Final Cut がレンダリングを担当します。
ツールは agent-motion/ にあります:
| ツール | 機能 |
|---|---|
motionkit.py inspect FILE [--json] | レイヤー構造、テキストレイヤー(テキスト/フォント/サイズ/位置)、タイミング(秒)、FCP に公開されている項目、メディア参照を表示 |
motionkit.py set-text IN OUT --set "KEY=TEXT" ... | テキストレイヤーを書き換えます。KEY はレイヤー ID、レイヤー名、または現在のテキストを指定。\n で改行。styleRun の長さ(UTF-16)を自動調整するため Motion がエラーを起こしません |
motionkit.py keyframes FILE [--grep X] [--all] | すべてのアニメーションパラメーターとそのキーフレーム時間・値を表示(回転はラジアン) |
motionkit.py preview FILE --at 1.9 3.2 [--open] | 指定した時間にファイルをコピーして書き出します。--open を付けると Motion でバックグラウンドで開きます(open -g)。app_screenshot によるスクリーンショット取得に使用 |
motionkit.py install FILE --name NAME | プロジェクトを Motion のタイトルフォルダに FCP タイトルテンプレートとしてコピー |
titles_fcpxml.py SPEC.json -o OUT.fcpxml | キューリスト → タイトルが適切な時間・テキストで配置された FCPXML プロジェクトを生成 |
番組のテンプレート
インストール先: ~/Library/Containers/com.apple.motionapp/Data/Movies/Motion Templates.localized/Titles.localized/Templates/
(FCP での UID 形式: ~/Titles.localized/Templates/<Name>/<Name>.moti)。メインの 2 つのテンプレートのスナップショットは agent-motion/*.motn にあります。
- TF_Podcast_title: メインタイトルカード、5 秒、29.97fps、1080p。テキストレイヤー:
Tiersias Foundation Podcast(表示は「Tiresias Foundation Podcast」; レイヤー名にタイポがありますが、そのままキーとして使用してください)とEpisode 4: Carl Schmitt(エピソードごとの行、Futura Medium)。1 つのドロップゾーンを公開しています。 - Citation v2: 引用と出典用のローワーサード、PT Serif。テキストレイヤー:
~Author Lastname(イタリック; 番組では先頭に~を付けます)、Person Writes Silly Headline to(作品のタイトル、2行になる場合あり)、20 Apr, 1969(日付)、Publication。 - Citation v2 no pub: 上記から出版元の行を除いたもの。他にも Citation v1、Black/Orange/Yellow/PeeTitle、Minister_Types があります。
過去の使用例(Podcast3/4 ライブラリより): Timothy Snyder、Carl Schmitt、Xunzi、
~Eric L. Hutton, trans.、~Armando Iannucci, dir.、95 U.S. 602。翻訳者や監督には役割の接尾辞を付けます。裁判例は著者スロットに入れます。
ワークフロー
python3 agent-motion/motionkit.py inspect "<template>.moti"でテキストレイヤーのキーを取得します。- キュー JSON を記述します(
agent-motion/examples/ep_demo.jsonを参照): テンプレート、at(エピソードタイムライン上の秒数)、オプションのduration、textsマップ。 python3 agent-motion/titles_fcpxml.py cues.json -o titles.fcpxmlを実行し、検証します:xmllint --noout --dtdvalid <FCPXMLv1_11.dtd のコピー> titles.fcpxml。DTD は/Applications/Final Cut Pro.app/Contents/Frameworks/Interchange.framework/Versions/A/Resources/にあります。 まずコピーしてください。xmllint はスペースを含むパスで失敗するためです。- 読み込み:
--library <bundle> --pushを追加します(ゼロクリック)。--libraryなしの場合、FCP はライブラリ選択ダイアログを表示しますので、ユーザーに任せてください。タイトルはギャップの上に接続されて配置されるため、実際の編集にコピーできます。
1回限りのベイク済みカード(サムネイルや、FCP ではオーバーライドできないスタイル変更が必要なカードなど)の場合は、.motn に対して set-text を使用し、open -g -a Motion OUT.motn でユーザーが目視確認または書き出しを行えるようにします。
FCP 11.0.1 (2026-10-18) で検証済み
- ゼロクリックインポートは動作します:
titles_fcpxml.py cues.json -o x.fcpxml --library path/To.fcpbundle --pushは<import-options>(ライブラリの場所、アセットのリンク、警告の抑制)を追加し、open -gで送信します。 FCP はバックグラウンドでインポートし、ライブラリがない場合は作成します。テストにはscratch/fcp-test/以下の使い捨てライブラリを使用し、ユーザーの実際のライブラリを許可なく使用しないでください。 <text>の順序 = Motion ドキュメント内の Text レイヤーの順序です。 確認済み: Citation v2 の著者、見出し、日付、出版元がすべて正しいスロットに配置されます。- プレーンテキストを送信します(デフォルトの
--style none)。 これによりテンプレート自身のフォント、サイズ、色、シャドウが維持されます。--style fontはtext-style-defを送信し、ファミリー/フェイス/サイズを指定します。スタイル定義はテンプレートを上書きし、Sizeパラメーターがないレイヤー(Motion デフォルト 48)は、48 のフォールバックが追加されるまでは非常に小さく表示されていました。--style fontは意図的にスタイルを変更する場合にのみ使用してください。 - メインタイトルカード(TF_Podcast_title)はアニメーションを維持したままインポートされます。
- FCP の状態は
com.apple.FinalCutのapp_screenshotで読み取ります: イベントをクリックし、ブラウザ内のプロジェクトアイコンをクリックします(名前をダブルクリックすると名前変更が始まるので、Escape キーを押します)、そしてルーラーをクリックします。
表示とレンダリング(2026-10-18 検証済み)
- プレビューフレーム:
motionkit.py preview FILE --at T --openを実行し、computer-use で Motion(バンドルcom.apple.motionapp)のapp_screenshotを取得し、キャンバスを拡大表示します。app_menu File > Closeでウィンドウを閉じてください。バックグラウンドから Motion の再生ヘッドフィールドに入力しても再生ヘッドは移動しません。<currentFrame>コピーが信頼できる方法です。 - レンダリング: computer-use では File > Share(Export Movie、Save Current Frame)を押せません。ユーザーに Export をクリックするよう依頼してください。シェルの
screencaptureには画面収録の許可がありません。 -gなしでopen -aを実行しないでください。ユーザーは同じ画面で作業しています。
アニメーション(XML で公開されているもの)
キーフレームは任意のパラメーター(Transform Position/Rotation/Scale、Blending Opacity、フィルターパラメーター)の下にある curve > keypoint{time, value, in/out tangents} です。ベヘイビア(Gather In、Pen Speed/Pressure)は独自のノードとして存在し、タイミングと Controls パラメーターを持ちます。したがって、完全な動きを読み取り、プログラムでタイミングの変更、オフセット、キーフレームの追加が可能です。その後、プレビューとスクリーンショットで確認します。
TF_Podcast_title の動き: Tiresias のフィギュア(Group 1/2)が ±400 px から 1.5 秒かけてスライドインし、その後 4.87 秒まで ±10 px / ±2° で揺れます。蛇の画像ペアは 1.74 秒でポップインし(スケール 0.17→0.62、2.1 秒まで、角丸長方形でマスク)、2.1/3.17/4.14/4.87 秒のキーフレーム間で動きます。タイトル行は 1.5~1.7 秒でフェードインし、Gather In が 1.0 秒から、エピソード行は 2.37 秒で Gather In します。
ozml に関する注意事項
- 時間は
"value timescale flags epoch"の形式です。秒 = value / timescale。 - テキストコンテンツ:
scenenode[factory=Text] > parameter[name=Object] > parameter[id=369] > text。 スタイルはstyleRun style=ID offset lengthで指定されるため、長さが一致しないとスタイルが壊れます。 - 先頭のファクトリーテーブルで
factoryID→ 種類(Text、Shape、Replicator、Image...)がマッピングされています。ID はファイルごとに異なるため、常にファクトリーテーブルを通して解決してください。 - Apple の(古いですが、ほとんどは正しい)リファレンス: developer.apple.com アーカイブの Motion XML ガイド。