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 = 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