1 puntos por GN⁺ 2024-09-04 | 1 comentarios | Compartir por WhatsApp
  • Una visualización musical estilo Pong ajusta la física del juego y trata la posición de las paletas como variables de optimización para hacer coincidir el momento en que la pelota toca una paleta con los beats de una canción
  • La pelota se mueve a velocidad constante y cada paleta puede desplazarse a cualquier lugar dentro de su mitad de la pantalla; el punto de contacto determina el ángulo de rebote y la pelota rebota en las paredes superior e inferior
  • Si las paletas se colocan cerca del centro, se puede hacer coincidir cualquier temporización, pero el uso de la pantalla es limitado y el movimiento se vuelve plano, lo que dificulta lograr una buena visualización
  • Al fijar la posición horizontal de la paleta en cada beat y la velocidad horizontal de la pelota, se formula como un problema de programación lineal que maximiza los golpes de paleta lejos del centro mientras respeta las restricciones físicas y el ritmo
  • La implementación usa CVXPY para resolver restricciones lineales; luego calcula el ángulo de rebote y la posición vertical a partir de la posición de la paleta y la velocidad de la pelota obtenidas, y crea la animación mediante interpolación de keyframes

Configuración física para hacer coincidir Pong con la música

  • El objetivo es sincronizar los momentos en que la pelota rebota en las paletas del clásico juego arcade Pong con los beats de una canción, para crear una visualización donde las paletas se muevan al ritmo de la música
  • Para ello, se modifica parte de la física del juego
    • La pelota se mueve a velocidad constante
    • Cada paleta puede moverse a cualquier lugar dentro de su propia mitad de la pantalla
  • También se mantienen reglas del Pong original
    • El punto de contacto en la paleta determina el ángulo de rebote
    • Las paletas no tienen límite de velocidad
    • La pelota rebota en los bordes superior e inferior de la pantalla
  • Esta configuración física aporta grados de libertad para lograr impactos en los instantes deseados

Límites de la solución centrada

  • Si las dos paletas se colocan cerca del centro de la pantalla, es posible satisfacer cualquier requisito de temporización
    • El espacio horizontal es pequeño, pero como la pelota puede rebotar en las paredes superior e inferior, en la práctica el espacio vertical es suficiente
    • Si se necesita que un tiro dure más tiempo, basta con golpear la pelota con una trayectoria más cercana a lo vertical para reducir la velocidad horizontal
  • Esto demuestra que existe una solución para cualquier entrada, pero no resulta interesante de ver
  • Para una buena visualización, el aprovechamiento del espacio en pantalla es importante
    • Si el juego queda atrapado en un área pequeña, se ve apretado y débil
    • El público disfruta del movimiento dinámico de las paletas cuando parecen alcanzar la pelota por muy poco
  • Por eso, la cuestión clave es en qué punto debe golpear cada paleta la pelota en cada beat para usar mejor la pantalla sin romper el ritmo ni las reglas físicas

Convertirlo en optimización con restricciones

  • Este problema puede tratarse como uno de optimización con restricciones, con función objetivo, variables y restricciones
    • El objetivo es aumentar el uso de la pantalla
    • Las variables son las posiciones donde rebota la pelota
    • Las restricciones son la física del juego y los beats de la canción
  • Al formularlo así, se pueden calcular posiciones óptimas de las paletas con un solver existente en lugar de diseñar un algoritmo desde cero
  • Si se cambia la física, basta con actualizar las restricciones, y también es fácil experimentar con la función objetivo
  • No hace falta modelar todo el sistema 2D
    • Como la velocidad total de la pelota es constante, al fijar la velocidad horizontal también queda determinada la velocidad vertical
    • La posición vertical de la pelota en cualquier instante puede calcularse por simulación
    • La posición vertical de la paleta debe coincidir con la de la pelota para golpearla, con un pequeño delta añadido para lograr el ángulo deseado
    • La posición de la paleta entre golpes se conecta suavemente con interpolación lineal

Entradas y restricciones lineales

  • Las entradas fijas son el ancho de la pantalla y la velocidad de la pelota
    • W: ancho de la pantalla
    • S: velocidad de la pelota
  • Los tiempos de los beats se obtienen de un archivo MIDI
    • T = {t_0, t_1, ..., t_n} son los instantes de cada beat en los que la pelota debe tocar una paleta
    • Más adelante se podrían explorar métodos más automatizados para extraerlos desde audio
  • La diferencia entre beats adyacentes define la duración de cada tiro
    • D = {d_0, d_1, ..., d_{n-1}}
    • d_i = t_{i+1} - t_i
  • Las variables de optimización son la posición horizontal y la velocidad horizontal
    • P = {p_0, p_1, ..., p_{n-1}} es la distancia horizontal desde el centro de la pantalla donde la paleta golpea la pelota
    • Los índices pares representan la paleta izquierda y los impares la derecha
    • V = {v_0, v_1, ..., v_{n-1}} es la velocidad horizontal de la pelota después de cada golpe
    • Para facilitar la formulación de las restricciones, v_i se define siempre como positiva, sin importar si la pelota se mueve hacia la izquierda o hacia la derecha
  • Las restricciones físicas fijan el rango de posiciones de paleta y velocidades de la pelota
    • 0 ≤ p_i ≤ W/2
    • 0 < v_i ≤ S
  • Las restricciones de sincronización con el beat hacen que la pelota llegue exactamente a tiempo a la siguiente paleta
    • p_{i-1} + p_i = d_i v_i
    • El lado izquierdo es la distancia horizontal total recorrida entre dos golpes consecutivos de paleta
    • El lado derecho es el producto entre la duración del tiro y la velocidad horizontal de la pelota

Función objetivo y generación de la animación

  • Para evitar la solución degenerada de quedarse en el centro, se incentiva que las paletas se alejen del centro de la pantalla
  • La función objetivo maximiza la suma de las distancias de las paletas respecto al centro
    • Maximize Σ p_i
  • Como todas las restricciones son lineales, el problema puede resolverse con un solver de programación lineal (LP)
  • La implementación utiliza CVXPY
    • CVXPY resuelve problemas de optimización convexa, y LP es un subconjunto de ellos
    • Aunque aquí no se necesita toda su funcionalidad, permite experimentar con objetivos y restricciones más complejos
  • El solver devuelve las posiciones horizontales donde las paletas deben golpear la pelota y la velocidad horizontal de la pelota
    • Con esos valores se puede calcular el ángulo de rebote
    • La posición vertical se calcula por simulación
  • La animación final usa como keyframes las posiciones de la pelota y las paletas en los instantes de golpe
    • Entre golpes, las posiciones se interpolan para crear un movimiento suave
  • El código está publicado como open source: Github Repo

1 comentarios

 
GN⁺ 2024-09-04
Comentarios de Hacker News
  • Me recordó a un proyecto de hace unos 20 años en el que programé audio multijugador para una exhibición de arte
    Mientras más intenso se ponía el juego, más se hacía evidente que los sonidos de la pelota y las paredes estaban interpretando música, y que en realidad la estructura era que tres jugadores tocaban juntos una sola pieza
    Colocamos 3 gabinetes arcade uno frente a otro para que cada jugador no pudiera ver la pantalla de los demás, y ajustamos ligeramente la velocidad/dirección de la pelota para que golpeara la paleta o la pared en puntos musicalmente adecuados y produjera el sonido correcto
    Josh también subió esto a su sitio como referencia: https://www.autogena.org/work/ping

    • Qué genial. Entonces, ¿había una composición fija y el gameplay se ajustaba ligeramente para encajar con ella?
  • Como variación de esta idea, me hace imaginar entrenar un agente de aprendizaje por refuerzo en juegos de Atari o Super Mario, pero agregando recompensas/entradas basadas en música para crear una forma de jugar que se vea “musical”
    No sé qué tan bien se vería ni si valdría la pena

    • Soy principiante en machine learning, pero OpenAI llegó a crear una biblioteca de Python para aprendizaje por refuerzo en videojuegos, y su fork sigue con mantenimiento activo [1]
      Si mal no recuerdo de hace unos años, se podía tener corriendo en uno o dos días, o a más tardar en un fin de semana. Usaba el emulador RetroArch y soporta una enorme cantidad de emuladores y consolas
      https://github.com/Farama-Foundation/Gymnasium
      También hay un excelente video de YouTube de SethBling sobre machine learning con Super Mario World:
      https://www.youtube.com/watch?v=qv6UVOQ0F44
      Te recomendaría probarlo. En el ambiente actual de hype por la IA, siento que los videojuegos están algo infravalorados, y creo que hay mucho potencial en que una máquina aprenda habilidades mientras juega. También es grande la posibilidad de elegir o crear juegos nuevos para enseñar habilidades específicas. Aunque para ese punto quizá convenga más dejar de lado audio y visuales y comunicarse con la máquina mediante texto o datos puros
      Por otro lado, he visto videos de redes neuronales convolucionales que toman como entrada cada píxel de la imagen, así que me da la impresión de que entrenar con datos de sonido o con píxeles de espectrogramas también podría dar resultados positivos. Ver un juego que se juega al ritmo de la música, o como si bailara siguiendo melodía, armonía e historia, definitivamente suena divertido
      Todo lo que han creado los humanos primero existió en la imaginación de alguien, y tú también tienes un cerebro así. Seguir una visión interior y arrastrarla hacia la realidad física es algo hermoso, y parece un regalo para toda la humanidad
    • Crypt of the NecroDancer explora esta idea al dar bonificaciones dentro del juego cuando mueves al personaje al ritmo
    • No parece muy buena idea. Mario no tiene suficiente ritmo como para evocar una musicalidad fuerte
      En el original esto ya pasaba un poco, porque los sonidos estaban ligados a la tasa de cuadros. Más tarde, los ports PAL corrían a una tasa de cuadros más lenta y esa característica se rompió
  • Me recordó a las visualizaciones de polirritmos de YouTube. Un buen ejemplo es LucidRhythms
    https://www.youtube.com/@LucidRhythms
    Sería casi imposible hacer que una canción ya existente encaje al revés con la visualización, pero podría ser divertido si distintas barras representaran distintas notas y la pelota se dividiera cuando hubiera acordes

    • También estaría genial tener N paletas. Para que no se vuelva demasiado fácil, se podría imponer un costo cuando las paletas se acerquen demasiado, optimizar qué nota o pulso le toca a cada una, y también aplicar un costo a cambios bruscos de tono, para que cada paleta pueda especializarse en cierto registro
  • Está realmente genial. Me quedé hipnotizado viendo cómo se mueven las paletas mientras avanza el compás
    Hay cosas que simplemente se sienten correctas con solo verlas, y por eso se perciben bellas; este proyecto es uno de esos casos

  • Antecedente: Eisenfunk - Pong (https://www.youtube.com/watch?v=cNAdtkSjSps)

    • Aun así es bastante distinto. En ese ejemplo los pitidos suenan a velocidad constante, así que el video se sincronizó manualmente con el BPM de la canción
      Básicamente se parece más a una visualización hecha a mano para uno de cada dos golpes del bombo
      En cambio, el trabajo enviado está “animado” automáticamente sobre la base de optimización con restricciones, y las notas no están en un simple tempo de negras. Por eso la visualización también resulta mucho más interesante
  • Está muy bien. Solo que, como no se pueden enviar corazones sin suscribirse, a mí se me hace un poco menos atractivo

  • Técnicamente está bien, pero hay varias veces en que las paletas y la pelota se mueven casi a la misma velocidad, así que parece que las paletas solo están empujando la pelota continuamente
    Por esa razón, quizá convendría no permitir p[i] = 0. Si justo después de un d[i] grande viene un d[i+1] muy pequeño será inevitable, pero cuando se pueda, parece algo que podría evitarse

    • Se podría poner una penalización en la función objetivo proporcional a d'[i]
  • Me hace imaginar tener una installation en mi espacio, usando un MT-80S junto con una pantalla
    ¿Seré capaz de entender bien este timing? No soy muy listo para estas cosas, pero me interesa
    https://www.matrixsynth.com/2014/07/roland-mt-80s-midi-playe...

  • Es realmente interesante, pero extrañamente mi cerebro lo odia muchísimo
    Siento que toca algo así como mi modelo de causalidad interno, y se me hace difícil de ver. Qué raro

    • Lo que más noto que falta para mí es la dinámica. Sobre todo en pasajes rápidos, cuando hay “ghost notes” entre notas mucho más fuertes, se siente como si faltara algo
      Aun así, curiosamente sí resulta satisfactorio de mirar. También me pregunto si haber tocado varios instrumentos tiene relación con esta sensación. A mí me recuerda bastante a instrumentos como el xilófono o el steelpan
    • Como si la pelota rebotara desde el centro de la paleta y no desde el borde, así que se sigue viendo raro. Quizá estamos notando el mismo problema
  • Atari tuvo un dispositivo de visualización musical en video a fines de los años 70. Lo diseñó uno de los desarrolladores de Pong, y fue el primero o uno de los primeros productos de consumo de este tipo
    https://en.wikipedia.org/wiki/Atari_Video_Music
    Si viste la película Over the Edge, Claude y Johnny tienen uno en su casa