Differenze tra le versioni di "Alsa e Gambas: Client e porte in Ricezione dei dati Midi"
(Creata pagina con "Per la creazione del nostro ''Client'' e delle sue porte e per consentirne il collegamento ad ALSA, nella classe principale ''FMain.class'' sciveremo le seguenti righe: Publ...") |
|||
(4 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | + | 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.0.0" | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Private Const SND_SEQ_OPEN_DUPLEX As Integer = 3 | Private Const SND_SEQ_OPEN_DUPLEX As Integer = 3 | ||
Riga 50: | Riga 32: | ||
− | + | 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) | err = snd_seq_open(VarPtr(handle), "default", SND_SEQ_OPEN_DUPLEX, 0) | ||
− | + | If err < 0 Then error.RAISE("Errore nell'apertura di ALSA !") | |
− | If err < 0 Then error.RAISE("Errore nell'apertura di ALSA !") | + | |
− | + | snd_seq_set_client_name(handle, "Esempio Client") | |
− | snd_seq_set_client_name(handle, | ||
id = snd_seq_client_id(handle) | id = snd_seq_client_id(handle) | ||
Print "Alsa Client-ID = "; id | Print "Alsa Client-ID = "; id | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | <Font Color=gray>' ''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:''</font> | |
+ | 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 !") | ||
− | ''' | + | <Font Color=gray>' ''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.'''''</font> |
+ | err = snd_seq_connect_from(handle, inport, <FONT Color=#B22222>'''14'''</font>, <FONT Color=#B22222>'''0'''</font>) | ||
+ | If err < 0 Then error.Raise("Error subscribe input device") <Font Color= #006400>' ''gestione dell'errore''</font> | ||
− | + | End | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | err = snd_seq_connect_from(handle, inport, '''24''', '''0''') | + | ===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()". | ||
+ | <BR>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, <FONT Color=#B22222>'''24'''</font>, <FONT Color=#B22222>'''0'''</font>) |
Versione attuale delle 04:59, 20 giu 2024
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.0.0" 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)