How to add Music Playlist in Pygame?

Pygame can handle audio, making it a great choice for creating and adding music playlists to our applications. Pygame is a Python library widely used for creating games and multimedia applications like music players. In this article, we will discuss steps to add a music playlist in Pygame and create a simple program that allows users to play and navigate through songs.

Pygame relies on the SDL library (Simple DirectMedia Layer) for audio processing. Therefore, to use pygame's audio features, we must have SDL installed on our systems. We can download the SDL library from the official website or through our system's package manager.

Prerequisites

Before creating a music playlist, ensure you have pygame installed ?

pip install pygame

Basic Music Playback

Let's start with loading and playing a single music file ?

import pygame
import sys

# Initialize pygame
pygame.init()

# Initialize the mixer
pygame.mixer.init()

# Load and play a music file
pygame.mixer.music.load("sample.mp3")  # Replace with your file
pygame.mixer.music.play()

# Keep the program running to hear the music
pygame.time.wait(5000)  # Wait for 5 seconds
pygame.quit()

Creating a Music Playlist

Now let's create a complete music player with playlist functionality ?

Algorithm

  • Step 1 ? Import pygame and initialize it

  • Step 2 ? Create a list of music files

  • Step 3 ? Load and play the current song

  • Step 4 ? Handle user input for navigation

  • Step 5 ? Update the current song index

Complete Music Playlist Example

import pygame
import sys
import os

class MusicPlayer:
    def __init__(self):
        pygame.init()
        pygame.mixer.init()
        
        # Screen setup
        self.screen = pygame.display.set_mode((640, 480))
        pygame.display.set_caption("Music Playlist Player")
        
        # Colors
        self.BLACK = (0, 0, 0)
        self.WHITE = (255, 255, 255)
        self.RED = (255, 0, 0)
        self.GREEN = (0, 255, 0)
        
        # Font setup
        self.font = pygame.font.SysFont("Arial", 24)
        self.small_font = pygame.font.SysFont("Arial", 18)
        
        # Music playlist - replace with your actual files
        self.music_files = [
            "song1.mp3",
            "song2.mp3", 
            "song3.mp3"
        ]
        
        self.current_song_index = 0
        self.is_playing = False
        self.is_paused = False
        
        # Button rectangles
        self.play_button = pygame.Rect(200, 300, 80, 40)
        self.pause_button = pygame.Rect(290, 300, 80, 40)
        self.next_button = pygame.Rect(380, 300, 80, 40)
        self.prev_button = pygame.Rect(120, 300, 80, 40)
        
        # Load first song
        self.load_current_song()
    
    def load_current_song(self):
        """Load the current song from the playlist"""
        try:
            current_file = self.music_files[self.current_song_index]
            if os.path.exists(current_file):
                pygame.mixer.music.load(current_file)
                return True
            else:
                print(f"File not found: {current_file}")
                return False
        except pygame.error as e:
            print(f"Error loading music: {e}")
            return False
    
    def play_music(self):
        """Play the current song"""
        if not self.is_playing:
            pygame.mixer.music.play()
            self.is_playing = True
            self.is_paused = False
    
    def pause_music(self):
        """Pause or unpause the music"""
        if self.is_playing:
            if self.is_paused:
                pygame.mixer.music.unpause()
                self.is_paused = False
            else:
                pygame.mixer.music.pause()
                self.is_paused = True
    
    def next_song(self):
        """Move to the next song in the playlist"""
        self.current_song_index = (self.current_song_index + 1) % len(self.music_files)
        self.load_current_song()
        if self.is_playing:
            self.play_music()
    
    def prev_song(self):
        """Move to the previous song in the playlist"""
        self.current_song_index = (self.current_song_index - 1) % len(self.music_files)
        self.load_current_song()
        if self.is_playing:
            self.play_music()
    
    def draw_buttons(self):
        """Draw control buttons"""
        # Draw buttons
        pygame.draw.rect(self.screen, self.GREEN, self.play_button)
        pygame.draw.rect(self.screen, self.RED, self.pause_button)
        pygame.draw.rect(self.screen, self.WHITE, self.next_button)
        pygame.draw.rect(self.screen, self.WHITE, self.prev_button)
        
        # Button labels
        play_text = self.font.render("Play", True, self.BLACK)
        pause_text = self.font.render("Pause", True, self.BLACK)
        next_text = self.font.render("Next", True, self.BLACK)
        prev_text = self.font.render("Prev", True, self.BLACK)
        
        # Center text on buttons
        self.screen.blit(play_text, (self.play_button.centerx - play_text.get_width()//2, 
                                   self.play_button.centery - play_text.get_height()//2))
        self.screen.blit(pause_text, (self.pause_button.centerx - pause_text.get_width()//2, 
                                    self.pause_button.centery - pause_text.get_height()//2))
        self.screen.blit(next_text, (self.next_button.centerx - next_text.get_width()//2, 
                                   self.next_button.centery - next_text.get_height()//2))
        self.screen.blit(prev_text, (self.prev_button.centerx - prev_text.get_width()//2, 
                                   self.prev_button.centery - prev_text.get_height()//2))
    
    def draw_info(self):
        """Draw current song information"""
        current_song = self.music_files[self.current_song_index]
        song_name = os.path.basename(current_song).replace('.mp3', '').replace('.wav', '')
        
        # Current song title
        title_text = self.font.render(f"Now Playing: {song_name}", True, self.WHITE)
        self.screen.blit(title_text, (320 - title_text.get_width()//2, 100))
        
        # Playlist info
        playlist_text = self.small_font.render(f"Song {self.current_song_index + 1} of {len(self.music_files)}", 
                                             True, self.WHITE)
        self.screen.blit(playlist_text, (320 - playlist_text.get_width()//2, 140))
        
        # Status
        status = "Playing" if (self.is_playing and not self.is_paused) else "Paused" if self.is_paused else "Stopped"
        status_text = self.small_font.render(f"Status: {status}", True, self.WHITE)
        self.screen.blit(status_text, (320 - status_text.get_width()//2, 170))
    
    def handle_events(self):
        """Handle pygame events"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return False
            
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                
                if self.play_button.collidepoint(mouse_pos):
                    self.play_music()
                elif self.pause_button.collidepoint(mouse_pos):
                    self.pause_music()
                elif self.next_button.collidepoint(mouse_pos):
                    self.next_song()
                elif self.prev_button.collidepoint(mouse_pos):
                    self.prev_song()
            
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    if self.is_playing:
                        self.pause_music()
                    else:
                        self.play_music()
                elif event.key == pygame.K_RIGHT:
                    self.next_song()
                elif event.key == pygame.K_LEFT:
                    self.prev_song()
        
        return True
    
    def run(self):
        """Main game loop"""
        clock = pygame.time.Clock()
        running = True
        
        while running:
            running = self.handle_events()
            
            # Check if music has finished playing
            if self.is_playing and not pygame.mixer.music.get_busy() and not self.is_paused:
                self.next_song()  # Auto-play next song
            
            # Draw everything
            self.screen.fill(self.BLACK)
            self.draw_buttons()
            self.draw_info()
            
            pygame.display.flip()
            clock.tick(60)
        
        pygame.quit()
        sys.exit()

# Create and run the music player
if __name__ == "__main__":
    player = MusicPlayer()
    player.run()

Key Features

  • Play/Pause Control ? Start and pause music playback

  • Next/Previous Navigation ? Move through the playlist

  • Auto-advance ? Automatically plays the next song when current finishes

  • Keyboard Controls ? Use spacebar to play/pause, arrow keys to navigate

  • Visual Interface ? Shows current song and playback status

Usage Instructions

To use this music player ?

  1. Replace the filenames in music_files list with your actual audio files

  2. Ensure your audio files are in the same directory as the script

  3. Run the program: python music_player.py

  4. Use mouse clicks or keyboard shortcuts to control playback

Supported Audio Formats

Pygame supports various audio formats including ?

  • MP3 ? Most common format

  • WAV ? Uncompressed audio

  • OGG ? Open-source format

  • FLAC ? Lossless compression (with proper codecs)

Conclusion

Pygame provides a simple interface for creating music playlists with features like play, pause, and navigation controls. This foundation can be extended with additional features like shuffle, volume control, or progress bars to create a full-featured music player.

Updated on: 2026-03-27T07:00:36+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements