いつの間にか今年のカレンダーも最後の一枚になり、街中はクリスマスセール一色で、スーパーの鮮魚コーナーの片隅に「数の子」が出てくる季節になりました。
昨年の晩秋から始めた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側では日本語フォントが正しく扱えないため、プレイリスト等には日本語タイトルが表示できないようです。
mplayer
mplayerはxine同様、Linuxで古くから使われてきたメディアプレイヤーで、さまざまなコーデックに対応していることに定評があります。
mplayerにもCD再生機能が用意されており、cddb:// を引数に起動するとFreeDBに接続してタイトル情報を入手、表示してくれました。
一方、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から送られてくる日本語タイトルはタイトル中の日本語の部分が全て「????」になってしまいました。
これは日本語localeがらみの問題かも、と思って、localeの設定をあれこれ変えてみても変化なく、少しソースコードを追いかけてみたところ、KDEのライブラリを使ってFreeDBからデータを入手した時点ですでに返答のUTF-8形式のデータが壊れているようでした。
このように、手元にあるメディアプレイヤーをざっと試してみたところ、いずれも音楽CDの日本語タイトルを表示する機能は不十分でした。少しデバッグしてやれば何とかなりそうなものもありますが、そういう作業に手を出すと「秋の夜長の作業用BGM」という本来の目的からますます脱線していくことになりそうなので、別の方向を考えることにしました。
FreeDBのアクセス方法
少し余談になりますが、これらメディアプレイヤーがどのようにしてFreeDBからCDのタイトル情報を入手しているかについて簡単に紹介してみましょう。
前回紹介したように、FreeDBを利用するためにはCDに収められた各トラックの位置情報から計算されるdisc-idが必要となります。
このdisc-idは、CDのトラック数と各トラックのフレーム単位での開始位置、CD全体の収録時間といった情報から生成され、cd-discidというコマンドで表示可能です。
この数字のうち、最初の"71077e09"がこのCDのdisc-id、次の"9"がCDに含まれるトラック数、その次の"150","19230","28417"..がフレーム単位での各トラックの開始位置で、最後の"1920"が秒単位での全体の収録時間となります。
このデータを元にFreeDBのデータベースに問い合わせるわけですが、そのためにはlibcddbパッケージに含まれているcddb_queryというコマンドが便利です。
FreeDBに問い合わせた結果、該当するCDが1件見つかり、そのカテゴリー(misc)とdisc-id(71077e09)が得られました。次にこのデータを元にタイトル情報を検索します。
cd-infoコマンドだけでもdisc-idを表示するように、disc-id自身は音楽CDさえあれば計算できます。しかし、前回も紹介したように、FreeDBが採用している8桁のdisc-idでは世界中に存在するCDを一意に識別することができないため、FreeDBの検索時にはカテゴリー情報も必要とされています。
たとえば、今回試した"71077e09"というdisc-idの場合、"rock"のカテゴリーを指定して検索すればRandy Sheep Ranchの"Ready To Rodeo"というCDが登録されていました。
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からそれぞれの楽曲データを取り出すことを「リッピング」と呼びます。
Linux上で使えるCDリッパーは多数存在しています。最近はKDE環境を中心に使っているのでKDEと馴染みのいいCDリッパーを探したら、Audexというソフトウェアを見つけました。
CDをそのまま再生するメディアプレイヤーでは、音楽CDという「器(うつわ)」が操作単位になるため、その中のそれぞれの楽曲のタイトル表示は「あれば便利」なレベルの機能です。一方、CDリッパーではCDという「器」からそれぞれの楽曲を取り出して個別のデータファイルとして扱うため、各楽曲をきちんと区別する必要があり、楽曲のタイトル情報が重要な意味を持つことになります。
そのためCDリッパーではCDDBへの対応がメディアプレイヤーよりも丁寧で、AudexもMusicBrainzとFreeDBの双方に対応すると共に、FreeDBにUTF-8で登録されている日本語の情報も文字化けせずに取り込むことができました。
先に、CDリッパーの仕事は、音楽CDから楽曲データを取り出してWAV形式で保存すること、と述べましたが、WAV形式の楽曲データはかなり大きいため、よりコンパクトな形式に変換できれば便利です。そのため、たいていのCDリッパーには抽出したWAV形式のデータをMP3等の圧縮形式に変換するような機能があり、AudexにもFLAC、MP3、MP4、Ogg Vorbisの各形式に変換する機能があります。
FLAC(Free Lossless Audio Codec)は圧縮の際にデータを切り捨てない可逆圧縮形式で、圧縮率はそれほど高くありませんが、必要ならば元のCDと同じデータに復元できることが魅力です。一方、MP3、MP4(AAC)、Ogg Vorbisの各形式は圧縮の際に人間の耳には聞こえない音を切り捨てる非可逆圧縮形式で、圧縮率は高いものの、圧縮されたデータは元のデータには戻せません。
今回は元のCDは手元にありますし、BGM的な用途でそれほど音質にこだわる必要もないので、MP3形式で保存しておくことにしてみました。
抽出した楽曲データの保存先は自由に指定できますが、デフォルトではホームディレクトリに"Music"というディレクトリを作り、その下に "「アーティスト名」/「アルバム名」/" とサブディレクトリを作って、その中に各トラックの楽曲データを「トラック番号 - タイトル」の名前で保存するようになっています。
JuKやAmarokといった音楽プレイヤーは、こうやって保存した楽曲データを「コレクション」として扱うことができます。この例では~/Music/を楽曲コレクションの保存場所として設定してやると、その下にある楽曲ファイルをアーティストやアルバムごとに分類して登録し、それらを順に再生したり、「プレイリスト」機能を使って聞きたい曲のみを再生するような機能を持っています。
ファイル名とID3タグ
今回のように楽曲データ保存用ディレクトリに"「アーティスト名」/「アルバム名」/" のような階層を作って楽曲を保存しておけば、その曲が誰の何というアルバムに入っているのかは、ディレクトリ構造から読み取ることができます。
一方、リッピングした楽曲コレクションから好きな曲だけを取りだして携帯音楽プレイヤー等で楽しもうとすると、ディレクトリ構造に頼らず楽曲ファイルだけでアーティスト名やアルバム名を知りたくなります。そのために利用されるのがID3タグです。
ID3タグはMP3ファイルの先頭部分に記録される情報で、楽曲名やアーティスト名、アルバム名、出版年等の情報を記録することができます。
実は、今回利用したAudexにはID3タグを書き込む機能が用意されており、作成したMP3ファイルにはCDDBから得た各種情報が自動的に登録されています。ID3タグを見るにはいくつかの方法がありますが、今回はPythonにID3タグを扱う機能を追加するeyeD3モジュールをインストールして、eyeD3というコマンドを使ってみました。
この例で見るように、今回作成したMP3ファイルにはすでに適切なID3タグが付けられており、ID3タグに応した携帯音楽プレイヤーならば、この楽曲ファイルだけでアーティスト名やアルバム名を表示できるようになっています。
実は音楽CDのリッピングに取り組んだのは今回が初めてではなく、手元のHDDには10年くらい前にあれこれ試してみた楽曲データが残っています。当時はメディアプレイヤーが十分に国際化されていなかったため、ファイル名に日本語が使えずローマ字で記載しなければならなかったり、ID3v2の仕様も流動的で、タイトルやアーティスト名を正しく記録することが困難だったりしました。また、CDリッパーやメディアプレイヤーの開発者たちの間で、楽曲ファイルをどのようなディレクトリ構成の元に保存すべきかの合意もなかったので、リッピングした楽曲データを体系的に整理することは難しく、せいぜい好みの曲を携帯音楽プレイヤーにコピーして、戸外に持ち出す程度の使い方しかできませんでした。
それに対し、最近では、楽曲データをPC上に体系的に整理するための標準的な方法も広まり、多くのメディアプレイヤーがその方法に従って楽曲データを扱うようになりました。その結果、どのようなCDリッパーとメディアプレイヤーを組み合わせても、HDD上に保存した楽曲コレクションの中から、その日の気分に合わせた曲や好みのアーティストの曲を自由に取り出して楽しむことが簡単にできるようになりました。
CDリッピングが十分使えることがわかったので、さっそく懐しめの音楽CDから楽曲コレクションを作り、それらをBGMとしてを聞きながら、本来のPlamo64の作業に戻ることにしました。