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 ,,,等は読み取れる。