Differenze tra le versioni di "ALSA e Gambas - Registrare messaggi Midi"

Da Gambas-it.org - Wikipedia.
 
Riga 11: Riga 11:
 
===Creare i valori per il ''Tempo Delta''===
 
===Creare i valori per il ''Tempo Delta''===
 
Come abbiamo già avuto modo di vedere nella pagina "[[Alsa_e_Gambas:_Ricevere_dati_Midi_da_uno_Standard_Midi_File#Il_Tempo_Delta_come_dato_a_lunghezza_variabile|''Ricevere dati da uno Standard Midi File'']]", il ''Tempo Delta'' con valore superiore a 127 viene definito non con il suo valore reale, bensì con una sua ''rappresentazione''. Pertanto, nel file Midi non avremo i valori reali dei Midi ''tick'' superiori al valore 127, tenuto conto della ''risoluzione'' per nota da 1/4 del Tempo Delta presente nell'Header Chunk, bensì una loro ''rappresentazione'' esadecimale. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 
Come abbiamo già avuto modo di vedere nella pagina "[[Alsa_e_Gambas:_Ricevere_dati_Midi_da_uno_Standard_Midi_File#Il_Tempo_Delta_come_dato_a_lunghezza_variabile|''Ricevere dati da uno Standard Midi File'']]", il ''Tempo Delta'' con valore superiore a 127 viene definito non con il suo valore reale, bensì con una sua ''rappresentazione''. Pertanto, nel file Midi non avremo i valori reali dei Midi ''tick'' superiori al valore 127, tenuto conto della ''risoluzione'' per nota da 1/4 del Tempo Delta presente nell'Header Chunk, bensì una loro ''rappresentazione'' esadecimale. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
  Public Sub rappr(deTick As Integer)
+
  Public Sub Rappresentazione(deTick As Integer)
 
   
 
   
Dim dT As Integer
+
  Dim dT As Integer
Dim aaa, bbb, ddd, eee, hhh As Integer
+
  Dim aaa, bbb, ddd, eee, hhh As Integer
Dim fff As Byte
+
  Dim fff As Byte
 
   
 
   
  dT = deTick
+
  dT = deTick
 
   
 
   
  bbb = dT Mod 128
+
  bbb = dT Mod 128
  ddd = CInt(dT / 128)
+
  ddd = CInt(dT / 128)
 
    
 
    
 
   ggg[hhh] = bbb
 
   ggg[hhh] = bbb
 
    
 
    
  While ddd > 0
+
  While ddd > 0
 
+
    eee = ddd Mod 128
    eee = ddd Mod 128
+
    fff = eee Or 128
    fff = eee Or 128
+
    ddd = CInt(ddd / 128)
    ddd = CInt(ddd / 128)
+
    Inc hhh
   
+
    ggg[hhh] = fff
  Inc hhh
+
  Wend
 
 
    ggg[hhh] = fff
 
 
   
 
   
  Wend
+
  For aaa = hhh To 0 Step -1
 +
    Inc tdk
 +
    s[aaa] = ggg[aaa]
 +
    bloccoTD[jk] = bloccoTD[jk] & Chr(s[aaa]) ''<Font Color= #006400>' bloccoTD è la variabile riempita dal valore del Tempo Delta''</font>
 +
  Next
 
   
 
   
 +
<Font Color=gray>' ''Pulisce la variabile "s"''</font>
 
   For aaa = hhh To 0 Step -1
 
   For aaa = hhh To 0 Step -1
    Inc tdk
+
    s[aaa] = 0
    s[aaa] = ggg[aaa]
 
    bloccoTD[jk] = bloccoTD[jk] & Chr(s[aaa]) ''<Font Color= #006400>' bloccoTD è la variabile riempita dal valore del Tempo Delta''</font>
 
 
   Next
 
   Next
 
   
 
   
''<Font Color= #006400>' pulisce la variabile "s"''</font>
+
   Inc jk
  For aaa = hhh To 0 Step -1
 
   s[aaa] = 0
 
  Next
 
 
   
 
   
  Inc jk
+
  End
 
'''End'''
 
  
 
<P>Ora siamo, dunque, pronti per la parte del codice che raggrupperà le istruzioni per la realizzazione dell'ultima fase: la costruzione del file standard Midi ''.mid'', che esporremo nel seguente capitolo: "[[ALSA_e_Gambas_-_Il_salvataggio_dei_dati_Midi|''Salvataggio dei dati Midi'']]", ed al quale rimandiamo.</p>
 
<P>Ora siamo, dunque, pronti per la parte del codice che raggrupperà le istruzioni per la realizzazione dell'ultima fase: la costruzione del file standard Midi ''.mid'', che esporremo nel seguente capitolo: "[[ALSA_e_Gambas_-_Il_salvataggio_dei_dati_Midi|''Salvataggio dei dati Midi'']]", ed al quale rimandiamo.</p>
Riga 63: Riga 59:
 
  aa[1000000] As Long
 
  aa[1000000] As Long
 
   
 
   
  '''Public''' Sub ......()
+
  Public Sub ......()
 
   
 
   
 
   ....... ''<Font Color= #006400>' qui le istruzioni per intercettare i dati Midi''</font>
 
   ....... ''<Font Color= #006400>' qui le istruzioni per intercettare i dati Midi''</font>
Riga 71: Riga 67:
 
   Inc dd
 
   Inc dd
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
[2] Dunque, prima ancora di poter scrivere, ossia di salvare, un file Midi dovremo - fra l'altro - individuare l'algoritmo per trasformare i valori decimali "''reali''" <SPAN style="text-decoration:underline">superiori a 127</span> del Tempo Delta (ossia del numero dei Midi ''tick'', tenuto conto - ripetiamo - della ''risoluzione'' per nota da 1/4 presente nell'Header Chunk) nella loro ''rappresentazione'' esadecimale:
 
[2] Dunque, prima ancora di poter scrivere, ossia di salvare, un file Midi dovremo - fra l'altro - individuare l'algoritmo per trasformare i valori decimali "''reali''" <SPAN style="text-decoration:underline">superiori a 127</span> del Tempo Delta (ossia del numero dei Midi ''tick'', tenuto conto - ripetiamo - della ''risoluzione'' per nota da 1/4 presente nell'Header Chunk) nella loro ''rappresentazione'' esadecimale:
  
  Public g[4] As Byte ''<Font Color= #006400>' la variabile " g " è un array che conterrà i valori esadecimali costituenti la rappresentazione esadecimale dei Midi ''tick''</font>
+
  Public g[4] As Byte <Font Color=gray>' ''La variabile " g " è un array che conterrà i valori esadecimali costituenti la rappresentazione esadecimale dei Midi ''tick''</font>
  Public h As Integer   ''<Font Color= #006400>' la variabile " h " conterrà la quantità di byte che costituiscono la rappresentazione esadecimale dei Midi ''tick''</font>
+
  Public h As Integer <Font Color=gray>' ''La variabile " h " conterrà la quantità di byte che costituiscono la rappresentazione esadecimale dei Midi ''tick''</font>
 
   
 
   
  '''Public''' Sub Button2_Click()
+
  Public Sub Button2_Click()
 
   
 
   
  Dim a, b, c, d, e As Integer
+
  Dim a, b, c, d, e As Integer
  Dim rob As Byte
+
  Dim rob As Byte
 
    
 
    
  h = 0  
+
  h = 0  
 
    
 
    
  a = ...''<Font Color= #006400>' la variabile " a " raccoglie il valore reale decimale dei Midi ''tick'':</font>
+
  a = ...<Font Color=gray>' ''La variabile " a " raccoglie il valore reale decimale dei Midi ''tick'':</font>
 
   
 
   
  b = a Mod 128
+
  b = a Mod 128
  d = CInt(a / 128)
+
  d = CInt(a / 128)
 
    
 
    
 
   g[h] = b
 
   g[h] = b
 
    
 
    
  While d > 0
+
  While d > 0
 
+
    e = d Mod 128
    e = d Mod 128
+
    rob = e Or 128
    rob = e Or 128
+
    d = CInt(d / 128)
    d = CInt(d / 128)
+
    Inc h
   
+
    g[h] = rob
  Inc h
+
  Wend
 
 
    g[h] = rob
 
 
   
 
   
  Wend
+
  For a = h To 0 Step -1
+
    g[a] = Hex$(g[a], 2)
For a = h To 0 Step -1
+
  <Font Color=gray>' ''Mostra distintamente a scopo didattico ciascun valore della "rappresentazione" esadecimale del valore dei Midi ''tick'':</font>
  g[a] = Hex$(g[a], 2)
+
    Print g[a]
  ''<Font Color= #006400>' facciamo mostrare distintamente a scopo didattico ciascun valore della "rappresentazione" esadecimale del valore dei Midi ''tick'':</font>
+
  Next
    Print g[a]
 
Next
 
 
   
 
   
  '''End'''
+
  End

Versione attuale delle 15:34, 19 giu 2024

In questa pagina tratteremo del caso in cui vengono ricevuti in entrata dati Midi e memorizzati, al fine di creare al termine un file Midi (.mid).
Possiamo pensare di effettuare la registrazione dei dati Midi in entrata:

  • attraverso l'utilizzazione di un altro specifico applicativo in C di supporto, come ad esempio arecordmidi, diciamo in modalità demone;
  • oppure mediante la realizzazione in Gambas di apposito algoritmo, come parte del nostro applicativo appositamente dedicata o come applicativo a se stante.

Qui prenderemo in considerazione ovviamente la seconda soluzione.

Ricezione e memorizzazione dei dati Midi

Di seguito eviteremo di esporre codice esemplificativo, ritenendo che ciascun programmatore possa e debba scegliere le soluzioni algoritmiche che riterrà più opportune e migliori. Riporteremo con proposte di codice soltanto le parti più delicate anche a fini esplicativi di concetti più complessi. Sottolineeremo soltanto che nella fase di registrazione dei dati bisognerà individuare, (mediante il Timer, oppure prendendo il tempo dell'orologio interno con la funzione Time(Now) [nota 1]) il tempo che distanzia il primo evento da un tempo iniziale assoluto, nonché i tempi che distanziano ciascun Messaggio Midi dal precedente.

Creare i valori per il Tempo Delta

Come abbiamo già avuto modo di vedere nella pagina "Ricevere dati da uno Standard Midi File", il Tempo Delta con valore superiore a 127 viene definito non con il suo valore reale, bensì con una sua rappresentazione. Pertanto, nel file Midi non avremo i valori reali dei Midi tick superiori al valore 127, tenuto conto della risoluzione per nota da 1/4 del Tempo Delta presente nell'Header Chunk, bensì una loro rappresentazione esadecimale. [nota 1]

Public Sub Rappresentazione(deTick As Integer)

  Dim dT As Integer
  Dim aaa, bbb, ddd, eee, hhh As Integer
  Dim fff As Byte

  dT = deTick

  bbb = dT Mod 128
  ddd = CInt(dT / 128)
 
  ggg[hhh] = bbb
 
  While ddd > 0
    eee = ddd Mod 128
    fff = eee Or 128
    ddd = CInt(ddd / 128)
    Inc hhh
    ggg[hhh] = fff
  Wend

  For aaa = hhh To 0 Step -1
    Inc tdk
    s[aaa] = ggg[aaa]
    bloccoTD[jk] = bloccoTD[jk] & Chr(s[aaa]) ' bloccoTD è la variabile riempita dal valore del Tempo Delta
  Next

' Pulisce la variabile "s"
  For aaa = hhh To 0 Step -1
    s[aaa] = 0
  Next

  Inc jk

End

Ora siamo, dunque, pronti per la parte del codice che raggrupperà le istruzioni per la realizzazione dell'ultima fase: la costruzione del file standard Midi .mid, che esporremo nel seguente capitolo: "Salvataggio dei dati Midi", ed al quale rimandiamo.


Note

[1] Potremmo anche utilizzare:

  • il comando bash "Date":
sSec[1000000] As String
sNan[1000000] As String
aa[1000000] As Long

Public Sub ......()

 ....... ' qui le istruzioni per intercettare i dati Midi

Shell "date +%s" To sSec[dd]  ' esprime i secondi dal 01.01.1970
Shell "date +%N" To sNan[dd] ' esprime i nanosecondi in un secondo
  Inc dd

End

[2] Dunque, prima ancora di poter scrivere, ossia di salvare, un file Midi dovremo - fra l'altro - individuare l'algoritmo per trasformare i valori decimali "reali" superiori a 127 del Tempo Delta (ossia del numero dei Midi tick, tenuto conto - ripetiamo - della risoluzione per nota da 1/4 presente nell'Header Chunk) nella loro rappresentazione esadecimale:

Public g[4] As Byte  ' La variabile " g " è un array che conterrà i valori esadecimali costituenti la rappresentazione esadecimale dei Midi tick
Public h As Integer  ' La variabile " h " conterrà la quantità di byte che costituiscono la rappresentazione esadecimale dei Midi tick

Public Sub Button2_Click()

  Dim a, b, c, d, e As Integer
  Dim rob As Byte
 
  h = 0 
 
  a = ...' La variabile " a " raccoglie il valore reale decimale dei Midi tick:

  b = a Mod 128
  d = CInt(a / 128)
 
  g[h] = b
 
  While d > 0
    e = d Mod 128
    rob = e Or 128
    d = CInt(d / 128)
    Inc h
    g[h] = rob
  Wend

  For a = h To 0 Step -1
    g[a] = Hex$(g[a], 2)
' Mostra distintamente a scopo didattico ciascun valore della "rappresentazione" esadecimale del valore dei Midi tick:
    Print g[a]
  Next

End