ซิงก์ Pong ให้เข้ากับบีตเพลงด้วยการปรับให้เหมาะสมภายใต้ข้อจำกัด
(victortao.substack.com)- การทำภาพประกอบดนตรีสไตล์ Pong ปรับฟิสิกส์ของเกมและมองตำแหน่งแพดเดิลเป็นตัวแปรสำหรับการปรับให้เหมาะสม เพื่อให้จังหวะที่ลูกบอลชนแพดเดิลตรงกับ บีต ของเพลง
- ลูกบอลเคลื่อนที่ด้วย ความเร็วคงที่ และแพดเดิลแต่ละอันสามารถย้ายไปที่ใดก็ได้ในครึ่งหน้าจอของตัวเอง โดยจุดสัมผัสจะกำหนดมุมสะท้อน และลูกบอลจะเด้งกับผนังด้านบนและด้านล่าง
- หากวางแพดเดิลไว้ใกล้กึ่งกลาง จะจับเวลาให้ตรงได้ทุกแบบ แต่ใช้พื้นที่หน้าจอน้อยและการเคลื่อนไหวดูจืด ทำให้ยากที่จะเป็น การแสดงภาพ ที่ดี
- กำหนดตำแหน่งแนวนอนของแพดเดิลและความเร็วแนวนอนของลูกบอลในแต่ละจังหวะบีต แล้วจัดรูปเป็นปัญหาการโปรแกรมเชิงเส้นที่เพิ่มจำนวน การตีแพดเดิลที่ไกลจากกึ่งกลาง ให้มากที่สุด ขณะยังรักษาข้อจำกัดทางฟิสิกส์และจังหวะเพลง
- การใช้งานจริงใช้ CVXPY แก้ข้อจำกัดเชิงเส้น จากนั้นคำนวณมุมสะท้อนและตำแหน่งแนวตั้งจากตำแหน่งแพดเดิลและความเร็วลูกบอลที่ได้ แล้วสร้างแอนิเมชันด้วยการอินเตอร์โพเลตคีย์เฟรม
การตั้งค่าฟิสิกส์เพื่อให้ Pong ตรงกับบีตเพลง
- เป้าหมายคือสร้างการแสดงภาพที่แพดเดิลเคลื่อนไหวตามเพลง โดยซิงก์จังหวะที่ลูกบอลเด้งกับแพดเดิลในเกมอาร์เคดคลาสสิก Pong ให้ตรงกับบีตของเพลง
- เพื่อทำสิ่งนี้ จึงปรับฟิสิกส์บางส่วนของเกม
- ลูกบอลเคลื่อนที่ด้วย ความเร็วคงที่
- แพดเดิลแต่ละอันสามารถย้ายไปที่ใดก็ได้ในครึ่งหน้าจอของตัวเอง
- ยังมีบางกฎจาก Pong เดิมที่คงไว้
- จุดสัมผัส ที่ลูกบอลชนแพดเดิลเป็นตัวกำหนดมุมสะท้อน
- แพดเดิลไม่มีขีดจำกัดความเร็ว
- ลูกบอลเด้งกับขอบบนและขอบล่างของหน้าจอ
- การตั้งค่าฟิสิกส์นี้ให้ระดับอิสระเพียงพอสำหรับทำให้ลูกบอลชนตามเวลาที่ต้องการ
ข้อจำกัดของวิธีวางไว้ตรงกลาง
- หากวางแพดเดิลทั้งสองไว้ใกล้กึ่งกลางหน้าจอ ก็สามารถตอบโจทย์เวลาได้ทุกแบบ
- แม้พื้นที่แนวนอนจะน้อย แต่เพราะลูกบอลเด้งกับผนังบนล่างได้ พื้นที่แนวตั้งจึงเพียงพอในทางปฏิบัติ
- หากต้องการให้ช็อตกินเวลานานขึ้น ก็สามารถตีลูกให้เกือบเป็นแนวตั้งมากขึ้นเพื่อชะลอ ความเร็วแนวนอน ได้
- วิธีนี้แสดงให้เห็นว่ามีคำตอบสำหรับอินพุตทุกรูปแบบ แต่เมื่อดูแล้วไม่น่าสนใจ
- สำหรับการแสดงภาพที่ดี การใช้พื้นที่หน้าจอ สำคัญมาก
- หากเกมถูกกักอยู่ในพื้นที่เล็ก ๆ จะดูอึดอัดและไม่ทรงพลัง
- ผู้ชมชอบการเคลื่อนไหวที่มีไดนามิก ซึ่งแพดเดิลรับลูกบอลที่ดูเหมือนจะเอื้อมถึงก็ไม่ถึง
- ดังนั้นแก่นของปัญหาคือ ในแต่ละบีตแพดเดิลควรตีลูกตรงไหนเพื่อใช้หน้าจอให้กว้างขึ้น ขณะยังรักษาบีตและกฎฟิสิกส์ไว้
เปลี่ยนเป็นการปรับให้เหมาะสมภายใต้ข้อจำกัด
- ปัญหานี้สามารถมองเป็นปัญหา การปรับให้เหมาะสมภายใต้ข้อจำกัด ที่มีฟังก์ชันวัตถุประสงค์ ตัวแปร และเงื่อนไขข้อจำกัด
- วัตถุประสงค์คือเพิ่มการใช้พื้นที่หน้าจอ
- ตัวแปรคือตำแหน่งที่ลูกบอลเด้ง
- ข้อจำกัดคือฟิสิกส์ของเกมและบีตของเพลง
- เมื่อสร้างเป็นการปรับให้เหมาะสมภายใต้ข้อจำกัดแล้ว ก็สามารถใช้ตัวแก้ปัญหาที่มีอยู่คำนวณตำแหน่งแพดเดิลที่เหมาะที่สุด แทนการออกแบบอัลกอริทึมเอง
- หากเปลี่ยนฟิสิกส์ ก็เพียงอัปเดตข้อจำกัด และยังทดลองฟังก์ชันวัตถุประสงค์ได้ง่าย
- ไม่จำเป็นต้องโมเดลทั้ง 2D ทั้งหมด
- เนื่องจากความเร็วรวมของลูกบอลคงที่ เมื่อกำหนด ความเร็วแนวนอน แล้ว ความเร็วแนวตั้งก็ถูกกำหนดตามไปด้วย
- สามารถใช้การจำลองคำนวณตำแหน่งแนวตั้งของลูกบอล ณ เวลาใดก็ได้
- ตำแหน่งแนวตั้งของแพดเดิลต้องตรงกับตำแหน่งแนวตั้งของลูกบอลเพื่อให้ตีโดน และมีเดลต้าเล็ก ๆ เพิ่มเข้ามาเพื่อให้ได้มุมที่ต้องการ
- ตำแหน่งแพดเดิลระหว่างการตีแต่ละครั้งเชื่อมต่ออย่างนุ่มนวลด้วยการอินเตอร์โพเลตเชิงเส้น
ค่าอินพุตและข้อจำกัดเชิงเส้น
- อินพุตคงที่คือความกว้างหน้าจอและความเร็วลูกบอล
W: ความกว้างหน้าจอS: ความเร็วของลูกบอล
- เวลาของบีตได้มาจากไฟล์ MIDI
T = {t_0, t_1, ..., t_n}คือเวลาบีตแต่ละจุดที่ลูกบอลต้องชนแพดเดิล- ในอนาคตยังสามารถสำรวจวิธีสกัดจากเสียงโดยอัตโนมัติมากขึ้นได้
- ใช้ผลต่างระหว่างเวลาบีตที่ติดกันเพื่อสร้างระยะเวลาของแต่ละช็อต
D = {d_0, d_1, ..., d_{n-1}}d_i = t_{i+1} - t_i
- ตัวแปรสำหรับการปรับให้เหมาะสมคือ ตำแหน่งแนวนอนและความเร็วแนวนอน
P = {p_0, p_1, ..., p_{n-1}}คือ ระยะทางแนวนอน จากกึ่งกลางหน้าจอในขณะที่แพดเดิลตีลูก- ดัชนีเลขคู่แทนแพดเดิลซ้าย ดัชนีเลขคี่แทนแพดเดิลขวา
V = {v_0, v_1, ..., v_{n-1}}คือความเร็วแนวนอนของลูกบอลหลังการตีแต่ละครั้ง- เพื่อให้สร้างข้อจำกัดได้ง่าย
v_iจึงนิยามให้เป็นค่าบวกเสมอ โดยไม่ขึ้นกับทิศทางที่ลูกบอลเคลื่อนไปซ้ายหรือขวา
- ข้อจำกัดทางฟิสิกส์กำหนดช่วงของตำแหน่งแพดเดิลและความเร็วลูกบอล
0 ≤ p_i ≤ W/20 < v_i ≤ S
- ข้อจำกัดการซิงก์บีตทำให้ลูกบอลไปถึงแพดเดิลถัดไปตรงเวลา
p_{i-1} + p_i = d_i v_i- ฝั่งซ้ายคือระยะทางแนวนอนรวมระหว่างการตีแพดเดิลสองครั้งต่อเนื่องกัน
- ฝั่งขวาคือผลคูณของระยะเวลาช็อตกับความเร็วแนวนอนของลูกบอล
ฟังก์ชันวัตถุประสงค์และการสร้างแอนิเมชัน
- เพื่อหลีกเลี่ยงคำตอบเสื่อมที่ค้างอยู่กลางจอ จึงชี้นำให้แพดเดิลอยู่ห่างจากกึ่งกลางหน้าจอ
- ฟังก์ชันวัตถุประสงค์คือเพิ่มผลรวมระยะห่างจากกึ่งกลางของแพดเดิลให้มากที่สุด
Maximize Σ p_i
- เนื่องจากข้อจำกัดทั้งหมดเป็นเชิงเส้น จึงแก้ได้ด้วยตัวแก้ การโปรแกรมเชิงเส้น (LP)
- การใช้งานจริงใช้ CVXPY
- CVXPY ใช้แก้ปัญหาการปรับให้เหมาะสมแบบนูน และ LP เป็นส่วนย่อยของสิ่งนั้น
- งานนี้ไม่ต้องใช้ความสามารถทั้งหมด แต่การรองรับฟังก์ชันวัตถุประสงค์และข้อจำกัดที่ซับซ้อนกว่านั้นเอื้อต่อการทดลองเชิงสร้างสรรค์
- ตัวแก้ปัญหาจะคืนตำแหน่งแนวนอนที่แพดเดิลควรตีลูก และความเร็วแนวนอนของลูกบอล
- สามารถใช้ค่านี้คำนวณมุมสะท้อนได้
- ตำแหน่งแนวตั้งคำนวณด้วยการจำลอง
- แอนิเมชันสุดท้ายใช้ตำแหน่งของลูกบอลและแพดเดิล ณ เวลาที่ตีเป็น คีย์เฟรม
- ระหว่างการตีแต่ละครั้ง จะอินเตอร์โพเลตตำแหน่งเพื่อสร้างการเคลื่อนไหวที่ลื่นไหล
- โค้ดเปิดเป็นโอเพนซอร์ส: Github Repo
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
นึกถึงโปรเจกต์เมื่อราว 20 ปีก่อน ที่ผมเคยเขียนโค้ด เสียงสำหรับผู้เล่นหลายคนพร้อมกัน เพื่อจัดแสดงงานศิลปะ
ยิ่งเกมดุเดือดขึ้น ก็ยิ่งเห็นชัดว่าเสียงลูกบอล/กำแพงกำลังเล่นดนตรีอยู่ และผู้เล่นสามคนจริง ๆ แล้วกำลังร่วมกันเล่นเพลงเดียว
เราจัดตู้อาร์เคด 3 ตู้ให้หันเข้าหากัน เพื่อให้ผู้เล่นแต่ละคนมองไม่เห็นหน้าจอของคนอื่น แล้วปรับความเร็ว/ทิศทางของลูกบอลเล็กน้อยให้ไปโดนไม้ตีหรือกำแพงในจังหวะที่ถูกต้องทางดนตรี เพื่อให้เกิดเสียงที่ถูกต้อง
Josh ยังเคยเอาไปลงไว้เป็นข้อมูลอ้างอิงบนไซต์ของเขาด้วย: https://www.autogena.org/work/ping
ไอเดียอีกแบบหนึ่งที่นึกภาพได้คือ ฝึก เอเจนต์ reinforcement learning กับเกม Atari หรือ Super Mario แต่เพิ่มรางวัล/อินพุตที่อิงดนตรีเข้าไป เพื่อให้เกิดการเล่นที่ดู “เป็นดนตรี”
ไม่แน่ใจว่ามันจะดูดีแค่ไหน หรือคุ้มค่าหรือเปล่า
เท่าที่จำได้เมื่อไม่กี่ปีก่อน ใช้เวลาสักวันหรือสองวัน อย่างมากก็ช่วงสุดสัปดาห์ ก็น่าจะรันได้แล้ว มันใช้ emulator ของ RetroArch และรองรับ emulator กับคอนโซลจำนวนมาก
https://github.com/Farama-Foundation/Gymnasium
ยังมีวิดีโอ YouTube ยอดเยี่ยมของ SethBling ที่พูดถึง machine learning กับ Super Mario World ด้วย:
https://www.youtube.com/watch?v=qv6UVOQ0F44
แนะนำให้ลองทำเอง ในกระแส AI ที่ร้อนแรงตอนนี้ วิดีโอเกมดูเหมือนจะถูกประเมินค่าต่ำไปสักหน่อย และผมคิดว่ามีศักยภาพมากในการให้เครื่องเล่นเกมเพื่อเรียนรู้ทักษะต่าง ๆ ความเป็นไปได้ในการเลือกเกมหรือสร้างเกมใหม่เพื่อสอนทักษะเฉพาะก็มีมากเช่นกัน แต่พอถึงจุดนั้น การทิ้งเสียงกับภาพ แล้วสื่อสารกับเครื่องด้วยข้อความหรือข้อมูลล้วน ๆ อาจจะดีกว่าก็ได้
อีกด้านหนึ่ง ผมเคยเห็นวิดีโอเกี่ยวกับ convolutional neural network ที่ป้อนพิกเซลแต่ละพิกเซลของภาพเป็นอินพุต เลยคิดว่าการฝึกด้วยข้อมูลเสียงหรือพิกเซลของ spectrogram ก็น่าจะให้ผลดีได้เช่นกัน ฉากที่เล่นเกมให้เข้ากับดนตรี หรือเล่นเหมือนเต้นไปตามทำนอง เมโลดี ฮาร์โมนี และเรื่องราว น่าจะสนุกแน่นอน
ทุกสิ่งที่มนุษย์สร้างขึ้นล้วนเคยอยู่ในจินตนาการของมนุษย์ก่อน และคุณก็มีสมองแบบนั้นเช่นกัน การไล่ตามภาพในใจแล้วดึงมันออกมาสู่ความจริงทางกายภาพเป็นเรื่องงดงาม และดูเหมือนเป็นของขวัญให้มนุษยชาติทั้งมวล
เสียงของต้นฉบับผูกกับ frame rate ดังนั้นโดยพื้นฐานแล้วเรื่องแบบนี้เกิดขึ้นอยู่บ้างอยู่แล้ว ภายหลังพอร์ตเวอร์ชัน PAL รันด้วย frame rate ที่ช้ากว่า ทำให้คุณสมบัตินี้พังไป
นึกถึง การแสดงภาพ polyrhythm บน YouTube ตัวอย่างที่ดีให้ดู LucidRhythms
https://www.youtube.com/@LucidRhythms
การเอาเพลงที่เขียนไว้แล้วมาย้อนให้เข้ากับภาพเคลื่อนไหวน่าจะแทบเป็นไปไม่ได้ แต่ถ้าให้แท่งต่าง ๆ แทนโน้ตคนละเสียง และให้ลูกบอลแตกออกเมื่อเป็นคอร์ด ก็น่าจะน่าสนุก
เจ๋งมาก ผมดู การเคลื่อนไหวของแพดเดิล ขณะจังหวะดำเนินไปจนเคลิ้มเลย
มีบางสิ่งที่แค่มองดูก็รู้สึกว่าเข้าที่เข้าทาง และเพราะอย่างนั้นจึงรู้สึกว่าสวยงาม โปรเจกต์นี้ก็เป็นแบบนั้น
งานก่อนหน้า: Eisenfunk - Pong (https://www.youtube.com/watch?v=cNAdtkSjSps)
โดยพื้นฐานแล้วมันใกล้เคียงกับ visualization ที่ทำด้วยมือสำหรับ kick drum ทุก ๆ สองลูก
ในขณะที่งานที่ส่งมานี้ โน้ตไม่ได้อยู่ที่จังหวะ quarter note แบบง่าย ๆ และถูก “ทำแอนิเมชัน” อัตโนมัติบนพื้นฐานของ constraint optimization ดังนั้น visualization จึงน่าสนใจกว่ามาก
ชอบมากจริง ๆ แต่ถ้าไม่ได้สมัครสมาชิกก็ส่งหัวใจให้ไม่ได้ เลยรู้สึกว่าไม่ค่อยเหมาะกับผมเท่าไร
ในเชิงเทคนิคถือว่าโอเค แต่มีหลายครั้งที่แพดเดิลกับลูกบอลเคลื่อนที่ด้วยความเร็วเกือบเท่ากัน จนดูเหมือนแพดเดิลกำลังดันลูกบอลอยู่เรื่อย ๆ
ด้วยเหตุนี้ น่าจะไม่อนุญาต
p[i] = 0จะดีกว่า ถ้าd[i]ที่ใหญ่มากตามด้วยd[i+1]ที่เล็กมากก็อาจเลี่ยงไม่ได้ แต่ในกรณีที่เลี่ยงได้ก็น่าจะทำให้เลี่ยงd'[i]ใน objective function ได้ทำให้จินตนาการถึงการมี
installationในพื้นที่ของผม แล้วใช้ MT-80S ร่วมกับจอแสดงผลผมจะเข้าใจ timing นี้ได้ถูกต้องไหมนะ? ผมไม่ได้เก่งทางนี้เท่าไร แต่สนใจอยู่
https://www.matrixsynth.com/2014/07/roland-mt-80s-midi-playe...
น่าสนใจมากจริง ๆ แต่แปลกที่สมองผมเกลียดสิ่งนี้อย่างแรง
เหมือนมันไปสะกิดอะไรบางอย่างอย่าง โมเดลเหตุและผล ในตัวผม และทำให้ดูยาก รู้สึกประหลาดดี
แต่ถึงอย่างนั้นก็แปลกที่การดูมันยังให้ความพึงพอใจอยู่ ผมสงสัยว่าประสบการณ์ที่เคยเล่นเครื่องดนตรีหลายชนิดมีส่วนเกี่ยวข้องกับความรู้สึกนี้หรือไม่ สำหรับผม เครื่องอย่างไซโลโฟนหรือ steelpan ให้ความรู้สึกค่อนข้างคล้ายกับสิ่งนี้
Atari เคยมี อุปกรณ์ visualizer ดนตรีวิดีโอ ในช่วงปลายทศวรรษ 1970 ออกแบบโดยหนึ่งในผู้พัฒนาเกม Pong และน่าจะเป็นผลิตภัณฑ์สำหรับผู้บริโภคประเภทนี้รุ่นแรก ๆ หรืออย่างน้อยก็หนึ่งในรุ่นแรก ๆ
https://en.wikipedia.org/wiki/Atari_Video_Music
ถ้าเคยดูหนัง Over the Edge จะเห็นว่า Claude กับ Johnny มีเครื่องหนึ่งอยู่ที่บ้าน