Motion graphics para o podcast
O Motion 5.9 não possui dicionário AppleScript nem renderizador via linha de comando. Tudo aqui funciona
tratando arquivos do Motion como XML (ozml) e gerando FCPXML do Final Cut Pro que
referencia os modelos de título instalados. O Final Cut faz a renderização.
As ferramentas estão em agent-motion/:
| Ferramenta | O que faz |
|---|---|
motionkit.py inspect FILE [--json] | Árvore de camadas, camadas de texto (texto/fonte/tamanho/posição), temporização em segundos, o que está publicado no FCP, referências de mídia |
motionkit.py set-text IN OUT --set "KEY=TEXT" ... | Reescreve camadas de texto. KEY = id da camada, nome da camada ou texto atual. \n para quebras de linha. Corrige os comprimentos de styleRun (UTF-16) para que o Motion não engasgue |
motionkit.py keyframes FILE [--grep X] [--all] | Cada parâmetro animado com tempos/valores dos quadros-chave (rotação em radianos) |
motionkit.py preview FILE --at 1.9 3.2 [--open] | Escreve cópias paradas naqueles tempos; --open abre-as no Motion em segundo plano (open -g) para um app_screenshot |
motionkit.py install FILE --name NAME | Copia um projeto para a pasta Títulos do Motion como um modelo de título do FCP |
titles_fcpxml.py SPEC.json -o OUT.fcpxml | Lista de deixa → projeto FCPXML com títulos nos tempos corretos e textos preenchidos |
Os modelos do programa
Instalados em ~/Library/Containers/com.apple.motionapp/Data/Movies/Motion Templates.localized/Titles.localized/Templates/
(uid do FCP: ~/Titles.localized/Templates/<Nome>/<Nome>.moti). Instantâneos dos dois
principais estão em agent-motion/*.motn.
- TF_Podcast_title: cartão de título principal, 5 s, 29,97, 1080p. Camadas de texto:
Tiersias Foundation Podcast(mostra "Tiresias Foundation Podcast"; o nome da camada tem um erro de digitação, continue usando-o como chave) eEpisode 4: Carl Schmitt(a linha por episódio, Futura Medium). Publica uma Zona de Soltar. - Citation v2: terço inferior para citações e fontes, PT Serif. Camadas de texto:
~Author Lastname(itálico; o programa prefixa com~),Person Writes Silly Headline to(título da obra, pode ter duas linhas),20 Apr, 1969(data),Publication. - Citation v2 no pub: mesma sem a linha de publicação. Também Citation v1, Black/Orange/Yellow/PeeTitle, Minister_Types.
Uso anterior (das bibliotecas Podcast3/4): Timothy Snyder, Carl Schmitt, Xunzi,
~Eric L. Hutton, trans., ~Armando Iannucci, dir., 95 U.S. 602. Tradutores e
diretores recebem um sufixo de função. Casos judiciais vão no campo de autor.
Fluxo de trabalho
python3 agent-motion/motionkit.py inspect "<template>.moti"para obter as chaves das camadas de texto.- Escreva um JSON de deixa (veja
agent-motion/examples/ep_demo.json): template,at(segundos na linha do tempo do episódio),durationopcional, mapatexts. python3 agent-motion/titles_fcpxml.py cues.json -o titles.fcpxml, depois valide:xmllint --noout --dtdvalid <cópia de FCPXMLv1_11.dtd> titles.fcpxml. Os DTDs estão em/Applications/Final Cut Pro.app/Contents/Frameworks/Interchange.framework/Versions/A/Resources/. Copie um primeiro, porque o xmllint falha no caminho com espaços.- Empurre-o: adicione
--library <bundle> --push(zero cliques). Sem--library, o FCP mostra um seletor de biblioteca, então deixe isso para o usuário. Os títulos ficam conectados acima de uma lacuna, para que possam ser copiados para a edição real.
Para um cartão avulso (ex.: uma miniatura ou um cartão com uma alteração de estilo que o FCP não pode
substituir), use set-text no .motn e open -g -a Motion OUT.motn para o usuário
analisar ou exportar.
Verificado no FCP 11.0.1 (2026-10-18)
- Importação com zero cliques funciona:
titles_fcpxml.py cues.json -o x.fcpxml --library path/To.fcpbundle --pushadiciona<import-options>(local da biblioteca, vincular ativos, suprimir avisos) e envia comopen -g. O FCP importa em segundo plano e cria a biblioteca se ela estiver faltando. Use uma biblioteca descartável emscratch/fcp-test/para testes, e nunca as bibliotecas reais do usuário sem perguntar. - Ordem
<text>= ordem no documento Motion das camadas de Texto. Confirmado: autor, manchete, data e publicação do Citation v2 caem todos nos campos corretos. - Envie texto puro (o padrão
--style none). Assim o modelo mantém sua própria fonte, tamanho, cor e sombra.--style fontenvia umtext-style-defcom família/tipo/tamanho. Qualquer definição de estilo substitui o modelo, e camadas sem o parâmetroSize(padrão do Motion 48) saíram minúsculas antes da adição do fallback 48. Use--style fontapenas para reestilizar deliberadamente. - O cartão de título principal (TF_Podcast_title) é importado com sua animação intacta.
- Leia o estado do FCP com
app_screenshotemcom.apple.FinalCut: clique no evento, depois no ícone do projeto no navegador (clicar duas vezes no nome inicia uma renomeação, então pressione Escape), depois na régua.
Visualização e renderização (verificado 2026-10-18)
- Quadros de prévia:
motionkit.py preview FILE --at T --open, depois useapp_screenshotpor computador no Motion (bundlecom.apple.motionapp), então aumente o zoom na tela. Feche a janela comapp_menu File > Close. Digitar no campo do playhead do Motion a partir do segundo plano NÃO move o playhead. A cópia<currentFrame>é a rota confiável. - Renderização: o uso por computador não pode pressionar File > Share (Export Movie, Save Current Frame).
Peça ao usuário para clicar em Export. O shell
screencapturenão tem Permissão de Gravação de Tela. - Nunca
open -asem-g. O usuário está trabalhando na mesma tela.
Animação (o que o XML expõe)
Os quadros-chave são curve > keypoint{time, value, in/out tangents} sob qualquer parâmetro
(Transformação Posição/Rotação/Escala, Opacidade de Mesclagem, parâmetros de filtro). Os comportamentos (Gather In,
Pen Speed/Pressure) são seus próprios nós com parâmetros de Temporização e Controles. Portanto, podemos ler a
coreografia completa, e reprogramar, deslocar ou adicionar quadros-chave programaticamente. Depois, prévia e captura de tela para verificar.
Coreografia do TF_Podcast_title: as figuras Tiresias (Grupo 1/2) deslizam de ±400 px para 1,5 s,
depois balançam ±10 px / ±2° até 4,87 s. O par de imagens de serpente aparece em 1,74 s (escala 0,17→0,62 até
2,1 s, mascarado por retângulos arredondados) e ataca entre quadros-chave em 2,1/3,17/4,14/4,87 s.
A linha do título aparece em 1,5–1,7 s com Gather In a partir de 1,0 s, e a linha do episódio Gather In em 2,37 s.
Notas sobre ozml
- Os tempos são
"value timescale flags epoch"; segundos = value/timescale. - Conteúdo de texto:
scenenode[factory=Text] > parameter[name=Object] > parameter[id=369] > text. A estilização éstyleRun style=ID offset length, então uma incompatibilidade de comprimento quebra a estilização. - As fábricas no topo mapeiam
factoryID→ tipo (Text, Shape, Replicator, Image...). Os ids diferem por arquivo, então sempre resolva-os através da tabela de fábricas. - Referência (antiga, ainda em grande parte correta) da Apple: Motion XML guide em developer.apple.com archive.