見出し画像

PythonでMP3再生(早送り、巻き戻しとGetter、Setter)

でMP3再生のアプリを試していて、思ったこと。MyPlayerクラスのメソッドとして
再生中の曲の現在位置(開始何秒か・・)を取得するのが

    def get_curr_pos(self):
        return self.playback.curr_pos

でした。一方で、指定位置まで飛ぶseekという関数があるから、それを使ったら

    def set_pos(self,pos):
        self.playback.seek(pos)

のようなメソッドも書ける。
 それなら、二つをまとめたい。
 位置pos というプロパティを、読み出しに使ったときはget_curr_posが呼ばれ、書き込みにつかったときはset_pos が呼ばれるようにすると便利。
 たとえば、5秒早送りを

player.pos = player.pos + 5.0

といった感じで表現できると、直感的でうれしい。

 この辺をうまいことやってくれそうなGetter,Setterの扱いをCopilot先生に聞いてみました。

Copilot先生のサンプルコードでは、内部の変数として_valueを持っていますが、例えば再生位置posの値であれば、再生中刻々と変化するわけで、変数で持つ必要もない。ライブラリ中で次のように書けることでしょう。

class MyPlayer(CustomPlayer):

    @property
    def pos(self):
        return self.playback.curr_pos
    
    @pos.setter
    def pos(self, seekpos):
        self.playback.seek(seekpos)

これ使って5秒早送り、5秒巻き戻しを実装してみます。

class App(ctk.CTk):

    def __init__(self, title):  
 
        # 抜粋

        # 5秒早送り
        ctk.CTkButton(self, text="5秒送り", command=self.ffw).pack(
            padx=50, pady=10
        )

        # 5秒巻き戻し
        ctk.CTkButton(self, text="5秒戻し", command=self.rew).pack(
            padx=50, pady=10
        )

    def ffw(self):
        self.player.pos = self.player.pos + 5.0

    def rew(self):
        self.player.pos = self.player.pos - 5.0

実行テスト

思ったような動作になりました。

今回もテスト用のmp3ファイルには、「甘茶の音楽工房」様の「残業戦士」

という曲を使わせていただいています。

いいなと思ったら応援しよう!