Option Explicit
'Source VB6
'http://www.freevbcode.com/ShowCode.asp?ID=2646
'
'adaptée en VBA-Excel le 16.05.2007
'
Public i As Integer
Public strEmptyString As String
Public B As Byte
Public s As String
Public Version As Byte
Sub Test()
Dim NomFichier As String
Dim TailleFichier As Long
Dim NumFich As Integer
Dim PositionEntete As Long
Dim Tag2 As String
Dim R As Double
NomFichier = "C:\dossier\maMusique.mp3"
NumFich = FreeFile
Open NomFichier For Binary As #NumFich
TailleFichier = LOF(NumFich)
Get #NumFich, 1, B
'If B <> 255 Then '(255: début ID3v2)
'If B <> 73 Then Exit Sub
'End If
PositionEntete = 1
Get #NumFich, 2, B
If (B < 250 Or B > 251) Then
'We have an ID3v2 tag
If B = 68 Then
Get #NumFich, 3, B
If B = 51 Then
Get #NumFich, 4, Version
Get #NumFich, 7, B
R = B * 20917152
Get #NumFich, 8, B
R = R + (B * 16384)
Get #NumFich, 9, B
R = R + (B * 128)
Get #NumFich, 10, B
R = R + B
If R > TailleFichier Or R > 2147483647 Then Exit Sub
Tag2 = Space$(R)
Get #NumFich, 11, Tag2
PositionEntete = R + 11
End If
End If
Else
'Pas de tag ID3v2
End If
GetID3v2Tag1 Tag2 'Pass the Id3v2 TagId to the GetID3v2Tag1 function
End Sub
Private Function GetID3v2Tag1(Tag2 As String) As Boolean
'On Error GoTo errorhandler
Dim TitleField As String
Dim ArtistField As String
Dim AlbumField As String
Dim YearField As String
Dim GenreField As String
Dim FieldSize As Long
Dim SizeOffset As Long
Dim FieldOffset As Long
Dim TrackNbr As String
Dim SituationField As String
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Determine if the ID3v2 tag is ID3v2.2 or ID3v2.3
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Notes: I haven't tested reading an MP3 file that has a ID3v2.2 tag
Select Case Version
Case 2 'ID3v2.2
'Set the fieldnames for version 2.0
TitleField = "TT2"
ArtistField = "TOA"
AlbumField = "TAL"
YearField = "TYE"
GenreField = "TCO"
FieldOffset = 7
SizeOffset = 5
TrackNbr = "TRCK"
Case 3 'ID3v2.3
'Set the fieldnames for version 3.0
TitleField = "TIT2"
ArtistField = "TPE1"
AlbumField = "TALB"
YearField = "TYER"
GenreField = "TCON"
TrackNbr = "TRCK"
FieldOffset = 11
SizeOffset = 7
Case Else
'We don't have a valid ID3v2 tag, so bail
Exit Function
End Select
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Extract track title
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
i = InStr(Tag2, TitleField)
If i > 0 Then
'read the title
FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
If Version = 3 Then
'check for compressed or encrypted field
B = Asc(Mid$(Tag2, i + 9))
If (B And 128) = True Or (B And 64) = True Then GoTo ReadAlbum
End If
Debug.Print Mid$(Tag2, i + FieldOffset, FieldSize)
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Extract album title
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ReadAlbum:
i = InStr(Tag2, AlbumField)
If i > 0 Then
FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
If Version = 3 Then
'check for compressed or encrypted field
B = Asc(Mid$(Tag2, i + 9))
If (B And 128) = 128 Or (B And 64) = 64 Then GoTo ReadArtist
End If
Debug.Print Mid$(Tag2, i + FieldOffset, FieldSize)
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Extract artist name
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ReadArtist:
i = InStr(Tag2, ArtistField)
If i > 0 Then
FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
If Version = 3 Then
'check for compressed or encrypted field
B = Asc(Mid$(Tag2, i + 9))
If (B And 128) = 128 Or (B And 64) = 64 Then GoTo ReadYear
End If
Debug.Print Mid$(Tag2, i + FieldOffset, FieldSize)
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Extract year title
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ReadYear:
i = InStr(Tag2, YearField)
If i > 0 Then
FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
If Version = 3 Then
'check for compressed or encrypted field
B = Asc(Mid$(Tag2, i + 9))
If (B And 128) = 128 Or (B And 64) = 64 Then GoTo ReadGenre
End If
Debug.Print Mid$(Tag2, i + FieldOffset, FieldSize)
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Extract genre
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ReadGenre:
i = InStr(Tag2, GenreField)
If i > 0 Then
FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
If Version = 3 Then
'check for compressed or encrypted field
B = Asc(Mid$(Tag2, i + 9))
If (B And 128) = 128 Or (B And 64) = 64 Then GoTo ReadTrackNbr
End If
s = Mid$(Tag2, i + FieldOffset, FieldSize)
If Left$(s, 1) = "(" Then
Debug.Print Val(Mid$(s, 2, 2))
'cboGenre2.ListIndex = Val(txtGenre.Text) + 1
Else
'i = InStr(gsGenres, s & Space$(22 - Len(s)))
Debug.Print i
'cboGenre2.ListIndex = i
If i > 0 Then
Debug.Print Int(i / 22)
End If
End If
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Extract track number
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ReadTrackNbr:
i = InStr(Tag2, TrackNbr)
If i > 0 Then
FieldSize = Asc(Mid$(Tag2, i + SizeOffset)) - 1
If Version = 3 Then
'check for compressed or encrypted field
B = Asc(Mid$(Tag2, i + 9))
If (B And 128) = 128 Or (B And 64) = 64 Then GoTo Done
End If
Debug.Print Mid$(Tag2, i + FieldOffset, FieldSize)
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' We're done looking for ID3v2 info
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Done:
Exit Function
'errorhandler:
'Err.Clear
'Resume Next
End Function