How do I change mp3 ID3 Tag using VBA in Access?

  • Thread starter Thread starter MikeZz
  • Start date Start date
M

MikeZz

Hi,
Can someone provide an example of how I can change or add the ID3 tags of
MP3 files using Access VBA?

If possible, please include a reference to the most common tags used for MP3
files.

I'm using Access 2002.

Thanks and Happy New Years!
 
There's no easy way of doing something like that from Access without using
an external library of some kind. I would suggest you google something like
"VB MP3 ID3" and similar search terms and see what that turns up.


Rob
 
MikeZz said:
Hi,
Can someone provide an example of how I can change or add the ID3 tags of
MP3 files using Access VBA?

If possible, please include a reference to the most common tags used for
MP3
files.

I'm using Access 2002.

Thanks and Happy New Years!

Here's some code to read/write version 1 tags. Paste this code into a new
CLASS module:

''' START CODE '''
Private Type MP3ID3V1Tag
tag As String * 3
Title As String * 30
Artist As String * 30
Album As String * 30
Year As String * 4
Comment As String * 28
Filler As Byte
Track As Byte
Genre As Byte
End Type
'
Private m_sMp3File As String
Private m_bHasID3v1Tag As Boolean
'
Private m_sTag As String
Private m_sTitle As String
Private m_sArtist As String
Private m_sAlbum As String
Private m_sYear As String
Private m_sComment As String
Private m_sGenre As Byte
Private m_sTrack As Byte

Public Property Get MP3File() As String
MP3File = m_sMp3File
End Property

Public Property Let MP3File(ByVal value As String)
m_sMp3File = value
pLoadTag
End Property

Public Sub Update()
pUpdateTag
End Sub

Public Property Get HasID3v1Tag() As Boolean
HasID3v1Tag = m_bHasID3v1Tag
End Property

Public Property Get Title() As String
Title = RTrimZ(m_sTitle)
End Property
Public Property Let Title(ByVal value As String)
m_sTitle = value
End Property

Public Property Get Artist() As String
Artist = RTrimZ(m_sArtist)
End Property
Public Property Let Artist(ByVal value As String)
m_sArtist = value
End Property

Public Property Get Album() As String
Album = RTrimZ(m_sAlbum)
End Property
Public Property Let Album(ByVal value As String)
m_sAlbum = value
End Property

Public Property Get Year() As String
Year = RTrimZ(m_sYear)
End Property
Public Property Let Year(ByVal value As String)
m_sYear = value
End Property

Public Property Get Track() As Byte
Track = RTrimZ(m_sTrack)
End Property
Public Property Let Track(ByVal value As Byte)
m_sTrack = value
End Property

Public Property Get Comment() As String
Comment = RTrimZ(m_sComment)
End Property
Public Property Let Comment(ByVal value As String)
m_sComment = value
End Property

Public Property Get Genre() As Byte
Genre = RTrimZ(m_sGenre)
End Property
Public Property Let Genre(ByVal value As Byte)
m_sGenre = value
End Property

Public Property Get GenreName(ByVal Genre As Byte) As String
Select Case Genre
Case 34: GenreName = "Acid"
Case 74: GenreName = "Acid Jazz"
Case 73: GenreName = "Acid Punk"
Case 99: GenreName = "Acoustic"
Case 40: GenreName = "Alt.Rock"
Case 20: GenreName = "Alternative"
Case 26: GenreName = "Ambient"
Case 145: GenreName = "Anime"
Case 90: GenreName = "Avant Garde"
Case 116: GenreName = "Ballad"
Case 41: GenreName = "Bass"
Case 135: GenreName = "Beat"
Case 85: GenreName = "Bebob"
Case 96: GenreName = "Big Band"
Case 138: GenreName = "Black Metal"
Case 89: GenreName = "Blue Grass"
Case 0: GenreName = "Blues"
Case 107: GenreName = "Booty Bass"
Case 132: GenreName = "Brit Pop"
Case 65: GenreName = "Cabaret"
Case 88: GenreName = "Celtic"
Case 104: GenreName = "Chamber Music"
Case 102: GenreName = "Chanson"
Case 97: GenreName = "Chorus"
Case 136: GenreName = "Christian Gangsta Rap"
Case 61: GenreName = "Christian Rap"
Case 141: GenreName = "Christian Rock"
Case 1: GenreName = "Classic Rock"
Case 32: GenreName = "Classical"
Case 112: GenreName = "Club"
Case 128: GenreName = "Club - House"
Case 57: GenreName = "Comedy"
Case 140: GenreName = "Contemporary Christian"
Case 2: GenreName = "Country"
Case 139: GenreName = "Crossover"
Case 58: GenreName = "Cult"
Case 3: GenreName = "Dance"
Case 125: GenreName = "Dance Hall"
Case 50: GenreName = "Darkwave"
Case 22: GenreName = "Death Metal"
Case 4: GenreName = "Disco"
Case 55: GenreName = "Dream"
Case 127: GenreName = "Drum & Bass"
Case 122: GenreName = "Drum Solo"
Case 120: GenreName = "Duet"
Case 98: GenreName = "Easy Listening"
Case 52: GenreName = "Electronic"
Case 48: GenreName = "Ethnic"
Case 54: GenreName = "Eurodance"
Case 124: GenreName = "Euro - House"
Case 25: GenreName = "Euro - Techno"
Case 84: GenreName = "Fast Fusion"
Case 80: GenreName = "Folk"
Case 81: GenreName = "Folk / Rock"
Case 115: GenreName = "Folklore"
Case 119: GenreName = "Freestyle"
Case 5: GenreName = "Funk"
Case 30: GenreName = "Fusion"
Case 36: GenreName = "Game"
Case 59: GenreName = "Gangsta Rap"
Case 126: GenreName = "Goa"
Case 38: GenreName = "Gospel"
Case 49: GenreName = "Gothic"
Case 91: GenreName = "Gothic Rock"
Case 6: GenreName = "Grunge"
Case 79: GenreName = "Hard Rock"
Case 129: GenreName = "Hardcore"
Case 137: GenreName = "Heavy Metal"
Case 7: GenreName = "Hip Hop"
Case 35: GenreName = "House"
Case 100: GenreName = "Humour"
Case 131: GenreName = "Indie"
Case 19: GenreName = "Industrial"
Case 33: GenreName = "Instrumental"
Case 46: GenreName = "Instrumental Pop"
Case 47: GenreName = "Instrumental Rock"
Case 8: GenreName = "Jazz"
Case 29: GenreName = "Jazz - Funk"
Case 146: GenreName = "JPop"
Case 63: GenreName = "Jungle"
Case 86: GenreName = "Latin"
Case 71: GenreName = "Lo - fi"
Case 45: GenreName = "Meditative"
Case 142: GenreName = "Merengue"
Case 9: GenreName = "Metal"
Case 77: GenreName = "Musical"
Case 82: GenreName = "National Folk"
Case 64: GenreName = "Native American"
Case 133: GenreName = "Negerpunk"
Case 10: GenreName = "New Age"
Case 66: GenreName = "New Wave"
Case 39: GenreName = "Noise"
Case 11: GenreName = "Oldies"
Case 103: GenreName = "Opera"
Case 12: GenreName = "Other"
Case 75: GenreName = "Polka"
Case 134: GenreName = "Polsk Punk"
Case 13: GenreName = "Pop"
Case 62: GenreName = "Pop / Funk"
Case 53: GenreName = "Pop / Folk"
Case 109: GenreName = "Pr0n Groove"
Case 117: GenreName = "Power Ballad"
Case 23: GenreName = "Pranks"
Case 108: GenreName = "Primus"
Case 92: GenreName = "Progressive Rock"
Case 67: GenreName = "Psychedelic"
Case 93: GenreName = "Psychedelic Rock"
Case 43: GenreName = "Punk"
Case 121: GenreName = "Punk Rock"
Case 14: GenreName = "R&B"
Case 15: GenreName = "Rap"
Case 68: GenreName = "Rave"
Case 16: GenreName = "Reggae"
Case 76: GenreName = "Retro"
Case 87: GenreName = "Revival"
Case 118: GenreName = "Rhythmic Soul"
Case 17: GenreName = "Rock"
Case 78: GenreName = "Rock 'n'Roll"
Case 143: GenreName = "Salsa"
Case 114: GenreName = "Samba"
Case 110: GenreName = "Satire"
Case 69: GenreName = "Showtunes"
Case 21: GenreName = "Ska"
Case 111: GenreName = "Slow Jam"
Case 95: GenreName = "Slow Rock"
Case 105: GenreName = "Sonata"
Case 42: GenreName = "Soul"
Case 37: GenreName = "Sound Clip"
Case 24: GenreName = "Soundtrack"
Case 56: GenreName = "Southern Rock"
Case 44: GenreName = "Space"
Case 101: GenreName = "Speech"
Case 83: GenreName = "Swing"
Case 94: GenreName = "Symphonic Rock"
Case 106: GenreName = "Symphony"
Case 147: GenreName = "Synth Pop"
Case 113: GenreName = "Tango"
Case 18: GenreName = "Techno"
Case 51: GenreName = "Techno - Industrial"
Case 130: GenreName = "Terror"
Case 144: GenreName = "Thrash Metal"
Case 60: GenreName = "Top 40"
Case 70: GenreName = "Trailer"
Case 31: GenreName = "Trance"
Case 72: GenreName = "Tribal"
Case 27: GenreName = "Trip Hop"
Case 28: GenreName = "Vocal"
End Select
End Property

Private Sub pLoadTag()
Dim lErr As Long
Dim sErr As String

m_bHasID3v1Tag = False
m_sComment = ""
m_sArtist = ""
m_sAlbum = ""
m_sYear = ""
m_sGenre = 255
m_sTitle = ""
m_sTrack = 0

f% = FreeFile
On Error Resume Next
Open m_sMp3File For Binary Access Read Lock Write As #f%
If (Err.Number <> 0) Then
lErr = Err.Number
sErr = Err.Description
On Error GoTo 0
Err.Raise lErr, "clsMp3TagV1", sErr
Else
On Error GoTo 0
If LOF(f%) > 128 Then
Dim tag As MP3ID3V1Tag
Get #f%, LOF(f%) - 127, tag.tag
If Not (StrComp(tag.tag, "TAG") = 0) Then
' no tag
Else
m_bHasID3v1Tag = True
Get #f%, , tag.Title
Get #f%, , tag.Artist
Get #f%, , tag.Album
Get #f%, , tag.Year
Get #f%, , tag.Comment
Get #f%, , tag.Filler
Get #f%, , tag.Track
Get #f%, , tag.Genre

m_sTitle = tag.Title
m_sArtist = tag.Artist
m_sAlbum = tag.Album
m_sYear = tag.Year
m_sComment = tag.Comment
m_sTrack = tag.Track
m_sGenre = tag.Genre
End If
End If
End If
On Error Resume Next
Close #f%
On Error GoTo 0
Err.Clear
End Sub

Private Sub pUpdateTag()
Dim f As Integer
Dim lErr As Long
Dim sErr As String

f = FreeFile
On Error Resume Next
Open m_sMp3File For Binary Access Read Write Lock Write As #f
If (Err.Number <> 0) Then
lErr = Err.Number
sErr = Err.Description
On Error GoTo 0
Err.Raise lErr, "clsMp3TagV1", sErr
Else
Dim tag As MP3ID3V1Tag
If LOF(f) > 0 Then
If LOF(f) > 128 Then
Get #f, LOF(f) - 127, tag.tag
If Not (StrComp(tag.tag, "TAG") = 0) Then
' no MP3 tag already, need to extend the file
' to add it
Seek #f, LOF(f)
tag.tag = "TAG"
Put #f, , tag.tag
End If

LSet tag.Title = m_sTitle
LSet tag.Artist = m_sArtist
LSet tag.Album = m_sAlbum
LSet tag.Year = m_sYear
tag.Track = m_sTrack
LSet tag.Comment = m_sComment
tag.Genre = m_sGenre

Put #f, , tag.Title
Put #f, , tag.Artist
Put #f, , tag.Album
Put #f, , tag.Year
Put #f, , tag.Comment
Put #f, , tag.Filler
Put #f, , tag.Track
Put #f, , tag.Genre
End If
Else
On Error Resume Next
Close #f
On Error GoTo 0
Err.Raise vbObjectError + 1, "clsMp3TagV1", m_sMp3File & " is not a
valid MP3 file."
End If
End If

On Error Resume Next
Close #f
On Error GoTo 0
Err.Clear
End Sub

Private Function RTrimZ(s As String) As String
Dim p As Long
'
p = InStr(1, s, Chr(0))
If p Then
RTrimZ = RTrim(Left(s, p - 1))
Else
RTrimZ = RTrim(s)
End If
End Function
''' END CODE '''


Name the class clsMp3TagV1, and use it like this:

Sub testMp3Tag()
Dim tag As clsMp3TagV1, sav As String

Set tag = New clsMp3TagV1
With tag
.MP3File = "C:\temp\test1.mp3"
Debug.Print .Artist; " - "; .Album; " - "; .Title

sav = .Artist 'Save current Artist name
.Artist = "Stuart McCall"
.Update 'Change name
Debug.Print .Artist; " - "; .Album; " - "; .Title

.Artist = sav
.Update 'Restore original name
Debug.Print .Artist; " - "; .Album; " - "; .Title
End With
Set tag = Nothing
End Sub

Replacing "C:\temp\test1.mp3" with your file path.
 
I just discovered a little bug in my class module. This property procedure:
Public Property Get Genre() As Byte
Genre = RTrimZ(m_sGenre)
End Property

ought to read:

Public Property Get Genre() As Byte
Genre = m_sGenre
End Property
 
Back
Top