忘備ログ

失い続ける履歴 Pythonとか趣味とかいろいろ

Pythonで音楽を再生したい(4) pygame編


お久しぶりです、こんにちは。
スドウです。
ブログの更新が滞っていました、スイマセン。。。
(生きて。。。いました。。。)

Pygameを使った音楽プレイヤー(もどき)の作成記録です。
前回のソースから改良してみました。
(前回が100日以上前。。。)

【前回の記事】 sudo2501lab01.hatenablog.com

変更した内容は下記です。
* ファイル選択の追加
* 曲のタイトル表示追加
* 1つのウィンドウにまとめた
* 再生/一時停止ボタンを1つにまとめた
* 音量を0~10から0~100へとより細かく設定できるように変更

今回も前回と同様に wavファイル を再生します。
※ ソースと同じフォルダに wavファイル がなくてもOKです。

以下ソースです。

import os
import sys
import tkinter as tk
from tkinter import ttk
from tkinter import *
from tkinter.ttk import *
from tkinter import filedialog

import wave
import pygame.mixer as pymix

import time

button_act = 0 # 再生/一時停止用のグローバル変数

# ファイル選択処理
def fp_select():
    
    # ファイル拡張子の指定
    #fType = [("", "*.wav *.mp3")] #.wav,.mp3のみ
    fType = [("", "*.wav")] #.wavのみ
       
   # ディレクトリ名を返す
    iDir = os.path.abspath(os.path.dirname(__file__))

    # ファイル選択ダイアログ(選択ファイルの絶対パスを取得)
    fPath = filedialog.askopenfilename(filetype = fType, initialdir = iDir)

    # ファイル名のみ表示
    fName = os.path.basename(fPath)

    # ファイルパスor名前をセット
    file1.set(fPath) # 絶対パス
    file2.set(fName) # ファイル名のみ(曲名表示用)

    # 選択したファイルを開には絶対パスが必要


# プログラム終了
def push_exit():
    exit()

# 音楽再生
def music_play():

    # 再生中の音声を終了する
    pymix.quit()

    # 再生するファイルパスを取得
    sound_file = file1.get()

    # 初期設定
    pymix.init(frequency = 44100, size = -16, channels = 2, buffer = 4096)

    # 再生ファイルを設定
    sounds = pymix.Sound(sound_file) # Sound系

    # 再生回数(-1:無限ループ)
    sd_loop = -1

    # 音楽再生
    music_play = sounds.play( loops = sd_loop)# Sound系

    # 音量初期値
    music_play.set_volume(0.1) # Sound系

    # 音量調節
    def sound_vol(n):
        music_play.set_volume((float)(vol_scale.get()/100)) # 0.01刻みで0.00~1.00 

    vol_scale = tk.Scale(root,
                          orient = HORIZONTAL,
                          length = 400,
                          from_  = 0.0,
                          to     = 100.0,
                          resolution = 1.0 ,
                          command = sound_vol )
    
    vol_scale.set(10) # 音量スライダの初期値
    vol_scale.grid(row = 3, column = 1) # 音量スライダ
    

if __name__ == '__main__':
    
    root = Tk()
    root.title('Music Player by Pygame (Test)') # フレームタイトル(名前がひどい)
    #root.resizable(False, False)

    # ファイル名取得
    file1 = StringVar()  # フルパス取得(再生に必要)
    file2 = StringVar()  # 名前のみ取得(表示用)
    
    # ファイル名表示ラベルの作成
    name_label = ttk.Label(root,
                           textvariable = file2,
                           width = 50)
    name_label.grid(row = 1, column = 1) #ファイル名表示ラベル

    # ファイル選択用ボタン
    fp_select_btn = ttk.Button(root,
                               text = 'ファイル',
                               command = fp_select)
    fp_select_btn.grid(row = 0, column = 0) # ファイル選択用ボタン(左上)

    # 終了ボタン
    exit_btn = ttk.Button(root,
                          text = '終了',
                          command = push_exit)
    exit_btn.grid(row = 0, column = 1) # 終了ボタン

    # スタートボタン
    start_btn = ttk.Button(root,
                           text = 'Start',
                           command = music_play)
    start_btn.grid(row = 2, column = 0) # スタートボタン
    
    # 再生/一時停止
    def ply_stop():
        global button_act
        if(button_act == 0):
            pymix.pause() # 一時停止
            button_act = 1
            btn_text.set("一時停止")
        elif(button_act == 1):
            pymix.unpause() # 再開
            button_act = 0
            btn_text.set("再生")
            
    # 再生/一時停止ボタン
    btn_text = StringVar()
    btn_text.set("再生")
    play_button = ttk.Button(root,
                             textvariable = btn_text,
                             command = ply_stop)
    play_button.grid(row = 2, column = 1) # 再生/一時停止ボタン

    # 音量スライダ(ラベル)
    ttk.Label(root, text = '音量').grid(row = 3, column = 0)

    root.mainloop()

IDLEからプログラムを実行すると、下図のウィンドウが表示されます。

f:id:SUDO2501:20181218142259p:plain

ファイル ボタンから再生したい wavファイルダブルクリック開く ボタンをクリックします。
(通常のファイル選択と同じです。)

ファイルが選択されていると、下図のようにファイル名が表示されます。
(今回は核P-MODELさんの回=回から「ECHO-233.wav」を使用しています。)

f:id:SUDO2501:20181218142555p:plain

この状態でStart ボタンをクリックすると wavファイル が再生されます。
音量注意

終了する際は上図の 終了 ボタンをクリックすると
wavファイル の再生を停止しウィンドウも閉じます。
ウィンドウ右上の × ボタンでは wavファイル が停止しません。

ファイル選択機能を追加することで、好きな wavファイル を再生できるようになりました。
また、 再生/一時停止 機能を1つのボタンにまとめることで使いやすくなったと思います。
少しずつですが、音楽プレイヤーぽくなってきたと思います。

ただ、Pygameで再生できるファイルが wavogg なので
mp3 といった他の形式を生成するにはもう少し弄る必要があるのですが。。。

しばらくはPygameで作りこんでみようと思います。

また、Pygameの音声ファイルの操作はあくまでゲーム制作に付随した機能なので、
より高度な処理を実装しようとした場合、音声処理に特化したライブラリ への移行も考えています。

それとGUIのデザインも少しずつ変えていきたいですね。
メーカソフトまでいかなくても、せめてダサくないデザインにはしたいです。

ではでは。

スポンサードリンク


回=回