Differenze tra le versioni di "Alsa e Gambas: Salvataggio dei dati"
Riga 82: | Riga 82: | ||
''<Font Color= #006400>' Ora scrive la traccia degli eventi Midi: | ''<Font Color= #006400>' Ora scrive la traccia degli eventi Midi: | ||
− | ' deve ricavare innanzitutto la lunghezza della traccia degli eventi Midi. | + | ' il programma deve ricavare innanzitutto la lunghezza della traccia degli eventi Midi. |
' Essa è data: | ' Essa è data: | ||
' * dal numero di dati che sono stati memorizzati; | ' * dal numero di dati che sono stati memorizzati; |
Versione delle 09:04, 1 gen 2012
Come per la registrazione dei dati Midi anche per il salvataggio di tali dati in un file Midi potremmo prevedere l'utilizzo di un programma di supporto, scritto in C (come per esempio arecordmidi), oppure approntare un nostro specifico programma in linguaggio Gambas. Ovviamente qui ci occuperemo della seconda ipotesi. Il nostro obiettivo, pertanto, in questo capitolo sarà quello descrivere le istruzioni necessarie per salvare i dati Midi in un file Midi. Si risponderà alla domanda su come realizzare uno standard file Midi con le risorse della programmazione Gambas.
Abbiamo visto nel precedente capitolo "Registrare messaggi Midi" un esempio possibile di istruzioni ed algoritmi per memorizzare i dati Midi ricevuti da un dispositivo esterno, nonché la creazione di un array per i Messaggi Midi e di un array per il Tempo Delta.
Passiamo ora al salvataggio di tali elementi, di tali dati in uno standard file Midi.
Come sappiamo, il file Midi non è una mera sequenza di dati. Infatti esso è un archivio di dati complesso: composto di varie strutture fondamentali (chunk) che contengono i byte, ossia i dati. Pertanto, nella costruzione del file Midi dovremo rispettare non solo il protocollo Midi, ma anche le norme e le strutture alla base del file Midi.
Riprendiamo l'esempio del capitolo precedente da dove lo avevamo lasciato e proseguiamo (anche il codice sottostante è una fra le molte possibili soluzioni):
Public Sub Button6_Click() ' crea il file Midi ! Dim fileMidi As String ' definisce il Blocco d'Intestazione (Header Chunk) del file Midi: Dim mthd As String = "MThd" & String$(3, Chr(0)) & Chr(6) & Chr(0) & Chr(1) & Chr(0) & Chr(2) & Chr(1) & Chr(128) ' definisce i primi 4 dati del Blocco di Traccia (Track Chunk) del file Midi: Dim mtrkTesta As String = "MTrk" Dim mtrkDelTempo As String Dim mtrkDati As String ' definisce i 4 dati ricorrenti di chiusura di ogni Blocco Traccia del file Midi: Dim mtrkCoda As String = Chr(0) & Chr(255) & Chr(47) & Chr(0) Dim mtrk As String Dim j As Integer Dim trTmp, lunghMtrk As Integer Dim luA, luB, luC, luD As Byte Dim tmA As Byte = 7 Dim tmB As Byte = 161 Dim tmC As Byte = 32 Dim mtrkTempoMetronomico As String Dim mtrkSuddivisione As String Dim mtrkChiave As String For j = 1 To d If j = d + 1 Then bloccoTD[j] = Chr(0) Else mtrk = mtrk & blocco[j] & bloccoTD[j] Endif Next ' scrive la cosiddetta: Traccia del Tempo: ' defininendone i valori del tempo metronomico = Select Case denomSpin Case 1 trTmp = (60000000 / 4) / bpm Case 2 trTmp = (60000000 / 2) / bpm Case 4 trTmp = 60000000 / bpm Case 8 trTmp = (60000000 * 2) / bpm Case 16 trTmp = (60000000 * 4) / bpm Case 32 trTmp = (60000000 * 8) / bpm End Select tmC = trTmp Mod 256 trTmp = trTmp / 256 tmB = trTmp Mod 256 trTmp = trTmp / 256 tmA = trTmp Mod 256 ' definisce il Meta-evento del Tempo metronomico: mtrkTempoMetronomico = Chr(255) & Chr(81) & Chr(3) & Chr(tmA) & Chr(tmB) & Chr(tmC) ' definisce il Meta-evento della Suddivisione della Misura: mtrkSuddivisione = Chr(255) & Chr(88) & Chr(4) & Chr(numeratore) & Chr(denominatore) & Chr(96) & Chr(8) ' definisce il Meta-evento della Tonalità della Scala musicale del brano: mtrkChiave = Chr(255) & Chr(89) & Chr(2) & Chr(alterazioni) & Chr(modo) ' costituisce l'intera Traccia del Tempo: mtrkDelTempo = mtrkTesta & String$(3, Chr(0)) & Chr(25) & Chr(0) & mtrkSuddivisione & Chr(0) & mtrkTempoMetronomico & Chr(0) & mtrkChiave & mtrkCoda ' ------------| ' Ora scrive la traccia degli eventi Midi: ' il programma deve ricavare innanzitutto la lunghezza della traccia degli eventi Midi. ' Essa è data: ' * dal numero di dati che sono stati memorizzati; ' * + dal numero di byte che definiscrono la fine della traccia; ' * + dall'unico byte (che abbiamo previsto) del Tempo Delta immediatamente successivo alla parte dei 4 byte che definiscono la lunghezza della traccia di dati; ' * + dal numero complessivo di byte che esprimono il Tempo Delta fra un Messaggio Midi e l'altro: lunghMtrk = totDati + 4 + 1 + tdk luD = lunghMtrk Mod 256 lunghMtrk = lunghMtrk / 256 luC = lunghMtrk Mod 256 lunghMtrk = lunghMtrk / 256 luB = lunghMtrk Mod 256 lunghMtrk = lunghMtrk / 256 luA = lunghMtrk Mod 256 ' quindi riempie la variabile contenente i dati della Traccia degli eventi Midi comprensiva anche dei relativi Tempi Delta: mtrkDati = mtrkTesta & Chr(luA) & Chr(luB) & Chr(luC) & Chr(luD) & Chr(0) & mtrk ' Ora siamo pronti a creare e riempire la variabile contenente tutti i dati necessari per la scrittura del file Midi: fileMidi = mthd & mtrkDelTempo & mtrkDati & mtrkCoda '...il "magico" momento della scrittura del file Midi sul nostro hardDisk: File.Save("/tmp/midiProva.mid", fileMidi) ' Lo proviamo facendolo suonare subito ! Shell "aplaymidi -p 128:0 /tmp/midiProva.mid" End
Riguardo alla determinazione ed alla scrittura delle tracce MTrk nel file in altri casi, come ad esempio con un sequencer Midi, una procedura da seguire potrebbe essere quella di calcolare innanzitutto a quanti diversi canali fanno riferimento i gli eventi Midi da salvare. Tale numero andrebbe quindi sommato alla "Traccia del Tempo" (se si intende scriverla nel file). Il totale andrebbe inserito nell'apposito byte dell'Intestazione MThd relativo appunto all'indicazione del numero complessivo delle tracce MTrk. Dopo di ciò, si dovrebbe prevedere nella procedura di creazione del file Midi la scrittura di ogni traccia per canale (oltre alla eventuale "Traccia del Tempo") comprendente ciascuna i dati appartenenti a quel canale di riferimento.