Eliminare una traccia da un file MIDI: differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 11: | Riga 11: | ||
Dim ii As New String[] | Dim ii As New String[] | ||
s = File.Load("<FONT Color=gray>''/percorso/del/file.mid''</font>") | |||
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 ii.Push(i) | |||
Until i = 0 | |||
Print "Il file Midi contiene";; ii.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 ii.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:''</font> | ||
lungh = bb[ii[el - 1] + 6] | |||
lungh += bb[ii[el - 1] + 5] * 256 <FONT Color=gray>' ''&0100''</font> | |||
lungh += bb[ii[el - 1] + 4] * 65536 <FONT Color=gray>' ''&010000''</font> | |||
lungh += bb[ii[el - 1] + 3] * 16777216 <FONT Color=gray>' ''&01000000''</font> | |||
bb.Remove(ii[el - 1] - 1, 8 + lungh) | |||
bb[11] -= 1 | |||
Print "Salvataggio 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)) | |||
'''End''' | '''End''' | ||
| 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=gray>''/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=gray>''/percorso/del/nuovo_file.mid''</font>", tracce.Join(Null, Null)) | |||
'''End''' | '''End''' | ||
Versione delle 07:04, 8 lug 2021
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 Main()
Dim s As String
Dim bb As New Byte[]
Dim el As Byte
Dim i, lungh As Integer
Dim ii As New String[]
s = File.Load("/percorso/del/file.mid")
bb = Byte[].FromString(s)
' Ciclo per individuare ciascuna traccia "MTrk" del file Midi:
Repeat
i = InStr(s, "MTrk", i + 1)
If i > 0 Then ii.Push(i)
Until i = 0
Print "Il file Midi contiene";; ii.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 ii.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:
lungh = bb[ii[el - 1] + 6]
lungh += bb[ii[el - 1] + 5] * 256 ' &0100
lungh += bb[ii[el - 1] + 4] * 65536 ' &010000
lungh += bb[ii[el - 1] + 3] * 16777216 ' &01000000
bb.Remove(ii[el - 1] - 1, 8 + lungh)
bb[11] -= 1
Print "Salvataggio 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