Estrarre informazioni e TAG da un file OggVorbis con le sole funzioni di Gambas

Da Gambas-it.org - Wikipedia.

E' possibile estrarre informazioni generali e TAG da un file OggVorbis con le sole funzioni di Gambas.

Un possibile codice è il seguente:

Public Sub Main()  
 
 Dim percorsoFile, s, s2, tag As String
 Dim info As String[]  
 Dim ordo As New Integer[]  
 Dim j, rm, k As Integer  
 Dim n As Byte 
 
 
  percorsoFile = "/percorso/del/file.ogg"  
  
  s = File.Load(percorsoFile)  
    
' Verifica se effettivamente è un file .ogg:  
  If Left(s, 4) <> "OggS" Then Error.Raise("Attenzione ! Il file caricato non è un file OGG !")  
    
  Print "File audio ogg: '"; File.Name(percorsoFile); "'"  
  Print "\nDimensione: "; Len(s); " byte"  

' Estrae informazioni generali (frequenza di campionamento e canali) sul file:
  info = EstraeInfo(s)
  Print "Frequenza di campionamento = hz "; info[0]
  Print "Canali = "; info[1]
  Print "Bitrate nominale = "; info[2]; " kbps"
  

   ordo.add(InStr(s, "TITLE="))
   ordo.add(InStr(s, "title="))
   ordo.add(InStr(s, "VERSION="))
   ordo.add(InStr(s, "version="))
   ordo.add(InStr(s, "ALBUM="))
   ordo.add(InStr(s, "VERSION="))
   ordo.add(InStr(s, "TRACKNUMBER="))
   ordo.add(InStr(s, "tracknumber="))
   ordo.add(InStr(s, "ARTIST="))
   ordo.add(InStr(s, "artist="))
   ordo.add(InStr(s, "PERFORMER="))
   ordo.add(InStr(s, "performer="))
   ordo.add(InStr(s, "COPYRIGHT="))
   ordo.add(InStr(s, "copyright="))
   ordo.add(InStr(s, "LICENSE="))
   ordo.add(InStr(s, "license="))
   ordo.add(InStr(s, "ORGANIZATION="))
   ordo.add(InStr(s, "organization="))
   ordo.add(InStr(s, "DESCRIPTION="))
   ordo.add(InStr(s, "description="))
   ordo.add(InStr(s, "GENRE="))
   ordo.add(InStr(s, "genre="))
   ordo.add(InStr(s, "DATE="))
   ordo.add(InStr(s, "date="))
   ordo.add(InStr(s, "LOCATION="))
   ordo.add(InStr(s, "location="))
   ordo.add(InStr(s, "CONTACT="))
   ordo.add(InStr(s, "contact="))
   ordo.add(InStr(s, "COMMENT="))
   ordo.add(InStr(s, "comment="))
   ordo.add(InStr(s, "ISRC="))
   ordo.add(InStr(s, "isrc="))
 
  While j < ordo.Count  
    If ordo[j] = 0 Then  
      ordo.Remove(j)  
      Inc rm  
      Dec j  
    Endif  
    Inc j  
  Wend  
 
  ordo.Sort()

  s2 = Mid(s, ordo[ordo.Max], 255)
  n = InStr(s2, "vorbis") - 1
    
  Print "\n  == T A G =="  
 
  If ordo.Count > 0 Then        ' Se è presente almeno un TAG
    
    For j = 0 To ordo.Max  
 
    k = ordo[j]  
 
    While k < ordo[ordo.max] + n
        
      If j < ordo.Max Then  
' Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:
        If (k < ordo[j + 1]) And ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then  
          tag &= Mid(s, k, 1)  
        Else  
          tag &= " "  
        Endif  
      Else  
' Verifica che il carattere ASCII sia una lettera o un numero oppure un segno di punteggiatura:
        If ((IsLetter(Mid(s, k, 1))) Or (IsDigit(Mid(s, k, 1))) Or (IsPunct(Mid(s, k, 1)))) Then  
          tag &= Mid(s, k, 1)  
        Else  
          tag &= " "  
        Endif  
 
      Endif  
        
      Inc k  
 
    Wend  
 
    Print tag  
    tag = Null  
      
  Next  
    
  Else  
    Print "Assenti !"  
  Endif  
 
End


Private Function EstraeInfo(sf As String) As String[]
 
 Dim j As Byte
 Dim fr$, br$ As String
 Dim info$ As New String[]
 
 
' Estrae la frequenza di campionamento:
   For j = 43 To 41 Step -1
     fr$ &= Hex(Asc(Mid(sf, j, 1)), 2)
   Next
 
   info$.Add(Cstr(Val("&" & fr$)))
   
' Estrae il numero di canali d'uscita:
   info$.Add(CStr(Asc(Mid(sf, 40, 1))))

' Estrae il bitrate nominale:
   For j = 51 To 49 Step -1
     br$ &= Hex(Asc(Mid(sf, j, 1)), 2)
   Next
   
   info$.Add(CStr(Val("&" & br$) \ 1000))
   
   Return info$

End


Riferimenti

[1] Vorbis I specification