Differenze tra le versioni di "Alsa e Gambas: Gli eventi Midi in particolare"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
I particolari Eventi MIDI verranno inviati ad Alsa ciascuno nelle modalità appresso descritte.
+
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.
  
==Messaggi di NOTE ON==
+
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.
L'evento Midi NOTE-ON 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.
 
<BR>In ALSA, in particolare, i valori ''specifici'' del messaggio 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).
 
<p>In particolare nella classe principale scriveremo questa iniziale routine:</p>
 
  
'''PUBLIC''' Sub noteOn_Click()
+
Di seguito si mostreranno i dati appartenti agli specifici ''Eventi Midi''.  
   
 
  <FONT Color= #006400>' ''chiama la subroutine, che chiameremo "noteon", nella classe secondaria CAlsa.class;''</font>
 
  <FONT Color= #006400>' ''poniamo come esempio la nota da suonare num. 60 (il DO centrale) e velocità 100.''</font>
 
  alsa.noteon(0, 60, 100)
 
 
  alsa.flush()
 
 
'''END'''
 
Nella classe secondaria ''CAlsa.class'' dovremo scrivere la subroutine "noteon" chiamata, alla quale la chiamante trasmetterà i valori relativi al Canale, alla nota ed alla velocità di tocco.
 
 
 
Quindi sarà chiamata la subroutine ''prepareev'', affinché siano scritti nella zona della memoria pre-allocata i dati relativi al tipo di evento che intendiamo inviare (il ''Note ON'') e quelli generali a tutti gli eventi. La specificazione del tipo di evento si otterrà inviando un valore numerico identificativo, che sarà posto come costante nelle dichiarazioni iniziali, però, all'interno della classe principale:
 
 
 
Const SND_SEQ_EVENT_NOTEON As Byte = 6
 
Al termine della scrittura nella zona di memoria riservata di tutti i dati necessari per definire l'evento Midi desiderato, inseriremo la funzione di ALSA, espressa in C:
 
''int snd_seq_event_output(snd_seq_t * seq, snd_seq_event_t * ev)''
 
che accoda un evento in un buffer intermedio. Tale funzione ritorna il numero (integer) di eventi rimanenti da far uscire, oppure un codice di errore se negativo.
 
Detta funzione di ALSA dovrà essere richiamata con '''Extern''', in questo modo:
 
<FONT Color= #B22222>Private Extern snd_seq_event_output(handle As Pointer, ev As Pointer) As Integer</font>:
 
Quindi la routine nella Classe secondaria, che abbiamo chiamato: ''CALsa.class'', relativa al messaggio ''NoteOn'' può essere la seguente:
 
'''PUBLIC''' Sub noteon(channel As Byte, note As Byte, velocity As Byte)
 
 
 
  Dim err As Integer
 
 
<FONT Color= #006400>' ''Chiama la subroutine prepareev''</font>
 
prepareev(SND_SEQ_EVENT_NOTEON)
 
 
 
  Write #st, channel As Byte
 
 
  Write #st, note As Byte
 
 
  Write #st, velocity As Byte
 
 
 
  err = snd_seq_event_output(handle, ev)        <FONT Color= #006400>' ''output an event</font>
 
  printerr("Noteon = ", err)
 
 
'''END'''
 
 
 
 
 
Al termine si torna alla routine chiamante iniziale, presente nella classe principale, dove sarà chiamata la successiva subroutine "flush()".
 
 
 
 
 
==Messaggi di NOTE OFF==
 
L'evento Midi NOTE-OFF 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.
 
<BR>Si avrà solo l'accortezza di porre fra le dichiarazioni iniziali della classe principale l'identificativo del tipo di evento Note-OFF:
 
 
 
Const SND_SEQ_EVENT_NOTEOFF As Byte = 7
 
 
 
<p>In particolare nella classe principale scriveremo questa iniziale routine:</p>
 
  
'''PUBLIC''' Sub noteOff_Click()
 
   
 
  <FONT Color= #006400>' ''chiama la subroutine, che chiameremo "noteoff", nella classe secondaria CAlsa.class;''</font>
 
  <FONT Color= #006400>' ''poniamo come esempio la nota da far cessare di suonare num. 60 (il DO centrale) e velocità 0.''</font>
 
  alsa.noteoff(0, 60, 0)
 
 
  alsa.flush()
 
 
'''END'''
 
  
<P>Nella classe secondaria scriveremo ovviamente la specifica subroutine:</p>
+
===Messaggi di <FONT Color= #DF6400>NOTE ON</font>===
 +
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.
  
'''PUBLIC''' Sub noteoff(channel As Byte, note As Byte, velocity As Byte)
+
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);
Dim err As Integer
+
* 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).
<FONT Color= #006400>' ''Chiama la subroutine prepareev''</font>
 
prepareev(SND_SEQ_EVENT_NOTEOFF)
 
 
 
  Write #st, channel As Byte
 
 
  Write #st, note As Byte
 
 
  Write #st, velocity As Byte
 
 
 
  err = snd_seq_event_output(handle, ev)        <FONT Color= #006400>' ''output an event</font>
 
  printerr("Noteoff = ", err)
 
 
'''END'''
 
  
Al termine si torna alla routine chiamante iniziale, presente nella classe principale, dove sarà chiamata la successiva subroutine "flush()".
 
  
 +
===Messaggi di <FONT Color= #DF6400>NOTE OFF</font>===
 +
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 <SPAN Style="text-decoration:underline">zero</span>). Essendo contrario all'evento Note ON, la sua struttura e le relative routine riechieste saranno costruite in modo analogo a quelle del NoteON.
  
==Verifica pratica finale==
 
Verificheremo praticamente quanto abbiamo sino ad ora esposto lanciando il programma qui descritto. Concludiamo, però, il codice inserendo nella classe secondaria ''CAlsa.class'', e più precisamente nella prima ruoutine, quella dedicata alla creazione del ''Client'', una funzione ALSA, espressa in C:
 
''int snd_seq_alloc_queue(snd_seq_t * seq)''
 
utilizzata per creare una coda di eventi, ossia alloca una coda di eventi, in quanto in ALSA per schedulare un evento ci deve essere una coda. Tale funzione ritorna l'id della coda (zero o un numero positivo) in caso di successo, altrimenti un codice di errore negativo. L'Id della coda sarà attribuito al valore ''queue'' della struttura generale per la definizione degli eventi.
 
<BR>La funzione di ALSA è da richiamare in Gambas con il solito '''Extern''' così:
 
<FONT Color= #B22222>Private Extern snd_seq_alloc_queue(seq As Pointer, name As String) As Integer</font>.
 
Essa sarà espressa nella forma seguente:
 
  
err = snd_seq_alloc_queue(handle, "outqueue")
+
===Messaggi di <FONT Color= #DF6400>Program Change</font>===
  printerr("Creating queue", err)
+
Il tipo di "Evento Midi" '''PROGRAM-CHANGE''' definito dalla Costante di ALSA:
  If err < 0 Then error.Raise("Error creating out queue")
+
SND_SEQ_EVENT_PGMCHANGE = 11
  outq = err
+
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.
  
<p>Verifichiamo quindi il risultato dal terminale con ''aseqdump'':</p>
+
In ALSA, in particolare, i valori ''specifici'' dell'Evento Midi "Program-Change" da trasmettere in modo imprescindibile sono:
<p>''Waiting for data at port 128:0. Press Ctrl+C to end.''</P>
+
* 1 Byte per definire il Canale (da 0 a 15 per un totale di 16 canali disponibili);
<TABLE>
+
* 1 Integer nel campo "value" della Struttura di ALSA ''[https://www.alsa-project.org/alsa-doc/alsa-lib/structsnd__seq__event__t.html snd_seq_event_t]'' per il numero dello strumento musicale da impostare (da 0 a 127 per un totale di 128 strumenti disponibili).
      <TR>
 
        <TD>''Source''</td><TD>''Event''</td><TD>''Ch''</td><TD>''Data''</td>
 
      </tr>
 
      <TR>
 
          <TD>''0:1''</td><TD>''Port subscribed''</td><TD></td><TD>''129:0 -> 128:0''</td>
 
      </tr>
 
      <TR>
 
          <TD>''129:0''</td><TD>''Note on''</td><TD></td><TD>''0, note 60, velocity 100''</td>
 
      </tr>
 
      <TR>
 
          <TD>''129:0''</td><TD>''Note off''</td><TD></td><TD>''0, note 60, velocity 0''</td>
 
      </tr>
 
</table>
 
  
  
La nostra scrittura ha avuto, dunque, successo, raggiungendo così l'obiettivo iniziale di far suonare una nota con un semplice applicativo scritto in Gambas '''3'''.
+
===Messaggi di <FONT Color= #DF6400>Control Change</font>===
 +
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 ''[https://www.alsa-project.org/alsa-doc/alsa-lib/structsnd__seq__event__t.html 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).
  
==Vedere il codice==
 
Per vedere in ordine il nostro codice sin qui descritto, cliccare sul collegamento alla sua pagina: [[Alsa_e_Gambas_Codice_2|2° CODICE]].
 
  
----
+
===Messaggi di <FONT Color=#DF6400>Channel Aftertouch</font>===
 +
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.
  
==Aggiungere altri eventi Midi==
+
In ALSA, in particolare, i valori ''specifici'' dell'Evento Midi "Channel-Aftertouch" da trasmettere in modo imprescindibile sono:
Proviamo ora ad ottenere altri messaggi Midi fondamentali, ''Channel Voice'', oltre a quelli del ''Note On'' e del ''Note OFF''.
+
* 1 Byte per definire il Canale (da 0 a 15 per un totale di 16 canali disponibili);
La codifica di questi altri messaggi Midi sarà analoga a quella che abbiamo visto per i due precedenti eventi:
+
* 1 Integer nel campo "value" della Struttura di ALSA ''[https://www.alsa-project.org/alsa-doc/alsa-lib/structsnd__seq__event__t.html snd_seq_event_t]'' per impostare il valore di pressione aggiuntiva.
* un button con routine nella classe principale che chiama nella classe secondaria ''CAlsa.class'' la subroutine dell'evento specifico considerato, trasmettendole i valori necessari;
 
* chiamata della subroutine ''prepareev(...)'';
 
* ritorno alla ruotine principale e chiamata della subroutine "''flush()''" nella classe ''CAlsa.class''.
 
  
  
===<FONT Color= #DF6400>Program Change</font>===
+
===Messaggi di <FONT Color= #DF6400>Pitch Bend (Pitch-Wheel)</font>===
Il messaggio ''Program Change'' consente di mutare 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.
+
Il tipo di "Evento Midi" '''PITCH WHEEL''' definito dalla Costante di ALSA:
<P>Si porrà fra le dichiarazioni iniziali della classe principale l'identificativo del tipo di evento ''Program Change'':</p>
+
  SND_SEQ_EVENT_PITCHBEND As Byte = 13
 
 
Const SND_SEQ_EVENT_PGMCHANGE As Byte = 11
 
 
 
<p>In particolare nella classe principale scriveremo questa iniziale routine:</p>
 
 
 
'''PUBLIC''' Sub pgmchange_Click()
 
   
 
  <FONT Color= #006400>' ''Chiama la subroutine, che chiameremo "pgmchange", nella classe secondaria CAlsa.class;''</font>
 
  <FONT Color= #006400>' ''poniamo come esempio lo strumento musicale num. 71 (Fagotto).''</font>
 
  alsa.pgmchange(0, 71)
 
 
  alsa.flush()
 
 
'''END'''
 
 
 
<P>Nella classe secondaria scriveremo ovviamente la specifica subroutine:</p>
 
 
 
'''PUBLIC''' Sub pgmchange(channel As Byte, strum As Integer)
 
 
  Dim err As Integer
 
 
 
  <FONT Color= #006400>' ''Chiama la subroutine prepareev''</font>
 
  prepareev(SND_SEQ_EVENT_PGMCHANGE)
 
 
 
    Write #st, channel As Byte
 
    Seek #st, 24                            <FONT Color= #006400>' ''Spostiamo il puntatore dello stream sul byte num. 24''</font>
 
    Write #st, strum As Integer
 
 
 
  err = snd_seq_event_output(handle, ev)       <FONT Color= #006400>' ''output an event</font>
 
  printerr("Pgmchange = ", err)
 
 
'''END'''
 
 
 
 
 
===<FONT Color= #DF6400>Control Change</font>===
 
Il messaggio di ''Control Change'' 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.
 
<P>Si porrà fra le dichiarazioni iniziali della classe principale l'identificativo del tipo di evento ''Control Change'':</p>
 
 
 
Const SND_SEQ_EVENT_CONTROLLER As Byte = 10
 
 
 
<p>In particolare nella classe principale scriveremo questa iniziale routine:</p>
 
 
 
'''PUBLIC''' Sub controller_Click()
 
   
 
  <FONT Color= #006400>' ''chiama la subroutine, che chiameremo "controller", nella classe secondaria CAlsa.class;''</font>
 
  <FONT Color= #006400>' ''poniamo come esempio il tipo di controller num. 7 (Volume). Il terzo valore sarà posto a 100.''</font>
 
  alsa.controller(0, 7, 100)
 
 
  alsa.flush()
 
 
'''END'''
 
 
 
<P>Nella classe secondaria scriveremo ovviamente la specifica subroutine avendo l'accortezza di dichiarare i valori tutti come ''Integer'':</p>
 
 
 
'''PUBLIC''' Sub controller(channel As integer, ctrl As integer, valCtr as integer)
 
 
Dim err As Integer
 
 
 
  <FONT Color= #006400>' ''Chiama la subroutine prepareev''</font>
 
  prepareev(SND_SEQ_EVENT_CONTROLLER)
 
 
 
    Write #st, channel As Integer
 
 
    Write #st, ctrl As Integer
 
 
    Write #st, valCtr As Integer
 
 
  err = snd_seq_event_output(handle, ev)        <FONT Color= #006400>' ''output an event</font>
 
  printerr("Controller = ", err)
 
 
'''END'''
 
 
 
 
 
===<FONT Color= #DF6400>Channel Aftertouch</font>===
 
Il messaggio ''Channel Aftertouch'', anche chiamato ''Channel Pressure'', determina l'applicazione di una pressione aggiuntiva 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 (da 0 a 127) per specificare la ''quantità'' di ''pressione aggiuntiva'' da applicare.
 
<P>Si porrà fra le dichiarazioni iniziali della classe principale l'identificativo del tipo di evento ''Channel Aftertouch'' (''Channel Pressure''):</p>
 
 
 
Const SND_SEQ_EVENT_CHANPRESS As Byte = 12
 
 
 
<p>In particolare nella classe principale scriveremo questa iniziale routine:</p>
 
 
 
'''PUBLIC''' Sub chanpress_Click()
 
   
 
  <FONT Color= #006400>' ''chiama la subroutine, che chiameremo "chanpress", nella classe secondaria CAlsa.class;''</font>
 
  <FONT Color= #006400>' ''poniamo come esempio un valore di pressione aggiuntiva di 110.''</font>
 
  alsa.chanpress(0, 110)
 
 
  alsa.flush()
 
 
'''END'''
 
 
 
<P>Nella classe secondaria scriveremo ovviamente la specifica subroutine:</p>
 
 
 
  '''PUBLIC''' Sub chanpress(channel As Byte, press As Integer)
 
 
  Dim err As Integer
 
 
 
<FONT Color= #006400>' ''Chiama la subroutine prepareev''</font>
 
  prepareev(SND_SEQ_EVENT_CHANPRESS)
 
 
 
    Write #st, channel As Byte
 
    Seek #st, 24                            <FONT Color= #006400>' ''Spostiamo il puntatore dello stream sul byte num. 24''</font>
 
    Write #st, press As Integer
 
 
 
  err = snd_seq_event_output(handle, ev)        <FONT Color= #006400>' ''output an event</font>
 
  printerr("ChanPress = ", err)
 
 
'''END'''
 
 
 
 
 
===<FONT Color= #DF6400>Pitch Bend (Pitch-Wheel)</font>===
 
 
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:
 
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;
 
* -8192 = abbassamento massimo dell'intonazione;
Riga 262: Riga 62:
 
* +8192 = innalzamento massimo della nota;
 
* +8192 = innalzamento massimo della nota;
 
per un totale di 16394 valori intermedi (da 0 a 16393).
 
per un totale di 16394 valori intermedi (da 0 a 16393).
<BR>In Gambas non è necessario utilizzare il valore di Dati 1 (cioè il 2° valore), quello LSB, poiché il 3° valore, quello MSB percorrerà tutti i 16384 valori intermedi del Pitch Bend.</p>
+
<BR>Solitamente il 3° valore, quello MSB, percorre tutti i 16384 valori intermedi del Pitch Bend.
<P>Inseriremo innanzitutto uno Slider sul form con valore MIN -8192 e con valore MAX +8291.</p>
 
<BR>Si porrà fra le dichiarazioni iniziali della classe principale l'identificativo del tipo di evento ''Pitch Bend'' (''Pitch Wheel''), ed agganceremo il valore, che assumerà lo Slider ad ogni spostamento del suo cursore virtuale, alla variabile integer che chiameremo ''gross'':
 
 
 
gross As Integer
 
 
Const SND_SEQ_EVENT_PITCHBEND As Byte = 13
 
 
 
<p>In particolare nella classe principale scriveremo questa iniziale routine:</p>
 
 
 
'''PUBLIC''' Sub SliderPB_Change()
 
   
 
  gross = SliderPB.Value
 
 
  <FONT Color= #006400>' ''chiama la subroutine, che chiameremo "pitchbend", nella classe secondaria CAlsa.class;''</font>
 
  alsa.pitchbend(0, 0, gross)
 
 
  alsa.flush()
 
 
'''END'''
 
 
 
 
 
Nella classe secondaria ''CAlsa.class'' avremo l'accortezza di dichiarare ''Integer'' i valori all'interno dell'apposita subroutine per l'evento Pitch Bend:
 
  
'''Public''' Sub pitchbend(channel As Integer, valorePB1 As Integer, gross As Integer)
+
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);
    Dim err As Integer
+
* 1 Integer nel campo "param" della Struttura di ALSA ''[https://www.alsa-project.org/alsa-doc/alsa-lib/structsnd__seq__event__t.html 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.
  <FONT Color= #006400>' ''Chiama la subroutine prepareev''</font>
 
  prepareev(SND_SEQ_EVENT_PITCHBEND)
 
 
    Write #st, channel As Integer
 
 
    Write #st, valorePB1 As Integer          <FONT Color= #006400>' ''questo valore resta a 0''</font>
 
 
    Write #st, gross As Integer
 
 
 
  err = snd_seq_event_output(handle, ev)    <FONT Color= #006400>' ''output an event''</font>
 
  printerr("PitchBend = ", err)
 
 
   
 
   
'''End'''
 
 
  
 
===<FONT Color= #DF6400>Aftertouch Polyphonic</font>===
 
===<FONT Color= #DF6400>Aftertouch Polyphonic</font>===
L'evento ''Aftertouch Polyphonic'', anche chiamato ''Polyphonic Key Pressure'', determina l'applicazione di una ulteriore pressione su una 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.
+
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.
  
<P>Si porrà fra le dichiarazioni iniziali della classe principale l'identificativo del tipo di evento ''Aftertouch Polyphonic'' (''Polyphonic Key Pressure''):</p>
+
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);
Const SND_SEQ_EVENT_KEYPRESS As Byte = 8
+
* 1 Byte nel campo "velocity" della Struttura di ALSA ''[https://www.alsa-project.org/alsa-doc/alsa-lib/structsnd__seq__event__t.html snd_seq_event_t]'' per impostare il valore di pressione aggiuntiva (da 0 a 127).
 
 
<p>In particolare nella classe principale scriveremo questa iniziale routine:</p>
 
 
 
'''PUBLIC''' Sub polypho_Click()
 
   
 
  <FONT Color= #006400>' ''chiama la subroutine, che chiameremo &quot;polypho", nella classe secondaria CAlsa.class;''</font>
 
  <FONT Color= #006400>' ''poniamo come esempio alla nota 50 un valore di pressione aggiuntiva di 110.''</font>
 
  alsa.polypho(0, 60, 110)
 
 
  alsa.flush()
 
 
'''END'''
 
 
 
<P>Nella classe secondaria scriveremo ovviamente la specifica subroutine:</p>
 
 
 
'''PUBLIC''' Sub polypho(channel As Byte, note As Byte, velocity As Byte)
 
 
 
  Dim err As Integer
 
 
<FONT Color= #006400>' ''Chiama la subroutine prepareev''</font>
 
prepareev(SND_SEQ_EVENT_KEYPRESS)
 
 
 
  Write #st, channel As Byte
 
 
  Write #st, note As Byte
 
 
  Write #st, poly As Byte
 
 
 
  err = snd_seq_event_output(handle, ev)        <FONT Color= #006400>' ''output an event</font>
 
  printerr("Polyphonic = ", err)
 
 
'''END'''
 

Versione delle 20:53, 18 gen 2022

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.

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.


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