[Kivy] 音楽ファイルを操作する

Kivyでの音楽ファイルの操作について

 Kivyでは、音楽ファイルを操作するためのクラスが存在しており、そのクラスのイベントを使用することで、音楽ファイルの操作がおこなえます。音楽ファイルを操作するためのクラスは、デフォルトではインストールされていないので、追加でインストールする必要があります。

 今回は、音楽を扱うためのクラスのインストール方法と、kivyによる音楽ファイルの操作方法を紹介します

音楽ファイルの操作方法

前準備

 以下のコマンドを実行すると、kivyに必要なビデオ、オーディオについてのバックエンドをインストールします。

pip install kivy[media]

音楽ファイルを操作する方法

音楽ファイルの読み込み

 音楽ファイルの読み込みには、クラスkivy.core.audio.SoundLoaderのLosd()イベントを使用して以下のようにおこないます。

from kivy.core.audio import SoundLoader

        # Audioファイルの読み込み
        self.sound = SoundLoader.load('test.mp3')

音楽ファイルの再生

 音楽ファイルの再生はplay()によりおこないます。以下では、Playボタンが押された時に、①self.soundが定義されていることと②状態(self.sound.state)がstopであることを確認して、そうであったなら、再生位置をseek()により指定してから音楽ファイルを再生しています。

    # 再生ボタンの処理
    def on_play_press(self):
        if self.sound and self.sound.state == 'stop':
            self.sound.seek(self.time)
            self.sound.play()

音楽ファイルの停止

 音楽ファイルの停止はstop()によりおこないます。以下では、状態が’play’の場合に、get_pos()により再生位置を取得して、再生を停止しています。
 ※ 取得した再生位置は、音楽ファイルの再生時に使用します。

    # 停止ボタンの処理
    def on_stop_press(self):
        if self.sound.state == 'play':
            self.time = self.sound.get_pos()
            self.sound.stop()

音楽ファイルの再生位置を変更する

 音楽ファイルの再生位置の変更は、①変更後の再生位置を算出して、②その再生位置に移動したのち再をおこなうことで実現します。

 変更後の再生位置の算出は、get_pos()により取得した現在の再生位置に移動したい量を加えることでおこないます(単位:秒)。そして、計算した位置にseek()により移動して、play()により再生をおこなうことで再生位置への移動がおこなえます。

    # 巻き戻しボタンの処理(10秒戻る)
    def on_feedb_press(self):
        if self.sound.state == 'play':
            self.time = self.sound.get_pos() - 10
            self.sound.seek(self.time)
            self.sound.play()

音楽ファイルを操作するためのクラス

 Kivyで音楽ファイルを操作するのに使用するクラス(kivy.core.audio.Sound)の主なイベントやプロパティは以下のとおりです。

kivy.core.audio.Soundのイベント

イベント内容
Play() ファイルを再生する。
stop()ファイルの再生を停止する。
unload()メモリからファイルデータを解放する。  
seek(position)  指定したposition(秒で指示)に移動する。
ほとんどのサウンドプロバイダーは、オーディオが停止するとシークできない。再生中にシークする。
get_pos()オーディオファイルの現在の位置を返す。停止中は、0を返す。

kivy.core.audio.Soundのプロパティ

プロパティ内容
sourceオーディオファイルの名前StringProperty
既定値: None、読み取り専用
stateサウンドの状態(’stop’もしくは’play’)
OptionProperty
読み取り専用
loopサウンド終了時の対応
True: 自動的にループ
BooleanProperty
既定値: False
pitch音のピッチ(0.5 – 2)
SDL2 オーディオ プロバイダーに対してのみ実装
NumericProperty
既定値: 1
volume音量(範囲: 0-1)1が最大音量、0がミュート  NumericProperty
既定値: 1

サンプルプログラム

準備・実行方法 (Linuxの場合)

 ① 以下の2つのファイル(interface.kv, main.py)を同じフォルダに保存します。
 ② 再生したいmp3ファイル(ファイル名’test.mp3′)を①と同じフォルダに保存します。
 ③ ファイルを保存したディレクトリでターミナルを開き、以下のコマンドを実行します。

python main.py

内容

 プログラムを実行すると下図のようなウィンドウが表示されます。
  ・ ‘Play’ボタンを押すと指定したファイルが再生され、 ‘Stop’を押すと停止します。
  ・ 再度、’Play’ボタンを押すと、停止位置から再生が再開されます。
  ・ 再生中に’FB’を押すと10秒巻戻り、’FF’ボタンを押すと10秒早送りされます。

#:kivy 2.0


<AudioTest>:
    BoxLayout:
        size: root.size
        orientation: 'horizontal'
        padding: 20
        canvas.before:
            Color:
                rgba: 0.7, 0.7, 0.7, 1
            Rectangle:
                size: self.size
                pos: self.pos

        Button:
            id: play_button
            text: 'Play'
            on_press: root.on_play_press()

        Button:
            id: stop_button
            text: 'Stop'
            on_press: root.on_stop_press()

        Button:
            id: fb_button
            text: 'FB'
            on_press: root.on_feedb_press()

        Button:
            id: ff_button
            text: 'FF'
            on_press: root.on_feedf_press()
# -*- coding: utf-8 -*-

import os
import kivy

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.core.audio import SoundLoader
from kivy.core.window import Window

kivy.require('2.2.0')

# 画面サイズの指定
Window.size = (500, 150)

Builder.load_file(os.path.dirname(__file__) + "/interface.kv")


class AudioTest(Widget):

    def __init__(self, **kwargs):
        super(AudioTest, self).__init__(**kwargs)

        # Audioファイルの読み込み
        self.sound = SoundLoader.load('test.mp3')

        # 再生位置データ
        self.time = 0

    # 再生ボタンの処理
    def on_play_press(self):
        if self.sound and self.sound.state == 'stop':
            self.sound.seek(self.time)
            self.sound.play()

    # 停止ボタンの処理
    def on_stop_press(self):
        if self.sound.state == 'play':
            self.time = self.sound.get_pos()
            self.sound.stop()

    # 巻き戻しボタンの処理(10秒戻る)
    def on_feedb_press(self):
        if self.sound.state == 'play':
            self.time = self.sound.get_pos() - 10
            self.sound.seek(self.time)
            self.sound.play()

    # 早送りボタンの処理(10秒進む)
    def on_feedf_press(self):
        if self.sound.state == 'play':
            self.time = self.sound.get_pos() + 10
            self.sound.seek(self.time)
            self.sound.play()


class AudioTestApp(App):
    def __init__(self, **kwargs):
        super(AudioTestApp, self).__init__(**kwargs)
        self.title = 'Audio Test'

    def build(self):
        return AudioTest()


if __name__ == '__main__':
    app = AudioTestApp()
    app.run()
タイトルとURLをコピーしました