Pascal再入門:ID3TAGの解析、リハビリに適度な低水準処理
ID3TAGにはバージョンがあって、ID3V1の構成は単純で取り扱いは簡単だが、ID3V2の場合は各情報のオフセットを読み取る必要があり、それもバージョンにより取り扱いが異なるようだ。
ファイルの冒頭から3バイトの識別子でV1とV2を区別し、V1の場合はその後に固定長の情報、即ち「曲名」「アーティスト名」「アルバム名」...等が並ぶ。V2の場合はちょっとややっこしくて、3バイトの識別子のあとの2バイトがサブバージョンになり、そのサブバージョンで構成が異なる。
参考にしているMP3 ファイルのタグについての解説 (id3v1, id3v2, MPEG フレームヘッダ, XING ヘッダ)には、ID3v2.2とID3v2.3が解説されている。
Unit ID3TAGを書き加えた。
unit id3tag; interface procedure id3v2(tag :array of byte); procedure readfile(s : string); implementation var F : File; procedure id3v2(tag :array of byte); begin writeln('id3v2', '.' ,(tag[4]), (tag[5])); writeln('[',tag[1],'.' ,tag[2],'.' ,tag[3],'.' ,tag[4],'.' ,tag[5],'.' ,tag[6],'.' , tag[7],'.' , tag[8],'.' , tag[9],'.' , tag[10],'.' , tag[11],']'); end; procedure readfile(s : string); var R : array[1..128] of byte; i : integer; begin Assign(F,s); Reset(F,1); BlockRead(F, R, SizeOf(R)); Close(F); if ((char(R[1])='I') and (char(R[2])='D') and (char(R[3])='3')) then id3v2(R[1..10]); for i := 1 to 128 do begin write(char(R[i])); end; writeln(); writeln('dummy3'); end; end.
これを実行した場合、以下のようになる。
>sim4 11-Chiquitita.mp3
sim4 11-Chiquitita.mp3
11-Chiquitita.mp3 is Exists.
finded arg is "11-Chiquitita.mp3"
id3v2.00
[68.51.3.0.0.0.3.47.118.0.0]...
dummy3
...はバイト配列をそのまま出力しているので、文字化けする。ID3、/vTDAT、UFID、http://www.cddb.com/id3/taginfo1.html ,,,等は読み取れる。