Deciphering the tag information
Now that we have our basic GUI in place, we can work on extracting information about the MP3. The most popular tag encryption appears to be ID3, so we'll base our code on that format. This standard stores the tag information in the last 128 bytes of the file. Table A shows the exact length and order of each piece of data.
Table A: ID3 tag information format
Data | Length in bytes |
Tag | 3 |
Title | 30 |
Artist | 30 |
Album | 30 |
Year | 4 |
Comment | 30 |
Genre | 1 |
To read this information, you first open the MP3 file and grab the last 128 bytes. With ID3, the first three slots hold the string TAG if the file actually contains information. If the file does contain tag information, we'll store the last 128 bytes in a custom Type variable. After that, our code can cycle through the MP3 file, extracting information as it goes. Listing A shows the code that extracts this information as well as creates several important variables.
Listing A: Gathering MP3 tag information
Option Explicit Dim GenresTypes Dim Min As Integer Dim Sec As Integer Dim FileName As String Dim FileOpen As Boolean Dim CurrentTag As TagInfo Private Type TagInfo Tag As String * 3 Songname As String * 30 artist As String * 30 album As String * 30 year As String * 4 comment As String * 30 genre As String * 1 End Type Private Sub File1_Click() Dim temp As String On Error Resume Next EraseTXTBoxes If Right(Dir1.Path, 1) = "\" Then FileName = Dir1.Path & File1.FileName Else FileName = Dir1.Path & "\" & File1.FileName End If Open FileName For Binary As #1 With CurrentTag Get #1, FileLen(FileName) - 127, .Tag If Not .Tag = "TAG" Then lblMsg.Caption = "No tag" Close #1 Exit Sub End If Get #1, , .Songname Get #1, , .artist Get #1, , .album Get #1, , .year Get #1, , .comment Get #1, , .genre Close #1 txtTitle = RTrim(.Songname) txtArtist = RTrim(.artist) txtAlbum = RTrim(.album) txtYear = RTrim(.year) txtComment = RTrim(.comment) Temp = RTrim(.genre) txtGenreCode = Asc(Temp) Combo1.ListIndex = CInt(txtGenreCode) - 1 End With End Sub
Private Sub Dir1_change() File1.FileName = Dir1.Path End Sub Sub Drive1_Change() ' change the folder path to the new drive Dir1.Path = Drive1.Drive ' change the file path File1.Path = Drive1.Drive End Sub
Notice that the code has to handle the genre character a little differently. That's because ID3 stores this data as a single ASCII character. To match up the actual number with its corresponding combobox description, the procedure converts the ASCII to a number, and then looks up that number in the combobox.
Writing the tag information
To write the tag information back to the file, you use a similar technique. Again, our code will take advantage of the Open command. This time, however, it will use the Put command. Listing B shows the procedure we attached to the command button cmdWriteTag's Click() event.
Listing B: Writing the tag information
Private Sub cmdWriteTag_Click() If FileOpen Then MsgBox "You can't save to an open file", _ vbCritical, "MP3 Tag Save Error" Exit Sub End If If Right(Dir1.Path, 1) = "\" Then FileName = Dir1.Path & File1.FileName Else FileName = Dir1.Path & "\" & File1.FileName End If With CurrentTag .Tag = "TAG" .Songname = txtTitle .artist = txtArtist .album = txtAlbum .year = txtYear .comment = txtComment .genre = Chr(Combo1.ListIndex + 1) Open FileName For Binary Access Write As #1 Seek #1, FileLen(FileName) - 127 Put #1, , .Tag Put #1, , .Songname Put #1, , .artist Put #1, , .album Put #1, , .year Put #1, , .comment Put #1, , .genre Close #1 End With End Sub
Comments