mixer.pause

2025-05-31

機能

  • pygame.mixer.music.stop() とは異なり、pause() は音楽の再生位置をリセットしません。stop() は音楽を完全に停止させ、次に play() を呼び出すと最初から再生が始まります。
  • 一時停止された音楽は、pygame.mixer.music.unpause() を呼び出すことで、一時停止した時点から再生を再開できます。
  • この関数を呼び出すと、再生中の音楽がその時点の位置で一時停止します。音楽は停止するわけではなく、単に再生が中断されるだけです。

使用例

import pygame

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

screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Mixer Pause Example")

# 音楽ファイルのロード(例: 'your_music.mp3' を用意してください)
try:
    pygame.mixer.music.load('your_music.mp3')
except pygame.error as e:
    print(f"音楽ファイルをロードできませんでした: {e}")
    print("適切な音楽ファイル(例: your_music.mp3)をスクリプトと同じディレクトリに置いてください。")
    pygame.quit()
    exit()

# 音楽の再生
pygame.mixer.music.play(-1) # -1 はループ再生

running = True
paused = False
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                if not paused:
                    pygame.mixer.music.pause() # スペースキーで一時停止
                    print("音楽を一時停止しました。")
                    paused = True
                else:
                    pygame.mixer.music.unpause() # スペースキーで再開
                    print("音楽を再開しました。")
                    paused = False
            if event.key == pygame.K_s:
                pygame.mixer.music.stop() # 's' キーで停止
                print("音楽を停止しました。")
                paused = False # 停止したので一時停止状態ではない
            if event.key == pygame.K_p:
                pygame.mixer.music.play(-1) # 'p' キーで最初から再生(ループ)
                print("音楽を最初から再生しました。")
                paused = False

    screen.fill((0, 0, 0)) # 背景を黒で塗りつぶし
    pygame.display.flip()

pygame.quit()

解説

上記のコードでは、以下の挙動を確認できます。

  • 'p' キーを押すと、音楽が最初から再生されます。
  • 's' キーを押すと、音楽が完全に停止(pygame.mixer.music.stop())し、次に再生するには最初からになります。
  • 再度スペースキーを押すと、一時停止した時点から音楽が再開(pygame.mixer.music.unpause())します。
  • スペースキーを押すと、音楽が一時停止(pygame.mixer.music.pause())します。
  • your_music.mp3 という音楽ファイル(ご自身で用意してください)をロードして再生します。
  • pygame.mixer.music は一度に一つの音楽ファイルしか扱えません。複数の効果音などを同時に再生したい場合は、pygame.mixer.Sound オブジェクトを使用します。pause()pygame.mixer.Sound オブジェクトには直接適用されません。Sound オブジェクトの再生を一時停止したい場合は、Sound.play() が返す Channel オブジェクトの pause() メソッドを使用します。


エラー: pygame.error: mixer not initialized または pygame.mixer.music not initialized

原因
pygame.mixer.music.pause() を呼び出す前に、Pygameのミキサーモジュールが初期化されていない場合に発生します。

解決策
コードの早い段階で pygame.mixer.init() または pygame.init() を呼び出して、ミキサーモジュールを初期化してください。pygame.init() は全てのPygameモジュールを初期化するため、これを含めると通常は問題ありません。


import pygame

# 良い例: pygame.init() を呼び出す
pygame.init() # これでmixerモジュールも初期化される
# あるいは個別に pygame.mixer.init()

# ... (後で音楽のロードと再生)
# pygame.mixer.music.load('your_music.mp3')
# pygame.mixer.music.play()
# pygame.mixer.music.pause()

エラー: 音楽が一時停止しない、または反応がない

原因

  • イベント処理の問題
    pause() を呼び出すトリガーとなるイベント(キープレスなど)が正しく処理されていない。
  • 間違ったミキサーを使用している
    pygame.mixer.music はストリーミング音楽(BGMなど)用です。効果音(短いSEなど)は pygame.mixer.Sound オブジェクトで扱われ、それらの一時停止には別の方法(Channel.pause())を使用します。
  • 音楽ファイルがロードされていない
    pygame.mixer.music.load() で音楽ファイルが正常にロードされていない場合、play() を呼び出しても何も再生されません。
  • 音楽が再生されていない
    pause() は、pygame.mixer.music.play() で再生されている音楽に対してのみ有効です。そもそも音楽が再生されていなければ、一時停止するものは何もありません。

解決策

  • イベント処理をデバッグする
    print() 文を挿入して、キープレスなどのイベントが正しく検出され、pause() が実際に呼び出されているかを確認します。
  • 適切なミキサー関数を使用しているか確認する
    BGMなら pygame.mixer.music を、SEなら pygame.mixer.Sound を使用していることを確認してください。
  • 音楽ファイルのパスを確認する
    ファイルのパスが正しいか、ファイルが存在するか、アクセス権があるかを確認してください。ファイルのスペルミスもよくある原因です。
  • 音楽が再生されているか確認する
    pygame.mixer.music.get_busy() を使って、現在音楽が再生中かどうかを確認できます。


import pygame

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

screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Troubleshooting Pause")

try:
    pygame.mixer.music.load('your_music.mp3')
    print("音楽ファイルをロードしました。")
except pygame.error as e:
    print(f"エラー: 音楽ファイルのロードに失敗しました: {e}")
    # 音楽ファイルがない場合はプログラムを終了
    pygame.quit()
    exit()

# 音楽を再生
pygame.mixer.music.play(-1)
print("音楽を再生しました。")

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                if pygame.mixer.music.get_busy(): # 音楽が再生中か確認
                    pygame.mixer.music.pause()
                    print("スペースキーが押され、音楽を一時停止しました。")
                else:
                    print("音楽は再生されていませんでした。一時停止できません。")
            if event.key == pygame.K_u: # unpause
                pygame.mixer.music.unpause()
                print("Uキーが押され、音楽を再開しました。")

    screen.fill((0, 0, 0))
    pygame.display.flip()

pygame.quit()

エラー: pygame.mixer.music.pause() を呼び出した後、音楽が再開できない

原因

  • pygame.mixer.music 以外のものが一時停止されていると思っている
    例えば、pygame.mixer.Sound オブジェクトを pause() しようとしているが、それは music モジュールではない。
  • pause() の後に stop() を呼び出してしまった
    stop() は音楽を完全に停止させ、再生位置をリセットします。この場合、unpause() は効果がなく、play() を呼び出して最初から再生する必要があります。

解決策

  • pygame.mixer.music.get_pos() を使用して、現在の再生位置をチェックできます。一時停止している場合は、この値は更新されません。
  • pause() の後に stop() を呼び出していないか確認してください。一時停止と再開のロジックは、stop() とは別に扱うべきです。

特定のプラットフォームでの問題(例: LinuxでのALSAエラー)

原因
これは pause() 自体の問題というよりは、Pygameのミキサー初期化時の問題です。特定のオーディオドライバー(特にLinuxのALSAなど)が正しく設定されていない場合、ミキサーが初期化できなかったり、予期しない動作をしたりすることがあります。

解決策

  • ミキサーの初期化パラメータを調整する
    pygame.mixer.init(frequency=44100, size=-16, channels=2, buffer=512) のように、初期化時に周波数、ビットサイズ、チャンネル数、バッファサイズを明示的に指定することで解決することがあります。特に buffer サイズを調整すると、オーディオの途切れや遅延が改善される場合があります。
  • オーディオドライバーの確認
    OSのオーディオ設定やドライバーが正しくインストール・設定されているか確認します。
  • Pygameのバージョンを確認する
    最新の安定版Pygameを使用しているか確認します。


import pygame

# より具体的なミキサー初期化
pygame.mixer.init(frequency=44100, size=-16, channels=2, buffer=512)
pygame.init() # これも呼び出すことを推奨

# ...

複数の音源管理に関する混乱

原因
Pygameでは、BGM(pygame.mixer.music)と効果音(pygame.mixer.Sound)の管理方法が異なります。この違いを混同すると、期待通りの一時停止ができません。

解決策

  • 効果音
    pygame.mixer.Sound オブジェクトの play() メソッドが返す pygame.mixer.Channel オブジェクトを使用します。Channel オブジェクトには pause()unpause() メソッドがあります。
  • BGM
    pygame.mixer.music.pause()pygame.mixer.music.unpause() を使用します。
import pygame

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

screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Sound Pause Example")

try:
    sound_effect = pygame.mixer.Sound('your_sound.wav') # 効果音ファイル
    print("効果音ファイルをロードしました。")
except pygame.error as e:
    print(f"エラー: 効果音ファイルのロードに失敗しました: {e}")
    pygame.quit()
    exit()

channel = None # チャネルを保持する変数

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_p:
                if channel is None or not channel.get_busy():
                    channel = sound_effect.play() # 効果音を再生し、チャネルを取得
                    print("効果音を再生しました。")
                else:
                    channel.pause() # 再生中のチャネルを一時停止
                    print("効果音を一時停止しました。")
            if event.key == pygame.K_u:
                if channel is not None and channel.get_busy():
                    channel.unpause() # チャネルを再開
                    print("効果音を再開しました。")

    screen.fill((0, 0, 0))
    pygame.display.flip()

pygame.quit()


pygame.mixer.music.pause() は、主にゲームのBGM(背景音楽)を一時停止・再開する際に使われます。ここでは、基本的な使い方から、ポーズメニューでの応用例までを段階的に説明します。

例1: 基本的な一時停止と再開(スペースキーで切り替え)

この例では、音楽を再生し、スペースキーを押すたびに一時停止と再開を切り替えます。

import pygame
import os

# Pygameの初期化
pygame.init()

# ミキサーの初期化 (音楽再生には必須)
# frequency: サンプリング周波数 (通常44100Hz)
# size: サンプルビット数 (-16は16ビットステレオ)
# channels: チャンネル数 (2はステレオ)
# buffer: バッファサイズ (小さいほど遅延が少ないが、PC負荷が増える)
pygame.mixer.init(frequency=44100, size=-16, channels=2, buffer=512)

# 画面設定
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Mixer Pause Basic Example")

# 音楽ファイルのパス (スクリプトと同じディレクトリに 'background_music.mp3' を置いてください)
music_file = os.path.join(os.path.dirname(__file__), 'background_music.mp3')

# 音楽のロード
try:
    pygame.mixer.music.load(music_file)
    print(f"音楽ファイル '{music_file}' をロードしました。")
except pygame.error as e:
    print(f"エラー: 音楽ファイルのロードに失敗しました: {e}")
    print("適切な音楽ファイル (例: background_music.mp3) をスクリプトと同じディレクトリに置いてください。")
    pygame.quit()
    exit()

# 音楽の再生 (-1はループ再生)
pygame.mixer.music.play(-1)
print("音楽を再生しました (ループ再生)。")

# ゲームループのフラグ
running = True
music_paused = False # 音楽が一時停止中かどうかを管理するフラグ

# フォント設定(メッセージ表示用)
font = pygame.font.Font(None, 36)

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        
        # キーボードイベントの処理
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                if not music_paused:
                    # 音楽が再生中であれば一時停止
                    pygame.mixer.music.pause()
                    music_paused = True
                    print("音楽を一時停止しました。")
                else:
                    # 音楽が一時停止中であれば再開
                    pygame.mixer.music.unpause()
                    music_paused = False
                    print("音楽を再開しました。")
            
            if event.key == pygame.K_s: # 's' キーで完全に停止
                pygame.mixer.music.stop()
                music_paused = False # 停止したので一時停止状態ではない
                print("音楽を完全に停止しました。")
            
            if event.key == pygame.K_p: # 'p' キーで最初から再生(停止していた場合)
                if not pygame.mixer.music.get_busy(): # 再生中でない場合のみ
                    pygame.mixer.music.play(-1)
                    print("音楽を最初から再生しました。")
                    music_paused = False

    # 画面の描画
    screen.fill((0, 0, 0)) # 背景を黒で塗りつぶし

    # メッセージの表示
    if music_paused:
        text = font.render("Music PAUSED (Press SPACE to unpause)", True, (255, 255, 255))
    else:
        if pygame.mixer.music.get_busy():
            text = font.render("Music Playing (Press SPACE to pause)", True, (255, 255, 255))
        else:
            text = font.render("Music Stopped (Press P to play)", True, (255, 255, 255))
            
    text_rect = text.get_rect(center=(screen_width // 2, screen_height // 2))
    screen.blit(text, text_rect)

    pygame.display.flip()

# Pygameの終了処理
pygame.quit()
print("Pygameを終了しました。")

解説

  • pygame.mixer.music.get_busy(): 音楽が現在再生中かどうか(一時停止中は False になる)を返します。
  • pygame.mixer.music.stop(): 音楽を完全に停止し、再生位置をリセットします。
  • pygame.mixer.music.unpause(): 一時停止された音楽を、一時停止した位置から再開します。
  • pygame.mixer.music.pause(): 音楽を一時停止します。再生位置は保持されます。
  • music_paused フラグ: 音楽が現在一時停止状態であるかを追跡するために使用します。これにより、スペースキーを押したときに pause()unpause() を適切に切り替えることができます。
  • pygame.mixer.music.play(-1): 読み込んだ音楽をループ再生します。
  • pygame.mixer.music.load(): 音楽ファイルを読み込みます。

例2: ポーズメニューの実装と音楽の一時停止

ゲームでは、通常、ポーズメニューを開いたときにゲームのロジックだけでなく、音楽も一時停止します。

import pygame
import os

pygame.init()
pygame.mixer.init(frequency=44100, size=-16, channels=2, buffer=512)

screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Pause Menu Example with Music")

music_file = os.path.join(os.path.dirname(__file__), 'background_music.mp3')
try:
    pygame.mixer.music.load(music_file)
except pygame.error as e:
    print(f"エラー: 音楽ファイルのロードに失敗しました: {e}")
    pygame.quit()
    exit()

pygame.mixer.music.play(-1)

running = True
game_paused = False # ゲームが一時停止中かどうかを管理するフラグ

font = pygame.font.Font(None, 74)
small_font = pygame.font.Font(None, 36)

# ゲームの状態を描画するダミー関数
def draw_game_state(screen, time_elapsed):
    screen.fill((50, 150, 200)) # 青っぽい背景
    # 実際はここにキャラクターやオブジェクトを描画
    text = small_font.render(f"Time Elapsed: {time_elapsed:.1f}s", True, (255, 255, 255))
    screen.blit(text, (screen_width // 2 - text.get_width() // 2, 50))
    # 簡単なアニメーションの代わりに、時間経過で何か動いているように見せる
    pygame.draw.circle(screen, (255, 0, 0), (int(screen_width/2 + 100 * (time_elapsed % 2 - 1)), screen_height // 2), 30)

# ポーズメニューを描画する関数
def draw_pause_menu(screen):
    # 半透明のオーバーレイ
    overlay = pygame.Surface((screen_width, screen_height), pygame.SRCALPHA)
    overlay.fill((0, 0, 0, 180)) # 黒で半透明 (RGBA)
    screen.blit(overlay, (0, 0))

    pause_text = font.render("PAUSED", True, (255, 255, 255))
    resume_text = small_font.render("Press ESC to Resume", True, (255, 255, 255))
    
    screen.blit(pause_text, (screen_width // 2 - pause_text.get_width() // 2, screen_height // 2 - 50))
    screen.blit(resume_text, (screen_width // 2 - resume_text.get_width() // 2, screen_height // 2 + 50))

clock = pygame.time.Clock()
start_time = pygame.time.get_ticks() / 1000 # ゲーム開始からの時間 (秒)

while running:
    dt = clock.tick(60) / 1000 # デルタタイム (秒)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                game_paused = not game_paused # ポーズ状態を切り替える
                if game_paused:
                    pygame.mixer.music.pause() # ゲームがポーズされたら音楽も一時停止
                    print("ゲームを一時停止し、音楽も一時停止しました。")
                else:
                    pygame.mixer.music.unpause() # ゲームが再開されたら音楽も再開
                    print("ゲームを再開し、音楽も再開しました。")

    if not game_paused:
        # ゲームロジックの更新 (ポーズ中は更新しない)
        current_time = pygame.time.get_ticks() / 1000
        time_elapsed = current_time - start_time
        # ダミーのゲーム状態更新(例:キャラクター移動など)
        # ...
    else:
        # ポーズ中は時間の経過を停止させる
        pass

    # 描画
    if not game_paused:
        draw_game_state(screen, time_elapsed) # ゲームの状態を描画
    else:
        # ゲームがポーズ中の場合でも、最後に描画されたゲーム状態を表示し、その上にポーズメニューを重ねる
        draw_game_state(screen, time_elapsed) # ポーズ前のゲーム状態を描画
        draw_pause_menu(screen) # ポーズメニューを描画

    pygame.display.flip()

pygame.quit()
print("Pygameを終了しました。")

解説

  • else: のブロック(ゲームがアクティブなとき):
    • ゲームロジックを通常通り更新し、音楽も再生を続けます。
    • ポーズから解除されたときに pygame.mixer.music.unpause() を呼び出し、BGMを再開します。
  • if game_paused: のブロック:
    • ゲームがポーズされたときに pygame.mixer.music.pause() を呼び出し、BGMを一時停止します。
    • ゲームのロジック更新(例: time_elapsed の計算など)をスキップし、画面の動きを止めます。
    • draw_pause_menu() を呼び出して、ポーズ画面を表示します。
  • ESCAPE キー: これを押すと game_paused の状態が切り替わります。
  • game_paused フラグ: ゲーム全体のポーズ状態を管理します。

この例では、ゲームのポーズ状態と音楽の再生状態が密接に連動していることがわかります。

例3: pygame.mixer.Sound オブジェクトと Channel.pause()

pygame.mixer.music はBGM用ですが、短い効果音(SE)には pygame.mixer.Sound を使います。Sound オブジェクトには pause() メソッドが直接ありませんが、Sound.play() が返す Channel オブジェクトを通じて一時停止できます。

import pygame
import os

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

screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Sound Pause Example")

# 効果音ファイルのパス (スクリプトと同じディレクトリに 'hit_sound.wav' を置いてください)
# WAV形式が推奨されますが、一部のMP3も動作する場合があります。
sound_file = os.path.join(os.path.dirname(__file__), 'hit_sound.wav')

# 効果音のロード
try:
    hit_sound = pygame.mixer.Sound(sound_file)
    print(f"効果音ファイル '{sound_file}' をロードしました。")
except pygame.error as e:
    print(f"エラー: 効果音ファイルのロードに失敗しました: {e}")
    print("適切な効果音ファイル (例: hit_sound.wav) をスクリプトと同じディレクトリに置いてください。")
    pygame.quit()
    exit()

# 効果音を再生するチャネルを保持する変数
# None で初期化し、再生時にチャネルオブジェクトを代入します。
sound_channel = None 

running = True
font = pygame.font.Font(None, 36)

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_s: # 's' キーで効果音を再生/一時停止
                if sound_channel is None or not sound_channel.get_busy():
                    # 再生中でない場合、またはチャネルが未割り当ての場合
                    sound_channel = hit_sound.play() # 効果音を再生し、チャネルオブジェクトを取得
                    print("効果音を再生しました。")
                elif sound_channel.get_busy() and not sound_channel.get_paused():
                    # 再生中だが一時停止中でない場合
                    sound_channel.pause() # チャネルを一時停止
                    print("効果音を一時停止しました。")
                elif sound_channel.get_paused():
                    # 一時停止中の場合
                    sound_channel.unpause() # チャネルを再開
                    print("効果音を再開しました。")
            
            if event.key == pygame.K_x: # 'x' キーで効果音を停止
                if sound_channel is not None:
                    sound_channel.stop()
                    print("効果音を完全に停止しました。")
                    sound_channel = None # チャネルをリセット(オプション)

    screen.fill((0, 0, 0))

    # メッセージの表示
    message = "Press 'S' to Play/Pause/Unpause Sound"
    if sound_channel is not None and sound_channel.get_busy():
        if sound_channel.get_paused():
            message = "Sound PAUSED (Press 'S' to unpause)"
        else:
            message = "Sound Playing (Press 'S' to pause)"
    elif sound_channel is not None and not sound_channel.get_busy():
        message = "Sound Finished (Press 'S' to play again)"
    
    text = font.render(message, True, (255, 255, 255))
    text_rect = text.get_rect(center=(screen_width // 2, screen_height // 2))
    screen.blit(text, text_rect)

    pygame.display.flip()

pygame.quit()
print("Pygameを終了しました。")
  • sound_channel.get_paused(): そのチャネルが一時停止状態にあるかを返します。
  • sound_channel.get_busy(): そのチャネルが現在何かを再生しているか(一時停止中も含む)を返します。
  • sound_channel.unpause(): 一時停止された効果音を再開します。
  • sound_channel.pause(): この Channel オブジェクトに対して pause() を呼び出すことで、そのチャネルで再生中の効果音を一時停止できます。
  • sound_channel = hit_sound.play(): 効果音を再生すると、それを再生している Channel オブジェクトが返されます。
  • hit_sound = pygame.mixer.Sound('hit_sound.wav'): 効果音ファイルをロードします。


pygame.mixer.music.pause() は音楽の一時停止に直接使われる関数ですが、音楽の再生を「停止」させたり、「制御」したりする他の方法もあります。これらは pause() とは異なる挙動を示すため、用途に応じて使い分けることが重要です。

主な代替方法としては、以下の3つが挙げられます。

  1. pygame.mixer.music.stop()
  2. pygame.mixer.music.set_volume() を使った音量調整
  3. 再生中の音楽ファイルを切り替える

pygame.mixer.music.stop() を使用する

これは pause() の最も直接的な代替であり、かつ最も重要な違いを持つメソッドです。

  • pause() との比較
    • pause(): 再生位置を保持し、unpause() でその位置から再開できる。
    • stop(): 再生位置をリセットし、play() で最初から再開するしかない。
  • 用途
    • BGMを完全に終了させたい場合(例:ゲームオーバー画面への移行、ステージクリアなど)。
    • 別のBGMに切り替える前に、現在のBGMを確実に停止させたい場合。
  • 機能
    現在再生中の音楽を完全に停止します。pause() とは異なり、再生位置がリセットされます。次に pygame.mixer.music.play() を呼び出すと、音楽は最初から再生されます。

コード例

import pygame
import os

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

screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Stop Example")

music_file = os.path.join(os.path.dirname(__file__), 'background_music.mp3')
try:
    pygame.mixer.music.load(music_file)
except pygame.error as e:
    print(f"音楽ファイルのロードに失敗しました: {e}")
    pygame.quit()
    exit()

pygame.mixer.music.play(-1) # 音楽を再生

running = True
font = pygame.font.Font(None, 36)

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_s:
                pygame.mixer.music.stop() # 's' キーで音楽を完全に停止
                print("音楽を完全に停止しました。")
            if event.key == pygame.K_p:
                # 音楽が停止している場合のみ、最初から再生
                if not pygame.mixer.music.get_busy():
                    pygame.mixer.music.play(-1)
                    print("音楽を最初から再生しました。")

    screen.fill((0, 0, 0))
    if pygame.mixer.music.get_busy():
        text = font.render("Music Playing (Press 'S' to Stop)", True, (255, 255, 255))
    else:
        text = font.render("Music Stopped (Press 'P' to Play)", True, (255, 255, 255))
    text_rect = text.get_rect(center=(300, 200))
    screen.blit(text, text_rect)
    pygame.display.flip()

pygame.quit()

pygame.mixer.music.set_volume() を使った音量調整

これは直接的な「一時停止」ではありませんが、音楽をミュート(無音にする)ことで、一時停止のような効果を得られます。

  • pause() との比較
    • pause(): 音楽の再生を中断し、位置を保持する。
    • set_volume(0): 音楽は再生を続けるが、音量がゼロになるため聞こえない。再生位置は進んでいく。
  • 用途
    • ゲーム内のイベント(会話シーン、イベントCGなど)中にBGMをフェードアウトさせたい場合。
    • 一時的にBGMを小さくしたいが、後で元の音量に戻したい場合。
    • ポーズ中も音楽の再生位置を進めておきたい場合(あまり一般的ではありませんが、特定の演出で使われることがあります)。
  • 機能
    再生中の音楽の音量を0に設定することで、聞こえなくします。音楽は内部的には再生を続けており、再生位置も進んでいきます。

コード例

import pygame
import os

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

screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Volume Mute Example")

music_file = os.path.join(os.path.dirname(__file__), 'background_music.mp3')
try:
    pygame.mixer.music.load(music_file)
except pygame.error as e:
    print(f"音楽ファイルのロードに失敗しました: {e}")
    pygame.quit()
    exit()

pygame.mixer.music.play(-1)
current_volume = 1.0 # 現在の音量 (0.0から1.0)
pygame.mixer.music.set_volume(current_volume) # 初期音量を最大に設定

running = True
muted = False # ミュート状態かどうかを管理するフラグ
font = pygame.font.Font(None, 36)

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_m: # 'm' キーでミュート/ミュート解除を切り替え
                if not muted:
                    pygame.mixer.music.set_volume(0.0) # 音量を0にする
                    muted = True
                    print("音楽をミュートしました。")
                else:
                    pygame.mixer.music.set_volume(current_volume) # 元の音量に戻す
                    muted = False
                    print("音楽をミュート解除しました。")
            
            # 音量調整の例
            if event.key == pygame.K_UP:
                current_volume = min(1.0, current_volume + 0.1)
                pygame.mixer.music.set_volume(current_volume)
                print(f"音量を上げました: {current_volume:.1f}")
                muted = False # 音量を上げたのでミュート解除
            if event.key == pygame.K_DOWN:
                current_volume = max(0.0, current_volume - 0.1)
                pygame.mixer.music.set_volume(current_volume)
                print(f"音量を下げました: {current_volume:.1f}")
                if current_volume == 0.0:
                    muted = True

    screen.fill((0, 0, 0))
    if muted:
        text = font.render("Music Muted (Press 'M' to Unmute)", True, (255, 255, 255))
    else:
        text = font.render(f"Music Playing (Volume: {current_volume:.1f}) (Press 'M' to Mute)", True, (255, 255, 255))
    text_rect = text.get_rect(center=(300, 200))
    screen.blit(text, text_rect)
    pygame.display.flip()

pygame.quit()

再生中の音楽ファイルを切り替える

これは「一時停止」とは異なりますが、特定の状況下で音楽の再生を停止し、別の音楽に切り替えることで、BGMの流れを制御する一般的な方法です。

  • pause() との比較
    • pause() は同じ音楽の再生を中断・再開する。
    • 音楽ファイルの切り替えは、現在の音楽を捨てて、別の音楽を最初から再生する。
  • 用途
    • ステージの切り替わりでBGMを変更する場合。
    • ボス戦など、特定のイベントでBGMを変更する場合。
    • メインメニューとゲームプレイで異なるBGMを使用する場合。
  • 機能
    現在の音楽を停止し、新しい音楽ファイルをロードして再生します。
import pygame
import os

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

screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Music Switch Example")

# 複数の音楽ファイルを用意 (例: 'music1.mp3', 'music2.mp3')
music_files = [
    os.path.join(os.path.dirname(__file__), 'music1.mp3'),
    os.path.join(os.path.dirname(__file__), 'music2.mp3')
]

current_music_index = 0

def load_and_play_music(index):
    try:
        pygame.mixer.music.load(music_files[index])
        pygame.mixer.music.play(-1)
        print(f"音楽ファイル '{os.path.basename(music_files[index])}' を再生しました。")
    except pygame.error as e:
        print(f"エラー: 音楽ファイルのロードに失敗しました: {e}")
        print("適切な音楽ファイルがあるか確認してください。")

# 最初の音楽を再生
load_and_play_music(current_music_index)

running = True
font = pygame.font.Font(None, 36)

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_n: # 'n' キーで次の音楽に切り替え
                current_music_index = (current_music_index + 1) % len(music_files)
                load_and_play_music(current_music_index)

    screen.fill((0, 0, 0))
    text = font.render(f"Playing: {os.path.basename(music_files[current_music_index])} (Press 'N' for next)", True, (255, 255, 255))
    text_rect = text.get_rect(center=(300, 200))
    screen.blit(text, text_rect)
    pygame.display.flip()

pygame.quit()