SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|

2016-12-29(Thu) mp3のタグの文字化けをなんとかする

  ここのところ、起き抜けと、寝しなに、ミニコンポで音楽のある生活を送っている。基本的にDLNAサーバに放り込んでから聴いているのだが、いまだ手持ちのCDのすべてを放り込めていない。とはいえ、以前に自作したflacのタグ編集ツールにより、放り込み作業自体はとても快適に進められている。

  最近の問題はmp3だ。過去に借りたCDなどをmp3化したものが少しあるのだが、既存のタグを修正したいのに、できないのだ。いや、厳密にはLinuxにはid3v2というタグ編集ツールがあるのだが、それでタグ付けすると日本語が文字化けしてしまうのだ。

  「mp3 タグ 文字化け」で検索するといろいろと引っかかるのだが、シフトJISがどうとか、エンコーディングが規定されていないとか、情報が錯綜している。共通するのは、スカッと解決した事例がないこと。

  改めて調べてみると、以下のようなことがわかった。

・mp3のタグはID3と呼ばれる
・ID3には、v1とv2がある
・ID3v1は固定長で128バイト、ファイル末尾に位置、文字エンコーディングの規定なし
・ID3v2は可変長で、ファイル先頭に位置
・ID3v2には、ID3v2.2、ID3v2.3、ID3v2.4がある
・ID3v2.2は、UTF-16が使用可能
・ID3v2.3は、UTF-16が使用可能、ID3v2.2と互換性がないが、最も普及している
・ID3v2.4は、UTF-8も使用可能、普及していないらしい

  ID3v2からは、規格上キチンと日本語に対応しているはずなのだが、なぜか文字化けしてしまう。id3v2というタグ編集ツールの問題を疑い、適当に日本語を付与し、バイナリダンプしてみると、中身はUTF-8で記録されている。パッと見、ヘンではない。

  なるほど、ID3v2.4だから、コンポ側が対応していないせいで文字化けしているのか、と思ったら、ID3ヘッダはID3v2.3を示していた。その場合、UTF-16である必要がある。ダメじゃん。つまり、アレだ。元が海外のツールだから、文字エンコーディングに関してロクにテストしておらず、バグっている、というわけなのだな。

  どうも、何をやってもダメそうなので、ソースコードを修正してやろうかとも思ったのだが、Cを読むのがダルい。Rubyのライブラリがあるらしいので、自作しようと思ったが、ライブラリの導入が面倒くさそう。うーむ、ID3v2.2の仕様書をちょっと見た限りでは、さほど複雑そうでもないので、ぜんぶ自分で実装してしまうか。

  やりたいことは、既存のmp3ファイルの存在するフォルダから、曲目リストを作成することと、修正した曲目リストから、既存のmp3ファイルのタグを付け直すこと。実は、前者は「mget」、後者は「tagmp3」として既に完成しているので、そいつが呼んでいるバグ付きの「id3v2」と、ほぼ同等の動作をしバグのない「mp3id3」というツールを実装すればいい。

  というわけで実装完了。実は、手持ちのmp3の多くは、WindowsのiTunesでエンコードしたものがほとんどであり、それらのタグはID3v2.2で記録されていたので、その読み出しにも対応させた。ID長などが変わっていてマジで互換性がない。まぁ、策定から時間が経っているとはいえ、先が見えないアホが規格を作るとアホなことになるという見本だな、これは。

  使い方はこう。

$ ls -l
-rw-r--r-- 1 user user  725343  6月  9  2007 '1-01 サーカスの来た日.mp3'
-rw-r--r-- 1 user user 3788568  6月  9  2007 '1-02 サンフランシスコ.mp3'
-rw-r--r-- 1 user user 4763695  6月  9  2007 '1-03 踊るダメ人間.mp3'
-rw-r--r-- 1 user user 3712079  6月  9  2007 '1-04 日本印度化計画.mp3'
-rw-r--r-- 1 user user 1421263  6月  9  2007 '1-05 じーさんはいい塩梅.mp3'
-rw-r--r-- 1 user user 2800086  6月  9  2007 '1-06 マタンゴ.mp3'
-rw-r--r-- 1 user user 3972468  6月  9  2007 '1-07 詩人オウムの世界.mp3'
-rw-r--r-- 1 user user 3472591  6月  9  2007 '1-08 元祖高木ブー伝説.mp3'
-rw-r--r-- 1 user user 4807150  6月  9  2007 '1-09 生きてあげようかな.mp3'
-rw-r--r-- 1 user user 4565577  6月  9  2007 '1-10 サボテンとバントライン.mp3'
-rw-r--r-- 1 user user 5641380  6月  9  2007 '1-11 これでいいのだ.mp3'
-rw-r--r-- 1 user user 4562279  6月  9  2007 '1-12 僕の宗教へようこそ ~Welcome to my religi.mp3'
-rw-r--r-- 1 user user 4863974  6月  9  2007 '1-13 キノコパワー.mp3'
-rw-r--r-- 1 user user 5333356  6月  9  2007 '1-14 戦え! 何を!_ 人生を!.mp3'
-rw-r--r-- 1 user user 6772376  6月  9  2007 '1-15 月とテブクロ.mp3'
 
$ mget . > .info
 
$ viorg .info 
 
$ diff .info.org .info
1c1
< _ALBUM_: 復活究極ベスト "大公式" [Disc 1]
---
> _ALBUM_: 81:復活究極ベスト "大公式" [Disc 1]
4c4
< _GENRE_: (9)
---
> _GENRE_: Rock
 
$ cat .info | tagmp3
 
$ mp3id3 -l *.mp3
id3v2 tag info for 1-01 サーカスの来た日.mp3:
TPE1: 筋肉少女帯
TALB: 81:復活究極ベスト 大公式 [Disc 1]
TIT2: 01:サーカスの来た日
TCON: Rock
TYER: 1989
TRCK: 1/15
 
id3v2 tag info for 1-02 サンフランシスコ.mp3:
TPE1: 筋肉少女帯
TALB: 81:復活究極ベスト 大公式 [Disc 1]
TIT2: 02:サンフランシスコ
TCON: Rock
TYER: 1989
TRCK: 2/15
 :
 
$ rm -f *.org
 
$ find . -name "*.mp3" | sort | sed "s/^/mpg123 \"/" | sed "s/$/\"/" | sh
Playing MPEG stream 1 of 1: 1-01 サーカスの来た日.mp3 ...
 
MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo
Title:   01:サーカスの来た日                     Artist: 筋肉少女帯
Album:   81:復活究極ベスト 大公式 [Disc 1]
Year:    1989                            Genre:  Rock
 :

  パッケージを置いておく。

  と、そういえば、冒頭に「以前に自作したflacのタグ編集ツールにより」などと書いたが、公開してなかったことに気づいた。上記のパッケージに含まれている「cget」「tagflac」というのがそれ。

  「cget」は、先の「mget」と似ているが、ローカルのmp3ファイルからではなく、CDのトラック情報を元に、外部のCDのデータベース「gracenote」から曲目リストを得るもの。ただし、利用にはgracenoteの開発者登録が必要で、あらかじめcget.confにクライアントIDを設定しておく必要がある。

  「tagflac」は、先の「tagmp3」と同等のもので、修正した曲目リストから、既存のflacファイルのタグを付け直すもの。どちらも、扱う曲目リストのフォーマットには互換性を持たせてある。

  使い方は(CDをセットしてから)こう。

$ cget > .info
 
$ cat .info
_#TOC_: 150 12165 42912 97717 108597 154367 178877 215317 245492
 
_ALBUM_: データイースト・ゲーム・ミュージック
_ARTIST_: Data East
_GENRE_: Soundtrack
 
カルノフ
チェルノブ -戦う人間発電所-
サイコニクス・オスカー
ダーウィン 4078 (アレンジ・バージョン)
スーパー・リアル・ダーウィン
ヘビー・バレル
ポケット・ギャル
ワンダー・プラネット
 
$ cdparanoia -B
cdparanoia III release 10.2 (September 11, 2008)
 
 
Ripping from sector       0 (track  1 [0:00.00])
	  to sector  245341 (track  8 [6:42.24])
 
outputting to track01.cdda.wav
 
 (== PROGRESS == [                              | 012014 00 ] == :^D * ==)   
 :
Done.
 
$ eject
 
$ flac -8 *
flac 1.3.1, Copyright (C) 2000-2009  Josh Coalson, 2011-2014  Xiph.Org Foundation
flac comes with ABSOLUTELY NO WARRANTY.  This is free software, and you are
welcome to redistribute it under certain conditions.  Type `flac' for details.
 
track01.cdda.wav: wrote 16148406 bytes, ratio=0.571
 :
rm -f *.tag; metaflac --list *.flac | grep -i comment | less
 
$ viorg .info 
 
$ diff .info.org .info
3,5c3,6
< _ALBUM_: データイースト・ゲーム・ミュージック
< _ARTIST_: Data East
< _GENRE_: Soundtrack
---
> _ALBUM_: 01:データイースト・ゲーム・ミュージック
> _ARTIST_: DATA EAST
> _DATE_: 1988
> _GENRE_: Game Music
 
$ cat .info | tagflac

  余談だが、ちょっと前に「ギャラクティックストーム」というタイトーのゲームのサウンドトラックを購入した。作曲はダライアスやニンジャウォリアーズのOGR氏だし、やたらネット上の評価も高いのだが、未プレイのゲームの曲ってのもなぁ、と躊躇していた。んが、Amazonでmp3形式で配信しているのを知り、先日、製作したPC用スピーカで試聴してみると、意表を突く節回しが心地よく、未プレイであることなどどうでもよくなってしまった。

  以前のAmazonのmp3配信は、妙な形式でのダウンロードを強要され、mp3を取り出すのにひと手間が必要だったような気がするが、今はシンプルにzipでまとめられたmp3をダウンロードできるし、ブラウザで直接に聴くことまでできて、なにひとつ不満はない。これに上記の「既存のmp3ファイルのタグを付け直せるツール」が加わったことで、最強の環境になったと言えよう。

  もうひとついうと「ギャラクティックストーム」の「オリジナルサウンドトラック」の購入は、アレンジ盤である「ギャラクティックストーム~瞳の記憶~」の購入の布石だったりする。なにせ、似たような位置関係にある「メタルブラック」のアレンジ盤である「メタルブラック-The-First-」は、気がつくともう10年以上も聴いているお気に入りだったりするからな……のだが、なぜかAmazonでは配信されていない。

  moraでなら配信されているのだが……aac形式なんだよなぁ。いや、別にaacでもいいんだが、それは、次に「aacのタグの付け直しツール」も作らねばならんということを意味するわけで……とほほ。