mpdで音楽をスケジュール再生する

linuxが動作しているなら、やはり何かやってみたくなる。

手始めにスケジュール再生して目覚ましとして使いたい、と思うのは当然の流れだと思う。
cronを使えば簡単にできる。

オーディオ方面ユーザでlinux初めてと言う人には、
Voila, voilaさんの記事がよくまとまっていると思うので、そちらを参照していただくとして、ここではもう少し手の込んだことをしたいと思う。

#!/bin/bash
LANG=C
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
date


/usr/bin/mpc clear
/usr/bin/mpc volume 45
/usr/bin/mpc load "sleep"
/usr/bin/mpc play 1

sleep 1800
/usr/bin/mpc volume 30

上記のコードを軽く説明すると

  • プレイリストを空にする
  • 音量を45にする
  • プレイリスト sleepを読み込む
  • プレイリストsleepの1曲目から再生を始める
  • さらに1800秒後に30にする

という動作だ。

これをファイルに保存してcronで実行すると、お休みタイマーができるわけだ。
プレイリストを指定することで、利便性が上がる。
AndroidやPCのmpdクライアントソフトでプレイリストを手軽に編集できる。


自宅では、決まった時間に音楽を流してユーザの就寝を促している・・・がまあ寝ないよね。
次に紹介するのは、もう少し手が込んだスクリプト

#!/bin/bash
LANG=C
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
date


/usr/bin/mpc volume 0

/usr/bin/mpc clear
/usr/bin/mpc load "wakeup1"
/usr/bin/mpc play 1

for i in `seq 1 45`
do
 sleep 0.5
 /usr/bin/mpc volume ${i}
done

これは自宅のmpdに紫紺できる起床用のもの。

  • 音量を0に
  • プレイリストを空に
  • 起床用プレイリストをロード
  • 1曲目から再生
  • 0.5秒おきにボリュームを1ずつ、45まで上げる


やはり大音量でいきなり起こされたのでは堪らない、ということで、音量を少しずつ上げていくようにしている。

まあ、心地よくてなかなか起きられないけどね。


最後に紹介するのは、就寝用スクリプトの後に手動で再生したまま寝オチしてしまったりした場合でも、しっかり音を消しておきたいよね、という配慮の塊。
だけど、ユーザが明確な意図を持って再生しているときの事も考えてある。

#!/bin/bash
LANG=C

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin



date

now_vol=`/usr/bin/mpc volume|awk '{sub(/%/,""); print $2}'`
last_vol=`/usr/bin/mpc volume|awk '{sub(/%/,""); print $2}'`

for i in `seq 0 ${now_vol}|sort -nr`
do
 now_vol=`/usr/bin/mpc volume|awk '{sub(/%/,""); print $2}'`
 if [ ${now_vol} -eq ${last_vol} ];then
  /usr/bin/mpc volume ${i}
  last_vol=`/usr/bin/mpc volume|awk '{sub(/%/,""); print $2}'`
  sleep 5
 else
  echo "manual stop"
  exit 2
 fi
done

先ほどのより複雑だけど、

now_vol=`/usr/bin/mpc volume|awk '{sub(/%/,""); print $2}'`

というのは、現在のボリュームを変数に代入している。
もっとスマートな方法があると思うが、手っ取り早く取得できたのでこれを使っている。

  • 現在の音量を記録する
  • 音量を1下げる
  • 2秒待つ
  • スクリプトが指定した音量になっていない=ユーザがボリュームを変更した場合はスクリプトが停止する
  • そうでない場合は、上記をボリュームが0になるまで繰り返す

という動作だ。
つまり、ユーザが夜なべをしていて、音が下がってきたな、まだ作業しているのに。
とおもったらボリュームをちょいといじれば、それ以降スクリプトはボリュームを変更しなくなる、というものだ。

以上3つのスクリプトは我が家で動作しているスクリプトに一部手を入れて読みやすくしたものだ。
実際は、2度寝防止用にもう少し工夫しているが、仕組みは上記と同様だ。
スクリプトは個人で使う分には構わないし、もっと良い方法があればコメントを貰えると嬉しい。