Alsa e Gambas: Salvataggio dei dati

Da Gambas-it.org - Wikipedia.

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 fondamentali (NoteON e NoteOFF) 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 Public Sub Button3_Click() crea il file Midi ! Dim fileMidi As String Dim mthd As String = "MThd" & String$(3, Chr(0)) & Chr(6) & Chr(0) & Chr(1) & Chr(0) & Chr(2) & Chr(1) & Chr(128) Dim mtrkTesta As String = "MTrk" Dim mtrkDelTempo As String Dim mtrkDati As String Dim mtrkCoda As String = Chr(0) & Chr(255) & Chr(47) & Chr(0) Dim mtrk As String Dim j, g 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 = 0 To bl If j = bl Then bloccoTD[j] = Chr(0) Else mtrk = mtrk & Right$(blocco[j], 3) & bloccoTD[j] Endif Next ' scrive la Traccia del Tempo: ' definisce 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 If trTmp > 65535 Then tmA = CInt(trTmp / 65536) trTmp = CInt(trTmp Mod 65536) Endif If trTmp > 255 Then tmB = CInt(trTmp / 256) tmC = CInt(trTmp Mod 256) Else tmC = trTmp Endif mtrkTempoMetronomico = Chr(255) & Chr(81) & Chr(3) & Chr(tmA) & Chr(tmB) & Chr(tmC) ' totale = 6 mtrkSuddivisione = Chr(255) & Chr(88) & Chr(4) & Chr(numeratore) & Chr(denominatore) & Chr(96) & Chr(8) ' totale = 7 mtrkChiave = Chr(255) & Chr(89) & Chr(2) & Chr(alterazioni) & Chr(modo) ' totale = 5 mtrkDelTempo = mtrkTesta & String$(3, Chr(0)) & Chr(25) & Chr(0) & mtrkSuddivisione & Chr(0) & mtrkTempoMetronomico & Chr(0) & mtrkChiave & mtrkCoda ' scrive la traccia degli eventi Midi: ' Ricava innanzitutto la lunghezza della traccia degli eventi Midi lunghMtrk = f + 5 + k 'Print lunghMtrk If lunghMtrk > 16777215 Then luA = CInt(lunghMtrk / 16777216) lunghMtrk = CInt(lunghMtrk Mod 16777216) Endif If lunghMtrk > 65535 Then luB = CInt(lunghMtrk / 65536) lunghMtrk = CInt(lunghMtrk Mod 65536) Endif If lunghMtrk > 255 Then luC = CInt(lunghMtrk / 256) luD = CInt(lunghMtrk Mod 256) Else luD = lunghMtrk Endif mtrkDati = mtrkTesta & Chr(luA) & Chr(luB) & Chr(luC) & Chr(luD) & Chr(0) & mtrk 'Print f, "5", bl, k, "= ", lunghMtrk 'Print "----------------------------------" fileMidi = mthd & mtrkDelTempo & mtrkDati & mtrkCoda 'fileMidi = mthd & mtrkDelTempo & mtrkTesta & Chr(luA) & Chr(luB) & Chr(luC) & Chr(luD) & Chr(0) & mtrk & mtrkCoda File.Save("/tmp/midiProva.mid", fileMidi) TextArea1.Text = fileMidi Shell "aplaymidi -p 128:0 /tmp/midiProva.mid" End
< Pagina in costruzione >