Sincronizar Pong con beats musicales mediante optimización con restricciones
(victortao.substack.com)- 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 pantallaS: 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_ise 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/20 < 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
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
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
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
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
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)
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 und[i]grande viene und[i+1]muy pequeño será inevitable, pero cuando se pueda, parece algo que podría evitarsed'[i]Me hace imaginar tener una
installationen 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
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
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