Differenze tra le versioni di "Alsa e Gambas: Salvataggio dei dati"

Da Gambas-it.org - Wikipedia.
 
(27 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
 
 
 
'''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
 
 
 
  ''<Font Color= #006400>' scrive la Traccia del Tempo:
 
 
 
''<Font Color= #006400>' 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
 
 
 
<BR><Font Color= #FF0000>'''< Pagina in costruzione >'''</font>
 

Versione attuale delle 17:51, 12 gen 2022