i-mode
Macintosh Page
ホームMacintoshOpenGLThinkPadJavaダイビング水中デジカメ


インデックス

Macintosh

Mac生活

リンク

AppleScript と iTunes

はじめに

iPod にMD等、他の録音可能な機器と同様の補償金を課金して音楽業界に還元しようという提案がされているようですが、全くもって時代遅れというか無駄な試みだと言 わざるを得ません。私は自分の持っている全ての CD を PowerBook に入れて出張中等も音楽を楽しんでいます。ならば全ての PC にも補償金を課金するべきなのでしょうか?音楽を聴く事ができる携帯は?多機能な携帯機器が次々と登場するこの時代にこの補償金制度が公平に対応する事はもはや不可能です。いっそ全て廃止にして音楽業界に自力の再生を促すべきではないでしょうか。

iPod を買ってから、私の音楽生活は一変しました。以前は古い CD はどこか棚の奥の方にしまい込まれたまま二度と聞かれる事は無く、本当に気に入った CD か新しい CD を繰り返し聞くばかりでした。それが今ではいつでも好きな時に好きな曲を聴く事ができます。音楽を聴く時間は以前に比べてはるかに増えました。ところがど うでしょう、新しい CD を購入する頻度は増えるどころか逆に減っていったのです。ライブラリに 1000 曲にも登るお気に入りの曲が入っているのにこれ以上新しい曲を買う必要があるのか、CD を買う前に考えるようになったからです。

CD の売り上げが減ったのはデジタル音楽プレイヤーの登場で音楽が違法にコピーされる機会が増えたからだという指摘がありますが、私はそうではないと思いま す。音楽の違法コピーは今に始まった事ではありません。遡ればカセットテープの時代から多くの人がやっていた事なのです。私は CD 売り上げの減少は私の様な以前は考えもせずに CD を買っていた人間がより慎重になった結果だと思うのです。

今ユーザーはかつてない程に多様な方法で音楽を楽しむ事ができ、実際に音楽を楽しむ人の人口、時間は増えているはずです。音楽業界がその恩恵にあや かれないのはひとえに斬新で魅力的な音楽を提供できていないためであり、さらにはその現実に業界が正面から取り組んでいないためなのです。

では私の様な人間が再び考えもせずに音楽を購入するようにするにはどうすればいいのでしょうか、答えは簡単です。

オンラインで、1クリックで買えるようにしなさい。

ところがどうでしょうか、Apple が提供しようとしている Apple Music Store に対して日本の音楽業界は一向に協力しようとしません。従来の販売方法に固執して時代の流れを全く見ない上、時代遅れの補償金制度を提案する日本の音楽業 界に必要なのは補償ではなくむしろ売り上げの減少によるリストラなのではないでしょうか。

今回はユーザーが所有する音楽の権利を最大限に活用できるよう、スクリプトを使ったデジタル音楽の新しい可能性を紹介したいと思います。

目的 - iTunes と歌詞検索

日本の楽曲がオンラインで購入できない事以外は便利で満足している iTunes ですが、まだできない事もあります。オンラインで CD のタイトル、アーティスト、そして曲名を検索して取り込めるのは素晴らしい機能ですが、歌詞を検索したり表示したりすることができません。折角取り込んだ CD を今度は永遠に棚の奥にしまい込めるはずが歌詞を見るために歌詞カードを引っ張り出さないといけないのでしょうか。私が望むのは次の様な機能です。

  1. オンラインでの歌詞検索、取込み
  2. 演奏中の曲の歌詞表示
  3. 時間に沿った歌詞表示

歌詞が検索できる Web サイトは日本にも海外にもあります。実際私もそれらのサイトを使って歌詞をテキストファイルに保存して必要に応じてみたりしていました。曲名とアーティス ト名は CDDB から取得できるのだからそれを元に歌詞を検索してダウンロードする事は技術的には難しく無いとは思います。

そこで調べてみた結果、iTunes のプラグインでそういった機能を提供しているものもある事が分かりました。そして同時に分かったのは MacOS と iTunes に搭載されている AppleScript によって同じ様な機能を自分で追加できるという事です。

AppleScript

ご存じでしょうか、Microsoft Windows 以外のあらゆるオペレーティングシステムには基本的にシステムの自働化を支援するスクリプト機能が提供されているものなのです。

バッチファイル?Are you kidding me!?

、、、音楽業界に続いて Windows までもが登場してしまうといつまでたっても本題にたどりつかないので止めておきます。とにかく AppleScript とは MacOS 標準のスクリプト言語でアプリケーションを自動で操作するための様々な命令が提供されているのです。

UNIX のシェルスクリプト等のコマンドラインベースのスクリプトと違って AppleScript が特徴的なのは GUI ベースの OS から発生しているため、GUI のアプリケーションを操作するコマンドが基本だと言う事です。また文法やデータ型があいまいだという点では BASIC に似ていますがより英語に近い、実に独特で面白い書式を持っています。

歌詞ファイルの管理と表示

歌詞の検索自体はとりあえず Web サイトで行う事にしてまず初めに歌詞のテキストファイルを適当な方法で管理して表示してみる事にしました。iTunes では音楽ファイルはアーティストとアルバム別のフォルダに分けられて保存されています。そこで歌詞ファイルは音楽ファイルと同じファイル名で拡張子だけを ".txt" に変えたテキストファイルとして同じフォルダに保存する事にしました。これから実際のスクリプトを見ながら解説していきます。以下のリンクからスクリプトをダウンロードして内容を見ていきましょう。

iTunes用スクリプト集(tar.gz ファイル)

ファイルをダウンロードし、解凍すると Scripts フォルダが現れ、中に "Show Lyrics.scpt" スクリプトが入っているのでそれを開いて下さい。スクリプトエディタが起動してソースが表示されます。iTunes でスクリプトを使うためにはホームフォルダの下の ライブラリ -> iTunes -> Scripts の下にスクリプトを置きます。すると iTunes のメニューにスクリプトのアイコンが追加され、その中に "Show Lyrics" メニューが現れます。

on replace(src, tgt, rpc) -- 文字列を置換する関数
set AppleScript's text item delimiters to tgt
set txtlist to text items of src
set AppleScript's text item delimiters to rpc
set ret to txtlist as string
return ret
end replace

AppleScript では何度も呼び出したい機能を関数として定義できます。今回のスクリプトでは拡張子を ".txt" に置換する必要があったため、上の様な関数を作りました。内容は元のテキスト(src)を置換したいテキスト(tgt)で分割して、再び繋ぎ合わせてテキ ストに戻す時に入れ替えたいテキスト(rpc)で繋ぎ合わせています。これは昔から一般的に使われている方法のようです。

ちなみに "文字列を置換する関数" の部分はコメントで実際には処理されません。コメントの開始は "--" で指示します。

try
tell application "iTunes"
activate
...
end tell
on error
...
end try

次にスクリプトの本体が来ます。AppleScript は C 言語や PASCAL 等と同様の階層構造を持つ事ができます。これはプログラムを論理的な単位に分割して書く事ができるので便利です。ここではエラー処理の範囲を決める "try" のブロック(節)が最初に来ています。try - end try までが一つの節で、try - on error までの間でエラーが起こった場合、処理は on error - end try の部分に移り、節の中の処理は終了します。

try 節の中には "tell" 節があります。tell - end tell までがその範囲です。tell は節の中で操作するアプリケーションを定義します。tell 節の中では指定されたアプリケーションに特有の命令やデータを扱う事ができます。この場合は iTunes を呼び出して activate 命令で起動しています。

try
set this_version to the version as string -- iTunes のバージョンを取得
if this_version is not greater than or equal to "2.0.3" then
display dialog "iTunes バージョン 2.0.3 以上が必要です。" buttons {"OK"}
return "version mismatch"
end if
on error
display dialog "iTunes のバージョンを確認できませんでした。" buttons {"OK"}
return "version error"
end try

次に iTunes のバージョンを確認します。ここでも try 節が出てきます。この場合この try 節の中で起こったエラーはこの節の on error で処理されます。階層構造では必ず内側の処理が優先されるのです。

try -- 演奏中のトラックを取得
set playing_track to the current track -- 演奏中のトラックを取得
set file_location to (the location of playing_track) -- 演奏中の曲のファイル名を取得
if player state is not playing then set file_location to "" -- 停止中の場合にファイル名をリセット
on error -- 演奏中のトラックを取得しようとしてエラーが起こった場合
set file_location to "" -- ファイル名をリセット
end try

次に iTunes から演奏中のトラックのファイルのファイル名を取得します。ここで変数と set 命令が出てきます。AppleScript では変数は特に型の定義等を行わなくてもどこでも自由に使いはじめる事ができます。最初の set 命令で値をセットした時の型が有効になるようです。ここでは playing_track という名前の変数に iTunes の演奏中のトラックを取得しています。set 命令は "set 変数名 to 値" と使います。"the current track" は iTunes 独特のデータで演奏中のトラックの事です。

次にトラックからファイルの場所を取得します。"the location of トラック" で取得できます。

次に曲が演奏中でも停止中の場合はファイル名をリセットしています。ここで if 文が登場します。"if 条件 then 処理" という構文です。iTunes が曲を実際に演奏しているか、それとも停止中かを調べるには "player state" という属性を調べます。player state が "playing" なら演奏中だと言う事が分かるのです。

if file_location is "" then -- ファイル名が空白の場合は選択された曲を取得
set selected_tracks to the selection of browser window 1 -- 選択された曲のリストを取得
if selected_tracks is {} then error "曲が選択されていません。" -- 選択された曲が無ければエラーで終了
set file_location to (the location of item 1 of selected_tracks) -- 選択された最初の曲のファイル名を取得
end if

ここまでで演奏中の曲が無かった場合は file_location は空白にリセットされています。その場合、今度は選択されている曲を取得します。if 文はここにあるように if 条件 then 処理 end if までの節として書く事もできます。

"the selection of browser window 1" で iTunes のメインウインドウで選択されているアイテムのリストを "selected_tracks" に取得します。これはリスト形式の変数になります。

リストが空の場合は何も選択されていない状態なのでエラーを発生させて終了します。空のリストは "{}" と表現されます。また "error 文字列" 命令で意図的にエラーを発生させて処理を on error に渡す事ができます。

リストが空でなかった場合はリストの最初のトラックのファイル名を file_location に取得します。リストの値は "item 番号 of リスト" で取得します。

set AppleScript's text item delimiters to ":" -- テキストを : で分割するように設定
set file_list to text items of (file_location as string) -- ファイルの完全パスをフォルダ名毎に分割
set file_name to (the item (the count of file_list) of file_list) -- ファイル名だけを取り出す

次にファイル名を取り出して拡張子を ".txt" に置換します。ここまでで file_location にはファイルの完全パス、つまり Macintosh HD から続くフォルダの階層全てを含む文字列が入っています。ここでそれをフォルダ名毎に分割してファイル名だけを取り出します。フォルダ名は ":" で区切られているので "AppleScript's text item delimiters" を ":" にセットしてから "text items of テキスト" でリストが取得できます。

リストの最後の item は "the item (the count of リスト) of リスト" で取り出せます。

set AppleScript's text item delimiters to "." -- テキストを . で分割するように設定
set text_list to text items of file_name -- ファイル名を本体と拡張子に分割
set file_suffix to (the item (the count of text_list) of text_list) -- ファイルの拡張子だけを取り出す。

次に同じようにしてファイル名から拡張子("mp3" 等)を取り出しています。

if file_suffix is "" then
text_filename to file_name & ".txt" -- 拡張子が無い場合は ".txt" を付けるだけ。
else
set text_filename to replace(file_name, "." & file_suffix, ".txt") -- 拡張子がある場合はそれを ".txt" で置き買える。
end if

ここでは拡張子がなかった場合とあった場合に場合分けしています。ない場合は ".txt" を追加し、ある場合は拡張子を "txt" で置き換えます。これで歌詞ファイルのファイル名が決まりました。

set (the item (the count of file_list) of file_list) to text_filename
set AppleScript's text item delimiters to ":"
set text_filename to file_list as string -- 歌詞ファイルの完全パスを構築する

次に先程曲ファイルを分割してできたリストのファイル名の部分だけをテキストファイルのファイル名で置き換え、再合成して歌詞ファイルの完全パスを作ります。これでファイルを開く準備が完了しました。

set text_file to (open for access file text_filename) -- 歌詞ファイルが無い場合は作成
close access text_file

歌詞ファイルが存在していない場合を考えて、ここで歌詞ファイルを作成します。"open for access file ファイル名" はデータアクセスのためにファイルをオープンする命令ですが、同時にファイルが存在しない場合は作成してくれます。次の行ですぐに close しているのでファイルがすでに存在していた場合も内容を壊す心配はありません。

tell application "Finder"
open file text_filename -- 歌詞ファイルをオープン
end tell

最後に Finder に命令を出してテキストファイルをオープンします。最初は TextEdit を使おうかと考えたのですが、ファイルをうまくオープンできなかったのと、ユーザーがテキストファイルと関連付けているアプリケーションで開くのが適当だ と考え、Finder にしました。

on error error_message number error_number -- エラー処理
if the error_number is not -128 then
tell application "iTunes"
beep
display dialog error_message buttons {"OK"} default button 1 -- エラーダイアログの表示
end tell
end if
end try

最後にエラー処理です。"display dialog" 命令でエラーダイアログを表示します。ダイアログのボタンの内容やデフォルトのボタンも上記のように指定できます。

おわりに

今回使ってみて、AppleScript は命令や書式が簡単で分かりやすい上に結果が目に見えてはっきり分かるのでプログラミング初心者でも楽しく簡単に学ぶ事ができるのではないかと思いまし た。ただオンライン/オフラインの文献が少ないのが難点かもしれません。リファレンスはスクリプトエディタの「ファイル」、「用語説明を開く」にありま す。アプリケーションで使える表現、コマンドを調べる時に使いましょう。

古くは「コンピュータを使う」というのは「プログラムを書く」、「スクリプトを書く」という事と必ずと言っていい程つながっていました。そこへ Windows が現れ、「プログラムは買え」、「Excel のマクロを書け」というふうにユーザを囲い込むようになっていったのです。あなたも「コンピュータに使われている」と感じてはいませんか?もしその感覚を 払拭したいのなら自らの手でコンピュータを管理し、プログラムやスクリプトを自ら書いていく以外に方法は無いのです。


コンテンツ: [ホーム] [Macintosh] [OpenGL] [ThinkPad] [Java] [ダイビング] [水中デジカメ]

このページについてのご質問はこちらへどうぞ。
このページに用いられている3Dのロゴやボタンは全てGLlogoによってレンダリングされたものです。
このページはリンクフリーです。
著作権等についてはこちらをどうぞ。