Differenze tra le versioni di "Eliminare una traccia da un file MIDI"
Da Gambas-it.org - Wikipedia.
Riga 2: | Riga 2: | ||
− | + | ===1° codice=== | |
− | '''Public''' Sub | + | '''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=gray>''/percorso/del/file.mid''</font>") | s = File.Load("<FONT Color=gray>''/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) | bb = Byte[].FromString(s) | ||
Riga 18: | Riga 19: | ||
Repeat | Repeat | ||
i = InStr(s, "MTrk", i + 1) | i = InStr(s, "MTrk", i + 1) | ||
− | If i > 0 Then | + | If i > 0 Then ss.Push(i) |
Until i == 0 | Until i == 0 | ||
− | Print "Il file Midi contiene"; | + | Print "Il file Midi contiene "; ss.Count; " tracce Midi." |
el = Val(InputBox("Scegliere la traccia da eliminare:")) | el = Val(InputBox("Scegliere la traccia da eliminare:")) | ||
Riga 29: | Riga 30: | ||
Message.Warning("Eliminazione della '<I>Traccia del Tempo</i>' non consentita !") | Message.Warning("Eliminazione della '<I>Traccia del Tempo</i>' non consentita !") | ||
Return | Return | ||
− | Case | + | Case ss.Count + 1 |
Message.Warning("Numero traccia superiore alla quantità di tracce presenti nel file Midi !") | Message.Warning("Numero traccia superiore alla quantità di tracce presenti nel file Midi !") | ||
Return | Return | ||
End Select | 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[ | + | lungh = bb[ss[el - 1] + 6] |
− | lungh += bb[ | + | lungh += bb[ss[el - 1] + 5] * 256 <FONT Color=gray>' ''&0100''</font> |
− | lungh += bb[ | + | lungh += bb[ss[el - 1] + 4] * 65536 <FONT Color=gray>' ''&010000''</font> |
− | lungh += bb[ | + | lungh += bb[ss[el - 1] + 3] * 16777216 <FONT Color=gray>' ''&01000000''</font> |
− | bb.Remove( | + | bb.Remove(ss[el - 1] - 1, 8 + lungh) |
bb[11] -= 1 | bb[11] -= 1 | ||
− | Print " | + | Print "\nSalvataggio del nuovo file Midi pari a", bb.Count; " byte." |
File.Save("<FONT Color=gray>''/percorso/del/nuovo_file.mid''</font>", bb.ToString(0, bb.count)) | File.Save("<FONT Color=gray>''/percorso/del/nuovo_file.mid''</font>", bb.ToString(0, bb.count)) | ||
Riga 50: | Riga 51: | ||
− | + | ===2° codice=== | |
− | |||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Versione delle 09:27, 22 set 2022
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