0
0

More than 3 years have passed since last update.

pygame で音楽再生した時、音程が変わってしまう。

Posted at

pygameで音楽を再生する。

今回は、Pythonで音を鳴らすために"pygame"のライブラリをインストールした。しかし曲の音程が変わるという問題が発生したので、解決方法を書いておく。

環境

Python: 3.7.4
pygame: 1.9.6
mutagen: 1.44.0

最初に実行したコード

pygame_test.py
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をインストールした。

次に実行したコード

pygame_test2.py
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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0