Constraint optimization से Pong को संगीत के बीट्स के साथ सिंक करना
(victortao.substack.com)- Pong-स्टाइल संगीत visualization में गेंद के पैडल से टकराने के क्षण को गाने के बीट के साथ मिलाने के लिए, गेम physics को समायोजित किया जाता है और पैडल की position को optimization variables की तरह माना जाता है
- गेंद स्थिर गति से चलती है और दोनों पैडल अपनी-अपनी स्क्रीन की आधी जगह में कहीं भी जा सकते हैं, जबकि संपर्क बिंदु reflection angle तय करता है और गेंद ऊपर-नीचे की दीवारों से उछलती है
- पैडल को केंद्र के पास रखने पर किसी भी timing को मिलाया जा सकता है, लेकिन स्क्रीन का उपयोग कम होता है और movement फीका लगता है, इसलिए अच्छा visualization बनाना कठिन हो जाता है
- हर beat समय पर पैडल की horizontal position और गेंद की horizontal speed तय करके, physics constraints और rhythm को बनाए रखते हुए केंद्र से दूर पैडल hits को अधिकतम करने वाली linear programming problem के रूप में इसे formalize किया जाता है
- implementation में CVXPY से linear constraints को solve किया जाता है, फिर मिले हुए पैडल positions और गेंद की speed से reflection angle व vertical position निकाली जाती है, और keyframe interpolation से animation बनाया जाता है
Pong को संगीत के बीट्स से मिलाने के लिए physics setup
- लक्ष्य यह है कि क्लासिक arcade game Pong में गेंद के पैडल से उछलने के क्षण को गाने के beats के साथ synchronize किया जाए, ताकि पैडल संगीत के साथ चलने वाला visualization बने
- इसके लिए game physics के कुछ हिस्से बदले जाते हैं
- गेंद स्थिर गति से चलती है
- दोनों पैडल अपनी-अपनी स्क्रीन के आधे हिस्से में कहीं भी जा सकते हैं
- कुछ नियम ऐसे भी हैं जो मूल Pong से बनाए रखे जाते हैं
- गेंद के पैडल से टकराने का संपर्क बिंदु reflection angle तय करता है
- पैडल पर speed limit नहीं है
- गेंद स्क्रीन की ऊपर और नीचे की सीमाओं से उछलती है
- यह physics setup मनचाहे समय पर गेंद को hit कराने के लिए पर्याप्त freedom देता है
केंद्र में रखने वाले समाधान की सीमाएँ
- अगर दोनों पैडल को स्क्रीन के केंद्र के पास रखा जाए, तो किसी भी timing requirement को पूरा किया जा सकता है
- horizontal space कम होती है, लेकिन गेंद ऊपर-नीचे की दीवारों से उछल सकती है, इसलिए vertical space व्यवहारिक रूप से पर्याप्त रहती है
- अगर किसी shot की desired duration लंबी हो, तो गेंद को अधिक vertical दिशा में मारकर horizontal speed धीमी की जा सकती है
- यह तरीका दिखाता है कि हर input के लिए एक solution मौजूद है, लेकिन देखने में यह दिलचस्प नहीं लगता
- अच्छे visualization के लिए screen space का उपयोग महत्वपूर्ण है
- अगर game छोटा-सा क्षेत्र घेरकर रह जाए, तो वह घुटा हुआ और कमजोर दिखता है
- दर्शक पैडल की उस dynamic movement का आनंद लेते हैं जिसमें वे मुश्किल से पहुँचने वाली गेंद को return करते दिखते हैं
- इसलिए असली सवाल यह है कि beats और physics rules का पालन करते हुए, हर beat पर पैडल गेंद को कहाँ hit करें ताकि स्क्रीन का अधिक व्यापक उपयोग हो सके
इसे constraint optimization में बदलना
- इस समस्या को objective function, variables और constraints वाली constraint optimization समस्या के रूप में लिया जा सकता है
- objective है स्क्रीन उपयोग को बढ़ाना
- variables हैं वे positions जहाँ गेंद उछलती है
- constraints हैं game physics और गाने के beats
- constraint optimization बनाने से खुद algorithm design करने के बजाय, मौजूदा solvers से optimal पैडल positions निकाली जा सकती हैं
- अगर physics बदलती है, तो सिर्फ constraints अपडेट करने होते हैं, और objective function पर भी आसानी से प्रयोग किया जा सकता है
- पूरे 2D मॉडल की ज़रूरत नहीं है
- गेंद की कुल speed स्थिर होने से, horizontal speed तय हो जाए तो vertical speed भी तय हो जाती है
- simulation से किसी भी समय गेंद की vertical position निकाली जा सकती है
- पैडल की vertical position गेंद से मेल खानी चाहिए ताकि hit हो सके, और desired angle के लिए उसमें एक छोटा delta जोड़ा जाता है
- hits के बीच पैडल positions को linear interpolation से smoothly जोड़ा जाता है
input values और linear constraints
- स्थिर inputs हैं स्क्रीन की चौड़ाई और गेंद की speed
W: स्क्रीन की चौड़ाईS: गेंद की speed
- beat timings MIDI file से प्राप्त किए जाते हैं
T = {t_0, t_1, ..., t_n}वे beat समय हैं जब गेंद को पैडल से टकराना चाहिए- आगे चलकर audio से इन्हें अधिक automated तरीके से निकालने के विकल्प भी खोजे जा सकते हैं
- पड़ोसी beat times के अंतर से हर shot की duration बनती है
D = {d_0, d_1, ..., d_{n-1}}d_i = t_{i+1} - t_i
- optimization variables हैं horizontal positions और horizontal speed
P = {p_0, p_1, ..., p_{n-1}}वह horizontal distance है जो गेंद को hit करते समय पैडल की स्क्रीन के केंद्र से दूरी दर्शाता है- even index बाएँ पैडल को और odd index दाएँ पैडल को दर्शाते हैं
V = {v_0, v_1, ..., v_{n-1}}हर hit के बाद गेंद की horizontal speed है- constraints को बनाना आसान रखने के लिए, गेंद बाएँ जाए या दाएँ,
v_iको हमेशा positive परिभाषित किया जाता है
- physics constraints पैडल positions और गेंद की speed की सीमाएँ तय करते हैं
0 ≤ p_i ≤ W/20 < v_i ≤ S
- beat synchronization constraint यह सुनिश्चित करता है कि गेंद अगली पैडल तक ठीक सही समय पर पहुँचे
p_{i-1} + p_i = d_i v_i- बाईं ओर लगातार दो पैडल hits के बीच कुल horizontal travel distance है
- दाईं ओर shot duration और गेंद की horizontal speed का गुणनफल है
objective function और animation generation
- केंद्र में टिके रहने वाले degenerate solution से बचने के लिए पैडल को स्क्रीन के केंद्र से दूर जाने के लिए प्रेरित किया जाता है
- objective function पैडल की केंद्र से दूरी के योग को अधिकतम करता है
Maximize Σ p_i
- सभी constraints linear हैं, इसलिए इसे linear programming (LP) solver से हल किया जा सकता है
- implementation में CVXPY का उपयोग किया गया है
- CVXPY convex optimization problems को solve करता है, और LP उसका एक subset है
- इस काम में उसकी पूरी क्षमता की ज़रूरत नहीं है, लेकिन अधिक जटिल objective functions और constraints को support करने के कारण यह creative experimentation के लिए उपयोगी है
- solver पैडल की वह horizontal positions और गेंद की horizontal speed लौटाता है जिन पर पैडल को गेंद hit करनी चाहिए
- इनसे reflection angle निकाला जा सकता है
- vertical position simulation से निकाली जाती है
- अंतिम animation में गेंद और पैडल की hit timings पर positions को keyframes की तरह इस्तेमाल किया जाता है
- hits के बीच positions को interpolate करके smooth movement बनाई जाती है
- कोड open source के रूप में उपलब्ध है: Github Repo
1 टिप्पणियां
Hacker News टिप्पणियां
करीब 20 साल पहले एक आर्ट exhibition के लिए किए गए उस project की याद आती है, जिसमें मैंने कई लोगों द्वारा एक साथ खेला जाने वाला audio code किया था
जैसे-जैसे game तेज होता गया, यह साफ होता गया कि ball/wall की आवाजें music बजा रही थीं, और तीनों players असल में मिलकर एक ही composition बजा रहे थे
तीन arcade cabinets को एक-दूसरे की ओर मुंह करके रखा गया था ताकि हर player दूसरों की screen न देख सके, और ball की speed/direction को थोड़ा adjust किया जाता था ताकि वह musically सही जगह पर bat या wall से टकराए और सही sound निकले
Josh ने अपनी site पर reference के लिए यह भी रखा है: https://www.autogena.org/work/ping
इस idea के एक variation के तौर पर, कल्पना होती है कि Atari games या Super Mario में reinforcement learning agent को train किया जाए, लेकिन music-based reward/input जोड़कर ऐसा play बनाया जाए जो “musical” दिखे
यह देखने में कितना अच्छा लगेगा, या इसके लायक होगा या नहीं, यह ठीक-ठीक नहीं पता
कुछ साल पहले की याद के मुताबिक, इसे एक-दो दिन में, ज्यादा से ज्यादा weekend भर में, चला पाना संभव था। इसमें RetroArch emulator इस्तेमाल हुआ था, और यह बहुत सारे emulators और consoles support करता है
https://github.com/Farama-Foundation/Gymnasium
Super Mario World के साथ machine learning पर SethBling का एक बेहतरीन YouTube video भी है:
https://www.youtube.com/watch?v=qv6UVOQ0F44
खुद try करने की सलाह दूंगा। आजकल AI hype के माहौल में videogames कुछ हद तक undervalued लगते हैं, और machines के games खेलते हुए skills सीखने में काफी potential दिखता है। किसी खास skill को सिखाने के लिए games चुनने या नए बनाने की संभावना भी बड़ी है। हालांकि उस point पर शायद audio और visuals छोड़कर text या pure data के जरिए machine से communicate करना बेहतर हो सकता है
दूसरी तरफ, मैंने convolutional neural network वाला video देखा है जिसमें image के हर pixel को input के रूप में दिया जाता है, इसलिए लगता है कि sound data या spectrogram pixels से training करने पर भी positive results आ सकते हैं। music के साथ sync में game खेलना, या melody, harmony और story के हिसाब से dance जैसी playing देखना निश्चित रूप से मजेदार होगा
इंसानों ने जो कुछ भी बनाया है, वह पहले इंसान की कल्पना में था, और आपके पास भी वैसा ही दिमाग है। मन की vision का पीछा करके उसे physical reality में लाना एक सुंदर काम है, और पूरी मानवता के लिए gift जैसा लगता है
original की sounds frame rate से बंधी थीं, इसलिए basically कुछ हद तक ऐसा होता था। बाद में PAL ports slower frame rate पर चले और यह quality टूट गई
YouTube की polyrhythm visualizations याद आती हैं। अच्छे examples के लिए LucidRhythms देखें
https://www.youtube.com/@LucidRhythms
पहले से लिखे गए songs को उल्टा visualization से match कराना लगभग असंभव होगा, लेकिन अगर अलग-अलग bars अलग notes को represent करें और chords में ball split हो जाए, तो मजेदार लग सकता है
वाकई शानदार। beat आगे बढ़ते हुए paddles के move करने को देखकर मैं मंत्रमुग्ध हो गया
कुछ चीजें ऐसी होती हैं जो बस देखने भर से सही बैठती हैं, और इसलिए सुंदर लगती हैं; यह project वैसा ही है
पहले का काम: Eisenfunk - Pong (https://www.youtube.com/watch?v=cNAdtkSjSps)
basic तौर पर वह हर दूसरे kick drum की hand-made visualization जैसा है
जबकि submitted work में notes simple quarter-note tempo पर नहीं हैं, और यह constraint optimization के आधार पर automatic “animated” है। इसलिए visualization भी कहीं ज्यादा interesting हो जाती है
बहुत अच्छा। बस subscribe किए बिना heart नहीं भेज सकते, इसलिए मेरे लिए यह थोड़ा ठीक नहीं लगता
technically ठीक है, लेकिन कई बार paddles और ball लगभग same speed से चलते हैं, जिससे लगता है कि paddles लगातार ball को धक्का दे रहे हैं
इसी वजह से
p[i] = 0allow न करना बेहतर होगा। बड़ेd[i]के ठीक बाद बहुत छोटाd[i+1]आए तो इसे टाला नहीं जा सकेगा, लेकिन जहां possible हो वहां avoid कराया जा सकता हैd'[i]के proportional penalty दी जा सकती हैअपने space में एक
installationरखने और MT-80S के साथ display इस्तेमाल करने की कल्पना कर रहा हूंक्या मैं इस timing को सच में ठीक से समझ पाऊंगा? इस तरफ मैं बहुत smart नहीं हूं, लेकिन interest है
https://www.matrixsynth.com/2014/07/roland-mt-80s-midi-playe...
बहुत interesting है, लेकिन अजीब तरह से मेरा दिमाग इसे बहुत नापसंद कर रहा है
लगता है जैसे यह मेरे अंदर के causality model जैसी किसी चीज को छेड़ता है, और देखने में मुश्किल लगता है। अजीब है
फिर भी अजीब तरह से इसे देखना satisfying है। सोचता हूं कि कई instruments बजाने का अनुभव इस feeling से जुड़ा है या नहीं। मेरे लिए xylophone या steelpan जैसे instruments इससे काफी मिलते-जुलते लगते हैं
Atari के पास 1970s के late दौर में एक video music visualizer था। इसे Pong game developers में से एक ने design किया था, और यह इस तरह के consumer products में पहला या शुरुआती products में से एक था
https://en.wikipedia.org/wiki/Atari_Video_Music
अगर आपने film Over the Edge देखी है, तो Claude और Johnny के घर में एक है