Communitygithub.com

emoji-party

Crea un vídeo musical de mundo emoji sincronizado con el ritmo en Blender Grease Pencil a partir de cualquier canción: personajes emoji con estilo, un mundo y paleta por escena, letras animadas y renderizado completo.

¿Qué es emoji-party?

Emoji Party es una habilidad especializada para crear vídeos musicales animados en Blender Grease Pencil, sincronizados con el ritmo de cualquier canción. Toma un archivo de audio y su letra (o ninguna para instrumentales) y produce un vídeo completo en 1080p con caras emoji que expresan emociones, cada una en su propio mundo y esquema de color, realizando acciones cotidianas como bailar, conducir o hacer pesas. La habilidad analiza el tempo y género musical para adaptar el movimiento (bounce, sway, half-time), la paleta de colores y los accesorios de los personajes. Soporta Blender 5.x, utiliza Grease Pencil para dibujos 2D y aprovecha expresiones matemáticas para sincronizar animaciones con los beats. El renderizado se optimiza procesando escenas en paralelo para reducir tiempos, y la salida es un archivo H264 con audio AAC. Está pensada para artistas, músicos y creadores que quieran producir vídeos musicales personalizados sin depender de plantillas genéricas.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/MayorDapper/Partymoji/tree/HEAD/emoji-party

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Emoji Party (vídeo de letras animadas en mundo emoji sincronizado con el ritmo, Blender Grease Pencil)

El usuario proporciona una canción de cualquier género (archivo de audio) y su letra, o ninguna letra para una instrumental. Tú entregas un vídeo completo en 1080p: una cara emoji reconocible por sección, cada una en su propio mundo y esquema de color, haciendo algo relatable, bailando al ritmo, con las letras apareciendo en pantalla y temblando con el bajo. Probado en "Mr Me" (150 BPM, 4:12, 15 escenas, ~840 objetos, renderizado en aproximadamente 10 minutos).

0. Reglas creativas (aprendidas del usuario)

  • Los protagonistas son caras emoji que transmiten una emoción, una diferente por escena (ansioso, sonrisa, vendado, resoplando, llorando de risa, shh, alucinado, nerd, enojado, sexy, ojos de estrella, boca con cremallera, boca de dinero, halo, fiesta). Los objetos (vela, brújula, diamante) son solo accesorios, nunca protagonistas.
  • Estilo en cada protagonista: cada protagonista lleva algo puesto. Para rap, una cadena con dije, grills, tatuajes faciales, aretes y un sombrero (gorra, durag, bucket, beanie, corona); para otros géneros, ver sección 0b.
  • Acción relatable por escena: conducir, andar en bicicleta, hacer un examen, grabar con teléfonos, pescar, ser DJ, levantar pesas, selfie, tirar dinero.
  • Una paleta por escena, elegida según el estado de ánimo de la letra. El estilo de la letra se mantiene constante entre escenas para que el vídeo se lea como una pieza única.
  • Un protagonista recurrente (emoji de gafas de sol) es dueño del coro y regresa en el coro final con todo el elenco detrás.
  • Dibuja personajes emoji originales. No copies el conjunto de emojis de un proveedor.
  • Muestra una sola escena de prueba (o 3 opciones de paleta) primero y obtén un sí antes de construir todo. Envía vistas previas estáticas con SendUserFile.

0b. Adaptar a la música (cualquier género)

Lee la pista antes de elegir cualquier cosa. El género es una entrada, no una suposición.

  • Búsqueda de tempo: busca entre 60-180 BPM, luego resuelve medio/doble tiempo según dónde caiga la caja o el clap (tiempos 2 y 4). Trap y hip-hop suelen leerse como 140-150 pero se sienten a medio tiempo; drum and bass lee 170+ pero se puede animar a mitad de velocidad. Almacena tanto FPB (tiempo sentido) como el tiempo de la cuadrícula.
  • Compás: por defecto 4 tiempos por compás; haz que beats-per-bar sea un parámetro (3 para vals, 6 para 6/8) y úsalo en FR(bar) y las expresiones de duración del compás.
  • Deriva de tempo (bandas en vivo, grabaciones antiguas): si la puntuación del comb es débil o deriva, usa una lista de beats seguidos y asigna una propiedad beat_phase por beat en lugar de las expresiones de período fijo.
  • Fotogramas por segundo: elige los fps que den fotogramas enteros por beat sentido; de lo contrario, 25 y acepta beats fraccionarios.
  • Movimiento por sensación:
    • Four-on-the-floor (house, techno, disco, amapiano): rebote uniforme en cada beat, balanceo constante.
    • Half-time (trap, hip-hop, drill, dubstep): gran golpe en beat 1, recostarse en 3, pequeños detalles de hi-hat.
    • Off-beat (reggae, dancehall, afrobeats, ska): rebote en OFFP, caderas se balancean en un período de 2 beats.
    • Rápido (drum and bass, punk, hardcore): cuerpo a media velocidad, manos y accesorios a velocidad completa.
    • Lento (balada, R&B, soul, lo-fi): solo balanceo, períodos largos, poca compresión, desvanecimientos lentos de letras en lugar de pops.
    • Swing/triplete (jazz, blues, shuffle): retrasar el off-beat a dos tercios del beat.
  • Tasa de corte según energía: 8-16 compases por escena cuando está calmado, 4 compases en coros, 1-2 compases en drops y picos.
  • Apariencia según género y letras: elige paletas, mundos, sombreros y accesorios que pertenezcan a la música (cadenas y grills para rap, auriculares y visores para música dance, sombrero vaquero para country, flores para folk, tachuelas para rock). Mantén siempre la cara emoji como protagonista y mantén la regla de estilo: cada protagonista lleva algo.
  • Estilo de letra: pops duros y sacudidas para pistas con mucho bajo; deslizamiento suave y desvanecimiento para pistas suaves; tipo más grande para estribillos y hooks. El idioma sigue la letra tal como se da (nunca "corrijas" dialecto o pidgin).
  • Instrumentales: sin capa de letra; usa el título, nombres de secciones o palabras cortas de estado de ánimo en los drops, y deja que los accesorios cuenten la historia.
  • Confirma la lectura con el usuario en una línea (BPM, sensación, mapa de secciones) antes de construir.

1. Analizar la canción (espacio de trabajo)

  • pip install --break-system-packages -q librosa, luego una búsqueda comb en el flujo de baja banda (<130 Hz) sobre un rango de BPM da el BPM exacto y el primer offset de beat; imprime kick por compás (K) y volumen (R) para ver intro, groove, drops y silencios. No confíes en el BPM escrito en el prompt (el prompt de Suno dijo 140; la pista era 150).
  • Usa 25 fps cuando dé fotogramas enteros por beat (120, 125, 150 BPM lo hacen).
  • Tiempos de letra: los modelos de voz no se pueden descargar en el espacio de trabajo, y las subidas a Descript storage están bloqueadas desde el shell. Llama a Descript file_upload_ui, pide al usuario que deje caer el audio, wait_for_job, luego export_transcript como srt. Espera tiempos a nivel de línea para partes claras de rap/habladas y tiempos a nivel de bloque (o faltantes) para partes densas o cantadas; empareja manualmente la letra real del usuario con esas marcas de tiempo y estima el resto de manera uniforme entre compases. Informa al usuario qué secciones son estimadas.
  • Escribe una tabla de escenas: sección, compás de inicio, emoji, mundo, acción, paleta. Los límites de escena se sitúan en los compases (medios compases están bien). Añade escenas instrumentales (tarjeta de título, drop) donde la voz está en silencio.

2. Configuración de Blender

  • Verifica la conexión con blender__get_scene_info. Pregunta antes de borrar un archivo guardado. Guarda temprano (pide una carpeta; el Python de Blender puede leer las carpetas del usuario directamente, así que apunta la pista de sonido al audio en su lugar en lugar de copiarlo).
  • 2D plano: cámara ortográfica en y=-20 mirando hacia +Y, ortho_scale 16 (la vista es de 16 x 9 unidades). Todo se dibuja en el plano XZ; la profundidad es el Y del objeto (Y más grande es más atrás).
  • Cada escena vive en X = índice * 40 en su propia colección S01_...; la cámara salta entre ellas con claves LINEAR en la ubicación X (más una pequeña deriva dentro de cada escena) y un marcador de línea de tiempo por corte.
  • Color: view_transform='Standard', look None. Almacena código reutilizable en bpy.data.texts y ejecuta exec al principio de cada llamada.

3. Reglas de Grease Pencil que cuestan tiempo encontrar (Blender 5.x)

  • Los datos son bpy.data.grease_pencils; layer.frames.new(1).drawing; drawing.add_strokes([n]); configura point.position=(x,0,z) y point.radius; llama a drawing.tag_positions_changed().
  • Los rellenos no se renderizan a menos que cada trazo relleno tenga un fill_id no nulo. Establece stroke.fill_id = entero único para rellenos y 0 para líneas, y stroke.hide_stroke = True en trazos solo de relleno. Dale a todos los bucles de un glifo de texto el mismo fill_id para que los agujeros de letras se recorten.
  • Materiales: bpy.data.materials.create_gpencil_data(m); show_fill / show_stroke; gradiente radial mediante fill_style='GRADIENT'. Los colores de material son lineales: convierte hex con (v/255)**2.2 o todo se ve deslavado.
  • layer.use_lights = False en cada capa.
  • Los objetos de texto de fuente/curva están ocultos detrás de Grease Pencil en los renders. Convierte texto a GP: haz una curva FONT temporal, evaluated_get(dg).to_curve(dg), muestrea splines bezier con mathutils.geometry.interpolate_bezier, dibuja los bucles como trazos GP (primero trazos de contorno, luego rellenos). Haz el trabajo temporal en una escena separada de scratch para que el depsgraph de la escena grande no se re-evalúe por palabra (486 palabras tomaron 3 s de esta manera).
  • Los rellenos translúcidos sobre otros rellenos translúcidos se ven embarrados; prefiere colores oscuros opacos para rayos y brillos.
  • Drivers: la ejecución automática de Python suele estar desactivada, por lo que cada driver debe ser una expresión simple (sin abs exp fmod min max pi frame); asegura driver.is_simple_expression.

4. Expresiones de beat (F0 = fotograma del primer beat, FPB = fotogramas por beat)

PULSE = exp(-fmod(frame-F0+BIG, FPB)/(FPB*0.25))        # 1 en cada beat, decae
OFFP  = igual, desplazado medio beat                       # off-beat
HALF  = exp(-fmod(frame-F0+BIG, 2*FPB)/(FPB*0.45))      # cada 2 beats
OFFB  = HALF desplazado un beat
SWAY(per,ph) = sin(pi*(frame-F0)/(FPB*per)+ph)
FR(bar) = F0 + round(4*FPB*bar)

dance(obj): location Z += bouncePULSE, scale X (1+squashPULSE), scale Z (1-squashPULSE), rotation Y += swaySWAY. Alterna PULSE y OFFP entre vecinos. Las manos se encogen en HALF/OFFB. Cámara ortho_scale = 16*(1 - zoom*PULSE) con una propiedad personalizada zoom con clave (más grande en drops y coros).

5. Biblioteca de ayuda para construir una vez

  • Formas: ell, rect, rrect, star, drop; F (relleno), S (línea), P (relleno + contorno de tinta).
  • emo(C,name,x,z,r,mood): sombra, disco amarillo degradado, brillo, luego características por estado de ánimo. Almacena o["r"]=r para que los accesorios escalen.
  • Estilo: chain(o,pendant,ice), grills(o), tattoo(o,kind,side) (lágrima, cruz, estrella, líneas, texto), earring(o,side), hat(o,kind,col,col2,tilt) como objeto hijo, headphones(o), hand(...) con anillos y reloj opcional.
  • Mundo: sky(C,X,top,mid,bot) como 16 bandas de color, ground, city horizonte con ventanas iluminadas, wheel con un driver de rotación, phone.
  • preview(shots) renderiza imágenes estáticas al 33% en /tmp y montage(paths) las embaldosa con numpy en una imagen; mírala con blender__look(image=path). Verifica cada escena de esta manera antes de renderizar.

6. Capa de letras

  • Datos: lista de (kind, t0, t1, text) con kinds L línea, A ad-lib, H palabra de hook, B grito grande. Almacénala como JSON en un bloque de texto.
  • L: divide en palabras, envuelve a 14.4 unidades de ancho con tamaño 0.78 y un espacio de 0.44, parte superior del marco. Cada palabra es su propio objeto GP que aparece en start + i*step (step de la duración de la línea, 2 a 8 fotogramas) y se oculta al inicio de la siguiente línea o en el corte de escena.
  • Drivers por palabra: scale = vis * pop * (1+0.10*PULSE) donde vis es una rampa de entrada/salida de 2 fotogramas y pop es un sobreimpulso de 6 fotogramas; location X/Z += shake*sin(frame*k+ph)*PULSE para la vibración del bajo.
  • A: rosa, inclinado, alternando izquierda y derecha. H: amarillo, abajo, cae desde arriba. B: dorado, tamaño 1.5, arriba.
  • Coloca los objetos de letras de cada escena en colecciones LYR_Sxx para que los fragmentos de render puedan ocultar el resto.

7. Renderizado (ruta rápida)

  • Un render de escena completa es ~1.3 s/fotograma porque cada objeto GP se evalúa. Renderiza un fragmento por escena en paralelo en su lugar: un Blender en segundo plano por escena que establece hide_render en cada colección excepto Sxx_, LYR_Sxx y CAMERA, elimina la pista de sonido y escribe H264 sin audio. Ejecuta 5 a la vez desde un proceso de ejecutor separado (start_new_session=True) que registra en render_log.txt.
  • Luego ensambla en una escena vacía de fábrica con tiras de película en el fotograma de inicio de cada escena más la pista de sonido, H264 + AAC. Establece la transformación de vista de esa escena a Standard o el vídeo final sale oscuro y desaturado (el valor predeterminado de fábrica es AgX).
  • No elimines fragmentos hasta que el archivo final esté verificado.
  • Verifica: carga el mp4 como un movieclip (recuento de fotogramas, fps, tamaño) y como sonido (tasa, canales); extrae ~16 fotogramas a través de una escena de secuenciador temporal con transformación de vista Standard en una hoja de contactos y míralo. El rastreo de bgl add-on en los registros de fondo es inofensivo.
  • No hagas polling en un bucle apretado; duerme ~5 minutos entre verificaciones e informa al usuario del tiempo esperado.

8. Entrega

  • Indica dónde están el mp4 y el .blend (palabras claras más un enlace computer://) y envía la hoja de contactos.
  • Indica qué no se verificó (viste imágenes estáticas, no reproducción) y qué secciones de letras son estimadas.
  • Ofrece correcciones por escena o por línea de letra; los marcadores de línea de tiempo son los cortes y el JSON de letras contiene los tiempos.

Skills relacionados