1 điểm bởi GN⁺ 2024-09-04 | 1 bình luận | Chia sẻ qua WhatsApp
  • Trực quan hóa âm nhạc kiểu Pong điều chỉnh vật lý trò chơi và xem vị trí paddle là biến tối ưu hóa để khớp khoảnh khắc bóng chạm paddle với nhịp của bài hát
  • Bóng di chuyển với tốc độ không đổi, mỗi paddle có thể di chuyển đến bất kỳ đâu trong nửa màn hình của mình; điểm tiếp xúc quyết định góc phản xạ và bóng bật lại ở tường trên/dưới
  • Nếu đặt paddle gần trung tâm, có thể khớp mọi thời điểm, nhưng việc tận dụng màn hình nhỏ và chuyển động nhạt khiến khó trở thành một trực quan hóa tốt
  • Bài toán được chính thức hóa thành một bài toán quy hoạch tuyến tính: quyết định vị trí ngang của paddle và vận tốc ngang của bóng tại từng nhịp, tuân thủ ràng buộc vật lý và nhịp điệu, đồng thời tối đa hóa các cú đánh paddle xa trung tâm
  • Phần triển khai dùng CVXPY để giải các ràng buộc tuyến tính; từ vị trí paddle và vận tốc bóng thu được, tính góc phản xạ và vị trí dọc rồi tạo hoạt ảnh bằng nội suy keyframe

Thiết lập vật lý để Pong khớp với nhịp nhạc

  • Mục tiêu là đồng bộ khoảnh khắc bóng bật khỏi paddle trong trò chơi arcade cổ điển Pong với nhịp của bài hát, tạo ra một trực quan hóa trong đó các paddle chuyển động theo âm nhạc
  • Để làm vậy, một phần vật lý trò chơi được thay đổi
    • Bóng di chuyển với tốc độ không đổi
    • Mỗi paddle có thể di chuyển đến bất kỳ đâu trong nửa màn hình của mình
  • Cũng có những quy tắc được giữ lại từ Pong gốc
    • Điểm tiếp xúc nơi bóng chạm paddle quyết định góc phản xạ
    • Paddle không bị giới hạn tốc độ
    • Bóng bật lại ở mép trên và mép dưới màn hình
  • Thiết lập vật lý này cung cấp các bậc tự do để đưa bóng đến đúng thời điểm mong muốn

Giới hạn của lời giải đặt ở trung tâm

  • Nếu đặt hai paddle gần giữa màn hình, có thể thỏa mãn bất kỳ yêu cầu thời điểm nào
    • Không gian ngang nhỏ, nhưng vì bóng có thể bật ở tường trên/dưới nên không gian dọc về cơ bản là đủ
    • Nếu thời lượng cú đánh mong muốn dài, có thể đánh bóng gần theo phương dọc hơn để làm chậm vận tốc ngang
  • Cách này cho thấy luôn tồn tại lời giải cho mọi đầu vào, nhưng nhìn không thú vị
  • Với một trực quan hóa tốt, tận dụng không gian màn hình là điều quan trọng
    • Nếu trò chơi bị nhốt trong một vùng nhỏ, nó trông tù túng và thiếu lực
    • Khán giả thích chuyển động năng động khi paddle đỡ những quả bóng tưởng như sắp chạm mà lại chưa chạm
  • Vì vậy, điểm cốt lõi là: trong khi vẫn tuân thủ nhịp và quy tắc vật lý, ở mỗi nhịp paddle nên đánh bóng ở đâu để dùng được nhiều diện tích màn hình hơn

Chuyển thành tối ưu hóa ràng buộc

  • Bài toán này có thể được xử lý như một bài toán tối ưu hóa ràng buộc có hàm mục tiêu, biến và điều kiện ràng buộc
    • Mục tiêu là tăng mức tận dụng màn hình
    • Biến là vị trí bóng bật lại
    • Ràng buộc là vật lý trò chơi và nhịp của bài hát
  • Khi chuyển sang tối ưu hóa ràng buộc, có thể dùng solver có sẵn để tính vị trí paddle tối ưu thay vì tự thiết kế thuật toán
  • Nếu thay đổi vật lý, chỉ cần cập nhật các ràng buộc; hàm mục tiêu cũng dễ thử nghiệm
  • Không cần mô hình hóa toàn bộ 2D
    • Vì tốc độ tổng của bóng là cố định, khi vận tốc ngang được xác định thì vận tốc dọc cũng được xác định
    • Có thể tính vị trí dọc của bóng tại thời điểm bất kỳ bằng mô phỏng
    • Vị trí dọc của paddle phải khớp với vị trí dọc của bóng để đánh trúng, kèm thêm một delta nhỏ cho góc mong muốn
    • Vị trí paddle giữa các cú đánh được nối mượt bằng nội suy tuyến tính

Đầu vào và ràng buộc tuyến tính

  • Đầu vào cố định là chiều rộng màn hình và tốc độ bóng
    • W: chiều rộng màn hình
    • S: tốc độ của bóng
  • Thời điểm nhịp được lấy từ tệp MIDI
    • T = {t_0, t_1, ..., t_n} là các thời điểm nhịp mà bóng phải chạm paddle
    • Trong tương lai cũng có thể khám phá cách trích xuất tự động hơn từ audio
  • Hiệu giữa các thời điểm nhịp liền kề tạo thành thời lượng của từng cú đánh
    • D = {d_0, d_1, ..., d_{n-1}}
    • d_i = t_{i+1} - t_i
  • Biến tối ưu hóa là vị trí ngang và vận tốc ngang
    • P = {p_0, p_1, ..., p_{n-1}}khoảng cách ngang từ tâm màn hình đến vị trí paddle đánh bóng
    • Chỉ số chẵn biểu thị paddle bên trái, chỉ số lẻ biểu thị paddle bên phải
    • V = {v_0, v_1, ..., v_{n-1}} là vận tốc ngang của bóng sau mỗi cú đánh
    • Để dễ tạo ràng buộc, v_i luôn được định nghĩa là số dương, bất kể bóng đang di chuyển sang trái hay sang phải
  • Ràng buộc vật lý xác định phạm vi vị trí paddle và vận tốc bóng
    • 0 ≤ p_i ≤ W/2
    • 0 < v_i ≤ S
  • Ràng buộc đồng bộ nhịp khiến bóng đến paddle kế tiếp đúng thời gian
    • p_{i-1} + p_i = d_i v_i
    • Vế trái là tổng quãng đường di chuyển ngang giữa hai lần bóng chạm paddle liên tiếp
    • Vế phải là tích của thời lượng cú đánh và vận tốc ngang của bóng

Hàm mục tiêu và tạo hoạt ảnh

  • Để tránh lời giải suy biến nằm ở trung tâm, hàm mục tiêu khuyến khích các paddle rời xa tâm màn hình
  • Hàm mục tiêu tối đa hóa tổng khoảng cách của paddle so với tâm
    • Maximize Σ p_i
  • Vì mọi ràng buộc đều tuyến tính, có thể giải bằng solver quy hoạch tuyến tính (LP)
  • Phần triển khai dùng CVXPY
    • CVXPY giải các bài toán tối ưu hóa lồi, và LP là một tập con của nó
    • Công việc này không cần toàn bộ tính năng, nhưng việc hỗ trợ các hàm mục tiêu và ràng buộc phức tạp hơn có lợi cho thử nghiệm sáng tạo
  • Solver trả về vị trí ngang nơi paddle phải đánh bóng và vận tốc ngang của bóng
    • Từ các giá trị này có thể tính góc phản xạ
    • Vị trí dọc được tính bằng mô phỏng
  • Hoạt ảnh cuối cùng dùng vị trí của bóng và paddle tại các thời điểm chạm làm keyframe
    • Giữa các lần chạm, vị trí được nội suy để tạo chuyển động mượt
  • Mã được công bố dưới dạng mã nguồn mở: Github Repo

1 bình luận

 
GN⁺ 2024-09-04
Ý kiến trên Hacker News
  • Gợi nhớ đến một dự án cách đây khoảng 20 năm, nơi họ code âm thanh nhiều người chơi cùng lúc cho một triển lãm nghệ thuật
    Khi trận game trở nên căng hơn, người ta bắt đầu nhận ra tiếng bóng/tường thực ra đang chơi nhạc, và cấu trúc là ba người chơi cùng nhau biểu diễn một bản nhạc
    Họ đặt 3 máy arcade cabinet quay mặt vào nhau để mỗi người chơi không thể nhìn màn hình của người khác, rồi tinh chỉnh nhẹ tốc độ/hướng của bóng để nó chạm vợt hoặc tường tại những điểm phù hợp về mặt âm nhạc và phát ra đúng âm thanh
    Josh cũng có đăng nó trên trang cá nhân để tham khảo: https://www.autogena.org/work/ping

    • Hay thật. Vậy tức là có một bản phối cố định, và gameplay được điều chỉnh nhẹ để khớp với nó đúng không?
  • Một biến thể của ý tưởng này khiến tôi hình dung ra việc huấn luyện tác nhân học tăng cường trong game Atari hay Super Mario, nhưng thêm phần thưởng/đầu vào dựa trên âm nhạc để tạo ra lối chơi trông “có tính nhạc” hơn
    Không chắc nó sẽ đẹp mắt đến mức nào, hay có đáng làm hay không

    • Tôi là người mới với machine learning, nhưng OpenAI từng làm một thư viện Python cho học tăng cường trong video game, và bản fork của nó vẫn đang được duy trì rất tích cực [1]
      Theo ký ức vài năm trước của tôi thì chỉ cần một hoặc hai ngày, cùng lắm là một cuối tuần, là có thể chạy được. Nó dùng trình giả lập RetroArch và hỗ trợ cực nhiều emulator lẫn console
      https://github.com/Farama-Foundation/Gymnasium
      Cũng có một video YouTube rất hay của SethBling về machine learning với Super Mario World:
      https://www.youtube.com/watch?v=qv6UVOQ0F44
      Tôi khuyên bạn nên tự thử. Trong bầu không khí AI đang bị thổi quá nóng hiện nay, video game có cảm giác đang bị đánh giá hơi thấp, trong khi việc máy chơi game để học kỹ năng có rất nhiều tiềm năng. Khả năng chọn game hoặc tạo game mới để dạy một kỹ năng cụ thể cũng rất lớn. Dù vậy, đến mức đó thì có lẽ giao tiếp với máy bằng văn bản hoặc dữ liệu thuần túy, thay vì âm thanh và hình ảnh, sẽ hợp lý hơn
      Mặt khác, tôi từng xem video về mạng nơ-ron tích chập nhận từng pixel của hình ảnh làm đầu vào, nên tôi nghĩ việc học bằng dữ liệu âm thanh hoặc pixel của spectrogram cũng có thể cho kết quả tích cực. Cảnh game được chơi theo nhạc, hoặc như đang nhảy múa theo giai điệu, hòa âm và câu chuyện, chắc chắn sẽ rất thú vị
      Mọi thứ con người tạo ra trước hết đều từng tồn tại trong trí tưởng tượng của con người, và bạn cũng có một bộ não như thế. Theo đuổi hình dung trong tâm trí rồi kéo nó vào hiện thực vật lý là một điều đẹp đẽ, và có vẻ như là món quà dành cho toàn nhân loại
    • Crypt of the NecroDancer đã khai thác ý tưởng này bằng cách cho thưởng trong game nếu nhân vật di chuyển đúng theo nhịp
    • Có lẽ không hay lắm. Mario không có đủ nhịp điệu để gợi cảm giác âm nhạc mạnh đến vậy
      Âm thanh trong bản gốc bị buộc vào frame rate, nên về cơ bản chuyện này đã hơi xảy ra rồi. Các bản port PAL về sau chạy ở frame rate chậm hơn nên làm mất đặc tính đó
  • Gợi nhớ đến các video trực quan hóa đa nhịp trên YouTube. Ví dụ hay là LucidRhythms
    https://www.youtube.com/@LucidRhythms
    Có lẽ gần như không thể đảo ngược một bản nhạc đã có sẵn để khớp với trực quan hóa, nhưng sẽ thú vị nếu các thanh khác nhau đại diện cho các nốt khác nhau, và quả bóng tách ra khi gặp hợp âm

    • Có N cái paddle cũng sẽ hay. Để không trở nên quá dễ, có thể áp chi phí khi các paddle đến quá gần nhau, tối ưu xem mỗi paddle sẽ đảm nhận nốt hay phách nào, và cũng phạt các thay đổi cao độ quá đột ngột để mỗi paddle có thể chuyên vào một quãng âm nhất định
  • Thật sự rất đẹp. Tôi đã bị cuốn hút khi nhìn chuyển động của các paddle theo từng nhịp
    Có những thứ chỉ cần ngắm thôi cũng thấy mọi thứ khớp khít với nhau, và vì thế mà đẹp, và dự án này là một trường hợp như vậy

  • Có tiền lệ rồi: Eisenfunk - Pong (https://www.youtube.com/watch?v=cNAdtkSjSps)

    • Nhưng vẫn khá khác. Ví dụ đó có tiếng bíp phát ra với tốc độ cố định, nên video được đồng bộ thủ công theo BPM của bài nhạc
      Về cơ bản nó gần với một kiểu trực quan hóa được làm tay cho tiếng kick drum cách một nhịp hơn
      Trong khi đó, tác phẩm được gửi lên ở đây không đặt các nốt trên một nhịp 4/4 đơn giản, mà được “animate” tự động dựa trên tối ưu hóa ràng buộc. Vì vậy phần trực quan hóa cũng hấp dẫn hơn nhiều
  • Rất thích. Chỉ là nếu không đăng ký thì không thể gửi tim, nên tôi thấy nó hơi không hợp với mình

  • Về mặt kỹ thuật thì ổn, nhưng có nhiều đoạn paddle và bóng di chuyển gần như cùng tốc độ, khiến trông như paddle đang liên tục đẩy bóng đi
    Vì lý do này, có lẽ tốt hơn là không cho phép p[i] = 0. Nếu một d[i] lớn ngay trước một d[i+1] rất nhỏ thì có thể không tránh được, nhưng trong các trường hợp tránh được thì có vẻ nên né

    • Có thể thêm hình phạt tỷ lệ với d'[i] vào hàm mục tiêu
  • Nó khiến tôi tưởng tượng đến việc đặt một installation trong không gian của mình, dùng cùng với MT-80S và một màn hình
    Không biết liệu tôi có thể thật sự hiểu được phần timing này không. Tôi không quá giỏi mảng này nhưng thấy rất hứng thú
    https://www.matrixsynth.com/2014/07/roland-mt-80s-midi-playe...

  • Thật sự rất thú vị, nhưng kỳ lạ là não tôi lại cực kỳ ghét nó
    Có vẻ như nó chạm vào một kiểu mô hình nhân quả trong đầu tôi, nên tôi thấy khó xem. Lạ thật

    • Điều tôi thấy thiếu rõ nhất là cường độ. Đặc biệt trong các passage nhanh, khi có những “ghost note” chen giữa các âm to hơn nhiều, tôi có cảm giác như đang thiếu thứ gì đó
      Nhưng lạ là nó vẫn mang lại khoái cảm khi nhìn. Tôi cũng tự hỏi liệu việc từng chơi nhiều nhạc cụ có liên quan đến cảm giác này không. Với tôi, nó khá giống với những nhạc cụ như xylophone hay steelpan
    • Trông như bóng nảy từ giữa paddle chứ không phải từ mép của nó, nên cứ thấy sai sai. Có lẽ chúng ta đang nhìn cùng một vấn đề
  • Atari từng có một thiết bị trực quan hóa nhạc bằng video vào cuối thập niên 1970. Nó do một trong những nhà phát triển game Pong thiết kế, và là một trong những sản phẩm tiêu dùng đầu tiên, nếu không muốn nói là đầu tiên, thuộc loại này
    https://en.wikipedia.org/wiki/Atari_Video_Music
    Nếu bạn từng xem phim Over the Edge thì Claude và Johnny có một cái ở nhà