【Pygame】音声ファイルを再生(mp3形式、wave形式)

Pygameを用いて音声ファイル(mp3形式、wave形式)を再生する方法について解説します。

Pygameで音声ファイルを扱う方法

Pygameには、音楽や効果音を扱うためのpygame.mixerモジュールが用意されています。

pygame.mixerモジュールの使い方

以下に、pygame.mixerモジュールのの基本的な操作手順を示します。

1. Pygameの初期化

Pygameをインポートし、pygame.mixerを初期化します。

import pygame

pygame.init()
pygame.mixer.init()

2. 音楽ファイルの読み込み

次に、再生したい音楽ファイルを読み込みます。以下はsample.mp3というファイルを例にします。

pygame.mixer.music.load("sample.mp3")

3. 音楽の再生

音楽を再生するには、pygame.mixer.music.play()を使用します。

pygame.mixer.music.play()

引数に-1を指定すると、無限ループで再生されます。

pygame.mixer.music.play(-1)

4. 音楽の停止

音楽を停止するには、pygame.mixer.music.stop()を使用します。

pygame.mixer.music.stop()

5. 音量の調整

音量を調整するには、pygame.mixer.music.set_volume()を使用します。音量は0.0から1.0の範囲で設定します。

pygame.mixer.music.set_volume(0.5)  # 音量を50%に設定

6. 一時停止と再開

音楽を一時停止するには、pygame.mixer.music.pause()を使用し、再開するにはpygame.mixer.music.unpause()を使用します。

pygame.mixer.music.pause()    # 一時停止
pygame.mixer.music.unpause()  # 再開

サンプルコード1

以下に、簡単な音楽再生プログラムを示します。


このプログラムを実行すると、sample.mp3が無限ループで再生され、「画面を閉じる」ボタンを押すか、Escキーを押すと終了します。
音楽ファイルのパスを適切に設定して試してみてください。なお、waveファイルを再生したい場合、waveファイルのパスを指定します。

サンプルコード2

次に、音楽の再生を操作できる簡単なGUIアプリをPygameで作成します。
以下のプログラムでは、音楽の再生、停止、一時停止、再開をボタンで操作します。


サンプルコード2の解説

上記サンプルコードの各部分について解説をします。

インポートと初期設定

import pygame
import sys
  • pygameをインポートします。
  • sysモジュールは、プログラムの終了時に使用するのでインポートします。

画面サイズと音声ファイルパスの設定

SCREEN_WIDTH = 400
SCREEN_HEIGHT = 300
MUSIC_FILE_PATH = "/Users/github/sample/python/pygame/tutorial/sample.mp3"
  • 画面の幅と高さを設定しています。
  • 再生する音楽ファイルのパスを指定しています。

ボタンの作成関数

def create_button(screen, text, x, y, width, height, color, action=None):
    font = pygame.font.Font(None, 36)
    button_rect = pygame.Rect(x, y, width, height)
    pygame.draw.rect(screen, color, button_rect)
    text_surf = font.render(text, True, (255, 255, 255))
    text_rect = text_surf.get_rect(center=button_rect.center)
    screen.blit(text_surf, text_rect)
    return button_rect
  • ボタンを作成し、画面に描画する関数です。
  • textはボタンに表示するテキスト、xyはボタンの位置、widthheightはボタンのサイズ、colorはボタンの色を指定します。
  • pygame.Rectでボタンの矩形を作成し、pygame.draw.rectでボタンを描画します。
  • font.renderでテキストを描画し、ボタンの中央に配置します。

メイン関数

def main():
    pygame.init()
    pygame.mixer.init()

    screen = pygame.display.set_mode((SCREEN_WIDTH , SCREEN_HEIGHT))
    pygame.display.set_caption("Music Player")

    pygame.mixer.music.load(MUSIC_FILE_PATH)
  • pygame.init()でPygameを初期化します。
  • pygame.mixer.init()でミキサーを初期化します。
  • pygame.display.set_mode()で画面サイズを設定し、ウィンドウを作成します。
  • pygame.display.set_caption()でウィンドウのタイトルを設定します。
  • pygame.mixer.music.load()で音楽ファイルを読み込みます。

メインループとイベント処理

    running = True
    while running:
        screen.fill((0, 0, 0))

        play_button = create_button(screen, "Play", 50, 200, 100, 50, (0, 180, 0))
        stop_button = create_button(screen, "Stop", 250, 200, 100, 50, (200, 0, 0))
        pause_button = create_button(screen, "Pause", 50, 100, 100, 50, (0, 0, 180))
        unpause_button = create_button(screen, "Unpause", 250, 100, 100, 50, (0, 0, 180))

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                if play_button.collidepoint(event.pos):
                    pygame.mixer.music.play(-1)
                if stop_button.collidepoint(event.pos):
                    pygame.mixer.music.stop()
                if pause_button.collidepoint(event.pos):
                    pygame.mixer.music.pause()
                if unpause_button.collidepoint(event.pos):
                    pygame.mixer.music.unpause()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    running = False

        pygame.display.flip()

    pygame.quit()
    sys.exit()
  • runningフラグがTrueの間、ループが続きます。
  • screen.fill((0, 0, 0))で画面を黒でクリアします。
  • create_button()関数で再生、停止、一時停止、再開の各ボタンを作成し、画面に描画します。
  • pygame.event.get()でイベントを取得し、各イベントに応じた処理を行います。
    • pygame.QUITイベントでループを終了します。
    • pygame.MOUSEBUTTONDOWNイベントでボタンがクリックされたかを判定し、対応する音楽操作を行います。
    • pygame.KEYDOWNイベントでEscキーが押されたかを判定し、ループを終了します。
  • pygame.display.flip()で画面を更新します。

プログラムの終了処理

    pygame.quit()
    sys.exit()
  • pygame.quit()でPygameを終了し、sys.exit()でプログラムを終了します。

関連ページ

Pygameの使い方については以下ページで解説しています。

【Pygame超入門】使い方とサンプルゲームを解説
Pythonモジュール「Pygame」で2Dゲームを簡単に制作する方法を入門者向けに解説します。

Python全般については以下ページで解説しています。

【Python超入門】使い方とサンプル集
Pythonの基礎文法から応用例まで入門者向けに解説します。

コメント