Type MP3Info<br>
Bitrate As Integer<br>
Frequency As Long<br>
Mode As String<br>
Emphasis As String<br>
'ModeExtension As String<br>
MpegVersion As Integer<br>
MpegLayer As Integer<br>
Padding As String<br>
CRC As String<br>
Duration As Long<br>
CopyRight As String<br>
Original As String<br>
PrivateBit As String<br>
HasTag As Boolean<br>
Tag As String<br>
Songname As String<br>
Artist As String<br>
Album As String<br>
Year As String<br>
Comment As String<br>
Genre As Integer<br>
Track As String<br>
VBR As Boolean<br>
Frames As Integer<br>
End Type<br>
Public GetMP3Info As MP3Info<br>
<br>
Public Function BinaryHeader(filename As String, ReadTag As Boolean, ReadHeader As Boolean) As String<br>
Dim ByteArray(4) As Byte<br>
Dim XingH As String * 4<br>
FIO% = FreeFile<br>
Open filename For Binary Access Read As FIO%<br>
n& = LOF(FIO%): If n& < 256 Then Close FIO%: Return 'ny<br>
If ReadHeader = False Then GoTo 5: 'if we only want to read the IDtag goto 5<br>
Dim x As Byte<br>
'''''start check startposition for header''''''''''''<br>
'''''if start position <>1 then id3v2 tag exists'''''<br>
For i = 1 To 5000 'check up to 5000 bytes for the header<br>
Get #FIO%, i, x<br>
If x = 255 Then 'header always start with 255 followed by 250 or 251<br>
Get #FIO%, i + 1, x<br>
If x > 249 And x < 252 Then<br>
Headstart = i 'set header start position<br>
Exit For<br>
End If<br>
End If<br>
Next i<br>
'''end check start position for header'''''''''''''<br>
<br>
''start check for XingHeader'''<br>
Get #1, Headstart + 36, XingH<br>
If XingH = "Xing" Then<br>
GetMP3Info.VBR = True<br>
For Z = 1 To 4 '<br>
Get #1, Headstart + 43 + Z, ByteArray(Z) 'get framelength to array<br>
Next Z<br>
Frames = BinToDec(ByteToBit(ByteArray)) 'calculate # of frames<br>
GetMP3Info.Frames = Frames 'set frames<br>
Else: GetMP3Info.VBR = False<br>
End If<br>
'''end check for XingHeader<br>
<br>
'''start extract the first 4 bytes (32 bits) to an array<br>
For Z = 1 To 4 '<br>
Get #1, Headstart + Z - 1, ByteArray(Z)<br>
Next Z<br>
'''stop extract the first 4 bytes (32 bits) to an array<br>
5:<br>
If ReadTag = False Then GoTo 10 'if we dont want to read the tag goto 10<br>
''''start id3 tag''''''''''''''''''''''''''''''''''''''''''''''''<br>
Dim Inbuf As String * 256<br>
Get #FIO%, (n& - 255), Inbuf: Close FIO% 'ny<br>
p = InStr(1, Inbuf, "tag", 1) 'ny<br>
If p = 0 Then<br>
With GetMP3Info<br>
.HasTag = False<br>
.Songname = ""<br>
.Artist = ""<br>
.Album = ""<br>
.Year = ""<br>
.Comment = ""<br>
.Track = ""<br>
.Genre = 255<br>
End With<br>
Else<br>
With GetMP3Info<br>
.HasTag = True<br>
.Songname = RTrim(Mid$(Inbuf, p + 3, 30))<br>
.Artist = RTrim(Mid$(Inbuf, p + 33, 30))<br>
.Album = RTrim(Mid$(Inbuf, p + 63, 30))<br>
.Year = RTrim(Mid$(Inbuf, p + 93, 4))<br>
.Comment = RTrim(Mid$(Inbuf, p + 97, 29))<br>
.Track = RTrim(Mid$(Inbuf, p + 126, 1))<br>
.Genre = Asc(RTrim(Mid$(Inbuf, p + 127, 1)))<br>
End With<br>
End If<br>
''''stop id3 tag''''''''''''''''''''''''''''''<br>
10:<br>
Close FIO%<br>
BinaryHeader = ByteToBit(ByteArray)<br>
End Function<br>
<br>
''this function converts Binary string to decimal integer<br>
Public Function BinToDec(BinValue As String) As Long<br>
BinToDec = 0<br>
For i = 1 To Len(BinValue)<br>
If Mid(BinValue, i, 1) = 1 Then<br>
BinToDec = BinToDec + 2 ^ (Len(BinValue) - i)<br>
End If<br>
Next i<br>
End Function<br>
<br>
Public Function ByteToBit(ByteArray) As String<br>
'convert 4*1 byte array to 4*8 bits'''''<br>
ByteToBit = ""<br>
For Z = 1 To 4<br>
For i = 7 To 0 Step -1<br>
If Int(ByteArray(Z) / (2 ^ i)) = 1 Then<br>
ByteToBit = ByteToBit & "1"<br>
ByteArray(Z) = ByteArray(Z) - (2 ^ i)<br>
Else<br>
If ByteToBit <> "" Then<br>
ByteToBit = ByteToBit & "0"<br>
End If<br>
End If<br>
Next<br>
Next Z<br>
End Function<br>
<br>
Public Function GenreText(Index As Integer) As String<br>
Matrix = Array("Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", _<br>
"Hip -Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&b", "Rap", "Reggae", _<br>
"Rock", "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", _<br>
"Soundtrack", "Euro -Techno", "Ambient", "Trip -Hop", "Vocal", "Jazz Funk", "Fusion", _<br>
"Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", _<br>
"Noise", "AlternRock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", _<br>
"Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno -Industrial", "Electronic", _<br>
"Pop -Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", "Top 40", _<br>
"Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", "New Wave", _<br>
"Psychadelic", "Rave", "Showtunes", "Trailer", "Lo -Fi", "Tribal", "Acid Punk", "Acid Jazz", _<br>
"Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk/Rock", "National Folk", _<br>
"Swing", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", _<br>
"Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", _<br>
"Acoustic", "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", _<br>
"Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", _<br>
"Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "A Cappella", _<br>
"Euro - House", "Dance Hall", "Goa", "Drum & Bass", "Club - House", "Hardcore", "Terror", "Indie", "BritPop", _<br>
"Negerpunk", "Polsk Punk", "Beat", "Christian Gangsta Rap", "Heavy Metal", "Black Metal", "Crossover", _<br>
"Contemporary Christian", "Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "JPop", "Synthpop"

<br>
GenreText = Matrix(Index)<br>
End Function<br>
<br>
Public Function ReadMP3(filename As String, ReadTag As Boolean, ReadHeader As Boolean) As MP3Info<br>
bin = BinaryHeader(filename, ReadTag, ReadHeader) 'extract all 32 bits<br>
<br>
If ReadHeader = False Then Exit Function<br>
Version = Array(25, 0, 2, 1) 'Mpegversion table<br>
MpegVersion = Version(BinToDec(Mid(bin, 12, 2))) 'get mpegversion from table<br>
layer = Array(0, 3, 2, 1) 'layer table<br>
MpegLayer = layer(BinToDec(Mid(bin, 14, 2))) 'get layer from table<br>
SMode = Array("stereo", "joint stereo", "dual channel", "single channel"

'mode table<br>
Mode = SMode(BinToDec(Mid(bin, 25, 2))) 'get mode from table<br>
Emph = Array("no", "50/15", "reserved", "CCITT J 17"

'empasis table<br>
Emphasis = Emph(BinToDec(Mid(bin, 31, 2))) 'get empasis from table<br>
Select Case MpegVersion 'look for version to create right table<br>
Case 1 'for version 1<br>
Freq = Array(44100, 48000, 32000)<br>
Case 2 Or 25 'for version 2 or 2.5<br>
Freq = Array(22050, 24000, 16000)<br>
Case Else<br>
Frequency = 0<br>
Exit Function<br>
End Select<br>
Frequency = Freq(BinToDec(Mid(bin, 21, 2))) 'look for frequency in table<br>
If GetMP3Info.VBR = True Then 'check if variable bitrate<br>
Temp = Array(, 12, 144, 144) 'define to calculate correct bitrate<br>
Bitrate = (FileLen(filename) * Frequency) / (Int(GetMP3Info.Frames)) / 1000 / Temp(MpegLayer)<br>
Else 'if not variable bitrate<br>
<br>
Dim LayerVersion As String<br>
LayerVersion = MpegVersion & MpegLayer 'combine version and layer to string<br>
Select Case Val(LayerVersion) 'look for the right bitrate table<br>
Case 11 'Version 1, Layer 1<br>
Brate = Array(0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448)<br>
Case 12 'V1 L1<br>
Brate = Array(0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384)<br>
Case 13 'V1 L3<br>
Brate = Array(0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320)<br>
Case 21 Or 251 'V2 L1 and 'V2.5 L1<br>
Brate = Array(0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256)<br>
Case 22 Or 252 Or 23 Or 253 ''V2 L2 and 'V2.5 L2 etc...<br>
Brate = Array(0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160)<br>
Case Else 'if variable bitrate<br>
Bitrate = 1 'e.g. for Variable bitrate<br>
Exit Function<br>
End Select<br>
Bitrate = Brate(BinToDec(Mid(bin, 17, 4)))<br>
End If<br>
<br>
<br>
NoYes = Array("no", "yes"

<br>
Original = NoYes(Mid(bin, 30, 1)) 'Set original bit<br>
CopyRight = NoYes(Mid(bin, 29, 1)) 'Set copyright bit<br>
Padding = NoYes(Mid(bin, 23, 1)) 'get padding bit<br>
PrivateBit = NoYes(Mid(bin, 24, 1))<br>
YesNo = Array("yes", "no"

'CRC table<br>
CRC = YesNo(Mid(bin, 16, 1)) 'Get CRC<br>
ms = (FileLen(filename) * 8) / Bitrate 'calculate duration<br>
Duration = Int(ms / 1000)<br>
With GetMP3Info 'set values<br>
.Bitrate = Bitrate '<br>
.CRC = CRC<br>
.Duration = Duration<br>
.Emphasis = Emphasis<br>
.Frequency = Frequency<br>
.Mode = Mode<br>
.MpegLayer = MpegLayer<br>
.MpegVersion = MpegVersion<br>
.Padding = Padding<br>
.Original = Original<br>
.CopyRight = CopyRight<br>
.PrivateBit = PrivateBit<br>
End With<br>
End Function<br>
<br>
Public Function WriteTag(filename As String, Songname As String, _<br>
Artist As String, Album As String, Year As String, Comment As String, Genre As Integer) As Long<br>
Tag = "TAG"<br>
Dim sn As String * 30<br>
Dim com As String * 30<br>
Dim art As String * 30<br>
Dim alb As String * 30<br>
Dim yr As String * 4<br>
Dim gr As String * 1<br>
sn = Songname<br>
com = Comment<br>
art = Artist<br>
alb = Album<br>
yr = Year<br>
gr = Chr(Genre)<br>
Open filename For Binary Access Write As #1<br>
Seek #1, FileLen(filename) - 127<br>
Put #1, , Tag<br>
Put #1, , sn<br>
Put #1, , art<br>
Put #1, , alb<br>
Put #1, , yr<br>
Put #1, , com<br>
Put #1, , gr<br>
Close #1<br>
<br>
End Function<br>
<br>
Private Sub Command1_Click()<br>
Dim filename As String<br>
filename = "c:\2.mp3"<br>
Call WriteTag(filename, "Loooove", "Namnnnnn", "Alb1", "1985", "Braa", 54)<br>
End Sub<br>
<br>
Succes <p>Eric De Decker<br><a href=mailto:vbg.be@vbgroup.nl>vbg.be@vbgroup.nl</a><br><a href=
Basic Center</a><br>