いつの間にか今年のカレンダーも最後の一枚になり、街中はクリスマスセール一色で、スーパーの鮮魚コーナーの片隅に「数の子」が出てくる季節になりました。
昨年の晩秋から始めたPlamo Linuxの64ビット化の作業も最終段階に近づき、最近は夜な夜なインストールテストやデバッグ作業にいそしんでいます。そのような作業では、しばしば待ち時間や検討時間が生じ、そのような無聊な時間を慰めてくれるのが心地よいBGMです。本来の仕事を中断して、仕事中のBGMを効率よく扱う方法を探すという、本末転倒の作業が始まりました(苦笑) 。
メディアプレイヤーのCDDB対応状況
前回紹介したように、KDEデフォルトのCDプレイヤーであるKsCDは、MusicBrainz のみに対応していて、より多くのタイトル情報を保持しているFreeDB には未対応でした。
それでは他のメディアプレイヤーではどうだろう、と考えて、Plamo Linuxに含まれているメディアプレイヤーをあれこれ試してみました。
Rhythmbox
Rhythmbox はGStreamerフレームワークを利用した音楽プレイヤーで、GNOME環境のデフォルトの音楽プレイヤーになっています。
Rhythmboxは、KsCD同様、 MusicBrainzのみの対応 で、FreeDBのみに存在しているタイトル情報は利用できませんでした。
xine
xine は多数のコーデックに対応しているマルチメディアフレームで、CDを再生する機能も持っています。
xineでは実際の処理を行うxine-libと、それを用いたGUI部(xine-ui)が独立に開発されています。xine-lib側を見ると、CDDBとしてFreeDBのみに対応 し、日本語タイトル等のUTF-8形式で送られてくるタイトル情報も正しく処理でき、視覚効果表示ウィンドウのタイトルバーには正しく日本語タイトルも表示されます。
一方、xine-ui側では日本語フォントが正しく扱えない ため、プレイリスト等には日本語タイトルが表示できないようです。
図1 xineではプレイリストで日本語タイトルが表示できない
mplayer
mplayer はxine同様、Linuxで古くから使われてきたメディアプレイヤーで、さまざまなコーデックに対応していることに定評があります。
mplayerにもCD再生機能が用意されており、cddb:// を引数に起動する とFreeDBに接続してタイトル情報を入手、表示してくれました。
$ mplayer cddb://
MPlayer SVN-r34178-snapshot-4.5.3 (C) 2000-2011 MPlayer Team
cddb:// を再生中
Found audio CD with 9 tracks.
================ CD INFO === start =========
artist=[遊佐未森]
album=[檸檬]
genre=[J-pop]
nb_tracks=9
length= 31:58.15
# 1 4:14.31 @ 150 [青空]
# 2 2:02.38 @ 19230 [月がとっても青いから]
# 3 3:42.16 @ 28417 [南の花嫁さん]
...
一方、mplayerもxine同様にGUIを用いたユーザインターフェース部は別プロジェクトとして開発されており、デフォルトのGUIであるgmplayer も、QtベースのGUIであるsmplayer も、mplayerがFreeDBから入手してきたタイトル情報を引き継ぐことはできず、プレイリストにはタイトル情報が表示できませんでした。
vlc
vlc はxineやmplayerよりも新しい世代のメディアプレイヤーで、メディアプレイヤーとしての使いやすさを重視した作りになっています。
vlcのCD再生機能は、CDDBとしてFreeDBに問い合わせを行いますが、FreeDBからの返答の中に英数字以外の文字があるとエラーと見なして処理を打ち切る ようで、タイトル情報が英数字のみのCDではプレイリストにタイトルが表示されますが、日本語を含んだCDではトラック情報を受けとることができませんでした。
Amarok
Amarok はKDE環境を前提とした音楽プレイヤーで、動画再生機能は持たないものの、タイトルから歌詞を探してきたり、アーティスト名をWikipediaで調べた結果を表示したりと、楽曲再生に特化した作りになっています。
AmarokはKDEのCDDB機能を使っていることもあり、MusicBrainzとFreeDBの双方に対応しているものの、FreeDBから送られてくる日本語タイトルはタイトル中の日本語の部分が全て「????」になってしまいました。
図2 Amarokでは日本語タイトルが文字化けする
これは日本語localeがらみの問題かも、と思って、localeの設定をあれこれ変えてみても変化なく、少しソースコードを追いかけてみたところ、KDEのライブラリを使ってFreeDBからデータを入手した時点ですでに返答のUTF-8形式のデータが壊れているようでした。
このように、手元にあるメディアプレイヤーをざっと試してみたところ、いずれも音楽CDの日本語タイトルを表示する機能は不十分でした。少しデバッグしてやれば何とかなりそうなものもありますが、そういう作業に手を出すと「秋の夜長の作業用BGM」という本来の目的からますます脱線していくことになりそうなので、別の方向を考えることにしました。
FreeDBのアクセス方法
少し余談になりますが、これらメディアプレイヤーがどのようにしてFreeDBからCDのタイトル情報を入手しているかについて簡単に紹介してみましょう。
前回紹介したように、FreeDBを利用するためにはCDに収められた各トラックの位置情報から計算されるdisc-id が必要となります。
このdisc-idは、CDのトラック数と各トラックのフレーム単位での開始位置、CD全体の収録時間といった情報から生成され、cd-discid というコマンドで表示可能です。
$ cd-discid
71077e09 9 150 19230 28417 45082 59935 80807 93210 106715 128737 1920
この数字のうち、最初の"71077e09"がこのCDのdisc-id 、次の"9"がCDに含まれるトラック数 、その次の"150","19230","28417"..がフレーム単位での各トラックの開始位置 で、最後の"1920"が秒単位での全体の収録時間 となります。
このデータを元にFreeDBのデータベースに問い合わせるわけですが、そのためにはlibcddb パッケージに含まれているcddb_queryというコマンドが便利です。
$ cddb_query query 1920 9 150 19230 28417 45082 59935 80807 93210 106715 128737
Number of matches: 1
Match 1
category: misc (3) 71077e09
FreeDBに問い合わせた結果、該当するCDが1件見つかり、そのカテゴリー(misc) とdisc-id(71077e09) が得られました。次にこのデータを元にタイトル情報を検索します。
$ cddb_query -e euc-jp read misc 71077e09
Artist: 遊佐未森
Title: 檸檬
Ext.data: YEAR: 2002
Genre: J-pop
Year: 2002
Length: 32:00 (1920 seconds)
9 tracks
[01] '青空' by 遊佐未森 (4:14)
[02] '月がとっても青いから' by 遊佐未森 (2:02)
[03] '南の花嫁さん' by 遊佐未森 (3:42)
[04] 'アラビアの唄' by 遊佐未森 (3:18)
....
cd-infoコマンドだけでもdisc-idを表示するように、disc-id自身は音楽CDさえあれば計算できます。しかし、前回も紹介したように、FreeDBが採用している8桁のdisc-idでは世界中に存在するCDを一意に識別することができないため、FreeDBの検索時にはカテゴリー情報も必要とされています。
たとえば、今回試した"71077e09"というdisc-idの場合、"rock"のカテゴリーを指定して検索すればRandy Sheep Ranchの"Ready To Rodeo"というCDが登録されていました。
$cddb_query -e euc-jp read rock 71077e09
Artist: Randy Sheep Ranch
Title: Ready To Rodeo
Genre: Punk
Year: 2007
Length: 32:00 (1920 seconds)
9 tracks
[01] 'Alone in the desert' by Randy Sheep Ranch (3:03)
[02] 'Shadows' by Randy Sheep Ranch (3:10)
[03] 'Out of millions' by Randy Sheep Ranch (3:55)
...
FreeDBには、音楽のカテゴリーとして"data, folk, jazz, misc, rock, country, blues, newage, reggae, classical, and soundtrack"の11種類が用意されているそうですが、どのカテゴリーに登録するかはデータを登録する人の主観的な判断になるため、同じCDが複数のカテゴリーに重複して登録されている例も見られます。FreeDBのそのような雑然さを嫌う開発者は、登録データは少なくても品質の高いMusicBrainzのみを利用しているのでしょう。
CDリッパー
上述のように、ざっと手元のメディアプレイヤーを試した限りでは、FreeDBから日本語のタイトル情報を正しく入手、表示してくれるCDプレイヤーは見当りませんでした。
BGM的に使うのが目的なのでタイトル表示はなくても構わないと言えば構わないものの、本来使えるべき機能が使えないのは気にいらないし、CDだと曲が終われば交換しないといけないのも面倒なので、久しぶりにCDのリッピング をしてみることにしました。
前回も触れたように、音楽CDのデータはCD-DAと呼ばれる形式で記録されているため、PCから直接操作するのは不便です。一方、CDに記録されている楽曲データはPCM形式になっており、ヘッダ情報等を付加してやればPC上で広く利用されているWAV形式になります。
そこで、音楽CD上のCD-DAで記録されている楽曲データを読み取って、WAV形式に変換してHDD上に保存するソフトウェアが開発されました。そのようなソフトウェアはCDリッパー (ripper)と呼ばれ、音楽CDからそれぞれの楽曲データを取り出すことを「リッピング」と呼びます。
CDドライブがSCSIアダプタ経由で接続されていたころは、CD-DAから楽曲データを読みだすための標準規格が存在せず、CDドライブのメーカごとに操作コマンドが異なっていました。そのころはCDリッパーが対応しているドライブを入手することがリッピングの第一歩でした。その後、CDドライブがATAPIとしてIDE(ATA)バスに接続されるようになると、CD-DAの読み出し方法もATAPIの規格として統一され、最近のCDドライブではメーカを問わずリッピングできるようになっています。
Linux上で使えるCDリッパーは多数存在しています。最近はKDE環境を中心に使っているのでKDEと馴染みのいいCDリッパーを探したら、Audex というソフトウェアを見つけました。
CDをそのまま再生するメディアプレイヤーでは、音楽CDという「器(うつわ) 」が操作単位になるため、その中のそれぞれの楽曲のタイトル表示は「あれば便利」なレベルの機能です。一方、CDリッパーではCDという「器」からそれぞれの楽曲を取り出して個別のデータファイルとして扱うため、各楽曲をきちんと区別する必要があり、楽曲のタイトル情報が重要な意味を持つことになります。
そのためCDリッパーではCDDBへの対応がメディアプレイヤーよりも丁寧で、AudexもMusicBrainzとFreeDBの双方に対応すると共に、FreeDBにUTF-8で登録されている日本語の情報も文字化けせずに取り込むことができました。
図3 audexでは日本語タイトルを扱える
先に、CDリッパーの仕事は、音楽CDから楽曲データを取り出してWAV形式で保存すること、と述べましたが、WAV形式の楽曲データはかなり大きいため、よりコンパクトな形式に変換できれば便利です。そのため、たいていのCDリッパーには抽出したWAV形式のデータをMP3等の圧縮形式に変換するような機能があり、AudexにもFLAC、MP3、MP4、Ogg Vorbisの各形式に変換する機能があります。
図4 audexの保存形式設定メニュー
FLAC(Free Lossless Audio Codec)は圧縮の際にデータを切り捨てない可逆圧縮形式 で、圧縮率はそれほど高くありませんが、必要ならば元のCDと同じデータに復元できる ことが魅力です。一方、MP3、MP4(AAC) 、Ogg Vorbisの各形式は圧縮の際に人間の耳には聞こえない音を切り捨てる非可逆圧縮形式 で、圧縮率は高いものの、圧縮されたデータは元のデータには戻せません 。
今回は元のCDは手元にありますし、BGM的な用途でそれほど音質にこだわる必要もないので、MP3形式で保存しておくことにしてみました。
抽出した楽曲データの保存先は自由に指定できますが、デフォルトではホームディレクトリに"Music"というディレクトリを作り、その下に "「アーティスト名」/「アルバム名」/" とサブディレクトリを作って、その中に各トラックの楽曲データを「トラック番号 - タイトル」の名前で保存するようになっています。
$ ls -hR Music/
Music/:
遊佐未森/
Music/遊佐未森:
檸檬/
Music/遊佐未森/檸檬:
01 - 青空.mp3 06 - 小さな喫茶店.mp3
02 - 月がとっても青いから.mp3 07 - 夜来香(イエライシャン).mp3
03 - 南の花嫁さん.mp3 08 - 蘇州夜曲.mp3
04 - アラビアの唄.mp3 09 - 森の小径.mp3
05 - ゴンドラの唄.mp3 檸檬.m3u
JuKやAmarokといった音楽プレイヤーは、こうやって保存した楽曲データを「コレクション 」として扱うことができます。この例では~/Music/を楽曲コレクションの保存場所として設定してやると、その下にある楽曲ファイルをアーティストやアルバムごとに分類して登録し、それらを順に再生したり、「 プレイリスト」機能を使って聞きたい曲のみを再生するような機能を持っています。
図5 Jukのコレクション設定
ファイル名とID3タグ
今回のように楽曲データ保存用ディレクトリに"「アーティスト名」/「アルバム名」/" のような階層を作って楽曲を保存しておけば、その曲が誰の何というアルバムに入っているのかは、ディレクトリ構造から読み取ることができます。
一方、リッピングした楽曲コレクションから好きな曲だけを取りだして携帯音楽プレイヤー等で楽しもうとすると、ディレクトリ構造に頼らず楽曲ファイルだけでアーティスト名やアルバム名を知りたくなります。そのために利用されるのがID3タグ です。
ID3タグはMP3ファイルの先頭部分に記録される情報で、楽曲名やアーティスト名、アルバム名、出版年等の情報を記録することができます。
ID3タグにはいくつかのバージョンがあり、初期のころ(ID3v1)は記録できる文字数に制限があったり日本語が入らない等の問題があって使いづらい仕様でした。その後開発されたID3v2では文字数の制限が緩やかになると共に、UTF-8形式の文字列も記録可能になり、日本語タイトル等も問題なく使えるようになりました。
実は、今回利用したAudexにはID3タグを書き込む機能が用意されており、作成したMP3ファイルにはCDDBから得た各種情報が自動的に登録されています。ID3タグを見るにはいくつかの方法がありますが、今回はPythonにID3タグを扱う機能を追加するeyeD3モジュール をインストールして、eyeD3というコマンドを使ってみました。
$ eyeD3 Music/遊佐未森/檸檬/01\ -\ 青空.mp3
01 - 青空.mp3 [ 6.74 MB ]
-------------------------------------------------------------------------------
Time: 04:14 MPEG1, Layer III [ ~222 kb/s @ 44100 Hz - Joint stereo ]
-------------------------------------------------------------------------------
ID3 v2.3:
title: 青空 artist: 遊佐未森
album: 檸檬 year: 2002
track: 1 genre: J-pop (id None)
UserTextFrame: [Description: Tagging time]
2011-12-01T05:14:04
この例で見るように、今回作成したMP3ファイルにはすでに適切なID3タグが付けられており、ID3タグに応した携帯音楽プレイヤーならば、この楽曲ファイルだけでアーティスト名やアルバム名を表示できるようになっています。
実は音楽CDのリッピングに取り組んだのは今回が初めてではなく、手元のHDDには10年くらい前にあれこれ試してみた楽曲データが残っています。当時はメディアプレイヤーが十分に国際化されていなかったため、ファイル名に日本語が使えずローマ字で記載しなければならなかったり、ID3v2の仕様も流動的で、タイトルやアーティスト名を正しく記録することが困難だったりしました。また、CDリッパーやメディアプレイヤーの開発者たちの間で、楽曲ファイルをどのようなディレクトリ構成の元に保存すべきかの合意もなかったので、リッピングした楽曲データを体系的に整理することは難しく、せいぜい好みの曲を携帯音楽プレイヤーにコピーして、戸外に持ち出す程度の使い方しかできませんでした。
それに対し、最近では、楽曲データをPC上に体系的に整理するための標準的な方法も広まり、多くのメディアプレイヤーがその方法に従って楽曲データを扱うようになりました。その結果、どのようなCDリッパーとメディアプレイヤーを組み合わせても、HDD上に保存した楽曲コレクションの中から、その日の気分に合わせた曲や好みのアーティストの曲を自由に取り出して楽しむことが簡単にできるようになりました。
CDリッピングが十分使えることがわかったので、さっそく懐しめの音楽CDから楽曲コレクションを作り、それらをBGMとしてを聞きながら、本来のPlamo64の作業に戻ることにしました。