Pythonで音楽プレイヤーを作ってみた話

はじめに

この記事はAdventCalender2016その2、11日目の記事になります。 今回はPythonを使ったTerminal上で動く音楽プレイヤーを作ってみたので、それについて話していきます。 超初心者が作ったので色々至らぬところがあると思いますが温かい目で見てくださると幸いです。

作ったきっかけ

僕が普段使っているノートPCはPanasonic製のLet's note CF-N8というものです。
このPCのCPUはcore2duoのメモリがDRR2の4GB(初期では2GB)という今となってはスペックが低いPCです…。
このPCで作業していて音楽が聞きたい時に音楽プレイヤーを開くとすごく重くなる…。 そこで自分で軽い音楽プレイヤーを作ってみようということで作ってみました。

実装したかった機能

この音楽プレイヤーを作るにあたって実装したかった機能は以下の点です。

  • Terminal上で動く
  • mp3が再生できる
  • 曲を選んで流す

まずはこの3つの機能だけを実装するように作りました。
なので連続再生とかループさせるなどといった機能は作ってないです。(まずは曲を再生したかったので)

ライブラリやモジュールの機能の確認

まず上記の機能を作るには

  • 音楽ファイルの読み込み
  • 音楽の再生

この2つの機能を実装しなければなりません。
この機能を実装するにはライブラリとかモジュールが必要ということが判明(そりゃそうだ)。 そこでgoogle大先生で検索してみると、pygameを使えば良いということが判明。
ほかにも色々でてきたのですが、とりあえず僕が調べてみた感じ一番情報量が多かったpygameを使うことに。

まず、使うためにはインストールしないといけません。僕は普段Xubuntu16.04LTSを使っているのでTerminal上からpygameをインストールします。
sudo apt-get install python-pygame
これでインストールができます(めっちゃ楽!)。

それでは実際にコードを書いていきましょう!...と言いたいところなんですが使い方がわからない...。
そこで以下のサイトを参考にまずは音楽を再生してみました。

nwpct1.hatenablog.com

とにかくmusic.loadのところでmp3の音楽ファイルを読み込んでmusic.playで再生してるのかなってことはわかりました。
じゃあこれを応用すれば使えそうなのでそれでいくことに。

しかし、ここでこのソースを見てとあることに気づいてしまいました。

「あれ?これってソースファイルと音楽ファイル同じ所に置かないと使えないんじゃね??」 「あと音楽ファイルってそれぞれ再生時間が違うんじゃない?」

そうなのです。これだと同じフォルダに音楽ファイルがいっぱいあるとか、途中までしか音楽が流れないとかいったことが起こりますね。
これは何か美しくない…。

では1つ目の問題から解決しようと思いました。
この問題はソースファイルのあるフォルダの中に、新しくMusic用のフォルダを作ってそのパスを通してあげれば解決できると判明。

というわけでフォルダを作ってそのフォルダのパスを通してあげることに。

パスをソースに直接書くのはまずいと思ったので別のファイルを作ってあげてそれをファイル読み込みで読み込ませることにしました。

次に2つ目の再生時間が違う問題はmutagenというモジュールを使えばmp3の再生時間を取得できるみたいです。 ではこれもちょちょいとインストールしてあげます。
pip install mutagen
これでインストールできます(これも簡単!)。

pipが入ってない場合は先にインストールしておく必要性がありますが僕の場合はすでにインストールしていたので問題なかったです。

これで上記の2つ問題を解決できました。
あとはこれらを元に実装するだけです。

実装

とりあえず完成させたソースファイルがこちらです。

#!/usr/bin/python
#!/coding:utf-8

# import
import os
import pygame
import time
import sys
from mutagen.mp3 import MP3

filepath = 'path.txt'
musicdir = 'Music'

# path
if os.path.exists(filepath):
    print "Path file [OK]"
else :
    print "Path file [NO]"
    print "Please make a path.txt file"
    print "Please write absolute path to music in the path.txt"
    exit()

if os.path.exists(filepath):
    print "Music directory [OK]"
else :
    print "Music directory [NO]"
    print "Please make a `Music` directory"
    exit()

path = open('path.txt', 'r')

for musicpath in path:
    print "Music file path =",
    print musicpath

path.close()

musicpath = musicpath.rstrip("\n")

# start
print "-- pyMusic-CUI --"
print "*** MUSIC LIST***"
print ""

# file list
files = os.listdir(musicpath)

for file in files:
    print file

print ""
print "music select"
print "=>",

## select music
select = raw_input()
selectmusic = musicpath + select

audio = MP3(selectmusic)

pygame.mixer.init()
pygame.mixer.music.load(selectmusic)
pygame.mixer.music.play(1)

print "---"+select+"---"
print ""
print "音量:%s" %pygame.mixer.music.get_volume()

time.sleep(audio.info.length)
pygame.mixer.music.stop()
print "終了"

クラスわけや関数などを使っていないのですごく長く見難いソースファイルになってしまいましたが、とりあえず実装はできました。 最初にファイルやフォルダがあるかを確認し、path.txtからパスの情報を読み取りMusicフォルダから音楽ファイルをリストとして表示する。 そして音楽ファイルを選択してそのファイルを再生する。といった流れのプログラムになりました。
あと英語が全くできないので文法がおかしいとかはスルーしておいてください(笑)。

これから行っていきたいこと

  • クラス分け、関数の利用
  • 音楽ファイルの選択を番号で指定できるようにする
  • ループ再生やランダム再生の機能も実装する

今回はとりあえず実装を目標にやってきたので省いてきた以上のことをまず次の目標にしていきたいと思ってます。

まとめ

とりあえずこれで作業中でも音楽が聞けるので作業が捗るはずです(そこ!音楽プレイヤーを使えとか言うな!!)。
今回の開発でPythonのいい勉強にもなったので自分のこれからのアプリ開発のモチベーションにしていきたいと思います。 またこれからもPythonを使ったアプリケーションを作ってみたいです。