Alsa e Gambas: Ricezione dei dati Midi con Timer

Da Gambas-it.org - Wikipedia.
Versione del 20 gen 2022 alle 15:54 di Vuott (Discussione | contributi) (Creata pagina con "Come soluzione iniziale, anche ricordando il nostro approccio didattico, useremo un ciclo gestito dall'Oggetto ''Timer'', accettando l'inevitabile latenza. Per ridurre al mass...")

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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()":

Public Sub Timer1_Timer()

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

' 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 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,

 Seek #st, 17
 Read #st, b
 Print b,

 Seek #st, 18
 Read #st, b
 Print b

End