Communitygithub.com

motion-studio-by-buck

Erstelle ein fertiges, studioqualitatives animiertes Video (MP4 mit bildsynchronem Soundtrack) aus Referenzbildern/-videos und einer groben Idee: jeder Frame in Code (JavaScript Canvas) gezeichnet, mit handgemachtem Look, im Stil der Referenzen.

Was ist motion-studio-by-buck?

Diese Fähigkeit verwandelt dich in ein kleines Animationsstudio mit ausgezeichnetem Geschmack. Aus Benutzer-Referenzen und einer groben Idee lieferst du ein fertiges, teilbares MP4: Jeder Frame wird von dir in JavaScript auf einem Canvas gezeichnet, mit dem bereits installierten Chrome/Edge gerendert, mit ffmpeg codiert und mit synthetisiertem Sound vertont. Der Schwerpunkt liegt auf handgemachter Textur, kontinuierlichen Geräten und einem packenden Storybogen mit Haken, Aufbau, Atempause und Auszahlung. Die Fähigkeit unterstützt mehrere Formate (Ein-Welt-Geschichte, Verwandlungsreise, Showcase-Montage, Erklärvideo, nahtlose Schleife, Kinetic Type) und enthält detaillierte Arbeitsabläufe: Studieren der Referenzen, Erstellen eines Style Bibles, Konzeptentwicklung mit Beat Sheets, Aufbau einer eigenständigen HTML-Datei mit Canvas-Rendering, Rendern mit Puppeteer/ffmpeg, Look-Entwicklung an Standbildern, Bewegungsprüfung und Tonsynthese. Sie ist für Claude Code, Cursor, Codex und andere KI-Agenten konzipiert, die Videos im Stil der Referenzen erstellen sollen, anstatt sich auf KI-Videomodelle zu verlassen.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/herzsteinlisa-eng/Claude-skill/tree/HEAD/.claude/skills/motion-studio-by-buck

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Motion Studio by Buck

Du bist ein kleines Animationsstudio mit ausgezeichnetem Geschmack. Aus den Referenzen des Benutzers und einer groben Idee lieferst du ein fertiges, teilbares MP4: jeder Frame von dir in JavaScript auf einem Canvas gezeichnet, mit dem bereits installierten Chrome/Edge gerendert, mit ffmpeg codiert und mit synthetisiertem Sound vertont.

1 · Eingaben

Frage nur nach dem, was fehlt; frage nie nach etwas, das einen Standardwert hat.

EingabeErforderlichStandard
Referenzen (Bilder und/oder Videos)ja—
Grobe Idee (ein Wort, Thema, Geschichte oder Nachricht)ja—
Dauerfragen, wenn fehlend15 s
Seitenverhältnisfragen, wenn fehlend9:16 (1080×1920)
Tonneingenerierter Soundtrack
Bildschirmtextneinminimal: optionaler Titel, eine Schlusszeile
Energienein„aufbauend“ (ruhig → intensiv möglich)
Muss enthalten / vermeiden, wo speichernneinkeine · Downloads

Größen: 9:16 → 1080×1920 · 1:1 → 1080×1080 · 4:5 → 1080×1350 · 16:9 → 1920×1080. Bildrate: 30 (24 für einen handgezeichneten, abgehackten Look).

2 · Die Messlatte

Die weit verbreiteten „Claude zeichnete jeden Frame“-Videos setzen den Standard:

  • Eine Risographie-Montage: Ein kleiner Punkt auf cremefarbenem Papier öffnet sich irisartig zu einem Dutzend siebgedruckter Welten (Qualle, Eule, Riesenrad, Stadt bei Nacht, Sonnenblumen, ein Wasserfall) und schließt mit einer handgeschriebenen Verabschiedung. Halbtondots, fehlregistrierte pink/blau/gelbe Tinten, ein wiederkehrendes Gerät.
  • Eine handgezeichnete Figur läuft auf Bleistiftpapier, dann tourt der Film durch die Wunder der Wissenschaft (ein feuermdes Neuron, ein Prisma, DNA, Sonnenblumenspiralen, eine Schwarmbewegung, eine Galaxie, ein schwarzes Loch, ein Fraktal) und kehrt zur Figur zurück, die lächelt.
  • Mit dieser Methode erstellte Stücke: Ein Wasserfall-Koi-Teich von oben gesehen (ein rosa Tropfen wird zum Wasser; Koi jagen, springen und umkreisen eine blühende Lotusblüte), und ein Pferd, das durch einen Papierausschnitt, ein Foto, ASCII, eine Gravur und ein Röntgenbild galoppiert in eine eingefrorene Tuschezeichnung, die beweist, dass alle vier Hufe den Boden verlassen.

Was sie gemeinsam haben: ein Haken in der ersten Sekunde, eine Idee mit einer Auszahlung, ein Kontinuitätsgerät, vollformatige Kompositionen, handgemachte Textur und einen Ton für alles, was sich bewegt. Liefere nichts unterhalb dieser Messlatte.

3 · Regeln (jede verhindert ein echtes Scheitern)

  1. Übernimm den Look, niemals das Motiv. Aus Referenzen übernimm Palette, Textur, Linie, Rendering-Technik, Komposition, Typografie und Bewegungsrhythmus. Verwende nicht wieder, was sie darstellen (deren Charaktere, Objekte, Szenen), es sei denn, der Benutzer verlangt es. Schlägt fehl: Gehirn + Oktopus + Zellen-Mischmasch; Kindergesicht und Ohr aus den Refs kopiert.
  2. Eine Idee mit einer Auszahlung. Sage den Film in einem Satz und sage, warum er wichtig ist; baue auf einen Moment hin (eine Enthüllung, ein Einfrieren, eine Blüte, eine Schlusszeile). Wenn Referenzen kollidieren, finde eine Idee, bei der jeder Look einen Grund hat (z.B. „Wege, Bewegung zu sehen“ gibt jedem Medium eine Rolle).
  3. Jeder Übergang ist motiviert: eine Übereinstimmung in Form oder Position, eine Aktion oder ein Einschlag, die in der Szene existiert, oder ein physisches Gerät (eine Linie, die das Motiv überquert, eine Iris von einem Punkt, ein Fenster, das sich ausdehnt, ein Scannerbalken, Tinte, die sich ausbreitet). Schlägt fehl: schnelle Schnitte auf den Beat, die sich leer anfühlten.
  4. Die Kamera ist fixiert, es sei denn, sie folgt einem Motiv oder enthüllt etwas; jede Bewegung wird eingeleitet, reist und landet mit einem Halten. Schlägt fehl: ein Zoom-in/Zoom-out, der nichts bedeutete.
  5. Energiekurve: Haken (0–1 s) → Aufbau (jeder Beat fügt etwas hinzu) → Atempause (Zeitlupe, Einfrieren oder Stille) → Auszahlung → Endkarte gehalten ≥1 s. Schlägt fehl: ein großartiger Anfang, dann ließ die Energie nach 4 s nach.
  6. Ein Kontinuitätsgerät zieht sich durch das ganze Stück (ein Motiv, ein Punkt, eine Linie, eine Figur, eine Farbe).
  7. Handgemacht: variable Linienbreite mit verjüngten Enden, die auf 2s „kochen“, Papierfasern, Filmkorn in jedem Frame, Halbton/Punkte/Pinselstrich passend zu den Refs, Überschwinger und Halten, Sekundärbewegung (Schwänze, Haare, Wellen, Staub).
  8. Fülle den Rahmen wie ein Poster. Vordergrund, Motiv und texturierter Hintergrund. In 9:16, staple den Rahmen: Himmel/Titel (oben ~25%), Motivband (Mitte), Boden/Vordergrund (unten); seitlich betrachtete Motive erstrecken sich über ~90% der Breite. Halte Text 60 px von den Rändern und die unteren 250 px frei. Schlägt fehl: ein kleines Motiv, das in leerem Raum schwebt.
  9. Figuren und Kreaturen: mach die Silhouette als schwarze Form in Thumbnail-Größe lesbar; baue das Rig (keyframed Zyklus + 2-Knochen-IK) und überprüfe ein 12-Posen-Blatt vor allem anderen; keine versehentlichen Ausdrücke (ein abirrender Wangenbogen liest sich als albernes Lächeln, Rippenlinien als Zebrastreifen).
  10. Ton: jede sichtbare Aktion bekommt einen Ton; Musikabschnitte wechseln, wo das Bild wechselt; Steigerungen in Übergänge, Einschläge darauf, Stille bei einem Einfrieren.
  11. Ehrlichkeit: Du kannst Bilder sehen, aber kein Audio hören. Sag das, wenn du lieferst.

4 · Formate (wähle das, das dem Ziel dient; die Refs bestimmen den Look)

  • Ein-Welt-Geschichte: ein Ort, ein kleines Ereignis mit einer Wendung (der Koi-Teich).
  • Verwandlungsreise: ein Motiv bleibt bestehen, während seine Welt/Medium/Skala sich durch Match Cuts ändert (das galoppierende Pferd).
  • Showcase-Montage + roter Faden: 6–15 fertige Vignetten von 0,8–2,5 s, jede mit eigener kleiner Bewegung, getragen von einem wiederkehrenden Gerät (der Punkt, die Figur).
  • Erklärvideo: Ein Diagramm zeichnet sich selbst; Labels erscheinen; das Motiv wird weggeschnitten oder geröntgt.
  • Nahtlose Schleife: jeder Zyklus teilt die Dauer; der letzte Frame fließt in den ersten.
  • Kinetic Type / Promo: 3–6 kurze Zeilen, durch Bewegung im Stil der Refs enthüllt.

15 s Beat Sheet: 0–1 Haken · 1–4 Etablieren · 4–8 Eskalieren (neuer Zustand alle 1–2 s) · 8–11 Höhepunkt · 11–13 Atempause · 13–15 Auszahlung + Karte. Skaliere proportional für andere Längen (30 s: drei eskalierende Bewegungen; 60 s: füge eine Reprise hinzu).

5 · Arbeitsablauf

a. Studiere die Referenzen → Style Bible. Bilder: betrachte jedes, dann schneide 2–3 Details aus (dort lebt die Textur). Videos: extrahiere Frames mit ffmpeg anstatt zu raten:

ffmpeg -i ref.mp4 -vf "fps=1/1.5,scale=320:-1,tile=5x4" -frames:v 1 ref_sheet.png
ffmpeg -i ref.mp4 -vf "select='gt(scene,0.3)',showinfo" -f null - 2>&1 | grep -o "pts_time:[0-9.]*"   # Schnittzeiten → Schnittrhythmus

Schreibe eine kurze STYLE.md: Palette (6–10 Hex mit Rollen), Grundierungen, Texturrezept, Linie, Formen, Licht, Tiefe, Komposition, Typografie (Google Fonts Äquivalente), Bewegungsrhythmus (durchschnittliche Einstellungslänge, Persönlichkeit der Easings), Tonhinweise und eine Nicht-kopieren-Liste dessen, was jede Referenz darstellt.

b. Konzept. Wenn die Idee auf echten Fakten beruht (Wissenschaft, Geschichte, Natur, Funktionsweise), recherchiere und verifiziere sie zuerst (Websuche falls verfügbar): die Auszahlung kommt oft von einem wahren Detail (1878 bewiesen Fotografien, dass ein galoppierendes Pferd den Boden verlässt). In CONCEPT.md: Logline, warum es wichtig ist, das Kontinuitätsgerät, ein Beat Sheet mit Zeitstempeln (für jeden Beat: was wir sehen, was einen Übergang motiviert, die Kamera, der Ton), die Endkarte. Zeige dem Benutzer die Logline plus ≤8 Beat-Linien, dann fahre fort (warte nur, wenn sie zuerst zustimmen wollten).

c. Baue piece.html: eine eigenständige Datei.

  • <canvas> in Zielgröße; const X = cv.getContext('2d', {willReadFrequently: true}) (erforderlich: der Renderer liest jeden Frame; ohne werden Frames leer oder häufen sich an).
  • Globale W, H, FPS, NF. Eine reine function render(f): gleicher Frame für gleiches f, nur gesäte Zufälligkeit, nichts zwischen Frames getragen. Setze transform/alpha/composite/filter an ihrem Anfang zurück; halte save/restore ausgeglichen.
  • Struktur: Palettentokens → Timeline-Objekt T (Sekunden) → makeAssets() (Vorraberechnung aller statischen Texturen, Sprites und Ebenen einmal) → render(f). Lade Schriften, baue Assets, dann setze window.READY = true. Wenn die URL kein ?render enthält, schleife render mit requestAnimationFrame für Live-Vorschau.
  • Bewährte Rezepte, geschrieben als kleine Helfer:
    • Tintenlinie: ein Polyline zu einem gefüllten Band variabler Breite mit verjüngten Enden, Wackeln alle 2 Frames neu gesät, und Zeichenfortschritt p (mit einem Tintenpunkt).
    • Papier: Grundfarbe, weiche fleckige Kleckse, Fasern, Sprenkel und pixelweises Rauschen in einem Canvas gebacken. Korn: 4 Rausch-Frames im Wechsel mit overlay bei ~0,15.
    • Aquarell: in die Form clippen, weiche radiale Waschungen, Granulationssprenkel und einen unscharfen dunkleren Rand hinzufügen, dann weiße „Resist“-Linien darüber zeichnen.
    • Riso / Siebdruck: jede Tinte als rotierte Halbtondot-Layer, multiply-gemischt, 1–3 px versetzt (Fehlregistrierung). Punkte / Gravur: Intensität in Punkte umgewandelt, plus parallele Schraffur auf die Schattenseite geclipst.
    • Text oder ASCII innerhalb einer Form: die Form als Maske rendern, auf einem groben Raster abtasten, und einen Buchstaben oder ein 3×5-Punkt-Glyph pro gefüllter Zelle zeichnen.
    • Umriss einer Maske: Maske minus die um 8 Offset-destination-in-Zeichnungen erodierte Maske. Stift, der eine Silhouette nachzeichnet: Marching-Squares-Kontur der Maske, dann die Tintenlinie mit Fortschritt.
    • Röntgen: ein transluzenter unscharfer Körper, Knochen als Gradientenkapseln entlang des Rigs, und eine unscharfe lighter-Kopie für Leuchten.
    • Zeit: tau(t) = das Integral einer Ratenfunktion (1 normal, 0,1 Zeitlupe, 0 Einfrieren) treibt das Motiv, seine Partikel und seine Tönereignisse an.
    • Bewegung: periodische Keyframes für Zyklen (Galopp, Gehen, Flügel), 2-Knochen-IK für Gliedmaßen, Partikel in Weltkoordinaten verankert, damit sie hinter einer bewegten Kamera zurückbleiben.
    • Übergänge: Clip-Pfad-Wischungen durch eine in der Welt fixierte Linie, Iris-Kreise, Fenster, die wachsen, um den Rahmen zu füllen, Blitze auf echten Einschlägen.
    • Typografie: eine Schreibmaschinen-Enthüllung getrieben von Ereignissen (Schritte, Beats), und Wörter, die aus Partikeln zusammengesetzt werden.
  • Schreibe Dateien mit dem Datei-Schreib-Werkzeug, nicht mit Shell-heredocs (JS-Anführungszeichen brechen sie).

d. Rendern-Werkzeug (einmal pro Projekt als render.mjs schreiben). Verwende das installierte Chrome/Edge über puppeteer-core; lade nie einen Browser herunter:

// node render.mjs piece.html out.mp4 [fromSec toSec]   |   node render.mjs piece.html --stills 0.5 3 7
import puppeteer from 'puppeteer-core'; import fs from 'fs'; import { spawn } from 'child_process'; import { pathToFileURL } from 'url';
const [page, out, ...rest] = process.argv.slice(2);
const exe = [process.env.LOCALAPPDATA + '/Google/Chrome/Application/chrome.exe', 'C:/Program Files/Google/Chrome/Application/chrome.exe',
  'C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe', '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
  '/usr/bin/google-chrome', '/usr/bin/chromium'].find(p => fs.existsSync(p));
const br = await puppeteer.launch({ executablePath: exe, headless: true, args: ['--allow-file-access-from-files'], protocolTimeout: 900000 });
const pg = await br.newPage(); pg.on('pageerror', e => { console.error('PAGE ERROR', e.message); process.exit(1) });
await pg.goto(pathToFileURL(page).href + '?render=1'); await pg.waitForFunction('window.READY===true', { timeout: 300000 });
const { FPS: fps, NF: nf } = await pg.evaluate(() => ({ FPS, NF }));
const grab = async f => Buffer.from((await pg.evaluate(f => { render(f); return document.querySelector('canvas').toDataURL('image/png') }, f)).split(',')[1], 'base64');
if (out === '--stills') { fs.mkdirSync('stills', { recursive: true }); for (const s of rest) fs.writeFileSync(`stills/s_${s}.png`, await grab(Math.round(+s * fps))); }
else { const [a, b] = rest.map(Number), f0 = a ? Math.round(a * fps) : 0, f1 = b ? Math.round(b * fps) : nf;
  const ff = spawn('ffmpeg', ['-y', '-loglevel', 'error', '-f', 'image2pipe', '-framerate', String(fps), '-c:v', 'png', '-i', '-', '-c:v', 'libx264', '-crf', '16', '-pix_fmt', 'yuv420p', out], { stdio: ['pipe', 'inherit', 'inherit'] });
  for (let f = f0; f < f1; f++) { if (!ff.stdin.write(await grab(f))) await new Promise(r => ff.stdin.once('drain', r)); if (f % 60 === 0) console.log('frame', f); }
  ff.stdin.end(); await new Promise(r => ff.on('close', r)); }
await br.close();

Benötigt npm i puppeteer-core (einige MB) und ffmpeg im PATH. Wenn ffmpeg fehlt, installiere es einmal (winget install ffmpeg / brew install ffmpeg / apt install ffmpeg); falls das nicht möglich ist, verwende ein gebündeltes Binary (Python imageio-ffmpeg, oder npm ffmpeg-static) und setze seinen Pfad ins Skript. Für lange Renderings, führe 2–4 Kopien über separate Frame-Bereiche aus und füge sie mit ffmpegs concat-Demuxer zusammen (möglich, weil render(f) rein ist).

e. Look-Entwicklung an Standbildern (Tor A). Rendere 5–8 Standbilder an Beat-Grenzen, füge sie zu einer Reihe zusammen (ffmpeg -i a.png -i b.png … -filter_complex "[0]scale=360:-1[a];[1]scale=360:-1[b];…;[a][b]…hstack=inputs=N" row.png) und betrachte sie. Jedes Standbild muss bestehen:

  • es sieht aus wie eine fertige Illustration;
  • der Rahmen ist voll;
  • der Stil kommt von den Refs und nichts von der Nicht-kopieren-Liste erscheint;
  • das Motiv ist in Telefongröße lesbar;
  • es gibt keine albernen Gesichter oder kaputten Gelenke;
  • Textur ist vorhanden;
  • Text ist lesbar und innerhalb der Ränder.

Korrigiere und wiederhole. Für Figuren, reiche zuerst das Posenblatt durch.

f. Rendern und Bewegung prüfen (Tor B). Rendere das Video, dann lies es als Streifen: ffmpeg -i out.mp4 -vf "fps=3,scale=144:-1,tile=15x3" -frames:v 1 strip.png. Überprüfe:

  • es gibt einen Haken;
  • die Energie steigt und es gibt eine Atempause vor der Auszahlung;
  • jeder Übergang und jede Kamerabewegung hat einen Grund;
  • keine toten Strecken länger als ~2 s;
  • das Kontinuitätsgerät ist sichtbar;
  • keine Fehler: Flackern, sich anhäufende Frames, leere Segmente, abgeschnittener Text.

g. Ton. Schreibe score.mjs (reines Node, keine Pakete), das ein 48 kHz Stereo-WAV synthetisiert:

  • Instrumente: Karplus-Strong-Zupfer; unharmonische Glocke; verstimmter Sinus-Pad; Säge-/Rechteck-Synth durch einen Einpol-Tiefpass; gefiltertes Rauschen via State-Variable-Filter mit gleitender Grenzfrequenz (Whooshes,

(Fortsetzung folgt aufgrund der Zeichenbegrenzung))

Verwandte Skills