Differenze tra le versioni di "Alsa e Gambas: Ricezione dei dati Midi con Timer"

Da Gambas-it.org - Wikipedia.
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:
  
 
Mostriamo di seguito un esempio astratto con l'uso di un "Timer" e il metodo con il ''Memory Stream'' di dereferenziazione del Puntatore, passato dalla funzione esterna di ALSA "snd_seq_event_input()":
 
Mostriamo di seguito un esempio astratto con l'uso di un "Timer" e il metodo con il ''Memory Stream'' di dereferenziazione del Puntatore, passato dalla funzione esterna di ALSA "snd_seq_event_input()":
 +
Private Timer1 As Timer
 +
 +
 
  '''Public''' Sub Timer1_Timer()
 
  '''Public''' Sub Timer1_Timer()
 
   
 
   
Riga 8: Riga 11:
 
   Dim st As Stream
 
   Dim st As Stream
 
   Dim b As Byte
 
   Dim b As Byte
 +
 +
  Do
 
   
 
   
 
  <Font Color= #006400>' ''Questa seguente funzione restituisce un Integer, il quale, se diverso da 0, comunica al programma che c'è un evento.</font>''
 
  <Font Color= #006400>' ''Questa seguente funzione restituisce un Integer, il quale, se diverso da 0, comunica al programma che c'è un evento.</font>''
  i = snd_seq_event_input_pending(handle, True)
+
    i = snd_seq_event_input_pending(handle, True)
 
  <Font Color= #006400>' Se non ci sono eventi, il programma fuoriesce dalla routine:''</font>
 
  <Font Color= #006400>' Se non ci sono eventi, il programma fuoriesce dalla routine:''</font>
  If i = 0 Then Return
+
    If i = 0 Then Return
 
   
 
   
 
  <Font Color= #006400>' ''La seguente funzione ritorna l'indirizzo dell'evento.''
 
  <Font Color= #006400>' ''La seguente funzione ritorna l'indirizzo dell'evento.''
 
  ' ''Poiché ALSA deve riempire un puntatore, si usa VarPtr: si passa così l'indirizzo del puntatore ad ALSA.''</font>
 
  ' ''Poiché ALSA deve riempire un puntatore, si usa VarPtr: si passa così l'indirizzo del puntatore ad ALSA.''</font>
  i = snd_seq_event_input(handle, VarPtr(p))
+
    i = snd_seq_event_input(handle, VarPtr(p))
  If i < 0 Then Return
+
    If i < 0 Then Break
 
   
 
   
 
  <Font Color= #006400>' ''Filtra i tipi di Eventi Midi di ALSA non interessanti:''</font>
 
  <Font Color= #006400>' ''Filtra i tipi di Eventi Midi di ALSA non interessanti:''</font>
  If Byte@(p) > 14 Then Return
+
    If Byte@(p) > 14 Then Return
 
   
 
   
 
  <Font Color= #006400>' ''Quindi si posiziona uno Stream all'indirizzo del puntatore dell'indirizzo dell'evento:''</font>
 
  <Font Color= #006400>' ''Quindi si posiziona uno Stream all'indirizzo del puntatore dell'indirizzo dell'evento:''</font>
  st = Memory p For Read
+
    st = Memory p For Read
 
   
 
   
 
  <Font Color= #006400>' ''A scopo didattico ricaviamo e mostriamo in console il contenuto dei byte nn. 16, 17 e 18, i quali contengono rispettivamente i valori del canale, del numero della nota e della velocità di tocco (velocity).</font>''
 
  <Font Color= #006400>' ''A scopo didattico ricaviamo e mostriamo in console il contenuto dei byte nn. 16, 17 e 18, i quali contengono rispettivamente i valori del canale, del numero della nota e della velocità di tocco (velocity).</font>''
  Seek #st, 16
+
    Seek #st, 16
  Read #st, b
+
    Read #st, b
  Print b,
+
    Print b,
 +
 +
    Read #st, b
 +
    Print b,
 
   
 
   
  Read #st, b
+
    Read #st, b
  Print b,
+
    Print b
 
   
 
   
   Read #st, b
+
   Loop
  Print b
 
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione attuale delle 18:01, 20 gen 2022

Come soluzione iniziale, anche ricordando il nostro approccio didattico, useremo un ciclo gestito dall'Oggetto Timer, accettando l'inevitabile latenza. Per ridurre al massimo tale possibile latenza, alla Proprietà ".Delay" del Timer si assegnerà il valore minimo di 1 millisecondo.

Mostriamo di seguito un esempio astratto con l'uso di un "Timer" e il metodo con il Memory Stream di dereferenziazione del Puntatore, passato dalla funzione esterna di ALSA "snd_seq_event_input()":

Private Timer1 As Timer


Public Sub Timer1_Timer()

 Dim i As Integer
 Dim p As Pointer
 Dim st As Stream
 Dim b As Byte

 Do

' Questa seguente funzione restituisce un Integer, il quale, se diverso da 0, comunica al programma che c'è un evento.
   i = snd_seq_event_input_pending(handle, True)
' Se non ci sono eventi, il programma fuoriesce dalla routine:
   If i = 0 Then Return

' La seguente funzione ritorna l'indirizzo dell'evento.
' Poiché ALSA deve riempire un puntatore, si usa VarPtr: si passa così l'indirizzo del puntatore ad ALSA.
   i = snd_seq_event_input(handle, VarPtr(p))
   If i < 0 Then Break

' Filtra i tipi di Eventi Midi di ALSA non interessanti:
   If Byte@(p) > 14 Then Return

' Quindi si posiziona uno Stream all'indirizzo del puntatore dell'indirizzo dell'evento:
   st = Memory p For Read

' A scopo didattico ricaviamo e mostriamo in console il contenuto dei byte nn. 16, 17 e 18, i quali contengono rispettivamente i valori del canale, del numero della nota e della velocità di tocco (velocity).
   Seek #st, 16
   Read #st, b
   Print b,

   Read #st, b
   Print b,

   Read #st, b
   Print b

 Loop

End