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

Da Gambas-it.org - Wikipedia.
Riga 3: Riga 3:
 
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
 
  Private Timer1 As Timer
 +
 +
 +
Public Sub ......
 +
 +
  Timer1 = New Timer As "Timer1"
 +
 +
End
 
   
 
   
 
   
 
   
Riga 16: Riga 23:
 
  <Font Color=gray>' ''Questa seguente funzione restituisce un Integer, il quale, se diverso da 0, comunica al programma che c'è un evento.</font>''
 
  <Font Color=gray>' ''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=gray>' ''Se non ci sono eventi, il programma fuoriesce dalla routine:''</font>
 
     If i = 0 Then Return
 
     If i = 0 Then Return
 
   
 
   

Versione delle 05:11, 20 giu 2024

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 = New Timer As "Timer1"

End


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