|
|
(20 versioni intermedie di 2 utenti non mostrate) |
Riga 1: |
Riga 1: |
− | 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.
| + | #REDIRECT [[ALSA_e_Gambas_-_Il_salvataggio_dei_dati_Midi]] |
− | <P>Abbiamo visto nel precedente capitolo "[[Alsa_e_Gambas:_Registrare_messaggi_Midi|''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.</p>
| |
− | <P>Passiamo ora al salvataggio di tali elementi, di tali dati in uno standard file Midi.</p>
| |
− | <P>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.</p>
| |
− | <P>Riprendiamo l'esempio del capitolo precedente da dove lo avevamo lasciato e proseguiamo:</p>
| |
− | | |
− | '''Public''' Sub Button6_Click() ''<Font Color= #006400>' crea il file Midi !''</font>
| |
− |
| |
− | Dim fileMidi As String
| |
− |
| |
− | ''<Font Color= #006400>' definisce il Blocco d'Intestazione (Header Chunk) del file Midi:''</font>
| |
− | Dim mthd As String = "MThd" & String$(3, Chr(0)) & Chr(6) & Chr(0) & Chr(1) & Chr(0) & Chr(2) & Chr(1) & Chr(128)
| |
− |
| |
− | ''<Font Color= #006400>' definisce i primi 4 dati del Blocco di Traccia (Track Chunk) del file Midi:''</font>
| |
− | Dim mtrkTesta As String = "MTrk"
| |
− |
| |
− | Dim mtrkDelTempo As String
| |
− | Dim mtrkDati As String
| |
− |
| |
− | ''<Font Color= #006400>' definisce i 4 dati ricorrenti di chiusura di ogni Blocco Traccia del file Midi:''</font>
| |
− | 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 = 0 To bl
| |
− |
| |
− | If j = bl Then
| |
− | bloccoTD[j] = Chr(0)
| |
− | Else
| |
− | mtrk = mtrk & Right$(blocco[j], 3) & bloccoTD[j]
| |
− | Endif
| |
− | Next
| |
− |
| |
− | ''<Font Color= #006400>' scrive la cosiddetta: Traccia del Tempo:''</font>
| |
− |
| |
− | ''<Font Color= #006400>' defininendone i valori del tempo metronomico =''</font>
| |
− | 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
| |
− |
| |
− |
| |
− | ''<Font Color= #006400>' definisce il Meta-evento del Tempo metronomico:''</font>
| |
− | mtrkTempoMetronomico = Chr(255) & Chr(81) & Chr(3) & Chr(tmA) & Chr(tmB) & Chr(tmC)
| |
− |
| |
− | ''<Font Color= #006400>' definisce il Meta-evento della Suddivisione della Misura:''</font>
| |
− | mtrkSuddivisione = Chr(255) & Chr(88) & Chr(4) & Chr(numeratore) & Chr(denominatore) & Chr(96) & Chr(8)
| |
− |
| |
− | ''<Font Color= #006400>' definisce il Meta-evento della Tonalità della Scala musicale del brano:''</font>
| |
− | mtrkChiave = Chr(255) & Chr(89) & Chr(2) & Chr(alterazioni) & Chr(modo)
| |
− |
| |
− | ''<Font Color= #006400>' costituisce l'intera Traccia del Tempo:''</font>
| |
− | mtrkDelTempo = mtrkTesta & String$(3, Chr(0)) & Chr(25) & Chr(0) & mtrkSuddivisione & Chr(0) & mtrkTempoMetronomico & Chr(0) & mtrkChiave & mtrkCoda
| |
− |
| |
− |
| |
− | ''<Font Color= #006400>' Scrive la traccia degli eventi Midi:''</font>
| |
− | ''<Font Color= #006400>' deve ricavare innanzitutto la lunghezza della traccia degli eventi Midi:''</font>
| |
− | lunghMtrk = f + 5 + k
| |
− |
| |
− | 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
| |
− |
| |
− | ''<Font Color= #006400>' quindi riempie la variabile contenente i dati della Traccia degli eventi Midi comprensiva anche dei relativi Tempi Delta:''</font>
| |
− | mtrkDati = mtrkTesta & Chr(luA) & Chr(luB) & Chr(luC) & Chr(luD) & Chr(0) & mtrk
| |
− |
| |
− |
| |
− | ''<Font Color= #006400>' Ora siamo pronti a creare e riempire la variabile contenente tutti i dati necessari per la scrittura del file Midi:''</font>
| |
− | fileMidi = mthd & mtrkDelTempo & mtrkDati & mtrkCoda
| |
− |
| |
− | ''<Font Color= #006400>'...il "magico" momento della scrittura del file Midi sul nostro hardDisk:''</font>
| |
− | File.Save("/tmp/midiProva.mid", fileMidi)
| |
− |
| |
− | ''<Font Color= #006400>' Lo proviamo facendolo suonare subito !''</font>
| |
− | Shell "aplaymidi -p 128:0 /tmp/midiProva.mid"
| |
− |
| |
− | '''End'''
| |