Differenze tra le versioni di "Estrarre il testo da un file Midi"

Da Gambas-it.org - Wikipedia.
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:
 
<BR>In particolare per contenenre il testo di una canzone sono per lo più usati i seguenti Meta-Eventi:
 
<BR>In particolare per contenenre il testo di una canzone sono per lo più usati i seguenti Meta-Eventi:
 
* '''FF 01''' (''Text event''): utilizzato per del testo per qualsiasi scopo, spesso per inserire il testo di un brano;
 
* '''FF 01''' (''Text event''): utilizzato per del testo per qualsiasi scopo, spesso per inserire il testo di un brano;
* '''FF 05''' (''Lyric''): utilizzato specificamente per il testo di un brano, ma in partcolare va usato per contenere una sola sillaba per uno specifico movimento (battuta).
+
* '''FF 05''' (''Lyric''): utilizzato specificamente per il testo di un brano, ma in particolare va usato per contenere una sola sillaba per uno specifico movimento (battuta).
 
Dopo il secondo file del Meta-Evento sono presenti da uno a quattro byte che indicano in formato a lunghezza variabile la quantità di byte seguenti che rappresentano il testo.
 
Dopo il secondo file del Meta-Evento sono presenti da uno a quattro byte che indicano in formato a lunghezza variabile la quantità di byte seguenti che rappresentano il testo.
  
Riguardo all'estensione del file Midi contenente il testo del brano, si preferisce utilizzare l'estensione .kar (karaoke). Va però precisato che i file Midi con estensione .kar sono esattamente identici ai file Midi con estensione .mid.
+
Riguardo all'estensione del file Midi contenente il testo del brano, si preferisce utilizzare l'estensione .kar (karaoke). Va però precisato che i file Midi con estensione .kar sono strutturalmente identici ai file Midi con estensione .mid.
  
  
 
Vediamo un semplice codice in grado di leggere il testo contenuto da entrambi i suddetti Meta-Eventi:
 
Vediamo un semplice codice in grado di leggere il testo contenuto da entrambi i suddetti Meta-Eventi:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim fl As File
 
   Dim fl As File
Riga 16: Riga 16:
 
   Dim ts As New Byte[]
 
   Dim ts As New Byte[]
 
   
 
   
   fileMidi = "<FONT Color=gray>''/percorso/del/file.kar''</font>"
+
   fileMidi = "<FONT Color=darkgreen>''/percorso/del/file.kar''</font>"
 
   Print "File Midi:    "; fileMidi
 
   Print "File Midi:    "; fileMidi
 
    
 
    
Riga 31: Riga 31:
 
       If (b = &01) Or (b = &05) Then legge_var(fl, ts)
 
       If (b = &01) Or (b = &05) Then legge_var(fl, ts)
 
     Endif
 
     Endif
   Until Seek(fl) = Lof(fl)
+
   Until Eof(fl)
 
    
 
    
 
   fl.Close
 
   fl.Close
Riga 39: Riga 39:
 
   Next
 
   Next
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Private''' Function legge_var(mf As File, bb As Byte[])
+
   
 +
Private Function legge_var(mf As File, bb As Byte[])
 
    
 
    
 
   Dim vl, i As Integer
 
   Dim vl, i As Integer
Riga 58: Riga 59:
 
   Next
 
   Next
 
    
 
    
  '''End'''
+
  End

Versione attuale delle 09:37, 19 giu 2024

Esistono vari Meta-Eventi Midi per inserire nel file Midi dati testuali.
In particolare per contenenre il testo di una canzone sono per lo più usati i seguenti Meta-Eventi:

  • FF 01 (Text event): utilizzato per del testo per qualsiasi scopo, spesso per inserire il testo di un brano;
  • FF 05 (Lyric): utilizzato specificamente per il testo di un brano, ma in particolare va usato per contenere una sola sillaba per uno specifico movimento (battuta).

Dopo il secondo file del Meta-Evento sono presenti da uno a quattro byte che indicano in formato a lunghezza variabile la quantità di byte seguenti che rappresentano il testo.

Riguardo all'estensione del file Midi contenente il testo del brano, si preferisce utilizzare l'estensione .kar (karaoke). Va però precisato che i file Midi con estensione .kar sono strutturalmente identici ai file Midi con estensione .mid.


Vediamo un semplice codice in grado di leggere il testo contenuto da entrambi i suddetti Meta-Eventi:

Public Sub Main()
 
 Dim fl As File
 Dim fileMidi, s As String
 Dim b As Byte
 Dim ts As New Byte[]

 fileMidi = "/percorso/del/file.kar"
 Print "File Midi:    "; fileMidi
 
 fl = Open fileMidi For Read
 
 Read #fl, s, 4
 If s <> "MThd" Then Error.Raise("Il file non è uno standard Midi !")
 Print "Dimensione:   "; Lof(fl); " byte\n\n  TESTO:\n"
 
 Repeat
   Read #fl, b
   If b = &FF Then
     Read #fl, b
     If (b = &01) Or (b = &05) Then legge_var(fl, ts)
   Endif
 Until Eof(fl)
 
 fl.Close
 
 For Each b In ts
   Write String.Chr(b)
 Next
 
End


Private Function legge_var(mf As File, bb As Byte[])
 
 Dim vl, i As Integer
 Dim c, n As Byte
 
' Legge un numero a lunghezza-variabile:
 Repeat
   Read #mf, c
   vl = Shl(vl, 7) Or (c And 127)
 Until Not (c And 128)
  
' Inserisce il valore ASCII del carattere alfanumerico nel vettore:
 For i = 1 To vl 
   Read #mf, n
   bb.Push(n)
 Next
  
End