忘備ログ

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

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

こんにちは、スドウです。

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

【前回の記事】

sudo2501lab01.hatenablog.com

改良と言っても大きな変更はありません。
本当に地味な、
地味~~な変更です。

変更内容は下記です。
* ファイル選択後に自動再生するように変更
* 上記の変更に伴いスタートボタンの削除
* ファイル選択キャンセル時にファイル名の表示が消えないように変更
* ファイル名表示のフォントサイズを変更
* 再生/一時停止ボタンの表示修正

いつものように 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 = [("", "*")] # 全てのファイル
    #fType = [("", "*.wav *.mp3")] #.wav,.mp3のみ
    fType = [("", "*.wav")] #.wavのみ
       
   # ディレクトリ名を返す
    iDir = os.path.abspath(os.path.dirname(__file__))

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

    if (fPath != ""): # 絶対パスが空ではない
        
        # ファイル名のみ表示
        fName = os.path.basename(fPath)

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

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

        # ファイルを自動再生
        if (fPath != "") : # ファイル選択時
            music_play()
        else :             # ファイル未選択時
            pass
        
    else : # ファイルパスが空
        pass

# プログラム終了
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) 

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

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

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

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

    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,
                           font = ("",12), # フォントサイズ変更
                           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) # 終了ボタン
    
    # 再生/一時停止
    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 = 0) # 再生/一時停止ボタン 

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

    root.mainloop()

IDLEからプログラムを実行します。

ファイル ボタンから wavファイル を選択すると、
再生を開始します。
下図のようにファイル名の表示を大きくしました。
(今回は核P-MODELさんの回=回から「遮眼大師.wav」を使用しています。)

f:id:SUDO2501:20181221154819p:plain

※前回のはコレ(↓)です。比較するとわかりやすいかも?
(前回は核P-MODELさんの「ECHO-233.wav」を使用しました。)
(核P-MODEL好きだね。うん、大好き。)

f:id:SUDO2501:20181221154842p:plain

やーーーーっと音楽プレイヤーらしくなってきました、が。
これからは、今まで使用してきたPygame から
Pydub と言うライブラリへの移行を考えています。

理由は、ざっと調べた限り音声/映像の処理に特化しているため
もっといろいろなことができるのかなー、
と言うボンヤリしたものですが。。。(笑)

なので、次回からはPydubで開発している!
。。。かもしれません。
(Pydubの他にイイ感じのライブラリがあれば、使ってみようと思っています。)

また、気が向いたときにPygameも触ってみると思います。

ペースはかなり落ちると思いますが、
来年もブログの更新を続けていきたいです。

相変わらずグッダグダな内容ですが、これにて。

ではでは!

スポンサードリンク


回=回