Alsa e Gambas: Ricezione dei dati Midi con Timer

Da Gambas-it.org - Wikipedia.

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