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

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!
 
R

Robert Morley

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
 
S

Stuart McCall

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.
 
S

Stuart McCall

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top