読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



BGMと効果音の再生

Pygame

効果音やBGMを鳴らす方法を紹介します。Pygameでは、効果音用にwavとogg、 BGM用にmp3とoggをサポートしています。midiも鳴りましたがループ再生しないなど問題があるようです。midiはiTunesなどでmp3に変換してから使った方がよさそうです。ただ鳴らすだけではつまらないので画像の移動と跳ね返り処理のスクリプトをもとに壁にあたったら音が鳴るようにしてみます。

効果音はザ・マッチメイカァズさん、MP3はTAM Music Factoryさんからお借りしました。

sound_test.zip
f:id:aidiary:20100605101151p:plain

サンプルスクリプト

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys
 
SCR_WIDTH,SCR_HEIGHT = 640,480
 
pygame.init()
screen = pygame.display.set_mode((SCR_WIDTH,SCR_HEIGHT))
pygame.display.set_caption(u"サウンドテスト")
 
# 画像をロード
img = pygame.image.load("python.png").convert_alpha()
img_rect = img.get_rect()
 
# サウンドをロード
hit_sound = pygame.mixer.Sound("hit.wav")
 
vx = vy = 300  # 1秒間の移動ピクセル
clock = pygame.time.Clock()
 
# BGMを再生
pygame.mixer.music.load("tam-n11.mp3")
pygame.mixer.music.play(-1)
 
while True:
    time_passed = clock.tick(60)
    time_passed_seconds = time_passed / 1000.0
 
    # 画像の移動
    img_rect.x += vx * time_passed_seconds
    img_rect.y += vy * time_passed_seconds
    
    # 壁にぶつかると跳ね返る
    if img_rect.left < 0 or img_rect.right > SCR_WIDTH:
        hit_sound.play()  # サウンドを再生
        vx = -vx
    if img_rect.top < 0 or img_rect.bottom > SCR_HEIGHT:
        hit_sound.play()  # サウンドを再生
        vy = -vy
    
    screen.fill((0,0,255))
    screen.blit(img, img_rect)
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT: sys.exit()
        if event.type == KEYDOWN and event.key == K_ESCAPE: sys.exit()

効果音のロードと再生

hit_sound = pygame.mixer.Sound("hit.wav")  # サウンドをロード
hit_sound.play()  # サウンドを再生

効果音はpygame.mixer.Soundにファイルを名を指定するだけで簡単にロードできます。戻り値はSound オブジェクトです。鳴らすときはSound.play()を使います。同時にいくつかの効果音を鳴らすこともできます。

BGMのロードと再生

pygame.mixer.music.load("tam-n11.mp3")  # BGMをロード
pygame.mixer.music.play(-1)  # BGMを再生

BGMはpygame.mixer.music.load()にファイル名を指定するだけで簡単にロードできます。こっちはサウンドと違って戻り値は返しません。BGMを鳴らすときはpygame.mixer.music.play()で鳴らします。引数に-1を指定するとループ再生します。

load()にmidiファイルを指定するとちゃんと再生されましたが、私の環境ではループ再生しませんでした。ドキュメントにもmidiをサポートしていると明示してないのでmp3かoggを使った方がよいかもしれません。midiをmp3に変換する方法ですが、iTunesなどでできます。midiファイルをiTunesで読み込んで、右クリック→選択項目をMP3に変換でできます。