Differenze tra le versioni di "Alsa e Gambas - Dai Messaggi Midi standard all'Evento Midi di ALSA"

Da Gambas-it.org - Wikipedia.
Riga 12: Riga 12:
 
  unsigned char flags                                <FONT Color=red>flags</font> As Byte                          \
 
  unsigned char flags                                <FONT Color=red>flags</font> As Byte                          \
 
  unsigned char tag                                  <FONT Color=red>tag</font> As Byte                            \
 
  unsigned char tag                                  <FONT Color=red>tag</font> As Byte                            \
  unsigned char queue                                <FONT Color=red>queue</font> As Byte                            \   dati comuni
+
  unsigned char queue                                <FONT Color=red>queue</font> As Byte                            \
 
  snd_seq_timestamp_t time                          <FONT Color=red>timestamp</font> As Long                        \   
 
  snd_seq_timestamp_t time                          <FONT Color=red>timestamp</font> As Long                        \   
     ↳ snd_seq_tick_time_t tick                                                                                       \ a tutti
+
     ↳ snd_seq_tick_time_t tick                                                                 \   dati valorizzati
     ↳ struct snd_seq_real_time time                                                                                   /
+
     ↳ struct snd_seq_real_time time                                                             \  per tutti
  snd_seq_addr_t source                                                                       /  i Messaggi Midi     
+
  snd_seq_addr_t source                                                                         /  i Messaggi Midi     
     ↳ unsigned char client                          <FONT Color=red>source_client</font> As Byte                   /
+
     ↳ unsigned char client                          <FONT Color=red>source_client</font> As Byte                     /
     ↳ unsigned char port                            <FONT Color=red>source_port</font> As Byte                     /
+
     ↳ unsigned char port                            <FONT Color=red>source_port</font> As Byte                       /
  snd_seq_addr_t dest                                                                       /
+
  snd_seq_addr_t dest                                                                         /
     ↳ unsigned char client                          <FONT Color=red>dest_client</font> As Byte                   /
+
     ↳ unsigned char client                          <FONT Color=red>dest_client</font> As Byte                     /
     ↳ unsigned char port                            <FONT Color=red>dest_port</font> As Byte   byte di indice 15/
+
     ↳ unsigned char port                            <FONT Color=red>dest_port</font> As Byte                     /
  snd_seq_ev_note_t note                    
+
  snd_seq_ev_note_t note                                                                   /
     ↳ unsigned char channel                        <FONT Color=green>channel</font> As Byte         byte di indice 16 \
+
     ↳ unsigned char channel                        <FONT Color=red>channel</font> As Byte   byte di indice 16 /
     ↳ unsigned char note                            <FONT Color=green>note</font> As Byte            byte di indice 17  \  dati appartenenti
+
     ↳ unsigned char note                            <FONT Color=green>note</font> As Byte            byte di indice 17  \  dati valorizzati
     ↳ unsigned char velocity                        <FONT Color=green>velocity</font> As Byte        byte di indice 18  \ agli specifici
+
     ↳ unsigned char velocity                        <FONT Color=green>velocity</font> As Byte        byte di indice 18  \ solo per specifici
 
     ↳ unsigned char off_velocity                    <FONT Color=green>off_velocity</font> As Byte    byte di indice 19  / Messaggi Midi
 
     ↳ unsigned char off_velocity                    <FONT Color=green>off_velocity</font> As Byte    byte di indice 19  / Messaggi Midi
 
  unsigned int param                                <FONT Color=orange>param</font> As Integer        byte di indice 20  /
 
  unsigned int param                                <FONT Color=orange>param</font> As Integer        byte di indice 20  /
Riga 31: Riga 31:
 
   
 
   
 
  '''}                                                  End Struct'''
 
  '''}                                                  End Struct'''
 +
 +
<FONT Size=2>I "dati comuni", indicati in tabella, si riferiscono a membri della Struttura comunque valorizzati per tutti i tipi di Eventi Midi.</font>
 
Sia per inviare che per ricevere ''Eventi Midi ALSA'', bisognerà rispettare <SPAN Style="text-decoration:underline">rigidamente</span> la disposizione - quindi il tipo - di ciascun dato nel rispettivo ''offset''  stabilito dal protocollo di ALSA.
 
Sia per inviare che per ricevere ''Eventi Midi ALSA'', bisognerà rispettare <SPAN Style="text-decoration:underline">rigidamente</span> la disposizione - quindi il tipo - di ciascun dato nel rispettivo ''offset''  stabilito dal protocollo di ALSA.
  

Versione delle 06:45, 19 gen 2022

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 Snd_seq_event_t

snd_seq_event_type_t type                          type As Byte         byte di indice 0 \
unsigned char flags                                flags As Byte                          \
unsigned char tag                                  tag As Byte                             \
unsigned char queue                                queue As Byte                            \
snd_seq_timestamp_t time                           timestamp As Long                         \  
   ↳ snd_seq_tick_time_t tick                                                                 \   dati valorizzati
   ↳ struct snd_seq_real_time time                                                             \  per tutti
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                      /
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 valorizzati
   ↳ unsigned char velocity                        velocity As Byte        byte di indice 18   \ solo per 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

I "dati comuni", indicati in tabella, si riferiscono a membri della Struttura comunque valorizzati per tutti i tipi di Eventi Midi.

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.


Gli Eventi Midi di ALSA in particolare

I particolari "Messaggi Midi" standard organizzati opportunamente in Eventi MIDI di ALSA verranno inviati al sub-sistema "seq" di ALSA ciascuno nelle modalità appresso descritte.

Come sappiamo, i primi sette dati relativi all'area di memoria che costituisce un Evento Midi di ALSA, appartengono a ogni tipo di Evento Midi da inviare.
Va però precisato che il primo campo (type) della Struttura snd_seq_event_t individua lo specifico Evento Midi. Pertanto la Costante di ALSA, che specifica un tipo di Evento Midi, va assegnata a detto primo campo ("type"). In questo senso si può dire che il primo membro della Struttura assume un valore diverso per ogni "tipo" di Evento Midi di ALSA da individuare.

Di seguito si mostreranno i dati appartenti agli specifici Eventi Midi.


Messaggi di NOTE ON

Il tipo di "Evento Midi" NOTE-ON definito dalla Costante di ALSA:

 SND_SEQ_EVENT_NOTEON = 6

trasmette l'istruzione di far suonare una nota. Esso è composto nello standard Midi da tre byte: uno relativo al Canale, uno relativo al numero di nota da far suonare ed il terzo relativo alla "velocità di tocco" (velocity) sullo strumento.

In ALSA, in particolare, i valori specifici dell'Evento Midi "Note-ON" da trasmettere in modo imprescindibile sono:

  • 1 Byte per definire il Canale (da 0 a 15 per un totale di 16 canali disponibili);
  • 1 Byte per il numero della nota da suonare (da 0 a 127 per un totale di 128 note disponibili);
  • 1 Byte per il valore della velocity (da 0 a 127 per un totale di 128 valori disponibili).


Messaggi di NOTE OFF

Il tipo di "Evento Midi" NOTE-OFF definito dalla Costante di ALSA:

SEQ_EVENT_NOTEOFF = 7

trasmette l'istruzione di far smettere di suonare una nota che sta suonando. Esso è composto nello standard Midi da tre byte: uno relativo al Canale, uno relativo al numero di nota da far smettere di suonare ed il terzo relativo alla velocità di tocco (velocity) sullo strumento (che sarà più opportunamente posto a zero). Essendo contrario all'evento Note ON, la sua struttura e le relative routine riechieste saranno costruite in modo analogo a quelle del NoteON.


Messaggi di Program Change

Il tipo di "Evento Midi" PROGRAM-CHANGE definito dalla Costante di ALSA:

SND_SEQ_EVENT_PGMCHANGE = 11

trasmette l'istruzione impostare lo strumento musicale associato ad uno specifico canale. L'Evento Program Change contiene oltre al byte di Stato un solo byte di dati, che può assumere un valore da 0 a 127 consentendo così di disporre di 128 suoni (strumenti) all'interno di banco di suoni.

In ALSA, in particolare, i valori specifici dell'Evento Midi "Program-Change" da trasmettere in modo imprescindibile sono:

  • 1 Byte per definire il Canale (da 0 a 15 per un totale di 16 canali disponibili);
  • 1 Integer nel campo "value" della Struttura di ALSA snd_seq_event_t per il numero dello strumento musicale da impostare (da 0 a 127 per un totale di 128 strumenti disponibili).


Messaggi di Control Change

Il tipo di "Evento Midi" CONTROL CHANGE definito dalla Costante di ALSA:

SND_SEQ_EVENT_PGMCHANGE = 10

consente di impostare particolari modalità esecutive e diffusive musicali. Esso altre al valore del Canale, presenta un valore (da 0 a 127) per specificare il tipo di controller ed un terzo valore (da 0 a 127) per impostare la quantità dell'effetto determinato dal controller da applicare.

In ALSA, in particolare, i valori specifici dell'Evento Midi "Control-Change" da trasmettere in modo imprescindibile sono:

  • 1 Byte per definire il Canale (da 0 a 15 per un totale di 16 canali disponibili);
  • 1 Integer nel campo "param" della Struttura di ALSA snd_seq_event_t per impostare il numero del controller da usare (da 0 a 127);
  • 1 Integer nel campo "value" della predetta Struttura di ALSA per l'impostazione del valore da attribuire al tipo di controller (da 0 a 127).


Messaggi di Channel Aftertouch

Il tipo di "Evento Midi" CHANNEL AFTERTOUCH definito dalla Costante di ALSA:

SND_SEQ_EVENT_CHANPRESS = 12

(anche chiamato Channel Pressure, Mono Aftertouch o Mono Pressure) consente solo il controllo globale di tutte le note suonate (influisce sull'intero canale MIDI) e determina l'applicazione di una pressione aggiuntiva complessiva (non individuale) sulle note (che stanno suonando) appartenenti ad un medesimo canale, sulle quali si è già esercitata una pressione iniziale (velocity). Esso oltre al valore del Canale, presenta un solo valore per specificare la quantità di pressione aggiuntiva da applicare.

In ALSA, in particolare, i valori specifici dell'Evento Midi "Channel-Aftertouch" da trasmettere in modo imprescindibile sono:

  • 1 Byte per definire il Canale (da 0 a 15 per un totale di 16 canali disponibili);
  • 1 Integer nel campo "value" della Struttura di ALSA snd_seq_event_t per impostare il valore di pressione aggiuntiva.


Messaggi di Pitch Bend (Pitch-Wheel)

Il tipo di "Evento Midi" PITCH WHEEL definito dalla Costante di ALSA:

SND_SEQ_EVENT_PITCHBEND As Byte = 13

Il messaggio Pitch Bend, anche chiamato Pitch Wheel, simula l'effetto glissato. Esso oltre al valore del Canale, presenta nello standard Midi un valore LSB per determinare le micro-variazioni di intonazione (variazione che chiameremo "raffinata"), ed un terzo valore, quello MSB per determinare le variazioni all'intonazione della nota (variazione che chiameremo "grossolana") davvero percettibili all'udito. I valori previsti per il Pitch Bend (e che saranno quindi quelli che saranno utilizzati con il 3° valore MSB) vanno da -8192 a + 8192; laddove:

  • -8192 = abbassamento massimo dell'intonazione;
  • 0 = intonazione normale, naturale della nota;
  • +8192 = innalzamento massimo della nota;

per un totale di 16394 valori intermedi (da 0 a 16393).
Solitamente il 3° valore, quello MSB, percorre tutti i 16384 valori intermedi del Pitch Bend.

In ALSA, in particolare, i valori specifici dell'Evento Midi "Pitch-Wheel" da trasmettere in modo imprescindibile sono:

  • 1 Byte per definire il Canale (da 0 a 15 per un totale di 16 canali disponibili);
  • 1 Integer nel campo "param" della Struttura di ALSA snd_seq_event_t per impostare il 2° valore: LSB;
  • 1 Integer nel campo "value" della Struttura di ALSA per impostare il 3° valore: MSB.


Messaggi di Aftertouch Polyphonic

Il tipo di "Evento Midi" AFTERTOUCH POLYPHONIC definito dalla Costante di ALSA:

SND_SEQ_EVENT_KEYPRESS = 8

(anche chiamato Polyphonic Key Pressure o Key Aftertouch), determina l'applicazione di una ulteriore pressione su una specifica nota (che sta suonando), sulla quale si è già esercitata una pressione iniziale (velocity). Esso oltre al valore del Canale, presenta il valore (da 0 a 127) che si riferisce alla nota sulla quale si intende applicare l'ulteriore pressione (da 0 a 127) ed un 3° valore (da 0 a 127) per specificare la quantità di pressione aggiuntiva da applicare a quella nota.

In ALSA, in particolare, i valori specifici dell'Evento Midi "Aftertouch-Polyphonic" da trasmettere in modo imprescindibile sono:

  • 1 Byte per definire il Canale (da 0 a 15 per un totale di 16 canali disponibili);
  • 1 Byte nel campo "velocity" della Struttura di ALSA snd_seq_event_t per impostare il valore di pressione aggiuntiva (da 0 a 127).