Differenze tra le versioni di "Alsa e Gambas: Client e porte in Ricezione dei dati Midi"

Da Gambas-it.org - Wikipedia.
(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...")
 
Riga 1: Riga 1:
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:
+
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.
  
Public alsa As CAlsa              <Font Color= #006400>' ''classe che incapsula le funzioni ALSA''</font>
+
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"
 
'''Public''' Sub Form_Open()
 
 
  Me.Center
 
 
  <Font Color=gray>' ''creare ("istanziare") la classe per poterla usare''</font>
 
  alsa = New CAlsa As "alsa"
 
 
 
  <Font Color=gray>' ''aprire alsa e assegnare un nome''</font>
 
  alsa.alsa_open("Applicativo in Ricezione dati")
 
 
 
'''End'''
 
 
 
 
 
<P>Nella classe secondaria CAlsa.class richiameremo e porremo sostanzialmente tutte le funzioni, la libreria e le necessarie dichiarazioni di variabili che abbiamo conosciuto nel precedente progetto per l'invio dei dati Midi:</p>
 
Public handle As Pointer
 
  Private id As Integer
 
Private inport As Integer
 
 
 
  Library "libasound:2"
 
 
   
 
   
 
  Private Const SND_SEQ_OPEN_DUPLEX As Integer = 3
 
  Private Const SND_SEQ_OPEN_DUPLEX As Integer = 3
Riga 50: Riga 32:
 
   
 
   
 
   
 
   
  '''Public''' Sub alsa_open(nome As String)
+
  '''Public''' Sub Main()
  Dim err As Integer
 
 
    
 
    
 +
  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)
 
   printerr("Apertura di Alsa regolare !", err)
 
   printerr("Apertura di Alsa regolare !", err)
   If err < 0 Then error.RAISE("Errore nell'apertura di ALSA !")     <Font Color= #006400>' ''gestione dell'errore''</font>
+
   If err < 0 Then error.RAISE("Errore nell'apertura di ALSA !")
   
+
 
   snd_seq_set_client_name(handle, nome)
 
   snd_seq_set_client_name(handle, nome)
 
   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 la propria porta, essa viene posta con capacità "Write", ossia "scrivibile" da parte dell'Altro dispositivo''</font>
+
   <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>
   err = snd_seq_create_simple_port(handle, "Porta applicativo", SND_SEQ_PORT_CAP_WRITE, SND_SEQ_PORT_TYPE_MIDI_GENERIC + SND_SEQ_PORT_TYPE_APPLICATION)
+
   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 = "; err
+
   Print "Numero della porta input dell'applicazione = "; inport
   If err < 0 Then error.Raise("Errore nella creazione della porta !")     <Font Color= #006400>' ''gestione dell'errore''</font>
+
   If inport < 0 Then error.Raise("Errore nella creazione della porta !")
  inport = err
+
   
+
  <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>
  <Font Color=gray>' ''si pongono: 14 (id del sistema ALSA) e 0 ( num. della sua porta)''</font>
+
   err = snd_seq_connect_from(handle, inport, <FONT Color=#B22222>'''14'''</font>, <FONT Color=#B22222>'''0'''</font>)
<Font Color=gray>' '''''per connettere il nostro client ad Alsa e "ricevere" dati direttamente da essa.'''''</font>
 
   err = snd_seq_connect_from(handle, inport, 14, 0)    
 
 
   printerr("Subscribe inport", err)
 
   printerr("Subscribe inport", err)
 
   If err < 0 Then error.Raise("Error subscribe input device")      <Font Color= #006400>' ''gestione dell'errore''</font>
 
   If err < 0 Then error.Raise("Error subscribe input device")      <Font Color= #006400>' ''gestione dell'errore''</font>
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
<P>Quindi inseriremo le funzioni per la gestione degli errori:</p>
 
 
<Font Color=gray>''' ###  GESTIONE DELL'ERRORE  ### ''</font>
 
 
Private Extern snd_strerror(err As Integer) As Pointer
 
 
'''Public''' Sub errmsg(err As Integer) As String
 
 
    Return String@(snd_strerror(err))
 
 
'''End'''
 
 
 
'''Private''' Sub printerr(operation As String, err As Integer)
 
    If err < 0 Then Print operation; ": err="; err; " ("; errmsg(err); ")"
 
'''End'''
 
 
  
 
===Ricevere messaggi Midi da una tastiera o altro dispositivo Midi esterno===
 
===Ricevere messaggi Midi da una tastiera o altro dispositivo Midi esterno===
 
Se si intende, invece, ricevere messaggi Midi da una tastiera o altro dispositivo Midi esterno, dopo averlo collegato alla porta USB, si verificherà in console mediante il comando ''cat /proc/asound/seq/clients'' il suo numero identificativo e la sua porta. Quindi, se, per esempio, il numero identificativo della nostra tastiera esterna è 24 ed il numero della la sua porta è 0, bisognerà sostituire i parametri relativi al dispositivo sorgente nell'apposita funzione:
 
Se si intende, invece, ricevere messaggi Midi da una tastiera o altro dispositivo Midi esterno, dopo averlo collegato alla porta USB, si verificherà in console mediante il comando ''cat /proc/asound/seq/clients'' il suo numero identificativo e la sua porta. Quindi, se, per esempio, il numero identificativo della nostra 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>)
  err = snd_seq_connect_from(handle, inport, '''24''', '''0''')
 

Versione delle 07:21, 19 gen 2022

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)
 printerr("Apertura di Alsa regolare !", err)
 If err < 0 Then error.RAISE("Errore nell'apertura di ALSA !")

 snd_seq_set_client_name(handle, nome)
 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)
 printerr("Subscribe inport", err)
 If err < 0 Then error.Raise("Error subscribe input device")      ' gestione dell'errore

End

Ricevere messaggi Midi da una tastiera o altro dispositivo Midi esterno

Se si intende, invece, ricevere messaggi Midi da una tastiera o altro dispositivo Midi esterno, dopo averlo collegato alla porta USB, si verificherà in console mediante il comando cat /proc/asound/seq/clients il suo numero identificativo e la sua porta. Quindi, se, per esempio, il numero identificativo della nostra 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)