Intercettare dati Midi grezzi con le funzioni esterne del API di Sndio
Vai alla navigazione
Vai alla ricerca
La libreria "sndio" fornisce funzionalità anche per la gestione dei dati Midi in entrata ed in uscita.
A tal riguardo è possibile con alcune funzioni esterne della libreria "sndio" intercettare i dati Midi grezzi provenienti da un dispositivo Midi.
Sarà necessario avere installata nel proprio sistema e richiamare nel programma Gambas la libreria condivisa: "libsndio.so.7.3 ".
Mostriamo un semplice esempio pratico:
Private Const MIDI_BUFFER As Integer = 128
Library "libsndio:7.3"
Private Const MIO_IN As Integer = 8
' struct mio_hdl * mio_open(const char *name, unsigned int mode, int nbio_flag)
Private Extern mio_open(name As String, mode As Integer, nbio_flag As Integer) As Pointer
' size_t mio_read(struct mio_hdl *hdl, void *addr, size_t nbytes)
Private Extern mio_read(hdl As Pointer, addr As Pointer, nbytes As Long) As Long
' void mio_close(struct mio_hdl *hdl)
Private Extern mio_close(hdl As Pointer)
Public Sub Main()
Dim por, n As String
Dim hin As Pointer
Dim buf As Long
Dim buffer As New Byte[MIDI_BUFFER]
' Verifica l'esistenza di un file-device Midi, ed eventualmente lo raccoglie:
por = Dir("/dev", "midi*", gb.Device)[0]
' Ottiene il numero finale del file-device Midi:
n = Right(por, 1)
' Verifica che l'ultima lettera del file-device sia un numero:
If Not IsNumber(n) Then Error.Raise("L'ultima lettera del file-device non è un numero !")
' Imposta la porta Midi IN (ossia il file-device Midi individuato) secondo lo standard "sndio":
por = "rmidi/" & n
' Apre la porta Midi d'entrata dei dati Midi grezzi:
hin = mio_open(por, MIO_IN, 0)
If hin = 0 Then Error.Raise("Errore !")
Do
' Legge dalla porta Midi IN, e inserisce i dati grezzi nella variabile array:
buf = mio_read(hin, buffer.Data, MIDI_BUFFER)
If buf == 0 Then Break
Midi(buf, buffer)
Loop
Print por, " disconnesso !"
mio_close(hin)
End
Private Procedure Midi(bf As Long, buff As Byte[]) ' Procedura per mostrare i dati Midi grezzi
Dim i, sep As Integer
For i = 0 To bf - 1
sep = IIf((i Mod 16 = 15) Or (bf - 1 = i), &0A, 58)
' I dati vengono mostrati in esadecimale:
Write Hex(buff[i], 2) & " " & Chr(sep)
Next
End