Estrarre il testo da un file Midi: differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| 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 | Until Eof(fl) | ||
fl.Close | fl.Close | ||
Versione delle 08:35, 20 set 2022
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 partcolare 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 esattamente 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