Gráficos en movimiento para el podcast
Motion 5.9 no tiene diccionario AppleScript ni renderizador CLI. Todo lo que aquí se hace funciona
tratando los archivos de Motion como XML (ozml) y generando archivos FCPXML para Final Cut Pro que
hacen referencia a las plantillas de título instaladas. Final Cut se encarga del renderizado.
Las herramientas están en agent-motion/:
| Herramienta | Qué hace |
|---|---|
motionkit.py inspect ARCHIVO [--json] | Árbol de capas, capas de texto (texto/fuente/tamaño/posición), temporización en segundos, qué está publicado para FCP, referencias a medios |
motionkit.py set-text IN OUT --set "CLAVE=TEXTO" ... | Reescribe capas de texto. CLAVE = id de capa, nombre de capa o texto actual. \n para saltos de línea. Corrige las longitudes de styleRun (UTF-16) para que Motion no falle |
motionkit.py keyframes ARCHIVO [--grep X] [--all] | Cada parámetro animado con tiempos/valores de keyframe (la rotación está en radianes) |
motionkit.py preview ARCHIVO --at 1.9 3.2 [--open] | Escribe copias estacionadas en esos tiempos; --open las abre en Motion en segundo plano (open -g) para una app_screenshot |
motionkit.py install ARCHIVO --name NOMBRE | Copia un proyecto en la carpeta Títulos de Motion como plantilla de título de FCP |
titles_fcpxml.py SPEC.json -o OUT.fcpxml | Lista de señales → proyecto FCPXML con títulos en los momentos indicados y textos completados |
Las plantillas del programa
Instaladas en ~/Library/Containers/com.apple.motionapp/Data/Movies/Motion Templates.localized/Titles.localized/Templates/
(uid de FCP: ~/Titles.localized/Templates/<Nombre>/<Nombre>.moti). Las capturas de las dos
principales están en agent-motion/*.motn.
- TF_Podcast_title: tarjeta de título principal, 5 s, 29.97, 1080p. Capas de texto:
Tiersias Foundation Podcast(muestra "Tiresias Foundation Podcast"; el nombre de la capa tiene un error tipográfico, sigue usándolo como clave) yEpisode 4: Carl Schmitt(la línea por episodio, Futura Medium). Publica una Zona de Soltar. - Citation v2: tercio inferior para citas y fuentes, PT Serif. Capas de texto:
~Author Lastname(en cursiva; el programa antepone~),Person Writes Silly Headline to(título de la obra, puede tener dos líneas),20 Apr, 1969(fecha),Publication. - Citation v2 no pub: igual pero sin la línea de publicación. También Citation v1, Black/Orange/Yellow/PeeTitle, Minister_Types.
Uso pasado (de las bibliotecas Podcast3/4): Timothy Snyder, Carl Schmitt, Xunzi,
~Eric L. Hutton, trans., ~Armando Iannucci, dir., 95 U.S. 602. Los traductores y
directores llevan un sufijo de rol. Los casos judiciales van en el espacio del autor.
Flujo de trabajo
python3 agent-motion/motionkit.py inspect "<template>.moti"para obtener las claves de las capas de texto.- Escribir un JSON de señales (ver
agent-motion/examples/ep_demo.json): plantilla,at(segundos en la línea de tiempo del episodio),durationopcional, mapatexts. python3 agent-motion/titles_fcpxml.py cues.json -o titles.fcpxml, luego validar:xmllint --noout --dtdvalid <copia de FCPXMLv1_11.dtd> titles.fcpxml. Las DTD están en/Applications/Final Cut Pro.app/Contents/Frameworks/Interchange.framework/Versiones/A/Resources/. Copia una primero, porque xmllint falla con la ruta que tiene espacios.- Enviarlo: añade
--library <paquete> --push(sin clics). Sin--library, FCP muestra un selector de biblioteca, así que deja eso al usuario. Los títulos quedan conectados sobre un hueco, para que puedan copiarse en la edición real.
Para una tarjeta horneada única (por ejemplo, una miniatura o una tarjeta con un cambio de estilo que FCP no
puede sobrescribir), usa set-text en el .motn y open -g -a Motion OUT.motn para que el usuario
la revise o exporte.
Verificado en FCP 11.0.1 (2026-10-18)
- La importación sin clics funciona:
titles_fcpxml.py cues.json -o x.fcpxml --library ruta/A.fcpbundle --pushañade<import-options>(ubicación de la biblioteca, enlazar recursos, suprimir advertencias) y lo envía conopen -g. FCP importa en segundo plano y crea la biblioteca si falta. Usa una biblioteca desechable bajoscratch/fcp-test/para las pruebas, y nunca las bibliotecas reales del usuario sin preguntar. - El orden de
<text>= orden en el documento de Motion de las capas de Texto. Confirmado: el autor, titular, fecha y publicación de Citation v2 llegan a los lugares correctos. - Envía texto sin formato (el
--style nonepor defecto). Así la plantilla conserva su propia fuente, tamaño, color y sombra.--style fontenvía untext-style-defcon familia/tipo/tamaño. Cualquier definición de estilo sobrescribe la plantilla, y las capas sin parámetroSize(Motion por defecto 48) salían muy pequeñas antes de añadir el fallback a 48. Usa--style fontsolo para cambiar deliberadamente el estilo. - La tarjeta de título principal (TF_Podcast_title) se importa con su animación intacta.
- Lee el estado de FCP mediante
app_screenshotencom.apple.FinalCut: haz clic en el evento, luego en el icono del proyecto en el navegador (hacer doble clic en el nombre inicia un cambio de nombre, así que presiona Escape), luego en la regla.
Visualización y renderizado (verificado 2026-10-18)
- Fotogramas de previsualización:
motionkit.py preview ARCHIVO --at T --open, luego usaapp_screenshoten Motion (paquetecom.apple.motionapp) mediante acceso por computadora, luego haz zoom en el lienzo. Cierra la ventana medianteapp_menu File > Close. Escribir en el campo de cabezal de Motion desde segundo plano NO mueve el cabezal. La copia<currentFrame>es la ruta fiable. - Renderizado: el acceso por computadora no puede presionar File > Share (Export Movie, Save Current Frame).
Pídele al usuario que haga clic en Exportar. El comando de shell
screencapturecarece de permiso de Grabación de Pantalla. - Nunca uses
open -asin-g. El usuario está trabajando en la misma pantalla.
Animación (lo que expone el XML)
Los keyframes son curve > keypoint{time, value, in/out tangentes} bajo cualquier parámetro
(Posición de Transformación/Rotación/Escala, Opacidad de Mezcla, parámetros de filtro). Los comportamientos (Gather In,
Pen Speed/Pressure) son sus propios nodos con temporización y parámetros de Controls. Así que podemos leer la
coreografía completa, y reprogramar, desplazar o añadir keyframes mediante programación. Luego previsualizar y capturar pantalla para comprobar.
Coreografía de TF_Podcast_title: las figuras de Tiresias (Grupo 1/2) se deslizan desde ±400 px hasta 1.5 s,
luego se balancean ±10 px / ±2° hasta 4.87 s. El par de imágenes de la serpiente aparece a 1.74 s (escala 0.17→0.62 hasta
2.1 s, enmascarado por rectángulos redondeados) y se lanza entre keyframes a 2.1/3.17/4.14/4.87 s.
La línea del título se funde a 1.5–1.7 s con Gather In desde 1.0 s, y la línea del episodio hace Gather In a 2.37 s.
Notas sobre ozml
- Los tiempos son
"value timescale flags epoch"; segundos = value/timescale. - Contenido de texto:
scenenode[factory=Text] > parameter[name=Object] > parameter[id=369] > text. El estilo esstyleRun style=ID offset length, por lo que una discrepancia de longitud rompe el estilo. - Las factorías en la parte superior mapean
factoryID→ tipo (Text, Shape, Replicator, Image...). Los ids difieren por archivo, así que resuélvelos siempre a través de la tabla de factorías. - Referencia de Apple (antigua, aún mayormente correcta): guía Motion XML en el archivo developer.apple.com.