崖っぷちの男

たぶん技術っぽいネタ。ブログ名が決められない

Time Out で休憩中に iTunes の曲をランダム再生

ゴールデンウィークで更新が滞ってますが久しぶりに書きます。


今回は前に以下の記事に書いた Time Out という Mac OS X 用の休憩をうながすソフトの話をします。具体的には休憩に入ったときに iTunes の曲をランダムに再生する方法を書きます。

無料のTime Out FreeやWorkraveで休憩タイム - hida_shunの日記

その前に、ネットラジオ「SMOOTH RIVIERA」を流してるとすんごい落ち着く!

いきなり脱線しますが、ゴールデンウィーク中はずっと家にいるので、その分、家の Mac 環境をよくしようと色々やっていました。ターミナルの色やフォントサイズをカスタマイズしてみたり。


その中で作業用 BGM も探していたのですが、いいのがありました。以下のページの iTunes マークを押すとファイルが落ちてくるので、それをダブルクリックすれば iTunes で再生されます。適当なプレイリストを作ってドラッグ&ドロッグしておけば次回再生するときに見つけやすいです。

Time Out で休憩中にできること

Time Out では休憩に入ったときに、音楽ファイルを再生できるということは前回書きました。これはこれでいいのですが、使っているとここらへんに不満を持つようになりました。

  • いつも同じ曲で飽きる
  • 休憩開始時の Mac の音量で再生されるので設定によってはうるさい


一方で、前回はちゃんと書かなかったのですが、Time Out は休憩の最初と最後に AppleScriptAutomator のフローを実行できます。実行するスクリプトのサンプルもあって、「iTunes の再生を開始する」「一時停止する」スクリプトがそれぞれ用意されているので、例えば休憩の間だけ iTunes で曲を再生する、というようなことができます。でも、これにも次の不満があります。

  • iTunes で休憩が始まる前に何かを再生していた場合、休憩の終わりにその再生が止まる


そこで、休憩中はランダムな曲を流し、終わったら休憩前に再生していた曲を再生し直すスクリプトを作成しました。休憩開始と終了用にそれぞれスクリプトを作って、セットで使用します。言語は AppleScript ですが、普段めったに書かないので変なとこはつっこんでください。

休憩開始時のスクリプト - 休憩前に曲を再生していたらその情報を記憶した後、ランダムな曲を再生

以下スクリプトですが、これを AppleScript エディタで以下に保存します。*1


/Users/ユーザ名/Library/Application Support/Dejal/Time Out Free/Run Scripts


その際にスクリプトで "Yasunori Mitsuda" となっているところにはランダムに曲を再生したいプレイリストの名前を入れます。あとは Time Out の設定で Micro か Normal を選び、「Run at start:」で保存したスクリプトを選択します。


他、補足事項として:

  • 再生音量を 0 から 100 で指定可。
  • iTunes が起動していない場合は実行されない。
  • プレイリスト名が間違っている場合も実行されない。

on run
# 休憩時にランダム再生するプレイリスト名
# ) ミュージック
set playlistName to "Yasunori Mitsuda"
# 再生時の音量 (0-100)
set playbackVolume to 35

tell application "Finder"
# iTunes が起動していない場合、何もしない
if not (process "iTunes" exists) then
return
end if
tell application "iTunes"
# プレイリストが存在しない場合、何もしない
if not (exists playlist playlistName) then
return
end if
set wasPlaying to false
# 曲を再生中の場合、曲情報を取得し、再生停止
if (exists current track) and (player state is playing) then
set wasPlaying to true
set currentPlaylistId to id of current playlist
set currentTrackId to id of current track
set currentPlayerPosition to player position
stop
end if
# 現在の音量を取得した上でランダム再生用の音量に変更
set currentVolume to output volume of (get volume settings)
set volume output volume playbackVolume
# 指定したプレイリストの曲をランダムに再生
set numOfTracks to number of tracks in playlist playlistName
set randomTrack to (random number (numOfTracks - 1)) + 1
play track randomTrack of user playlist playlistName
if wasPlaying is true then
# 終了時スクリプトに再生していた曲の情報を渡す
return {currentTrackId, currentVolume, currentPlaylistId, currentPlayerPosition}
end if
end tell
end tellend run

休憩終了時のスクリプト - 再生を停止し、以前に再生していた曲を再開

以下も同じように保存して、「Run at end:」で選択します。


ポイントは「Run even if the break is postponed or skipped」にチェックを入れておくことです。これがないと延長やスキップ時に休憩用の曲の再生が止まらなくなります。


on run arguments
# iTunes が起動していない場合何もしない
tell application "Finder"
if not (process "iTunes" exists) then
return
end if
end tell
tell application "iTunes"
# 曲を再生中の場合、再生停止
if (exists current track) and (player state is playing) then
stop
end if
# 引数が1以上の場合
if ((count of arguments) > 0) then
# 引数から再生していた曲の情報を取得
set realArguments to my theSplit(item 1 of arguments, ", ")
set currentTrackId to item 1 of realArguments
set currentVolume to item 2 of realArguments
set currentPlaylistId to item 3 of realArguments
set currentPlayerPosition to item 4 of realArguments
# 音量を元に戻す
set volume output volume currentVolume
# 再生していた曲をもう一度再生
play track id currentTrackId of user playlist id currentPlaylistId
set player position to currentPlayerPosition
end if
end tellend run

# split 関数# http://erikslab.com/2007/08/31/applescript-how-to-split-a-string/on theSplit(theString, theDelimiter)
-- save delimiters to restore old settings
set oldDelimiters to AppleScript's text item delimiters
-- set delimiters to delimiter to be used
set AppleScript's text item delimiters to theDelimiter
-- create the array
set theArray to every text item of theString
-- restore the old setting
set AppleScript's text item delimiters to oldDelimiters
-- return the result
return theArrayend theSplit


プログラム的に分かりにくいのは、開始時のスクリプトで return した値が終了時のスクリプトの実行時引数になるところです。これは Time Out がやってくれます。これを利用してスクリプトからスクリプトへと再生していた曲の情報を渡しています。ちなみに注意としては、この挙動をテストする場合は個々のスクリプトを実行するのではなく「Break」メニューの「Begin Micro Break」「Begin Normal Break」を使う必要があります。

自作スクリプトの感想

まず、悪いところ。

  • iTunes を利用しているので、Mac が重いときはなかなか再生が始まらない。15秒程度の休憩だと最後の方でやっと再生が始まったりする。


次に、いいところ。

  • 今はクロノ・トリガーやクロスの曲がランダムに流れるようにしているので、色んな場面を思い出したりできて休憩が楽しくなる。
  • 音量を固定しているので、いきなり大音量で曲が流れることがない。
  • 全体でシャッフルしたら、多分最近聞いてない曲とかも流れておもしろそう。15秒程度の休憩だとイントロクイズみたいになるけど。


という訳で今日はここまで。
生活にちょっとした変化が起きようとしている GW でした。

*1:AppleScript の シンタックスハイライトには [http://d.hatena.ne.jp/zariganitosh/20090223/1235459255:title] を使わせていただきました。感謝!