Differenze tra le versioni di "Eliminare una traccia da un file MIDI"
Da Gambas-it.org - Wikipedia.
(3 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 2: | Riga 2: | ||
− | + | ===1° codice=== | |
− | + | Public Sub Form_Open() | |
Dim s As String | Dim s As String | ||
Dim bb As New Byte[] | Dim bb As New Byte[] | ||
+ | Dim i, lungh As Integer | ||
+ | Dim ss As New String[] | ||
Dim el As Byte | Dim el As Byte | ||
− | + | ||
− | + | s = File.Load("<FONT Color=darkgreen>''/percorso/del/file.mid''</font>") | |
+ | If s[0, 4] <> "MThd" Then Error.Raise("Il file caricato non è un file Midi standard !") | ||
− | + | bb = Byte[].FromString(s) | |
− | |||
− | |||
<FONT Color=gray>' ''Ciclo per individuare ciascuna traccia "MTrk" del file Midi:''</font> | <FONT Color=gray>' ''Ciclo per individuare ciascuna traccia "MTrk" del file Midi:''</font> | ||
− | + | Repeat | |
− | + | i = InStr(s, "MTrk", i + 1) | |
− | + | If i > 0 Then ss.Push(i) | |
− | + | Until i == 0 | |
− | + | Print "Il file Midi contiene "; ss.Count; " tracce Midi." | |
− | + | el = Val(InputBox("Scegliere la traccia da eliminare:")) | |
− | + | Select Case el | |
− | + | Case 1 | |
− | + | Message.Warning("Eliminazione della '<I>Traccia del Tempo</i>' non consentita !") | |
− | + | Return | |
− | + | Case ss.Count + 1 | |
− | + | Message.Warning("Numero traccia superiore alla quantità di tracce presenti nel file Midi !") | |
− | + | Return | |
− | + | End Select | |
− | <FONT Color=gray>' ''Individua la dimensione della traccia da eliminare:''</font> | + | <FONT Color=gray>' ''Individua la dimensione della traccia da eliminare (ne ricava il valore dalla memorizzazione dei relativi dati in ordine "Big-Endian"):''</font> |
− | + | lungh = bb[ss[el - 1] + 6] | |
− | + | lungh += bb[ss[el - 1] + 5] * 256 <FONT Color=gray>' ''&0100''</font> | |
− | + | lungh += bb[ss[el - 1] + 4] * 65536 <FONT Color=gray>' ''&010000''</font> | |
− | + | lungh += bb[ss[el - 1] + 3] * 16777216 <FONT Color=gray>' ''&01000000''</font> | |
− | + | bb.Remove(ss[el - 1] - 1, 8 + lungh) | |
− | + | bb[11] -= 1 | |
− | + | Print "\nSalvataggio del nuovo file Midi pari a", bb.Count; " byte." | |
− | + | File.Save("<FONT Color=darkgreen>''/percorso/del/nuovo_file.mid''</font>", bb.ToString(0, bb.count)) | |
− | + | End | |
− | |||
− | + | ===2° codice=== | |
− | + | Public Sub Main() | |
Dim smf, mtrk As String | Dim smf, mtrk As String | ||
Riga 61: | Riga 61: | ||
<FONT Color=gray>' ''Stabilisce la traccia da eliminare:''</font> | <FONT Color=gray>' ''Stabilisce la traccia da eliminare:''</font> | ||
− | + | elim = <FONT Color=gray>''numero_della_traccia''</font> | |
<FONT Color=gray>' ''Carica uno file Midi standard:''</font> | <FONT Color=gray>' ''Carica uno file Midi standard:''</font> | ||
− | + | smf = File.Load("<FONT Color=darkgreen>''/percorso/del/file.mid''</font>") | |
− | + | If Left(smf, 4) <> "MThd" Then Error.Raise("Il file caricato non è un file Midi standard !") | |
<FONT Color=gray>' ''Memorizza nella varibile di tipo string il blocco d'Intestazione:''</font> | <FONT Color=gray>' ''Memorizza nella varibile di tipo string il blocco d'Intestazione:''</font> | ||
− | + | mthd = Byte[].FromString(Left(smf, 14)) | |
<FONT Color=gray>' ''Individua il numero di tracce "MTrk" dichiarate nel file Midi:''</font> | <FONT Color=gray>' ''Individua il numero di tracce "MTrk" dichiarate nel file Midi:''</font> | ||
− | + | tr = Asc(smf, 12) | |
− | + | If tr == 0 Then Error.Raise("Numero di tracce dichiarato nel file: zero !") | |
<FONT Color=gray>' ''Esclude dall'analisi il Blocco d'Intestazione del file Midi:''</font> | <FONT Color=gray>' ''Esclude dall'analisi il Blocco d'Intestazione del file Midi:''</font> | ||
− | + | mtrk = Right(smf, Len(smf) - 14) | |
<FONT Color=gray>' ''Inserisce in ciascun elemento del vettore di tipo Stringa una traccia del file Midi:''</font> | <FONT Color=gray>' ''Inserisce in ciascun elemento del vettore di tipo Stringa una traccia del file Midi:''</font> | ||
− | + | tracce = Scan(mtrk, String(tr, "MTrk*")) | |
− | + | If tracce.Count == 0 Then Error.Raise("Numero di tracce 'MTrk' realmente esistenti nel file: zero !") | |
<FONT Color=gray>' ''Elimina la traccia prescelta:''</font> | <FONT Color=gray>' ''Elimina la traccia prescelta:''</font> | ||
− | + | tracce.Remove(elim - 1, 1) | |
<FONT Color=gray>' ''Diminuisce di un'unità il valore presente nel 12° byte del blocco d'Intestazione:''</font> | <FONT Color=gray>' ''Diminuisce di un'unità il valore presente nel 12° byte del blocco d'Intestazione:''</font> | ||
− | + | mthd[11] -= 1 | |
<FONT Color=gray>' ''Ricostituisce ogni traccia riattribuendo il proprio identificatore 'MTrk':''</font> | <FONT Color=gray>' ''Ricostituisce ogni traccia riattribuendo il proprio identificatore 'MTrk':''</font> | ||
− | + | For b = 0 To tracce.Max | |
− | + | tracce[b] = "MTrk" & tracce[b] | |
− | + | Next | |
<FONT Color=gray>' ''Inserisce il blocco 'MThd':''</font> | <FONT Color=gray>' ''Inserisce il blocco 'MThd':''</font> | ||
− | + | tracce.Add(mthd.ToString(0, mthd.Count), 0) | |
<FONT Color=gray>' ''Ricostituisce l'intero file Midi, ora privo della traccia eliminata:''</font> | <FONT Color=gray>' ''Ricostituisce l'intero file Midi, ora privo della traccia eliminata:''</font> | ||
− | + | File.Save("<FONT Color=darkgreen>''/percorso/del/nuovo_file.mid''</font>", tracce.Join(Null, Null)) | |
− | + | End |
Versione attuale delle 09:33, 19 giu 2024
Di seguito mostriamo un paio di codici utili per eliminare una traccia da un file Midi con le sole funzioni di Gambas.
1° codice
Public Sub Form_Open() Dim s As String Dim bb As New Byte[] Dim i, lungh As Integer Dim ss As New String[] Dim el As Byte s = File.Load("/percorso/del/file.mid") If s[0, 4] <> "MThd" Then Error.Raise("Il file caricato non è un file Midi standard !") bb = Byte[].FromString(s) ' Ciclo per individuare ciascuna traccia "MTrk" del file Midi: Repeat i = InStr(s, "MTrk", i + 1) If i > 0 Then ss.Push(i) Until i == 0 Print "Il file Midi contiene "; ss.Count; " tracce Midi." el = Val(InputBox("Scegliere la traccia da eliminare:")) Select Case el Case 1 Message.Warning("Eliminazione della 'Traccia del Tempo' non consentita !") Return Case ss.Count + 1 Message.Warning("Numero traccia superiore alla quantità di tracce presenti nel file Midi !") Return End Select ' Individua la dimensione della traccia da eliminare (ne ricava il valore dalla memorizzazione dei relativi dati in ordine "Big-Endian"): lungh = bb[ss[el - 1] + 6] lungh += bb[ss[el - 1] + 5] * 256 ' &0100 lungh += bb[ss[el - 1] + 4] * 65536 ' &010000 lungh += bb[ss[el - 1] + 3] * 16777216 ' &01000000 bb.Remove(ss[el - 1] - 1, 8 + lungh) bb[11] -= 1 Print "\nSalvataggio del nuovo file Midi pari a", bb.Count; " byte." File.Save("/percorso/del/nuovo_file.mid", bb.ToString(0, bb.count)) End
2° codice
Public Sub Main() Dim smf, mtrk As String Dim mthd As Byte[] Dim elim, tr As Integer Dim tracce As String[] Dim b As Byte ' Stabilisce la traccia da eliminare: elim = numero_della_traccia ' Carica uno file Midi standard: smf = File.Load("/percorso/del/file.mid") If Left(smf, 4) <> "MThd" Then Error.Raise("Il file caricato non è un file Midi standard !") ' Memorizza nella varibile di tipo string il blocco d'Intestazione: mthd = Byte[].FromString(Left(smf, 14)) ' Individua il numero di tracce "MTrk" dichiarate nel file Midi: tr = Asc(smf, 12) If tr == 0 Then Error.Raise("Numero di tracce dichiarato nel file: zero !") ' Esclude dall'analisi il Blocco d'Intestazione del file Midi: mtrk = Right(smf, Len(smf) - 14) ' Inserisce in ciascun elemento del vettore di tipo Stringa una traccia del file Midi: tracce = Scan(mtrk, String(tr, "MTrk*")) If tracce.Count == 0 Then Error.Raise("Numero di tracce 'MTrk' realmente esistenti nel file: zero !") ' Elimina la traccia prescelta: tracce.Remove(elim - 1, 1) ' Diminuisce di un'unità il valore presente nel 12° byte del blocco d'Intestazione: mthd[11] -= 1 ' Ricostituisce ogni traccia riattribuendo il proprio identificatore 'MTrk': For b = 0 To tracce.Max tracce[b] = "MTrk" & tracce[b] Next ' Inserisce il blocco 'MThd': tracce.Add(mthd.ToString(0, mthd.Count), 0) ' Ricostituisce l'intero file Midi, ora privo della traccia eliminata: File.Save("/percorso/del/nuovo_file.mid", tracce.Join(Null, Null)) End