Intercettare dati Midi grezzi con le funzioni esterne del API di Sndio
Da Gambas-it.org - Wikipedia.
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