忘備ログ

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

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

スドウです。
前回のソースを少し改良してみました。

sudo2501lab01.hatenablog.com

追加機能は、「一時停止」「再開」ボタンと「音量スライダー」です。
ソースと同じフォルダに sound.wavを入れておきます。

以下ソースです。

import wave  
import pygame.mixer as pyx  

import tkinter as tk

def main():
    base = tk.Tk() # 再生制御
    base2 = tk.Tk() # 音量制御

    sound_file = "sound.wav"

    pyx.init(frequency = 44100, size = -16, channels = 2, buffer = 4096) # 初期設定
    sounds = pyx.Sound(sound_file) # 再生ファイルを設定
    
    sd_loop = -1 # 再生階数(-1:無限ループ)

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

    sound_time = sounds.get_length() # 再生時間取得(曲の長さ, 秒単位)
    print(sound_time)
    
    channel.set_volume(0.5) # 音量初期値

    sound_end = channel.get_endevent() # 再生終了時のイベント取得
    
    # 再生/一時停止
    def push1():
        print('一時停止')
        channel.pause() # 一時停止
    def push2():
        print('再開')
        channel.unpause() # 再開

    # 音量調節
    def sound_vol(n): 
        channel.set_volume((float)(scale2.get()))

    button1 = tk.Button(base, text = '一時停止' , command = push1).pack()
    button2 = tk.Button(base, text = '再開' , command = push2).pack()

    tk.Label(base2, text = '音量').pack()
    scale2 = tk.Scale(base2,  orient = 'h', from_ = 0.0, to = 1.0,
                      resolution = 0.1 ,command = sound_vol )
    scale2.set(0.5) # 音量スライダーの初期値
    scale2.pack()
  
    base.mainloop()

if __name__ == '__main__':
    main()

IDLEからプログラムを実行すると、sound.wavが再生されます。
音量注意

一応、音楽の一時停止・再開の機能は実装できました。   (ボタンの数は増えましたが。。。)
また、音楽の再生中に音量の変更ができるようになりました。    

ここまでたどり着くのに、かなりの時間を要しましたが、がんばりました(^^;)

ただ実のところ、追加したい機能が他にもいくつかありまして。。。   その内の1つが、現在の再生時間の表示です。

それで、時間表示ができるように変更してるのですが、 以下のソースを実行すると

import wave
import pygame.mixer as pyx
import time
import tkinter as tk

def main():
    base = tk.Tk() # 再生制御
    base2 = tk.Tk() # 音量制御

    sound_file = "sound.wav"
    pyx.init(frequency = 44100, size = -16, channels = 2, buffer = 4096) # 初期設定
    sounds = pyx.Sound(sound_file) # 再生ファイルを設定
    
    sd_loop = -1 # 再生階数(-1:無限ループ)

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

    sound_time = sounds.get_length() # 再生時間取得(曲の長さ, 秒単位)
    print(sound_time)
    
    channel.set_volume(0.5) # 音量初期値
    
    # 再生/一時停止
    def push1():
        print('一時停止')
        channel.pause() # 一時停止
    def push2():
        print('再開')
        channel.unpause() # 再開

    # 音量調節
    def sound_vol(n): 
        channel.set_volume((float)(scale2.get()))

    button1 = tk.Button(base, text = '一時停止' , command = push1).pack()
    button2 = tk.Button(base, text = '再開' , command = push2).pack()

    tk.Label(base2, text = '音量').pack()
    scale2 = tk.Scale(base2,  orient = 'h', from_ = 0.0, to = 1.0,
                      resolution = 0.1 ,command = sound_vol )
    scale2.set(0.5) # 音量スライダーの初期値
    scale2.pack()

    time_count = 0.0
    while pyx.get_busy(): # 音楽再生中のときwhile実行
        print(time_count)
        time.sleep(1)
        if(time_count < sound_time):
            time_count +=  1
        else :
            time_count = 0.0
        
    base.mainloop()
        

if __name__ == '__main__':
    main()

whileを使用し再生時間の表示はできました。が、
while以降の処理が実行されずにウィンドウが表示されません。
そのため、一時停止や音量変更の設定が一切できません。 どうしよう。。。  

Pythonを学習して日が浅い&オブジェクト指向がほとんどまったくわかっていないので、現状解決策がありません。

これからは、「オブジェクト指向とな何ぞや」という部分も含めてPythonの学習をゆっくり進めていこうかと考えています。

ブログが三日坊主にならなくてよかった

ではでは!  

スポンサードリンク

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

こんにちは、スドウです。
前回に引き続き、Python.wav形式の音楽ファイルを再生してみようと思います。

sudo2501lab01.hatenablog.com

今回は pygameライブラリを使用します。
pygame は外部ライブラリなので、予めインストールしておいてください。

以下にソースです。

def main():

    sound_file = "sound.wav" # 再生する.wavファイル

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

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

    channel = sounds.play(loops = -1) # 音楽再生(-1:無限ループ)

    sound_time = sounds.get_length() # 再生時間取得(曲の長さ, 秒単位)

    print(sound_time)
    
    volume = channel.get_volume() # 音量取得
    print(volume)
    channel.set_volume(0.5) # 音量変更

if __name__ == '__main__':  
    main()

IDLEからプログラムを実行すると、sound.wavが再生されます。
音量注意

ソース内のコメントで各機能に軽く触れていますが、簡単に説明します。

channel = sounds.play(loops = -1)で再生回数を設定します。
loops = 0の場合は1回のみ再生されます。
( loops = nの場合n+1回再生。-1の場合は無限ループ)

volume = channel.get_volume()で音量情報を取得します。
音量はデフォルトで最大(1.0)になっています。
次に、channel.set_volume(0.5)で音量を0.5に設定します。

pygameを使用して音楽再生ができました。
個人的には、前回使用したwinsoundよりも音量等の設定ができるのはうれしいですね。

pygame日本語サイト を見ると、一時停止・再開もできるみたいですね。
これからこういった機能も実装してみたいですね。

ではでは!

スポンサードリンク

Pythonで音楽を再生したい(1) winsound編

こんにちは、スドウです。
WindowsPCでPythonを使って音楽再生をしてみたいと思います。
再生する音源は.wavです。
(タイトルに(1)ってあるけど、どのくらい続くのかなぁ。。。)

今回は標準ライブラリの winsound wave を使用します。

以下、ソースコードです。
再生する音源はソースファイルと同じフォルダに入れておきます。

import wave  
import winsound as ws

   sound_name = 'sound.wav'  
   ws.PlaySound(sound_name , ws.SND_ALIAS)  
 # 指定した音声ファイルがある場合再生。ない場合はシステム音を再生(音量注意)

IDLEから実行すると音楽が再生されます。 が、かなり大きい音で再生されます。
(そのためPC本体の音量は3以下に設定しています)

思っていたよりカンタンにできてしまいました。
ただ現状では
1. 一時停止ができない(実行したら1曲フル再生)
2. 別の曲を再生するにはソースを変更する必要がある
3. 音量調節ができない(PC本体音量で調整)
などなど 「音楽再生」で見れば一応は目標達成ですが、 「音楽プレイヤー」として見るとイマイチどころか全然ですね。。。

ですので、今後は PyAudiopygame を使ってみようかな、と考えています。
(サンプルは見たけど難しそうだなぁ。。。)

はじめまして

はじめまして、スドウ2501です。
普段はC言語で組み込み系の開発をしています。

ブログをはじめたきっかけは、
最近話題のPythonを自分もやってみたい、
そのPythonを学習するうえでの技術的な振り返りのためにも
自身の考えをブログとして形に残そうと思ったからです。

そのため、Pythonに関する記事が大半を占めるかと思いますが、
趣味や日常の出来事も書いていけたらいいな、
と思っています。
(予定は未定ですが。。。)

技術的にも文章的にも拙い面が多々ありますが、
よろしくお願い致します。m(_ _)m

補足

pythonの開発環境