Alsa e Gambas: Salvataggio dei dati
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 >