Differenze tra le versioni di "Estrarre informazioni da un file Midi con le sole funzioni di Gambas"

Da Gambas-it.org - Wikipedia.
(Creata pagina con 'Mostreremo un possibile codice per ottenere da un file Midi le seguenti informazioni: * Nome; * Dimensione; * Tipo; * Quantità di tracce presenti; * Risoluzione PPQN; * Tempo...')
 
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 6: Riga 6:
 
* Risoluzione PPQN;
 
* Risoluzione PPQN;
 
* Tempo metronomico iniziale.
 
* Tempo metronomico iniziale.
 
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim file_midi As String = "/percorso/del/file.mid"
+
   Dim file_midi As String
 
   Dim fl As File
 
   Dim fl As File
 
   Dim bb As Byte[]
 
   Dim bb As Byte[]
Riga 15: Riga 14:
 
   Dim t As Short
 
   Dim t As Short
 
    
 
    
 +
  file_midi = "<FONT color=gray>''/percorso/del/file.mid''</font>"
 
    
 
    
  fl = Open file_midi For Read
+
  fl = Open file_midi For Read
 
    
 
    
 
  <FONT color=gray>' ''Mostra il nome del file Midi:''</font>
 
  <FONT color=gray>' ''Mostra il nome del file Midi:''</font>
   Print "Nome del file Midi: "; File.Name(file_midi)
+
   Print "Nome del file Midi:       \e[31m"; File.Name(file_midi)
 
   
 
   
 
  <FONT color=gray>' ''Verifica la dimensione del file Midi:''</font>
 
  <FONT color=gray>' ''Verifica la dimensione del file Midi:''</font>
   Print "Dimensione del file Midi: "; Lof(fl); " byte"
+
   Print "\e[0mDimensione del file Midi: "; Lof(fl); " byte"
 
    
 
    
 
  <FONT color=gray>' ''Legge l'intero file Midi e carica i dati nella variabile "bb":''</font>
 
  <FONT color=gray>' ''Legge l'intero file Midi e carica i dati nella variabile "bb":''</font>
Riga 28: Riga 28:
 
     .Read(fl)
 
     .Read(fl)
 
   End With
 
   End With
+
 
 
  <FONT color=gray>' ''Verifica che il file caricato sia un file Midi standard:''</font>
 
  <FONT color=gray>' ''Verifica che il file caricato sia un file Midi standard:''</font>
 
   If bb.ToString(0, 4) <> "MThd" Then Error.Raise("Il file caricato non è un file Midi !")
 
   If bb.ToString(0, 4) <> "MThd" Then Error.Raise("Il file caricato non è un file Midi !")
 
    
 
    
 
  <FONT color=gray>' ''Verifica il tipo di file Midi:''</font>
 
  <FONT color=gray>' ''Verifica il tipo di file Midi:''</font>
   Print "Tipo di file Midi: "; CStr(bb[9])
+
   Print "Tipo di file Midi:       "; CStr(bb[9])
 
    
 
    
 
  <FONT color=gray>' ''Verifica la quantità di tracce presenti nel File Midi:''</font>
 
  <FONT color=gray>' ''Verifica la quantità di tracce presenti nel File Midi:''</font>
   Print "Numero tracce presenti: "; CStr(bb[11])
+
   Print "Numero tracce presenti:   "; CStr(bb[11])
 
    
 
    
 
  <FONT color=gray>' ''Verifica la risoluzione PPQN del file Midi:''</font>
 
  <FONT color=gray>' ''Verifica la risoluzione PPQN del file Midi:''</font>
   Print "Risoluzione PPQN: "; Val("&" & Hex(bb[12]) & Hex(bb[13]))
+
   Print "Risoluzione PPQN:         "; legge_Byte(fl, 12, 2)
+
 
 
  <FONT color=gray>' ''Verifica il Tempo metronomico iniziale del file Midi:''</font>
 
  <FONT color=gray>' ''Verifica il Tempo metronomico iniziale del file Midi:''</font>
 
   i = InStr(bb.ToString(0, Lof(fl)), Chr(&FF) & Chr(&51) & Chr(&03))
 
   i = InStr(bb.ToString(0, Lof(fl)), Chr(&FF) & Chr(&51) & Chr(&03))
 
   If i > 0 Then
 
   If i > 0 Then
     t = 60000000 \ Val("&" & Hex(bb[i + 2]) & Hex(bb[i + 3]) & Hex(bb[i + 4]))
+
     t = 60000000 \ legge_Byte(fl, i + 2, 3)
 
   Else
 
   Else
 
     t = 120
 
     t = 120
 
   Endif
 
   Endif
   Print "Tempo metronomico: "; t
+
   Print "Tempo metronomico:       "; t; " bpm"
 +
 
 +
  fl.Close
 +
 
 +
'''End'''
 +
 +
'''Private''' Function legge_Byte(f As File, s As Short, q As Byte) As Integer
 +
 
 +
  Dim ris As Integer
 +
  Dim b As Byte
 +
 
 +
  Seek #f, s
 +
 
 +
  Repeat
 +
    Read #f, b
 +
    ris = (ris * CInt(2 ^ 8)) Or b
 +
    Dec q 
 +
  Until q == 0
 +
 
 +
  Return ris
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione attuale delle 08:38, 20 set 2022

Mostreremo un possibile codice per ottenere da un file Midi le seguenti informazioni:

  • Nome;
  • Dimensione;
  • Tipo;
  • Quantità di tracce presenti;
  • Risoluzione PPQN;
  • Tempo metronomico iniziale.
Public Sub Main()

 Dim file_midi As String
 Dim fl As File
 Dim bb As Byte[]
 Dim i As Integer
 Dim t As Short
 
 file_midi = "/percorso/del/file.mid"
 
 fl = Open file_midi For Read
 
' Mostra il nome del file Midi:
 Print "Nome del file Midi:       \e[31m"; File.Name(file_midi)

' Verifica la dimensione del file Midi:
 Print "\e[0mDimensione del file Midi: "; Lof(fl); " byte"
 
' Legge l'intero file Midi e carica i dati nella variabile "bb":
 With bb = New Byte[Lof(fl)]
   .Read(fl)
 End With
 
' Verifica che il file caricato sia un file Midi standard:
 If bb.ToString(0, 4) <> "MThd" Then Error.Raise("Il file caricato non è un file Midi !")
 
' Verifica il tipo di file Midi:
 Print "Tipo di file Midi:        "; CStr(bb[9])
 
' Verifica la quantità di tracce presenti nel File Midi:
 Print "Numero tracce presenti:   "; CStr(bb[11])
 
' Verifica la risoluzione PPQN del file Midi:
 Print "Risoluzione PPQN:         "; legge_Byte(fl, 12, 2)
 
' Verifica il Tempo metronomico iniziale del file Midi:
 i = InStr(bb.ToString(0, Lof(fl)), Chr(&FF) & Chr(&51) & Chr(&03))
 If i > 0 Then
   t = 60000000 \ legge_Byte(fl, i + 2, 3)
 Else
   t = 120
 Endif
 Print "Tempo metronomico:        "; t; " bpm"
 
 fl.Close
 
End

Private Function legge_Byte(f As File, s As Short, q As Byte) As Integer
 
 Dim ris As Integer
 Dim b As Byte
 
 Seek #f, s
 
 Repeat
   Read #f, b
   ris = (ris * CInt(2 ^ 8)) Or b
   Dec q  
 Until q == 0
 
 Return ris
 
End