Alsa e Gambas: Client e porte in Ricezione dei dati Midi

Da Gambas-it.org - Wikipedia.

Dopo la creazione del programma Client di ALSA e delle sue porte, per consentire di ricevere dati da un altro Client esterno, si dovrà utilizzare la funzione esterna di ALSA:

snd_seq_connect_from()

alla quale si dovranno passare il numero del Client esterno che invia i dati Midi e il numero della sua Porta.

Mostriamo un esempio pratico, nel quale poniamo il caso che il dispositivo esterno, che invia dati Midi ad ALSA (i quali dovranno essere intercettati poi dal nostro programma Client), sia connesso ad ALSA - come suo Client. Pertanto il nostro Client dovrà connettersi ad ALSA impostando nella predetta funzione esterna "snd_seq_connect_from()" il numero identificativo del sistema audio interno di ALSA: 14.

Library "libasound:2"

Private Const SND_SEQ_OPEN_DUPLEX As Integer = 3
Private Const SND_SEQ_PORT_CAP_WRITE As Integer = 2
Private Const SND_SEQ_PORT_TYPE_MIDI_GENERIC As Integer = 2
Private Const SND_SEQ_PORT_TYPE_APPLICATION As Integer = 1048576
 
' int snd_seq_open(snd_seq_t **seqp, const char * name, Int streams, Int mode)
' Open the ALSA sequencer.
Private Extern snd_seq_open(Pseq As Pointer, name As String, streams As Integer, mode As Integer) As Integer

' int snd_seq_set_client_name(snd_seq_t* seq, const char* name)
' Set client name.
Private Extern snd_seq_set_client_name(seq As Pointer, name As String) As Integer

' int snd_seq_create_simple_port(snd_seq_t* seq, const char* name, unsigned int caps, unsigned int type)
' Create a port - simple version.
Private Extern snd_seq_create_simple_port(seq As Pointer, name As String, caps As Integer, type As Integer) As Integer

' int snd_seq_client_id(snd_seq_t * seq)
' Get the client id.
Private Extern snd_seq_client_id(seq As Pointer) As Integer

' int snd_seq_connect_from(seq as pointer, myport as integer, src_client as integer, src_port as integer)
' Simple subscription (w/o exclusive & time conversion).
Private Extern snd_seq_connect_from(seq As Pointer, myport As Integer, src_client As Integer, src_port As Integer) As Integer


Public Sub Main()
 
 Dim handle As Pointer
 Dim err, id As Integer
 Dim inport As Integer

 err = snd_seq_open(VarPtr(handle), "default", SND_SEQ_OPEN_DUPLEX, 0)
 If err < 0 Then error.RAISE("Errore nell'apertura di ALSA !")

 snd_seq_set_client_name(handle, "Esempio Client")
 id = snd_seq_client_id(handle)
 Print "Alsa Client-ID = "; id

 ' Per poter leggere i dati ricevuti dalla propria porta, essa viene posta con capacità "Write", ossia "scrivibile" da parte dell'Altro dispositivo Client che invia appunto i dati:
 inport = snd_seq_create_simple_port(handle, "Porta applicativo", SND_SEQ_PORT_CAP_WRITE, SND_SEQ_PORT_TYPE_MIDI_GENERIC + SND_SEQ_PORT_TYPE_APPLICATION)
 Print "Numero della porta input dell'applicazione = "; inport
 If inport < 0 Then error.Raise("Errore nella creazione della porta !")

' Si pongono: 14 (id del sistema audio interno ALSA) e 0 ( num. della sua porta) per connettere il nostro Client ad ALSA e "ricevere" dati direttamente da essa.
 err = snd_seq_connect_from(handle, inport, 14, 0)
 If err < 0 Then error.Raise("Error subscribe input device")      ' gestione dell'errore

End

Connettere il Client direttamente tramite il numero identificativo del dispositivo Midi esterno

Se si intende, invece, connettere il nostro programma Client direttamente tramite il numero identificativo di una tastiera o di altro dispositivo Midi esterno, dopo aver collegato tale dispositivo alla porta USB, si verificherà in console mediante il comando cat /proc/asound/seq/clients il suo numero identificativo di Client ALSA e la sua porta, e li si utilizzerà nella funzione esterna "snd_seq_connect_from()".
Quindi, se, per esempio, il numero identificativo della tastiera esterna è 24 ed il numero della la sua porta è 0, bisognerà sostituire i parametri relativi al dispositivo sorgente nell'apposita funzione:

err = snd_seq_connect_from(handle, inport, 24, 0)