Differenze tra le versioni di "Alsa e Gambas: Uso di una Classe specifica"

Da Gambas-it.org - Wikipedia.
 
Riga 1: Riga 1:
===Preambolo===
+
#REDIRECT [[Alsa_e_Gambas:_Invio_dati_con_l'uso_di_una_Classe_specifica]]
 
 
Prenderemo ora in considerazione l'uso di una Classe specifica, nella quale inseriremo le variabili che saranno successivamente riempite dai valori relativi ai dati Midi e necessari per la definizione dell'evento Midi particolare. Dichiarando poi una variabile del tipo di quella Classe per ciascun evento Midi si avrà un'area di memoria utilizzabile. L'uso di tale Classe specifica sostituisce egregiamente e più dinamicamente la [[Strutture:_dichiarazione_ed_uso|Struttura]]. |[[#Note|1]]|
 
 
 
 
 
 
 
=Scrittura dei dati dei messaggi Midi nella Classe specifica dei dati Midi=
 
 
 
Viene innanzitutto creata ed impostata una Classe modello specifica (che qui nel nostro esempio sarà chiamata ''CMidi.class'') che contiene, come già detto, tutte le variabili necessarie per la definizione di qualunque evento Midi.
 
 
 
<FONT color=#006400>' ''Gambas class file''
 
' ''Questa è la Classe specifica per i dati midi: CMidi.class''</font>
 
 
 
  Public type As Byte              <FONT color=#006400>' ''byte n° 0''</font>
 
  Public flag As Byte
 
  Public tag As Byte
 
  Public queue As Byte
 
  Public timestamp1 As Integer
 
  Public timestamp2 As Integer
 
  Public source_id As Byte
 
  Public source_porta As Byte
 
  Public dest_id As Byte
 
  Public dest_porta As Byte        <FONT color=#006400>' ''byte n° 15''</font>
 
    Public channel As Byte            <FONT color=#006400>' ''byte n° 16''</font>
 
    Public note As Byte              <FONT color=#006400>' ''byte n° 17''</font>
 
    Public velocity As Byte          <FONT color=#006400>' ''byte n° 18''</font>
 
    Public off_velocity As Byte      <FONT color=#006400>' ''byte n° 19''</font>
 
      Public param As Integer          <FONT color=#006400>' ''byte n° 20''</font>
 
      Public value As Integer          <FONT color=#006400>' ''byte n° 24''</font>
 
Le variabili del tipo di questa Classe potranno essere dichiarate all'interno della Classe ''CAlsa.class''.
 
 
 
 
 
 
 
=I messaggi Midi specifici=
 
===Preambolo===
 
 
 
Organizzeremo nella classe secondaria CAlsa.class le routine per la gestione dei messaggi Midi. Poiché per i valori specifici di ciascun messaggio è prevista, come già sappiamo, una disposizione all'interno della zona di memoria comune con altri messaggi, prevederemo - per ciascun gruppo di messaggi dalla struttura simile - delle variabili del tipo della Classe specifica ''CMidi'' apposite che vadano bene per i messaggi appartenenti a quel gruppo.
 
 
 
V'è da sottolineare che nella classe ''CAlsa.class'' la funzione ''snd_seq_event_output'' va modificata inserendo come secondo parametro nella sua dichiarazione con la funzione ''Extern'' il nome della Classe modello ''CMidi'':
 
Private Extern snd_seq_event_output(handle As Pointer, vC As <FONT color=#B22222>Cmidi</font>) As Integer
 
 
 
mentre all'interno delle routine, quando essa viene chiamata, va inserito il nome della variabile-classe specifica. Ad esempio:
 
err = snd_seq_event_output(handle, <FONT color=#FF7000>ev_OnOffPoly</font>)
 
 
 
 
 
==Gruppo messaggi: <FONT Color= "red">NoteON - NoteOFF</font> - <FONT Color= "red">Polyphonic Aftertouch</font>==
 
Questi tre messaggi Midi hanno tra loro in comune tre medesimi specifici dati posti ai byte num. 16, 17 e 18 della Classe specifica modello, e che abbiamo chiamato: ''channel'', ''note'' e ''velocity''.
 
 
 
<P>Dichiareremo nella classe ''CAlsa.class'' una variabile ''ad hoc'' per questi tre messaggi Midi del tipo della Classe specifica modello ''CMidi'', della quale ultima assumerà così l'organizzazione interna delle particolari variabili ed il tipo dei valori:</p>
 
 
 
ev_OnOffPoly As New CMidi
 
 
 
<P>Ora la nostra variabile ''ev_OnOffPoly'' è operativa e può essere utilizzata per la gestione ed il successivo invio dei messaggi Midi ad ALSA.</p>
 
<P>L'uso di tale variabile-Classe si ha quando si dovrà definire ''concretamente'' il messaggio Midi richiesto, fissando in ciascun elemento costituivo (le diverse variabili in essa contenute) i relativi valori. Si potrà evitare di richiamare le varibili particolari della Classe che eventualmente non servono.</p>
 
 
 
<P>Quindi dalla classe principale chiameremo la routine specifica per i tre eventi qui considerati, passandogli anche tre valori necessari:</p>
 
Public Sub eventoOnOffPoly(def_Evento As Byte, nota as byte, velocitas As Byte)
 
 
Dim err As Integer
 
 
  With ev_OnOffPoly
 
    .type = def_Evento          <FONT color=#006400>' ''= 6, 7 oppure 8''</font>
 
    .queue = outq
 
    .source_id = id
 
    .source_porta = outport
 
    .dest_id = SND_SEQ_ADDRESS_SUBSCRIBERS
 
    .dest_porta = SND_SEQ_ADDRESS_UNKNOWN
 
    .channel = 0
 
    .note = 60
 
    .velocity = velocitas
 
  End With
 
 
  err = snd_seq_event_output(handle, <FONT color=#FF7000>ev_OnOffPoly</font>)    <FONT color=#006400>' ''si passano ad ALSA i valori presenti nella variabile-Classe: ev_OnOffPoly''</font>
 
  printerr("OnOffPoly = ", err)
 
 
End
 
 
 
 
 
==Gruppo messaggi: <FONT Color= "red">Program Change</font> - <FONT Color= "red">Channel Aftertouch (Key Pressure)</font>==
 
Questi due messaggi Midi hanno tra loro in comune due medesimi specifici dati posti ai byte num. 16 e 24 della Classe ''CMidi.class'' modello, e che abbiamo chiamato: ''channel'' e ''valorePrimo''.
 
 
 
<P>Dichiareremo una variabile ''ad hoc'' anche per questi due messaggi Midi del tipo della Classe ''CMidi.class'' modello, della quale ultima assumerà così l'organizzazione interna delle particolari variabili ed il tipo dei valori:</p>
 
 
 
ev_PgmKeyPress As New CMidi
 
 
 
<P>Ora la nostra variabile ''ev_PgmKeyPress'' è operativa e può essere utilizzata per la gestione ed il successivo invio dei messaggi Midi ad ALSA.</p>
 
<P>L'uso di tale variabile-Classe specifica si ha quando si dovrà definire ''concretamente'' il messaggio Midi richiesto, fissando in ciascun elemento costituivo (le diverse variabili in essa contenute) i relativi valori. Si potrà evitare di richiamare le varibili particolari della Classe che eventualmente non servono.</p>
 
 
 
<P>Quindi dalla classe principale chiameremo la routine specifica per i due eventi qui considerati, passandogli anche due valori necessari:</p>
 
 
 
Public Sub eventoPgmKeyPress(def_Evento As Byte, sec_Valore As Integer)
 
 
Dim err As Integer
 
 
  With ev_PgmKeyPress
 
  .type = def_Evento          <FONT color=#006400>' ''= 11 oppure 12''</font>
 
  .queue = outq
 
  .source_id = id
 
  .source_porta = outport
 
  .dest_id = SND_SEQ_ADDRESS_SUBSCRIBERS
 
  .dest_porta = SND_SEQ_ADDRESS_UNKNOWN
 
  .channel = 0
 
  .value = sec_Valore        <FONT color=#006400>' ''impostato nella classe principale''</font>
 
  End With
 
 
<FONT color=#006400>' ''Si passano ad ALSA i valori presenti nella variabile-Classe: ev_PgmKeyPress:''</font>
 
  err = snd_seq_event_output(handle, <FONT color=#FF7000>ev_PgmKeyPress</font>)
 
  printerr("PgmKeyPress = ", err)
 
 
End
 
 
 
 
 
==Gruppo messaggi: <FONT Color= "red">Control Change</font> - <FONT Color= "red">Pitch Bend (Pitch Wheel)</font>==
 
Questi due messaggi Midi hanno tra loro in comune tre medesimi specifici dati posti ai byte num. 16, 20 e 24 della Classe ''CMidi.class'' modello, e che abbiamo chiamato: ''channel'', ''primoValore'' e ''secondoValore''.
 
 
 
<P>Dichiareremo una variabile ''ad hoc'' anche per questi due messaggi Midi del tipo della Classe ''CMidi.class'' modello, della quale ultima assumerà così l'organizzazione interna delle particolari variabili ed il tipo dei valori:</p>
 
 
 
ev_CtrlPitBnd As New CMidi
 
 
 
<P>Ora la nostra variabile-Classe ''ev_CtrlPitBnd'' è operativa e può essere utilizzata per la gestione ed il successivo invio dei messaggi Midi ad ALSA.</p>
 
<P>L'uso di tale variabile-Classe specifica si ha quando si dovrà definire ''concretamente'' il messaggio Midi richiesto, fissando in ciascun elemento costituivo (le diverse variabili in essa contenute) i relativi valori. Si potrà evitare di richiamare le varibili particolari della Classe che eventualmente non servono.</p>
 
 
 
<P>Quindi dalla classe principale chiameremo la routine specifica per i due eventi qui considerati, passandogli anche tre valori necessari:</p>
 
 
 
Public Sub eventoPgmKeyPress(def_Evento As Byte, prm_Valore As Integer, sec_Valore As Integer)
 
 
Dim err As Integer
 
 
  With ev_CtrlPitBnd
 
    .type = def_Evento          <FONT color=#006400>' ''= 10 oppure 13''</font>
 
    .queue = outq
 
    .source_id = id
 
    .source_porta = outport
 
    .dest_id = SND_SEQ_ADDRESS_SUBSCRIBERS
 
    .dest_porta = SND_SEQ_ADDRESS_UNKNOWN
 
    .channel = 0
 
    .param = prm_Valore        <FONT color=#006400>' ''impostato nella classe principale''</font>
 
    .value = sec_Valore        <FONT color=#006400>' ''impostato nella classe principale''</font>
 
  End With
 
 
  err = snd_seq_event_output(handle, <FONT color=#FF7000>ev_CtrlPitBnd</font>)    <FONT color=#006400>' ''si passano ad ALSA i valori presenti nella variabile-Classe: CtrlPitBnd''</font>
 
  printerr("CtrlPitBnd = ", err)
 
 
End
 
<BR>Da notare che per il Pitch Bend il dato ''primoValore'' è ininfluente, e può essere quindi fissato a 0.
 
 
 
 
 
==Il codice completo==
 
Per vedere in ordine il nostro codice definitivo sin qui descritto della classe specifica modello ''CMidi'' e  classe ''CAlsa.class'', cliccare sul collegamento alla sua pagina: [[Alsa_e_Gambas_Codice_5|5° CODICE]].
 
 
 
 
 
 
 
=Note=
 
[1] In Gambas una "''Struttura'' " può anche essere sostituita con una ''Classe'' avente solo Proprietà (dunque senza Metodi né Eventi).
 

Versione attuale delle 16:15, 11 gen 2022