Alsa e Gambas - Dai Messaggi Midi standard all'Evento Midi di ALSA

Da Gambas-it.org - Wikipedia.

ALSA non gestisce i Messaggi Midi dai dati grezzi così come giungono, bensì li organizza preliminarmente in complessi propri Eventi Midi che si costruiscono su un'area di memoria allocata, rappresentata dalla Struttura di ALSA "seq_event_t".

Tale Struttura occupa un quantità di memoria pari a 28 byte.

Di essa i primi sette membri (che occupano i primi 16 byte dell'area di memoria allocata) contengono dati comuni a tutti gli Eventi Midi di Alsa, i restanti sono riservati a specifici Eventi Midi.

Confronto fra la rappresentazione in C e quella in Gambas della Struttura di ALSA "seq_event_t"

Traduciamo la Struttura di ALSA "seq_event_t", scritta in linguaggio C, nella corrispondente Struttura in linguaggio Gambas e le confrontiamo:

struct snd_seq_event_t {                           Public Struct seq_event_t

snd_seq_event_type_t type                          type As Byte         byte di indice 0 \
unsigned char flags                                flag As Byte                           \
unsigned char tag                                  tag As Byte                             \
unsigned char queue                                queue As Byte                            \   dati comuni
snd_seq_timestamp_t time                                                                     \  
   ↳ snd_seq_tick_time_t tick                      tick_time As Integer                       \ a tutti
   ↳ struct snd_seq_real_time time                 real_time As Integer                       / 
snd_seq_addr_t source                                                                        /  i Messaggi Midi    
   ↳ unsigned char client                          source_client As Byte                    /
   ↳ unsigned char port                            source_port As Byte                     /
snd_seq_addr_t dest                                                                       /
   ↳ unsigned char client                          dest_client As Byte                   /
   ↳ unsigned char port                            dest_port As Byte   byte di indice 15/
snd_seq_ev_note_t note                      
   ↳ unsigned char channel                         channel As Byte         byte di indice 16 \
   ↳ unsigned char note                            note As Byte            byte di indice 17  \  dati appartenenti
   ↳ unsigned char velocity                        velocity As Byte        byte di indice 18   \ agli specifici
   ↳ unsigned char off_velocity                    off_velocity As Byte    byte di indice 19   / Messaggi Midi
unsigned int param                                 param As Integer        byte di indice 20  /
signed int value                                   value As Integer        byte di indice 24 /

}                                                  End Struct

Sia per inviare che per ricevere Eventi Midi ALSA, bisognerà rispettare rigidamente la disposizione - quindi il tipo - di ciascun dato nel rispettivo offset stabilito dal protocollo di ALSA.

Non è possibile frammentare l'area di memoria del singolo Evento Midi ALSA in due o più blocchi da inviare al subsistema "seq" separatamente (seppur magari uno dopo l'altro in immediata sequenza): i dati contenuti nelll'area di memoria, che costituisce l'Evento Midi ALSA, devono essere inviati ad ALSA - mediante le funzioni esterne "snd_seq_event_output()" e "snd_seq_drain_output()" - tutti insieme in una volta sola.

PAGINA IN COSTRUZIONE !