[Gambas-user] Music.Length
Lee McPherson
leemcpherson at ...626...
Sun Jun 22 06:02:52 CEST 2008
Wow, this looks to be very useful! And I wasn't even looking for it...
Thanks!
-Lee
admin at ...1080... wrote:
> Hi
>
> Once i got a routine (don't remember from, sorry) for mp3-files witch
> can extract many properties.
> Maybe this can help you somehow.
>
> Regards, Werner
>
>
> ' Gambas class file
> '
> '***
> '*** Begin Declaration section
> '***
> PUBLIC OK AS Boolean
>
> PUBLIC Duration AS String
> PUBLIC Frequency AS String
> PUBLIC Mode AS String
> PUBLIC IntensitySterio AS String
> PUBLIC MSSterio AS String
> PUBLIC MpegLayer AS String
> PUBLIC MpegVersion AS String
> PUBLIC BitRate AS String
> PUBLIC Songname AS String
> PUBLIC Artist AS String
> PUBLIC Album AS String
> PUBLIC SongYear AS String
> PUBLIC Comment AS String
> PUBLIC Genre AS String
> PUBLIC Track AS String
> PUBLIC Protection AS String
> PUBLIC Copyright AS String
> PUBLIC Original AS String
> PUBLIC Emphasis AS String
> PUBLIC VBR AS Boolean
> PUBLIC ModeExtension AS Boolean
> PUBLIC Minutes AS Integer
> PUBLIC Seconds AS Integer
> PUBLIC FrameLength AS Integer
>
> PRIVATE GenreArray AS NEW String[]
> '***
> '*** End Declaration section
> '***
> '*** Begin Constructor section
> '***
> PUBLIC SUB _new()
> BitRate = ""
> Frequency = ""
> Duration = ""
> Songname = ""
> Artist = ""
> Album = ""
> SongYear = ""
> Comment = ""
> Genre = ""
> Track = ""
> MpegVersion = ""
> MpegLayer = ""
> Protection = ""
> Mode = ""
> VBR = FALSE
> Minutes = 0
> Seconds = 0
> FrameLength = 0
>
> LoadGenre()
> END
> '***
> '*** End Constructor section
> '***
> '*** Begin Subroutine section
> '***
> PRIVATE SUB LoadGenre()
> GenreArray.Resize(126)
>
> GenreArray[0] = "Blues"
> GenreArray[1] = "Classic Rock"
> GenreArray[2] = "Country"
> GenreArray[3] = "Dance"
> GenreArray[4] = "Disco"
> GenreArray[5] = "Funk"
> GenreArray[6] = "Grunge"
> GenreArray[7] = "Hip-Hop"
> GenreArray[8] = "Jazz"
> GenreArray[9] = "Metal"
> GenreArray[10] = "New Age"
> GenreArray[11] = "Oldies"
> GenreArray[12] = "Other"
> GenreArray[13] = "Pop"
> GenreArray[14] = "R&B"
> GenreArray[15] = "Rap"
> GenreArray[16] = "Reggae"
> GenreArray[17] = "Rock"
> GenreArray[18] = "Techno"
> GenreArray[19] = "Industrial"
> GenreArray[20] = "Alternative"
> GenreArray[21] = "Ska"
> GenreArray[22] = "Death Metal"
> GenreArray[23] = "Pranks"
> GenreArray[24] = "Soundtrack"
> GenreArray[25] = "Euro-Techno"
> GenreArray[26] = "Ambient"
> GenreArray[27] = "Trip-Hop"
> GenreArray[28] = "Vocal"
> GenreArray[29] = "Jazz+Funk"
> GenreArray[30] = "Fusion"
> GenreArray[31] = "Trance"
> GenreArray[32] = "Classical"
> GenreArray[33] = "Instrumental"
> GenreArray[34] = "Acid"
> GenreArray[35] = "House"
> GenreArray[36] = "Game"
> GenreArray[37] = "Sound Clip"
> GenreArray[38] = "Gospel"
> GenreArray[39] = "Noise"
> GenreArray[40] = "AlternRock"
> GenreArray[41] = "Bass"
> GenreArray[42] = "Soul"
> GenreArray[43] = "Punk"
> GenreArray[44] = "Space"
> GenreArray[45] = "Meditative"
> GenreArray[46] = "Instrumental Pop"
> GenreArray[47] = "Instrumental Rock"
> GenreArray[48] = "Ethnic"
> GenreArray[49] = "Gothic"
> GenreArray[50] = "Darkwave"
> GenreArray[51] = "Techno-Indistrial"
> GenreArray[52] = "Electronic"
> GenreArray[53] = "Pop-Folk"
> GenreArray[54] = "Eurodance"
> GenreArray[55] = "Dream"
> GenreArray[56] = "Southern Rock"
> GenreArray[57] = "Comedy"
> GenreArray[58] = "Cult"
> GenreArray[59] = "Gansta"
> GenreArray[60] = "Top 40"
> GenreArray[61] = "Christian Rap"
> GenreArray[62] = "Pop/Funk"
> GenreArray[63] = "Jungle"
> GenreArray[64] = "Native American"
> GenreArray[65] = "Cabaret"
> GenreArray[66] = "New Wave"
> GenreArray[67] = "Psychaledic"
> GenreArray[68] = "Rave"
> GenreArray[69] = "Showtunes"
> GenreArray[70] = "Trailer"
> GenreArray[71] = "Lo-Fi"
> GenreArray[72] = "Tribal"
> GenreArray[73] = "Acid Punk"
> GenreArray[74] = "Acid Jazz"
> GenreArray[75] = "Polka"
> GenreArray[76] = "Retro"
> GenreArray[77] = "Musical"
> GenreArray[78] = "Rock & Roll"
> GenreArray[79] = "Hard Rock"
> GenreArray[80] = "Folk"
> GenreArray[81] = "Folk-Rock"
> GenreArray[82] = "National Folk"
> GenreArray[83] = "Swing"
> GenreArray[84] = "Fast Fusion"
> GenreArray[85] = "Bebop"
> GenreArray[86] = "Latin"
> GenreArray[87] = "Revival"
> GenreArray[88] = "Celtic"
> GenreArray[89] = "Bluegrass"
> GenreArray[90] = "Avantgarde"
> GenreArray[91] = "Gothic Rock"
> GenreArray[92] = "Progressive Rock"
> GenreArray[93] = "Psychadelic Rock"
> GenreArray[94] = "Symphonic Rock"
> GenreArray[95] = "Slow Rock"
> GenreArray[96] = "Big Band"
> GenreArray[97] = "Chorus"
> GenreArray[98] = "Easy Listening"
> GenreArray[99] = "Acoustic"
> GenreArray[100] = "Humour"
> GenreArray[101] = "Speech"
> GenreArray[102] = "Chanson"
> GenreArray[103] = "Opera"
> GenreArray[104] = "Chamber Music"
> GenreArray[105] = "Sonata"
> GenreArray[106] = "Symphony"
> GenreArray[107] = "Booty Bass"
> GenreArray[108] = "Primus"
> GenreArray[109] = "Porn Groove"
> GenreArray[110] = "Satire"
> GenreArray[111] = "Slow Jam"
> GenreArray[112] = "Club"
> GenreArray[113] = "Tango"
> GenreArray[114] = "Samba"
> GenreArray[115] = "Folklore"
> GenreArray[116] = "Ballad"
> GenreArray[117] = "Power Ballad"
> GenreArray[118] = "Rhythmic Soul"
> GenreArray[119] = "Freestyle"
> GenreArray[120] = "Duet"
> GenreArray[121] = "Punk Rock"
> GenreArray[122] = "Drum Solo"
> GenreArray[123] = "A Capella"
> GenreArray[124] = "Euro-House"
> GenreArray[125] = "Dance Hall"
> END
> '***
> '*** End Subroutine section
> '***
> '*** Begin Function section
> '***
> PRIVATE FUNCTION BinToDec(BinValue AS String) AS Integer
> DIM i AS Integer
> DIM iDec AS Integer
>
> FOR i = 1 TO Len(BinValue)
> IF Mid(BinValue, i, 1) = 1 THEN
> iDec = iDec + 2 ^ (Len(BinValue) - i)
> ENDIF
> NEXT
>
> RETURN iDec
> END
>
> PRIVATE FUNCTION ByteToBit(ByteArray AS Byte[]) AS String
> DIM sBit AS String
> DIM z AS Integer
> DIM i AS Integer
> DIM Bytes AS Byte
>
> 'convert 4*1 byte array to 4*8 bits'''''
> sBit = ""
> FOR z = 0 TO 3
> Bytes = ByteArray[z]
> FOR i = 7 TO 0 STEP -1
> IF Int(Bytes / (2 ^ i)) = 1 THEN
> sBit = sBit & "1"
> Bytes = Bytes - (2 ^ i)
> ELSE IF sBit <> "" THEN
> sBit = sBit & "0"
> ENDIF
> NEXT
> NEXT
>
> RETURN sBit
> END
>
> PRIVATE FUNCTION GetGenreFromID(iListGenre AS Integer) AS String
> DIM GenreFromID AS String
>
> IF iListGenre > -1 AND iListGenre < 126 THEN
> GenreFromID = GenreArray[iListGenre]
> ELSE
> GenreFromID = "Unknown"
> ENDIF
>
> RETURN GenreFromID
> END
>
> PRIVATE FUNCTION ReadHeader(sFileName AS String) AS Boolean
> DIM VersionLayer AS NEW String[]
> DIM SMode AS NEW String[]
> DIM MpVersion AS NEW String[]
> DIM MpLayer AS NEW String[]
> DIM MpProtection AS NEW String[]
> DIM MpOriginal AS NEW String[]
> DIM MpCopyright AS NEW String[]
> DIM MpEmphasis AS NEW String[]
> DIM ByteArray AS NEW Byte[]
>
> DIM hFile AS File
> DIM sBin AS String
> DIM XingH AS String
> DIM x AS Byte
> DIM Bytes AS Byte
> DIM i AS Integer
> DIM z AS Integer
> DIM HeadStart AS Integer
> DIM Frames AS Integer
> DIM Calc AS Integer
> DIM LenFile AS Integer
> DIM Padding AS Integer
> DIM ModeExt AS Integer
> DIM vTemp AS Variant
> DIM Brate AS Variant
> DIM Freq AS Variant
>
> SMode.Resize(4)
> MpLayer.Resize(4)
> ByteArray.Resize(4)
> MpVersion.Resize(4)
> MpProtection.Resize(2)
> VersionLayer.Resize(4)
> MpOriginal.Resize(2)
> MpCopyright.Resize(2)
> MpEmphasis.Resize(4)
>
> 'tables
> VersionLayer[0] = "0"
> VersionLayer[1] = "3"
> VersionLayer[2] = "2"
> VersionLayer[3] = "1"
>
> SMode[0] = "Stereo"
> SMode[1] = "Joint stereo"
> SMode[2] = "Dual channel"
> SMode[3] = "Single channel"
>
> MpVersion[0] = "MPEG Version 2.5"
> MpVersion[1] = "None"
> MpVersion[2] = "MPEG Version 2"
> MpVersion[3] = "MPEG Version 1"
>
> MpLayer[0] = "None"
> MpLayer[1] = "Layer III"
> MpLayer[2] = "Layer II"
> MpLayer[3] = "Layer I"
>
> MpProtection[0] = "Protected by CRC (16bit CRC)"
> MpProtection[1] = "Not protected"
>
> MpOriginal[0] = "Copy of original media"
> MpOriginal[1] = "Original media"
>
> MpCopyright[0] = "Audio is not copyryghted"
> MpCopyright[1] = "Audio is copyrighted"
>
> MpEmphasis[0] = "None"
> MpEmphasis[1] = "50/15 ms"
> MpEmphasis[2] = "None"
> MpEmphasis[3] = "CCIT J.17"
>
> 'read the header
> OPEN sFileName FOR READ AS #hFile
> IF Lof(hFile) < 256 THEN
> CLOSE #hFile
> RETURN FALSE
> ENDIF
>
> '''''start check startposition for header''''''''''''
> '''''if start position <>1 then id3v2 tag exists'''''
> FOR i = 0 TO Lof(hFile) 'check the whole file for the header
> READ #hFile, x
> IF x = 255 THEN 'header always start with 255
> followed by 250 or 251
> READ #hFile, x
> IF x > 249 AND x < 252 THEN
> HeadStart = i 'set header start position
> BREAK
> ENDIF
> ENDIF
> NEXT
>
> 'no header start position was found
> IF HeadStart = 0 THEN
> RETURN FALSE
> ENDIF
> '''end check start position for header'''''''''''''
>
> ''start check for XingHeader'''
> SEEK #hFile, HeadStart + 36
> READ #hFile, XingH, 4
> IF XingH = "Xing" THEN
> VBR = TRUE
> SEEK #hFile, HeadStart + 43
> FOR z = 0 TO 3
> READ #hFile, Bytes 'get framelength to array
> ByteArray[z] = Bytes
> NEXT
> Frames = BinToDec(ByteToBit(ByteArray)) 'calculate # of frames
> ELSE
> VBR = FALSE
> ENDIF
> '''end check for XingHeader
>
> '''start extract the first 4 bytes (32 bits) to an array
> SEEK #hFile, HeadStart
> FOR z = 0 TO 3
> READ #hFile, Bytes
> ByteArray[z] = Bytes
> NEXT
> '''stop extract the first 4 bytes (32 bits) to an array
> LenFile = Lof(hFile)
> CLOSE #hFile
>
> 'header string
> sBin = ByteToBit(ByteArray)
>
> 'get mpegversion from table
> MpegVersion = VersionLayer[BinToDec(Mid(sBin, 12, 2))]
>
> 'get layer from table
> MpegLayer = VersionLayer[BinToDec(Mid(sBin, 14, 2))]
>
> 'get mode from table
> Mode = SMode[BinToDec(Mid(sBin, 25, 2))]
>
> 'get mode extension from table
> IF BinToDec(Mid(sBin, 25, 2)) = 1 THEN
> ModeExt = BinToDec(Mid(sBin, 27, 2))
> SELECT CASE ModeExt
> CASE 0
> IntensitySterio = "Off"
> MSSterio = "Off"
> CASE 1
> IntensitySterio = "On"
> MSSterio = "Off"
> CASE 2
> IntensitySterio = "Off"
> MSSterio = "On"
> CASE 3
> IntensitySterio = "On"
> MSSterio = "On"
> END SELECT
> ModeExtension = TRUE
> ELSE
> ModeExtension = FALSE
> IntensitySterio = "None"
> MSSterio = "None"
> ENDIF
>
> 'look for version to create right table
> 'ok = TRUE
> SELECT CASE Val(MpegVersion)
> CASE 1
> 'for version 1
> Freq = Array(44100, 48000, 32000)
> CASE 2 OR 25
> 'for version 2 or 2.5
> Freq = Array(22050, 24000, 16000)
> CASE ELSE
> 'Frequency = 0
> 'ok = FALSE 'RETURN TRUE 'FALSE
> Array(0, 0, 0)
> END SELECT
>
> 'look for frequency in table
> 'IF ok THEN
> Frequency = Freq[BinToDec(Mid(sBin, 21, 2))]
>
> IF VBR = TRUE THEN
> 'define to calculate correct bitrate
> vTemp = Array(0, 12, 144, 144)
> BitRate = (Lof(sFileName) * Frequency) / (Int(Frames)) / 1000 /
> vTemp[MpegLayer]
> ELSE
> 'look for the right bitrate table
> ' ok = TRUE
> SELECT CASE Val(MpegVersion & MpegLayer)
> CASE 11
> 'Version 1, Layer 1
> Brate = Array(0, 32, 64, 96, 128, 160, 192, 224, 256, 288,
> 320, 352, 384, 416, 448)
> CASE 12
> 'V1 L1
> Brate = Array(0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192,
> 224, 256, 320, 384)
> CASE 13
> 'V1 L3
> Brate = Array(0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160,
> 192, 224, 256, 320)
> CASE 21 OR 251
> 'V2 L1 and 'V2.5 L1
> Brate = Array(0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160,
> 176, 192, 224, 256)
> CASE 22 OR 252 OR 23 OR 253
> 'V2 L2 and 'V2.5 L2 etc...
> Brate = Array(0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112,
> 128, 144, 160)
> CASE ELSE
> 'if variable bitrate
> ' BitRate = Str(1)
> 'ok = FALSE 'RETURN TRUE 'FALSE
> Brate = Array(0, 1, 2, 3, 4, 5, 6, 7, 8,9 , 10, 11, 12, 13, 14)
> END SELECT
> 'IF ok THEN
> BitRate = Str(Brate[BinToDec(Mid(sBin, 17, 4))])
> ENDIF
>
> 'if there is a decimal place, then parse it off
> IF Instr(BitRate, ".") THEN
> BitRate = Left(BitRate, Instr(BitRate, ".") - 1)
> ENDIF
>
> 'calculate duration
> Calc = Int((LenFile * 8) / Val(BitRate) / 1000)
> Minutes = Calc \ 60
> IF Minutes < 10 THEN
> Duration = "0" & Str(Minutes) & "m "
> ELSE
> Duration = Str(Minutes) & "m "
> ENDIF
>
> Seconds = Calc - (Calc \ 60) * 60
> IF Seconds < 10 THEN
> Duration = Duration & "0" & Str(Seconds) & "s"
> ELSE
> Duration = Duration & Str(Seconds) & "s"
> ENDIF
>
> 'get padding bit from table
> Padding = BinToDec(Mid(sBin, 23, 1))
>
> 'get discription from table
> MpegVersion = MpVersion[BinToDec(Mid(sBin, 12, 2))]
> MpegLayer = MpLayer[BinToDec(Mid(sBin, 14, 2))]
>
> 'get protection from table
> Protection = MpProtection[BinToDec(Mid(sBin, 16, 1))]
>
> 'calc frame length
> FrameLength = ((144 * (Val(BitRate) * 1000)) / (Val(Frequency) +
> Padding))
>
> 'get copyright from table
> Copyright = MpCopyright[BinToDec(Mid(sBin, 29, 1))]
>
> 'get original from table
> Original = MpOriginal[BinToDec(Mid(sBin, 30, 1))]
>
> 'get emphasis from table
> Emphasis = MpEmphasis[BinToDec(Mid(sBin, 31, 2))]
>
> Frequency = Frequency & " Hz"
> BitRate = BitRate & " Kbit/s"
> FINALLY
> RETURN TRUE
> CATCH
> CLOSE #hFile
> END
>
> PRIVATE FUNCTION ReadID3(sFileName AS String) AS Boolean
> DIM hFile AS File
> DIM TagString AS String 'holds the string read from the mp3
> DIM TempString AS String
> DIM strStrip AS String
> DIM s AS String 'holds temp strings
> DIM r AS Integer
> DIM x AS Integer
> DIM i AS Integer 'holds temp int bytes
> DIM FieldSize AS Integer
> DIM SizeOffset AS Integer
> DIM FieldOffset AS Integer
> DIM b AS Byte 'holds temp byte values
> DIM Version AS Byte
>
> 'fixed length vars for reading v1ID3v1 tags
> DIM v1ID AS String
> DIM v1Title AS String
> DIM v1Artist AS String
> DIM v1Album AS String
> DIM v1Year AS String
> DIM v1Comment AS String
> DIM v1Genre AS Byte
>
> 'vars that hold v1ID3v2 attibutes
> DIM v2Title AS String
> DIM v2Artist AS String
> DIM v2Album AS String
> DIM v2Year AS String
> DIM v2Genre AS String
> DIM v2Track AS String
>
> 'Open the file so we can read it
> OPEN sFileName FOR READ AS #hFile
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ' Check for an ID3v1 tag
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> SEEK #hFile, Lof(hFile) - 128
> READ #hFile, v1ID, 3
> IF v1ID = "TAG" THEN 'If "TAG" is present, then we have a valv1ID
> v1ID3v1 tag and will extract all available v1ID3v1 info from the file
> READ #hFile, v1Title, 30 'Always limited to 30 characters
> READ #hFile, v1Artist, 30 'Always limited to 30 characters
> READ #hFile, v1Album, 30 'Always limited to 30 characters
> READ #hFile, v1Year, 4 'Always limited to 4 characters
> READ #hFile, v1Comment, 30 'Always limited to 30 characters
> READ #hFile, v1Genre, 1 'Always limited to 1 byte (?)
>
> Songname = v1Title
> Artist = v1Artist
> Album = v1Album
> SongYear = v1Year
> Comment = v1Comment
> Genre = v1Genre
>
> 'get rv1ID of " " on the right sv1IDe of the string
> DO UNTIL Right(Songname, 1) <> " "
> Songname = Left(Songname, Len(Songname) - 1)
> LOOP
>
> DO UNTIL Right(Artist, 1) <> " "
> Artist = Left(Artist, Len(Artist) - 1)
> LOOP
>
> DO UNTIL Right(Album, 1) <> " "
> Album = Left(Album, Len(Album) - 1)
> LOOP
>
> DO UNTIL Right(SongYear, 1) <> " "
> SongYear = Left(SongYear, Len(SongYear) - 1)
> LOOP
>
> DO UNTIL Right(Comment, 1) <> " "
> Comment = Left(Comment, Len(Comment) - 1)
> LOOP
>
> DO UNTIL Right(Genre, 1) <> " "
> Genre = Left(Genre, Len(Genre) - 1)
> LOOP
>
> 'get rv1ID of null characters
> Songname = Replace$(Songname, Chr$(0), "")
> Artist = Replace$(Artist, Chr$(0), "")
> Album = Replace$(Album, Chr$(0), "")
> SongYear = Replace$(SongYear, Chr$(0), "")
> Comment = Replace$(Comment, Chr$(0), "")
> Genre = Replace$(Genre, Chr$(0), "")
>
> 'comments tend to have lots of unprintable chars, so remove them
> IF Len(Comment) > 0 THEN
> FOR x = 0 TO 47
> IF Instr(Comment, Chr$(x)) THEN
> Comment = Replace$(Comment, Chr(x), "")
> ENDIF
> NEXT
> ENDIF
> ENDIF
>
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ' Check for a Header for ID3v2 tag
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> SEEK #hFile, 1
> READ #hFile, b
> IF (b < 250 OR b > 251) THEN
> 'We have an v1ID3v2 tag
> IF b = 68 THEN
> READ #hFile, b
> IF b = 51 THEN
> 'get version
> SEEK #hFile, 3
> READ #hFile, Version
>
> 'get how long the v2 tag is
> SEEK #hFile, 6
> READ #hFile, b
> r = Int(b) * 20917152
>
> READ #hFile, b
> r = r + Int(b) * 16384
>
> READ #hFile, b
> r = r + Int(b) * 128
>
> READ #hFile, b
> r = r + Int(b)
>
> 'invalid length was calculated
> IF r > Lof(hFile) OR r > 2147483647 THEN
> RETURN FALSE
> END IF
>
> 'get the v2 tag according to the length calculated
> READ #hFile, TagString, r
> ENDIF
> ENDIF
> ENDIF
>
>
> IF TagString <> "" THEN 'there is an ID3v2 tag in TagString
> ' Determine if the v1ID3v2 tag is v1ID3v2.2 or v1ID3v2.3
> SELECT CASE Version
> CASE 2 'v1ID3v2.2
> 'Set the fieldnames for version 2.0
> v2Title = "TT2"
> v2Artist = "TOA"
> v2Album = "TAL"
> v2Year = "TYE"
> v2Genre = "TCO"
> FieldOffset = 7
> SizeOffset = 5
> v2Track = "TRCK"
> CASE 3 'v1ID3v2.3
> 'Set the fieldnames for version 3.0
> v2Title = "TIT2"
> v2Artist = "TPE1"
> v2Album = "TALB"
> v2Year = "TYER"
> v2Genre = "TCON"
> v2Track = "TRCK"
> FieldOffset = 11
> SizeOffset = 7
> CASE ELSE
> 'We don't have a valv1ID v1ID3v2 tag, so bail
> RETURN FALSE
> END SELECT
>
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ' Extract track title
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> i = Instr(TagString, v2Title)
> IF i > 0 THEN
> 'read the title
> FieldSize = Asc(Mid$(TagString, i + SizeOffset)) - 1
>
> IF Version = 3 THEN
> 'check for compressed or encrypted field
> b = Asc(Mid$(TagString, i + 9))
> IF (b AND 128) = TRUE OR (b AND 64) = TRUE THEN GOTO
> ReadAlbum
> ENDIF
>
> TempString = Mid$(TagString, i + FieldOffset, FieldSize)
>
> IF TempString <> "" THEN
> Songname = TempString
> ENDIF
> ENDIF
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ' Extract album title
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ReadAlbum:
> i = Instr(TagString, v2Album)
> IF i > 0 THEN
> FieldSize = Asc(Mid$(TagString, i + SizeOffset)) - 1
>
> IF Version = 3 THEN
> 'check for compressed or encrypted field
> b = Asc(Mid$(TagString, i + 9))
> IF (b AND 128) = 128 OR (b AND 64) = 64 THEN GOTO ReadArtist
> ENDIF
>
> TempString = Mid$(TagString, i + FieldOffset, FieldSize)
>
> IF TempString <> "" THEN
> Album = TempString
> ENDIF
> ENDIF
>
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ' Extract artist name
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ReadArtist:
> i = Instr(TagString, v2Artist)
> IF i > 0 THEN
> FieldSize = Asc(Mid$(TagString, i + SizeOffset)) - 1
>
> IF Version = 3 THEN
> 'check for compressed or encrypted field
> b = Asc(Mid$(TagString, i + 9))
> IF (b AND 128) = 128 OR (b AND 64) = 64 THEN GOTO ReadYear
> ENDIF
>
> TempString = Mid$(TagString, i + FieldOffset, FieldSize)
>
> IF TempString <> "" THEN
> Artist = TempString
> ENDIF
> ENDIF
>
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ' Extract year title
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ReadYear:
> i = Instr(TagString, v2Year)
> IF i > 0 THEN
> FieldSize = Asc(Mid$(TagString, i + SizeOffset)) - 1
>
> IF Version = 3 THEN
> 'check for compressed or encrypted field
> b = Asc(Mid$(TagString, i + 9))
> IF (b AND 128) = 128 OR (b AND 64) = 64 THEN GOTO ReadGenre
> ENDIF
>
> TempString = Mid$(TagString, i + FieldOffset, FieldSize)
>
> IF TempString <> "" THEN
> SongYear = TempString
> ENDIF
> ENDIF
>
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ' Extract genre
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ReadGenre:
> i = Instr(TagString, v2Genre)
> IF i > 0 THEN
> FieldSize = Asc(Mid$(TagString, i + SizeOffset)) - 1
>
> IF Version = 3 THEN
> 'check for compressed or encrypted field
> b = Asc(Mid$(TagString, i + 9))
> IF (b AND 128) = 128 OR (b AND 64) = 64 THEN GOTO Readv2Track
> ENDIF
>
> s = Mid$(TagString, i + FieldOffset, FieldSize)
>
> IF Left$(s, 1) = "(" THEN
> IF Instr(s, ")") THEN
> 'the tag is in the form of "(10)metal"
> TempString = Right(S, Len(s) - Instr(s, ")"))
> ENDIF
> ELSE
> TempString = s
> ENDIF
> Genre = TempString
> ENDIF
>
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ' Extract track number
> ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> Readv2Track:
> i = Instr(TagString, v2Track)
> IF i > 0 THEN
> FieldSize = Asc(Mid$(TagString, i + SizeOffset)) - 1
>
> IF Version = 3 THEN
> 'check for compressed or encrypted field
> b = Asc(Mid$(TagString, i + 9))
> IF (b AND 128) = 128 OR (b AND 64) = 64 THEN GOTO Done
> ENDIF
>
> TempString = Mid$(TagString, i + FieldOffset, FieldSize)
>
> IF TempString <> "" THEN
> Track = TempString
> ENDIF
> ENDIF
> Done:
> ENDIF
> CLOSE #hFile
>
> 'if the genre tag has a # instead of a string, then decode it
> IF IsNumber(Val(Genre)) THEN
> Genre = GetGenreFromID(Val(Genre))
> ENDIF
> FINALLY
> RETURN TRUE
> CATCH
> CLOSE #hFile
> END FUNCTION
>
> PUBLIC FUNCTION ReadMP3(sFileName AS String) AS Boolean
> 'reads header (duration, freq, bitrate, version, layer are stored in
> the header)
> IF ReadHeader(sFileName) THEN
> 'reads the ID3 tag (artist, album, year, comment, genre, track are
> stored in ID3 tag)
> IF ReadID3(sFileName) THEN
> RETURN TRUE
> ELSE
> RETURN FALSE
> ENDIF
> ELSE
> RETURN FALSE
> ENDIF
> END
> '***
> '*** End Function section
> '***
>
>
> -------------------------------------------------------------------------
> Check out the new SourceForge.net Marketplace.
> It's the best place to buy or sell services for
> just about anything Open Source.
> http://sourceforge.net/services/buy/index.php
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user
>
More information about the User
mailing list