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()