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>" | |
− | + | 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''' | '''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''' | '''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