玩式草子─ソフトウェアとたわむれる日々

第27回Plamo Linuxで音楽三昧その1]

10月も下旬に入ると朝晩はめっきり冷えこむようになってきました。夜の時間もずいぶん長くなって、ソフトウェアと戯れるには絶好の季節です。

秋の夜長に一人PCに向かっていると何かBGMが欲しくなります。夏場だとYouTubeにアップロードされている元気なゲーム音楽とかをBGMにすることが多いのですが、晩秋の時期にはもうすこししっとりとした音楽の方が似合いそうです。そこで久しぶりに手元の音楽CDを取り出してみました。

最近のLinuxと音楽CD

CD-Rが普及し始めたころによく出たFAQに音楽CDがマウントできませんというものがありました。

当時は「音楽CDはCD-ROMやCD-Rとはフォーマットが違うのでマウントできません。そのままCDプレイヤーソフトウェアやCD再生に対応したメディアプレイヤーを使って再生してください」というのが正しい答とされていました。

もちろん現在でもこの答は正しくて、音楽CDのデータの格納形式(CD-DA:CD Digital Audio)はCD-ROMやCD-Rが採用しているISO9660形式とは異なるため、音楽CDをCD-ROMのようにカーネルレベルで直接マウントして利用することはできません.

一方、最近ではGNOMEやKDEに代表される統合デスクトップ環境が普及してきました。これらの環境ではユーザの利便性を高めるためのさまざまな工夫が凝らされており、音楽CDもCD-ROM同様、ドライブに入れれば自動的に認識して、その中身を見ることができるようになっています。

たとえばKDE-4.7.1の環境では、音楽CDはdolphinファイルマネージャから「CD-ROM」として選択可能で、選択すると各トラックのタイトルまで表示してくれました。

図1 dolphinで表示した音楽CDの例
図1 dolphinで表示した音楽CDの例

面白いことには、本来は音楽CD上には存在していないCDAやFLAC,MP3といったサブディレクトリが表示され、それらのサブディレクトリを開くと、FLACサブディレクトリならば可逆圧縮形式であるFLAC(Free Lossless Audio Codec)形式に変換されたファイルが、MP3サブディレクトリならば不可逆圧縮形式であるMP3形式に変換されたファイルがそれぞれ表示されます。

図2 MP3形式だとサイズもずいぶん小さくなるらしい
図2 MP3形式だとサイズもずいぶん小さくなるらしい

dolphinを使ってこれらのファイルを別のディレクトリにコピーする、すなわち仮想的なMP3サブディレクトリにあるファイルをホームディレクトリ等にコピーしてみると、音楽CDに記録されているCDA形式から自動的にMP3形式に変換した上でコピーしてくれます。

昔にくらべて便利になったものだなぁ…、と思って、dolphinに表示されているwavファイルをいくつか選択し、まとめてsmplayer等のメディアプレイヤーに送ってみたところ、メディアプレイヤーはなかなか起動してくれません。

あれれ…、と思ってよく見ると、dolphinは音楽CD上のデータをHDDにコピーして、メディアプレイヤーはコピーされたHDD上のファイルを使って再生するようになっているようです。

この動作はKIOの仕組み上仕方ないところという気もしますが、音楽CDを再生するのにいちいち中身をコピーしていては面倒なので、KDEに付属のkscdというソフトウェアCDプレイヤーを起動してみました。

ところがkscdからでは、dolphinでは表示されていたアルバム名やトラック名の情報が表示されません。

図3 kscdのアルバム表示の例
図3 kscdのアルバム表示の例

あれれ…、と思って、手元の音楽CDをあれこれ試してみると、dolphinではたいていのCDでタイトル名が表示されるのに、kscdでは大半のCDが「タイトル不明」になります。しかし、必ずしも全てがダメというわけではなく、kscdでもタイトルが表示されるCDもいくつかあります。

こうなると悪い癖で、当初の「音楽CDを作業用のBGMにする」という目的から脱線して、音楽CDの処理回りをあれこれ調べ始めることになりました(苦笑⁠⁠。

さまざまなCDDB

kscdを手動で起動してみると、⁠タイトル不明」となるCDでは、ターミナルにこのようなメッセージが出力されていました。

$ kscd
MusicBrainz: Connecting to http://musicbrainz.org:80
MusicBrainz: GET /ws/1/release/?type=xml&discid=xhEygRBHwvgzjuFFv2kHGo2V5oY-
MusicBrainz: Result: 0 (200 )
MusicBrainz: Status: 200
MusicBrainz: Response:
<?xml version="1.0" encoding="UTF-8"?><metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#" xmlns:ext="http://musicbrainz.org/ns/ext-1.0#"><release-list /></metadata>

一方、タイトルが表示されるCDでは、こういう形で大量のデータが送られてきます。

$ kscd
MusicBrainz: Connecting to http://musicbrainz.org:80
MusicBrainz: GET /ws/1/release/?type=xml&discid=0dHbR2_jxjyHs41pLvQVmPrSVac-
MusicBrainz: Result: 0 (200 )
MusicBrainz: Status: 200
MusicBrainz: Response:
<?xml version="1.0" encoding="UTF-8"?><metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#" xmlns:ext="http://musicbrainz.org/ns/ext-1.0#"><release-list><release type="Album Official" id="8c555558-d59f-45ed-a714-b3206b56df3e" ext:score="100"><title>Final Fantasy IV: Celtic Moon</title><text-representation script="Latn" language="ENG" /><asin>B000058AB1</asin> ...

この結果を見ると、kscdで表示されるタイトルはMusicBrainzから入手しているようです。そこで、musicbrainzをキーワードに調べてみると、CDDBと呼ばれるサービスにもいくつかの種類があることがわかりました。

最近のPC環境では、音楽CDを入れるとそのタイトルやアーティスト名、各トラック名などが表示されるのを当然のように感じてしまいますが、本来、音楽CDには、それ以前に普及していたLPレコードなどと同様、音の情報(をPCM形式でディジタル化したデータ)しか入っておらず、アルバムやアーティストの名前などの情報は含まれていません

そのため、アルバム名やアーティスト、トラック名などのタイトル情報は、音楽CDとは別に管理する必要があります。そのために用意されているのが、CDDB(Compact Disc DataBase)と呼ばれるインターネット上のサービスです。

CDDBには、それぞれの音楽CDごとにアルバム名やアーティスト名、アルバムに含まれる各トラックのタイトルや演奏時間などの情報が登録されており、音楽CDの特徴を元に計算されるdisc-idをキーとして、それらのタイトル情報を検索することができるようになっています。

このCDDBサービスには大きく分けて商用のサービスとフリーのサービスがあり、商用サービスでは、米国ソニーの子会社となっているGracenote社が最大手で、iTunesやSonicStageといった商用ソフトウェアは、ほとんどGracenote社のサービスを利用しているようです。

もともと、このCDDBサービスは、フリーなソフトウェアCDプレイヤー、xmcdの機能として開発され、当初はフリーなサービスとして利用できました。その後、開発者たちがCDDBサービスを企業化し、Gracenote社に売却、後にGracenote社はデータベースの仕様を変更して、ライセンスを得たアプリケーションからしか利用できなくしたそうです。

一方、当初はGPLに基づいて公開されていたCDDBデータベースを引き継いで、従来通りの仕様でフリーなサービスを提供し続けているfreeDBというCDDBサービスがあります。また、今回参照しているMusicBrainzというサービスは、フリーでサービスを提供しつつ、freeDBよりも高品質な情報の提供を目指したサービスだそうです。

そう言えば、KDE-4.7.1をビルドする際にlibmusicbrainzというライブラリを要求されたな、と思い出して、手元のソースコードを調べてみると、freedbにアクセスするためのlibcddbと、musicbrainzにアクセスするためのlibmusicbrainzの2種のライブラリがありました。

freeDBとMusicBrainz

freeDBとMusicBrainzは、共に音楽CDのタイトル情報を提供するデータベースサービスですが、freeDBがオリジナルのCDDBサービスを引き継いで生まれ、従来のデータとの互換性を重視したサービスなのに対し、MusicBrainzは後発で始まったサービスなこともあって、データの互換性よりもオリジナルのCDDBサービスの欠点を改良することを重視しています。

両者の最大の違いはタイトル情報にアクセスするためのdisc-idに現われています。disc-id とは、世界中に何百万種類と存在する音楽CDを識別するための情報です。

異なるCDには異なるdisc-idを振る必要があるし、同じCDでは再版等でプレスが多少異なっても同じdisc-idを振る必要があります。また、CDDBサービスが生まれたのは1990年代の前半で、当時のPCの能力ではCDに記録されている膨大な量のデータを迅速に処理することは不可能でした。そのため、CDDBサービスでは、音楽CD上に記録されているそれぞれのトラックの位置の情報を元にdisc-idを生成することにしています。

オリジナルのCDDBサービスでは、音楽CDの全体の長さと各トラックが始まる位置の情報を元に独自のハッシュ関数を使って"000a9f10"といった8桁のdisc-idを生成し、そのdisc-idをタイトル情報の検索に使っています。残念ながらこの8桁のdisc-idでは世界中に何百万種類と存在する音楽CDに対して十分な識別力がなく、同じdisc-idを持つ音楽CDが複数存在しています。そのため、この方式のdisc-idを使い続けているfreeDBサービスでは、disc-idに加えて音楽のジャンルという概念を導入し、両者を合わせてそれぞれの音楽CDを識別するようにしています。

一方、後発のMusicBrainzでは、元にするデータこそオリジナルのCDDBサービス同様に音楽CDの全体の長さや各トラックの位置情報なものの、より識別力を高めるためにそれぞれのデータをSHA-1ハッシュ関数を通した上でbase64エンコードした、"OMNbP0JKd_ublN4gER5KDPkxIx4-" といった28桁のdisc-idを用いています。この28桁のdisc-idならば世界中に存在している音楽CDを一意に区別できそうですが、後発な分、MusicBrainzに登録されている音楽CDの情報は、元々のCDDBサービスを引き継いだfreeDBに比べるとかなり少ないようです。

このような特徴を考慮してか、KDE-4.7系では「システム設定」「ハードウェア」のうち、⁠マルチメディア」の設定部分で、MusicBrainzとfreeDB、それぞれを使うかどうかの設定ができるようになっていました。

図4 KDE-4.7.1のマルチメディアに関するシステム設定
図4 KDE-4.7.1のマルチメディアに関するシステム設定

この設定に従って、KDEの標準ファイルブラウザであるdolphinは、音楽CDを開くとfreeDBにもアクセスしてタイトル情報を得ているようです。

それなら、なぜ同じKDEに含まれているkscdが、dolphinでは表示できる音楽CDのタイトルを表示できないのでしょう? このあたりになるとドキュメント等よりもソースコードを見た方がよさそうです。

kscdはkdemultimediaパッケージに含まれているので、kdemultimedia-4.7.1/kscd/ 以下にあるソースコードを調べてみると、何のことはない、kscdはKDEのシステム設定とは無関係に、直接MusicBrainzを参照するようなコードになっていました。

/** Music Brainz initialisation	*/
m_MBManager = new MBManager();
m_MBManager->discLookup(devices->getMedia()->currentSource().deviceName());
 ...

ありゃりゃ……、と思って、もう少し調べてみると、kscdのREADMEファイルには、kscdはKDE-1.0のころに開発されたソフトウェアで、その後、長く放置されたままだったのを、最低限の修正のみで現在のバージョンにしている、といった記述がありました。

どうやら、KDEは4.7系になってシステムレベルでCDDBサービスに対応するようになったものの、kscdはその機能に対応しておらず、自前でMusicBrainzのみを参照するままになっているため、freeDBも参照するdolphinの表示と齟齬をきたす結果になっていたようです。

まぁ、CDプレイヤーにとってアルバム名や楽曲のタイトルを表示する機能は「あれば便利」なレベルで、一昔前のハードウェアCDプレイヤーだと再生時に表示されるのはトラック番号と経過時間だけだったし、元々BGM用途だったので「タイトル不明」が問題になるわけではありません。しかし、本来使えるべき情報がきちんと扱えないのは少々気に障るところです。そこで何かいい方法がないかとあれこれ調べてみることにしました。

おすすめ記事

記事・ニュース一覧