Differenze tra le versioni di "Estrarre i dati Midi dal file audio AIFF con le sole funzioni di Gambas"

Da Gambas-it.org - Wikipedia.
 
(5 versioni intermedie di uno stesso utente non sono mostrate)
Riga 20: Riga 20:
 
   Print "Dimensione:      "; s.Len; " byte"
 
   Print "Dimensione:      "; s.Len; " byte"
 
   
 
   
  <FONT Color=gray>' ''<SPAN Style="text-decoration:underline">Verifica se il file AIFF caricato contiene dati Midi nel "MIDI Data Chunk"</span>:''</font>
+
  <FONT Color=gray>' ''<SPAN Style="text-decoration:underline">Verifica se il file AIFF caricato contiene il blocco dati "MIDI Data Chunk"</span>:''</font>
 
   i = InStr(s, "MIDI")
 
   i = InStr(s, "MIDI")
   If i == 0 Then Error.Raise("Il file non contiene un blocco di dati Midi !")
+
   If i == 0 Then Error.Raise("Il file non contiene il blocco dati «MIDI Data Chunk» !")
      
+
  Print "\nBlocco Midi in offset:     "; i
 +
 
   bb = New Byte[4]
 
   bb = New Byte[4]
 
   
 
   
 
   fl = Open aiff For Read
 
   fl = Open aiff For Read
 
+
 
  <FONT Color=gray>' ''Legge la dimensione dei dati Midi contenuti nel "MIDI Data Chunk":''</font>
 
  <FONT Color=gray>' ''Legge la dimensione dei dati Midi contenuti nel "MIDI Data Chunk":''</font>
 
   Seek #fl, i + 3
 
   Seek #fl, i + 3
Riga 36: Riga 37:
 
   q += bb[0] * 16777216  <FONT Color=gray>' ''&01000000''</font>
 
   q += bb[0] * 16777216  <FONT Color=gray>' ''&01000000''</font>
 
   bb.Clear
 
   bb.Clear
   Print "Quantità dati Blocco Midi: ", Null; q; " byte"
+
   Print "Quantità dati Blocco Midi: "; q; " byte"
 
   
 
   
 
  <FONT Color=gray>' ''Legge i dati Midi contenuti nel "MIDI Data Chunk":''</font>
 
  <FONT Color=gray>' ''Legge i dati Midi contenuti nel "MIDI Data Chunk":''</font>
Riga 42: Riga 43:
 
   bb = New Byte[q]
 
   bb = New Byte[q]
 
   bb.Read(fl, 0, q)
 
   bb.Read(fl, 0, q)
   
+
 
   fl.Close
 
   fl.Close
 
   
 
   

Versione attuale delle 12:22, 22 set 2022

Il formato AIFF (Audio Interchange File Format) è utilizzato per immagazzinare dati audio secondo il metodo di rappresentazione digitale Pulse-Code Modulation (PCM).

Tale formato, oltre ai predetti file audio PCM, consente di immagazzinare dati MIDI in un apposito blocco (MIDI Data Chunk), indivduato all'interno del file con il tag "MIDI". Tale blocco di dati è opzionale, e pertanto non è necessariamente presente all'interno del file aiff.

Lo scopo principale del MIDI Data Chunk è quello di memorizzare i messaggi Midi System Exclusive; però possono essere memorizzati in questo Blocco anche altri tipi di dati Midi.

Mostriamo di seguito un possibile codice per estrarre i dati Midi contenuti nel MIDI Data Chunk:

Public Sub Main()

 Dim aiff, s As String
 Dim bb As Byte[]
 Dim fl As File
 Dim i, q As Integer

 aiff = "/percorso/del/file.aiff"

 s = File.Load(aiff)
 If s[8, 4] <> "AIFF" Then Error.Raise("Il file caricato non è un file formato AIFF !")
 Print "File audio AIFF: "; aiff
 Print "Dimensione:      "; s.Len; " byte"

' Verifica se il file AIFF caricato contiene il blocco dati "MIDI Data Chunk":
 i = InStr(s, "MIDI")
 If i == 0 Then Error.Raise("Il file non contiene il blocco dati «MIDI Data Chunk» !")
 Print "\nBlocco Midi in offset:     "; i

 bb = New Byte[4]

 fl = Open aiff For Read

' Legge la dimensione dei dati Midi contenuti nel "MIDI Data Chunk":
 Seek #fl, i + 3
 bb.Read(fl, 0, 4)
 q = bb[3]
 q += bb[2] * 256       '     &0100
 q += bb[1] * 65536     '   &010000
 q += bb[0] * 16777216  ' &01000000
 bb.Clear
 Print "Quantità dati Blocco Midi: "; q; " byte"

' Legge i dati Midi contenuti nel "MIDI Data Chunk":
 Seek #fl, i + 7
 bb = New Byte[q]
 bb.Read(fl, 0, q)

 fl.Close

' I dati midi letti dal "MIDI Data Chunk" possono essere salvati in un file:
 File.Save("/percorso/del/file/contenente i/dati_Midi", bb.ToString(0, bb.Count))

End


Riferimenti