Differenze tra le versioni di "Verificare l'integrità dei dati del blocco d'intestazione di un file Midi"

Da Gambas-it.org - Wikipedia.
 
(3 versioni intermedie di uno stesso utente non sono mostrate)
Riga 16: Riga 16:
 
   Dim sh As Short
 
   Dim sh As Short
 
    
 
    
  midi = "<FONT Color=gray>''/percorso/del/file.mid''</font>"
+
  midi = "<FONT Color=gray>''/percorso/del/file.mid''</font>"
  Print "File Midi: "; midi
+
  Print "File Midi: "; midi
 
   
 
   
  fl = Open midi For Read
+
  fl = Open midi For Read
 
    
 
    
  Print "\n==== Analisi del blocco d'intestazione ====\n"
+
  Print "\n==== Analisi del blocco d'intestazione ====\n"
  Read #fl, s, 4
+
  Read #fl, s, 4
  If s <> "MThd" Then Error.Raise("Identificatore 'MThd' del blocco d'intestazione mancante !")
+
  If s <> "MThd" Then Error.Raise("Identificatore 'MThd' del blocco d'intestazione mancante !")
  Print "Identificativo blocco: "; s
+
  Print "Identificativo del blocco..... "; s
 
   
 
   
  sh = Legge_Big_Endian(fl, 4)
+
  sh = Legge_Big_Endian(fl, 4)
  If sh <> 6 Then Error.Raise("Lunghezza blocco MThd non valida !")
+
  If sh <> 6 Then Error.Raise("Lunghezza blocco MThd non valida !")
  Print "Lunghezza blocco MThd: "; sh
+
  Print "Lunghezza del blocco MThd.....    "; sh
 
   
 
   
  sh = Legge_Big_Endian(fl, 2)
+
  sh = Legge_Big_Endian(fl, 2)
  If (sh < 0) Or (sh > 2) Then Error.Raise("Formato di file non valido !")
+
  If (sh < 0) Or (sh > 2) Then Error.Raise("Formato di file non valido !")
  Print "Formato del file: "; sh
+
  Print "Formato del file..............    "; sh
 
   
 
   
  sh = Legge_Big_Endian(fl, 2)
+
  sh = Legge_Big_Endian(fl, 2)
  If sh = 0 Then Error.Raise("Numero di Tracce Midi non valido !")
+
  If sh == 0 Then Error.Raise("Numero di Tracce Midi non valido !")
  Print "Numero di Tracce Midi: "; sh
+
  Print "Numero di Tracce Midi.........  "; Format(sh, "##")
 
   
 
   
  sh = Legge_Big_Endian(fl, 2)
+
  sh = Legge_Big_Endian(fl, 2)
  If sh Mod 8 <> 0 Then Error.Raise("Risoluzione del Tempo Delta non valido !")
+
  If sh Mod 8 <> 0 Then Error.Raise("Risoluzione del Tempo Delta non valido !")
  Print "Risoluzione del Tempo Delta: "; sh
+
  Print "Risoluzione del Tempo Delta...  "; Format(sh, "###")
 
   
 
   
  Print "\nIl blocco d'intestazione 'MThd' appare essere corretto."
+
  Print "\nIl blocco d'intestazione 'MThd' appare essere corretto."
 
   
 
   
  fl.Close
+
  fl.Close
 
   
 
   
 
  '''End'''
 
  '''End'''
 
   
 
   
 +
'''Private''' Function Legge_Big_Endian(md As File, n As Byte) As Short
 +
 +
  Dim b As Byte
 +
  Dim c As Short
 +
 +
  Repeat
 +
    Read #md, b
 +
    c = (c * CInt(2 ^ 8)) Or b
 +
    Dec n
 +
  Until n == 0
 +
 +
  Return c
 
   
 
   
'''Private''' Function Legge_Big_Endian(md As File, b As Byte) As Short
 
 
 
  Dim c As Byte
 
  Dim j As Short
 
 
 
  Do
 
    Read #md, c
 
    j = (j * CInt(2 ^ 8)) Or c
 
    Dec b
 
  Loop Until b = 0
 
 
 
  Return j
 
 
 
 
  '''End'''
 
  '''End'''

Versione attuale delle 15:08, 22 set 2022

Il blocco d'intestazione del file Midi (Header Chunk) è costituito da 14 byte e contiene informazioni generali sul file medesimo.

Il particolare esso è composto da dai seguenti dati:

  • l'identificatore del blocco medesimo;
  • la lunghezza della sua parte contenente i byte delle informazioni generali;
  • il tipo di file Midi;
  • il numero di Tracce Midi presenti nel file;
  • la risoluzione del Tempo-Delta.


Per sapere se il blocco d'intestazione è integro, ed anche per conoscere i suddetti cinque tipi di dati, possiamo utilizzare il seguente codice:

Public Sub Main()

 Dim midi, s As String
 Dim fl As File
 Dim sh As Short
 
 midi = "/percorso/del/file.mid"
 Print "File Midi: "; midi

 fl = Open midi For Read
  
 Print "\n==== Analisi del blocco d'intestazione ====\n"
 Read #fl, s, 4
 If s <> "MThd" Then Error.Raise("Identificatore 'MThd' del blocco d'intestazione mancante !")
 Print "Identificativo del blocco..... "; s

 sh = Legge_Big_Endian(fl, 4)
 If sh <> 6 Then Error.Raise("Lunghezza blocco MThd non valida !")
 Print "Lunghezza del blocco MThd.....    "; sh

 sh = Legge_Big_Endian(fl, 2)
 If (sh < 0) Or (sh > 2) Then Error.Raise("Formato di file non valido !")
 Print "Formato del file..............    "; sh

 sh = Legge_Big_Endian(fl, 2)
 If sh == 0 Then Error.Raise("Numero di Tracce Midi non valido !")
 Print "Numero di Tracce Midi.........   "; Format(sh, "##")

 sh = Legge_Big_Endian(fl, 2)
 If sh Mod 8 <> 0 Then Error.Raise("Risoluzione del Tempo Delta non valido !")
 Print "Risoluzione del Tempo Delta...  "; Format(sh, "###")

 Print "\nIl blocco d'intestazione 'MThd' appare essere corretto."

 fl.Close

End

Private Function Legge_Big_Endian(md As File, n As Byte) As Short

 Dim b As Byte 
 Dim c As Short

 Repeat
   Read #md, b
   c = (c * CInt(2 ^ 8)) Or b
   Dec n
 Until n == 0

 Return c

End