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.1 ".


Mostriamo un semplice esempio pratico:

Private Const MIDI_BUFFER As Integer = 128


Library "libsndio:7.1"

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


Riferimenti