Differenze tra le versioni di "Eliminare una traccia da un file MIDI"

Da Gambas-it.org - Wikipedia.
(Creata pagina con 'Per eliminare una traccia da un file Midi con le sole funzioni di Gambas, è possibile usare il seguente codice: '''Public''' Sub Form_Open() Dim s1, s2, da, dati, mthd, ...')
 
 
(5 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per eliminare una traccia da un file Midi con le sole funzioni di Gambas, è possibile usare il seguente codice:
+
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()
 
  '''Public''' Sub Form_Open()
 
   
 
   
   Dim s1, s2, da, dati, mthd, nuovo_file As String
+
   Dim s As String
  Dim el, j As Byte
 
  Dim lungh As Integer
 
 
   Dim bb As New Byte[]
 
   Dim bb As New Byte[]
   Dim tracce As New String[]
+
   Dim i, lungh As Integer
 +
  Dim ss As New String[]
 +
  Dim el As Byte
 
   
 
   
+
  s = File.Load("<FONT Color=gray>''/percorso/del/file.mid''</font>")
  s1 = File.Load("''/percorso/del/file.mid''")
+
  If s[0, 4] <> "MThd" Then Error.Raise("Il file caricato non è un file Midi standard !")
   
+
 
   el = Val(InputBox("Scegliere la traccia da eliminare:"))
+
  bb = Byte[].FromString(s)
+
   
  If el = 1 Then
+
  <FONT Color=gray>' ''Ciclo per individuare ciascuna traccia "MTrk" del file Midi:''</font>
    Message.Warning("Eliminazione della 'Traccia del Tempo' non consentita !")
+
  Repeat
    Quit
+
    i = InStr(s, "MTrk", i + 1)
   Endif
+
    If i > 0 Then ss.Push(i)
+
  Until i == 0
  <FONT color=gray>' ''Carica la sola parte delle tracce "MTrk":''</font>
+
 
   s2 = Right(s1, Len(s1) - 14)
+
  Print "Il file Midi contiene "; ss.Count; " tracce Midi."
   
+
    
  <FONT color=gray>' ''Ciclo per individuare ciascuna traccia "MTrk" del file Midi:''</font>
+
  el = Val(InputBox("Scegliere la traccia da eliminare:"))
  While j < Asc(Mid(s1, 12, 1))
+
 
   
+
  Select Case el
    bb = Byte[].FromString(Mid(s2, 5, 4))
+
    Case 1
   
+
      Message.Warning("Eliminazione della '<I>Traccia del Tempo</i>' non consentita !")
    lungh = Val("&" & Hex(bb[0]) & Hex(bb[1]) & Hex(bb[2]) & Hex(bb[3]))
+
      Return
+
    Case ss.Count + 1
    tracce.Add(Mid(s2, 1, lungh + 8))
+
      Message.Warning("Numero traccia superiore alla quantità di tracce presenti nel file Midi !")
     
+
      Return   
    s2 = Right(s2, Len(s2) - (8 + lungh))
+
  End Select
+
    
    Inc j
+
  <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]
  Wend
+
  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>
  <FONT color=gray>' ''Rimuove la traccia "MTrk" prescelta:''</font>
+
   
  tracce.Remove(el - 1, 1)
+
  bb.Remove(ss[el - 1] - 1, 8 + lungh)
   
+
    
  For Each da In tracce
+
  bb[11] -= 1
    dati &= da
+
 
  Next
+
  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))
 +
   
 +
  '''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
 +
 
 +
  <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>
 +
  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>
 +
  mthd = Byte[].FromString(Left(smf, 14))
 +
   
 +
  <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>
 +
  mtrk = Right(smf, Len(smf) - 14)
 +
   
 +
  <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>
 +
  tracce.Remove(elim - 1, 1)
 +
   
 +
  <FONT Color=gray>' ''Diminuisce di un'unità il valore presente nel 12° byte del blocco d'Intestazione:''</font>
 +
  mthd[11] -= 1
 
      
 
      
  mthd = Left(s1, 11) & Chr(tracce.Count) & Mid(s1, 13, 2)
+
<FONT Color=gray>' ''Ricostituisce ogni traccia riattribuendo il proprio identificatore 'MTrk':''</font>
 +
  For b = 0 To tracce.Max
 +
    tracce[b] = "MTrk" & tracce[b]
 +
  Next
 
      
 
      
  nuovo_file = mthd & dati
+
<FONT Color=gray>' ''Inserisce il blocco 'MThd':''</font>
 +
  tracce.Add(mthd.ToString(0, mthd.Count), 0)
 
      
 
      
  File.Save("/tmp/nuovo.mid", nuovo_file)
+
<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))
   Quit
+
    
 
 
  '''End'''
 
  '''End'''

Versione attuale 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