pygameで音楽を再生する。
今回は、Pythonで音を鳴らすために"pygame"のライブラリをインストールした。しかし曲の音程が変わるという問題が発生したので、解決方法を書いておく。
環境
Python: 3.7.4
pygame: 1.9.6
mutagen: 1.44.0
最初に実行したコード
import pygame.mixer
import time
def main():
filename = "test.mp3" #曲のファイル名を指定する。(フルパスを指定したほうが良い)
pygame.mixer.init(frequency = 44100) #pygameの初期化
pygame.mixer.music.load(filename) #音楽ファイルを読み込む
pygame.mixer.music.play(1) #再生回数を指定
time.sleep(20) #20秒間動作を停止
pygame.mixer.music.stop() #再生の終了
pygame.mixer.quit() #pygameを終了
if __name__ == '__main__':
main()
音程が変わってしまう謎
これを実行すると曲が20秒間再生される。このとき再生するファイルによって音程、テンポが変わってしまう場合があった。何度も条件を変えたりして試行錯誤し、これの原因は__pygame.mixierの初期化__にあることが判明した。pygame.mixierを実行すると指定した__frequency(サンプリング周波数)__で初期化される。しかし曲のサンプリング周波数にあっていないと、正しく再生されない。そのため再生する曲に合わせて初期化する必要がある。また_time.sleep()_も曲の長さに合わせた方が好ましい。よって曲のデータを取得できる__mutagen__をインストールした。
次に実行したコード
import pygame.mixer
import time
from mutagen.mp3 import MP3 as mp3
# メイン
def main():
filename = "test.mp3" #曲のファイル名を指定する。(フルパスを指定したほうが良い)
pygame.mixer.init(frequency = mp3(filename).info.sample_rate) #曲のサンプリング周波数を取得しその値で初期化する。
pygame.mixer.music.load(filename) #ファイルの読み込み
mp3_length = mp3(filename).info.length #曲の長さを取得
pygame.mixer.music.play(1) #曲の再生回数
time.sleep(mp3_length + 1)
pygame.mixer.music.stop() #再生を停止
pygame.mixer.quit() #pygameの終了
if __name__ == '__main__':
main()
問題なく再生された
無事mp3を鳴らすことができるようになった。しかし、もっと簡単なやり方があってもいいと思うが...。
参考にさせてもらったサイト
【Python】PygameでBGMの再生
https://shizenkarasuzon.hatenablog.com/entry/2019/02/24/090652
PythonでMP3音源を再生する
https://qiita.com/kekeho/items/a0b93695d8a8ac6f1028
pygame.mixerモジュール説明
http://westplain.sakuraweb.com/translate/pygame/Mixer.cgi