Alsa e Gambas: Uso di una Classe specifica

Da Gambas-it.org - Wikipedia.

Preambolo

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 Struttura.


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.

' Gambas class file
' Questa è la Classe specifica per i dati midi: CMidi.class


 Public type As Byte               byte n° 0
 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         byte n° 15
  Public channel As Byte            byte n° 16
  Public note As Byte               byte n° 17
  Public velocity As Short          byte n° 18
   Public primoValore As Integer     byte n° 20
   Public secondoValore As Integer   byte n° 24


Tale Classe potrà essere dichiarata 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, zv As Cmidi) As Integer

mentre all'interno delle routine, quando essa viene chiamata, il nome della variabile classe specifica. Ad esempio:

err = snd_seq_event_output(handle, ev_OnOffPoly)


Gruppo messaggi: NoteON - NoteOFF - Polyphonic Aftertouch

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.

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:

ev_OnOffPoly As New CMidi

Ora la nostra variabile ev_OnOffPoly è operativa e può essere utilizzata per la gestione ed il successivo invio dei messaggi Midi ad ALSA.

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.

Quindi dalla classe principale chiameremo la routine specifica per i tre eventi qui considerati, passandogli anche tre valori necessari:

Public Sub eventoOnOffPoly(def_Evento As Byte, nota as byte, velocitas As Short)

Dim err As Integer

 With ev_OnOffPoly
   .type = def_Evento          ' = 6, 7 oppure 8
   .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, ev_OnOffPoly)    ' si passano ad ALSA i valori presenti nella variabile-Classe: ev_OnOffPoly
 printerr("OnOffPoly = ", err)

End


Gruppo messaggi: Program Change - Channel Aftertouch (Key Pressure)

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.

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:

ev_PgmKeyPress As New CMidi

Ora la nostra variabile ev_PgmKeyPress è operativa e può essere utilizzata per la gestione ed il successivo invio dei messaggi Midi ad ALSA.

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.

Quindi dalla classe principale chiameremo la routine specifica per i due eventi qui considerati, passandogli anche due valori necessari:

Public Sub eventoPgmKeyPress(def_Evento As Byte, sec_Valore As Integer)

Dim err As Integer

 With ev_PgmKeyPress
  .type = def_Evento          ' = 11 oppure 12
  .queue = outq
  .source_id = id
  .source_porta = outport
  .dest_id = SND_SEQ_ADDRESS_SUBSCRIBERS
  .dest_porta = SND_SEQ_ADDRESS_UNKNOWN
  .channel = 0
  .secondoValore = sec_Valore    ' impostato nella classe principale
 End With

 err = snd_seq_event_output(handle, ev_PgmKeyPress)    ' si passano ad ALSA i valori presenti nella variabile-Classe: ev_PgmKeyPress
 printerr("PgmKeyPress = ", err)

End


Gruppo messaggi: Control Change - Pitch Bend (Pitch Wheel)

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.

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:

ev_CtrlPitBnd As New CMidi

Ora la nostra variabile-Classe ev_CtrlPitBnd è operativa e può essere utilizzata per la gestione ed il successivo invio dei messaggi Midi ad ALSA.

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.

Quindi dalla classe principale chiameremo la routine specifica per i due eventi qui considerati, passandogli anche tre valori necessari:

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          ' = 10 oppure 13
   .queue = outq
   .source_id = id
   .source_porta = outport
   .dest_id = SND_SEQ_ADDRESS_SUBSCRIBERS
   .dest_porta = SND_SEQ_ADDRESS_UNKNOWN
   .channel = 0
   .primoValore = prm_Valore      ' impostato nella classe principale
   .secondoValore = sec_Valore    ' impostato nella classe principale
 End With

 err = snd_seq_event_output(handle, ev_CtrlPitBnd)    ' si passano ad ALSA i valori presenti nella variabile-Classe: CtrlPitBnd
 printerr("CtrlPitBnd = ", err)

End


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: 5° CODICE.