Eliminare una traccia da un file MIDI

Da Gambas-it.org - Wikipedia.

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:
  Do
    i = InStr(s, "MTrk", i + 1)
    If i > 0 Then ii.Push(i)
  Loop 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