pygame-ce
pygame-ce copied to clipboard
``pygame.music.Music`` implementation
Hello everyone,
As discussed on discord and on #3058 , I want to introduce a new pygame object that will help users to manipulate their musics in a better way, and also in a more pythonic way. The goal of this issue to collect feedbacks on how it should be implemented before opening a PR for its implementation.
Implementation
pygame.Music is an alias of pygame.music.Music.
pygame.music should be an alias for pygame.mixer_music.
class Music:
def __init__(self, path):
self.metadata : dict
# or
self.title : str
self.album : str
self.artist : str
self.copyright : str
self.position : float # Settable / Gettable (set/get from where it should/is play(ing))
self.duration : float # Read-only (returned time is in seconds just like SDL Mixer 2.6.0 functions use)
self.playing : bool # Read-only (Could be pygame.mixer.music.is_playing(Music) ?)
self.fade_in : float # Gettable / Settable (the value is in seconds)
self.fade_out : float # Gettable / Settable (the value is in seconds)
self.paused : bool # Gettable / Settable
self.ended : bool # Read-only (True only if the position >= duration or music stopped)
# If one day it's doable to play multiple musics at the same time, we could have
self.volume : float # Gettable / Settable
# For each method below, their equivalent in pygame.mixer.music has the same behaviour
def play() -> None: ...
def rewind() -> None: ...
def stop() -> None: ...
# New module functions
pygame.mixer_music.get_music() -> pygame.Music | None # Returns the music loaded
path is not necessary a str but support all types that pygame supported before.
I don't like how pygame.mixer.music.set|get_endevent works, it's not something the user have to setup. This is why I propose a better way IMO, when Music.stop() or pygame.mixer.music.stop() is called, or when the music ended peacefully, a pygame.MUSICENDED is sent to the event queue. This event would have a single attribute, music which is the music object that ended.
I highly support the metadata attributes than an actual metadata dict attribute, imo it doesn't look cool to write. Btw, what about an attribute for the music format type (ogg, wav, mp3 ...) ?
Why the need of this feature ?
For many reasons :
- It helps pygame users to correctly configure their musics in a more pythonic way.
- It allows to queue a music with specific fade_in and fade_out, which wasn't possible with the old implementation.
- If in a future, one day, we can play multiple musics at the same time, the system would be more friendly.
- Fixes how
pygame.mixer.music.set_posworked on the old implementation, which was definitly wrong. Also bring a homogeneous measure system (before get_pos was returning the value in ms, and set_pos needed a value in seconds). - ~~So we can forget the cursed code we can see in
music.c~~
Updates
Music.is_playinggot renamed toMusic.playingMUSICENDEDevent could have astoppedattribute so the user can now if the music got brutally stopped by a hater or not.