Eliminare una traccia da un file MIDI
Da Gambas-it.org - Wikipedia.
Versione del 19 giu 2024 alle 09:33 di Vuott (Discussione | contributi)
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