Differenze tra le versioni di "Estrarre il testo da un file Midi"
Da Gambas-it.org - Wikipedia.
(3 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 | + | * '''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 | + | 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() | |
Dim fl As File | Dim fl As File | ||
Riga 15: | Riga 15: | ||
Dim b As Byte | Dim b As Byte | ||
Dim ts As New Byte[] | Dim ts As New Byte[] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | fileMidi = "<FONT Color=darkgreen>''/percorso/del/file.kar''</font>" | |
+ | 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 vl, i As Integer | ||
Riga 47: | Riga 48: | ||
<FONT Color=gray>' ''Legge un numero a lunghezza-variabile:''</font> | <FONT Color=gray>' ''Legge un numero a lunghezza-variabile:''</font> | ||
− | + | Repeat | |
− | + | Read #mf, c | |
− | + | vl = Shl(vl, 7) Or (c And 127) | |
− | + | Until Not (c And 128) | |
<FONT Color=gray>' ''Inserisce il valore ASCII del carattere alfanumerico nel vettore:''</font> | <FONT Color=gray>' ''Inserisce il valore ASCII del carattere alfanumerico nel vettore:''</font> | ||
− | + | For i = 1 To vl | |
− | + | Read #mf, n | |
− | + | bb.Push(n) | |
− | + | Next | |
− | + | 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