Page 1 of 1
Forum

Welcome to the Tweaking4All community forums!
When participating, please keep the Forum Rules in mind!

Topics for particular software or systems: Start your topic link with the name of the application or system.
For example “MacOS X – Your question“, or “MS Word – Your Tip or Trick“.

Please note that switching to another language when reading a post will not bring you to the same post, in Dutch, as there is no translation for that post!



Share:
Notifications
Clear all

[Solved] Pascal - How to Read/Write MP3 ID3 Tags

1 Posts
1 Users
0 Reactions
3,684 Views
 Hans
(@hans)
Famed Member Admin
Joined: 12 years ago
Posts: 2859
Topic starter  

The thing that makes MPEG Layer 3 files good (besides their size:) are ID3 tags. Thanks to them you can save information about the song. Here’s the ID3 tag structure and information on reading/modifying them. Enjoy!

The ID3 tag is saved in the last 128 bytes of a MPEG Layer 3 file. It starts with a “TAG” string. If this string is absent that means that ID3 information has been removed. But don’t worry – all you have to do is append it to the file.

In newer versions of Delphi if you are going to use this code you may want to use the packed keyword with arrays and records.

The MPEG Layer 3 ID3 tag structure:

 ID3Struct = record
   Signature: array[0..2] of Char; { Should be: "TAG" }
   Title,
   Artist,
   Album: array[0..29] of Char;
   Year: array[0..3] of Char;
   Comment: array[0..29] of Char;
   Genre: Byte;
 end;

Here are the genres (Max. 256 entries).

 ID3Genre: array[0..126] of string = (
   'Blues', 'Classic Rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge',
   'Hip-Hop', 'Jazz', 'Metal', 'New Age', 'Oldies', 'Other', 'Pop', 'R&B',
   'Rap', 'Reggae', 'Rock', 'Techno', 'Industrial', 'Alternative', 'Ska',
   'Death Metal', 'Pranks', 'Soundtrack', 'Euro-Techno', 'Ambient',
   'Trip-Hop', 'Vocal', 'Jazz+Funk', 'Fusion', 'Trance', 'Classical',
   'Instrumental', 'Acid', 'House', 'Game', 'Sound Clip', 'Gospel',
   'Noise', 'AlternRock', 'Bass', 'Soul', 'Punk', 'Space', 'Meditative',
   'Instrumental Pop', 'Instrumental Rock', 'Ethnic', 'Gothic',
   'Darkwave', 'Techno-Industrial', 'Electronic', 'Pop-Folk',
   'Eurodance', 'Dream', 'Southern Rock', 'Comedy', 'Cult', 'Gangsta',
   'Top 40', 'Christian Rap', 'Pop/Funk', 'Jungle', 'Native American',
   'Cabaret', 'New Wave', 'Psychadelic', 'Rave', 'Showtunes', 'Trailer',
   'Lo-Fi', 'Tribal', 'Acid Punk', 'Acid Jazz', 'Polka', 'Retro',
   'Musical', 'Rock& Roll', 'Hard Rock', 'Folk', 'Folk-Rock',
   'National Folk', 'Swing', 'Fast Fusion', 'Bebob', 'Latin', 'Revival',
   'Celtic', 'Bluegrass', 'Avantgarde', 'Gothic Rock', 'Progressive Rock',
   'Psychedelic Rock', 'Symphonic Rock', 'Slow Rock', 'Big Band',
   'Chorus', 'Easy Listening', 'Acoustic', 'Humour', 'Speech', 'Chanson',
   'Opera', 'Chamber Music', 'Sonata', 'Symphony', 'Booty Bass', 'Primus',
   'Porn Groove', 'Satire', 'Slow Jam', 'Club', 'Tango', 'Samba',
   'Folklore', 'Ballad', 'Power Ballad', 'Rhythmic Soul', 'Freestyle',
   'Duet', 'Punk Rock', 'Drum Solo', 'Acapella', 'Euro-House', 'Dance Hall'
 );

This is the ID3 Tag read code:

procedure ReadID3(sFilename:string);
var
 fMP3: file of Byte;
 Tag: ID3Struct;
begin
 try
   (* sFileName - (string) The full file name with path. *)
   AssignFile(fMP3, sFileName);
   Reset(fMP3);
   try
     Seek(fMP3, FileSize(fMP3) - 128);
     BlockRead(fMP3, Tag, SizeOf(Tag));
   finally
   end;
 finally
   CloseFile(fMP3);
 end;
 if fMP3.Signature<> 'TAG' then begin
   ...
   { Doesn't have an ID3 tag }
 end else begin
   ...
   { Do something with the tag }
 end;
end;

And code to write ID3 tags:

(* WriteID3Tag() function
**
** Copyright (c) 2000 Jacob Dybala (m3Rlin)
** Freeware.
** Modified: January 7 2000
** Please leave this copyright notice.
*)
procedure WriteID3Tag(id3NewTag: ID3Struct; sFileName: string);
var
 fMP3: file of Byte;
 Tag : ID3Struct;
begin
 try
   AssignFile(fMP3, sFileName);
   Reset(fMP3);
   try
     Seek(fMP3, FileSize(fMP3) - ID3OffsetFromEnd);
     BlockRead(fMP3, Tag, SizeOf(Tag));
     if fMP3.Signature = 'TAG' then
       { Replace old tag }
       Seek(fMP3, FileSize(fMP3) - ID3OffsetFromEnd)
     else
       (* Append tag to file because it doesn't exist.
       * Cannot use Append() function. It's only for text files.
       *)
       Seek(fMP3, FileSize(fMP3));
     BlockWrite(fMP3, id3NewTag, SizeOf(id3NewTag));
   finally
   end;
 finally
   CloseFile(fMP3);
 end;
end;

   
ReplyQuote
Share: