Fondere insieme due file MIDI
Da Gambas-it.org - Wikipedia.
Versione del 21 ott 2024 alle 17:14 di Vuott (Discussione | contributi)
Mostriamo di seguito un codice, sufficientemente commentato, per fondere (mischiare) due file Midi con le sole funzioni di Gambas.
Va precisato che la dinamica e modalità dell'esecuzione di un file Midi potrà essere influenzata in modo particolare da diverso tipo di file Midi, da diversa risoluzione del Tempo-Delta e dagli eventuali Meta-eventi contenuti nell'altro file Midi. Pertanto si suggerisce di usare il seguente codice con due file Midi, dei quali almeno uno appartenga al tipo 1 di file Midi, e che posseggano medesima risoluzione del Tempo-Delta, nonché medesimo valore del Meta-evento relativo al Tempo metronomico.
Public Sub Main() Dim s1, s2, mtrk1, mtrk2, file_finale As String Dim nt1, nt2 As Byte s1 = File.Load("/percorso/del/primo/file.mid") s2 = File.Load("/percorso/del/secondo/file.mid") ' Innanzitutto verifica se almeno uno dei due file appartenga al tipo "1" di file Midi: If Asc(s1[9, 1]) + Asc(s2[9, 1]) == 0 Then Error.Raise("Nessuno dei due file appartiene al tipo '1' di file Midi !") ' Assicura che il 10° byte del Blocco d'intestazione del file Midi possegga il valore relativo al tipo "1" di file Midi. ' Assegna il valore "1" mediante la funzione "MkByte()", affinché sia assegnata precisamente la rappresentazione in memoria del valore 1 e non quella ASCII (che in memoria risulta essere &31). Si potrebbe usare in alternativa anche la funzione "Chr()". Mid(s1, 10, 1) = MkByte(1) ' Individua il numero di tracce presenti nel primo file: nt1 = Asc(s1[11, 1]) ' ...oppure anche: Byte@(s1[11, 1]), che restituisce un risultato opposto a quello della funzione "MkByte()" ' Individua il numero di tracce presenti nel secondo file: nt2 = Asc(s2[11, 1]) ' ...oppure anche: Byte@(s2[11, 1]), che restituisce un risultato opposto a quello della funzione "MkByte()" ' Raccoglie del 1° file Midi solo il valore della risoluzione del Tempo-Delta e la parte delle tracce "MTrk": mtrk1 = s1[12, s1.Len] ' Raccoglie del 2° file Midi solo la parte delle tracce "MTrk": mtrk2 = s2[14, s2.Len] file_finale = s1[0, 11] & MkByte(nt1 + nt2) & mtrk1 & mtrk2 File.Save("/tmp/nuovo.mid", file_finale) End