Differenze tra le versioni di "Il protocollo Midi"
(51 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Il M.I.D.I. (''Musical Instrument Digital Interface'') è un protocollo di trasmissione <SPAN Style="text-decoration:underline">[https://it.wikipedia.org/wiki/Trasmissione_seriale seriale]</span> di dati | + | Il M.I.D.I. (''Musical Instrument Digital Interface'') è un protocollo di trasmissione <SPAN Style="text-decoration:underline">[https://it.wikipedia.org/wiki/Trasmissione_seriale seriale]</span> di dati alla velocità di 31250 bit al secondo. |
<BR>Tali dati Midi vengono trasmessi uno dopo l'altro (in modo seriale, in sequenza), e ricevuti dal dispositivo ricevente nell'ordine sequenziale in cui sono stati trasmessi. | <BR>Tali dati Midi vengono trasmessi uno dopo l'altro (in modo seriale, in sequenza), e ricevuti dal dispositivo ricevente nell'ordine sequenziale in cui sono stati trasmessi. | ||
− | <BR>Un insieme di due o tre | + | <BR>Un insieme di due o tre Byte, previsto dal protocollo Midi e corrispondente a un elemento costitutivo di un brano musicale, rappresenta un ''Messaggio'' Midi. |
+ | <BR>Ogni ''Messaggio'' Midi è anche considerato un ''Evento'' musicale Midi, in quanto esso "''accade'' " nel tempo, sia in senso assoluto che in senso relativo, in quanto esso accade temporalmente anche rispetto all'Evento Midi che lo precede (fatta eccezione per il primo Evento in assoluto del brano musicale). | ||
− | ==Byte di Stato e | + | ==Byte di Stato e Byte di Dati== |
− | Si è detto che ogni ''Messaggio'' Midi è costituito da due o tre | + | Si è detto che ogni ''Messaggio'' Midi è costituito da due o tre Byte. Va precisato che riguardo al significato dei Byte, costituenti il ''Messaggio'' Midi, essi vanno considerati <SPAN Style="text-decoration:underline">distinti</span> e indipendenti fra loro, e non come un unico valore numerico formato da due o tre Byte. Pertanto <SPAN Style="text-decoration:underline">ogni singolo</span> Byte del ''Messaggio'' Midi apporta una <SPAN Style="text-decoration:underline">propria specifica</span> informazione. |
− | <BR>Da ciò deriva che ogni | + | <BR>Da ciò deriva che ogni singola informazione è scritta utilizzando i valori rappresentabili da 8 bit (un Byte), ossia da 0 a 255 per un totale - come si sa - di 256 combinazioni possibili. |
− | Il primo | + | Il <SPAN Style="text-decoration:underline">primo</span> Byte costituente il ''Messaggio'' Midi è chiamato Byte di "''Stato'' " (ma anche ''Messaggio di Stato''). Il seguente o i seguenti sono chiamati Byte di "''Dati'' " (ma anche ''Messaggio di Dati''). |
− | <BR>Pertanto | + | <BR>Pertanto l'invio da un dispositivo Midi trasmittente a un altro ricevente avviene in <SPAN Style="text-decoration:underline">sequenza</span> come appresso mostrato: |
− | + | '''___/ PORTA|''' '''|PORTA \___''' | |
− | + | '''___ USCITA|'''---> 2° Byte di ''Dati'' ---> 1° Byte di ''Dati'' ---> Byte di ''Stato'' --->'''|ENTRATA ___''' | |
− | + | ''' \ Midi|''' '''|Midi /''' | |
− | Il primo Byte a uscire dal dispositivo Midi trasmittente è il Byte di ''Stato'', poi esce il 1° Byte di ''Dati'' e infine esce il 2° Byte di ''Dati''. Analogamente, il primo Byte a entrare nel dispositivo Midi ricevente è il Byte di ''Stato'', poi entra il 1° Byte di ''Dati'' e infine il 2° Byte di ''Dati''. | + | Il <SPAN Style="text-decoration:underline">primo Byte a uscire</span> dal dispositivo Midi trasmittente è il Byte di ''Stato'', poi esce il 1° Byte di ''Dati'' e infine esce il 2° Byte di ''Dati''. Analogamente, il primo Byte a entrare nel dispositivo Midi ricevente è il Byte di ''Stato'', poi entra il 1° Byte di ''Dati'' e infine il 2° Byte di ''Dati''. |
− | I | + | I Byte di ''Stato'' e i Byte di ''Dati'' strutturalmente si differenziano per l'<I>ambitus</i> di valori rappresentati dal loro Byte. In particolare il Byte di ''Stato'' utilizza <SPAN Style="text-decoration:underline">solo</span> i valori compresi tra 128 e 255, mentre i Byte di ''Dati'' utilizzano <SPAN Style="text-decoration:underline">solo</span> i valori compresi tra 0 e 127. |
− | <BR>Ciò significa che nei | + | <BR>Ciò significa che: |
+ | <BR>1) nei Byte di ''Stato'' il bit ''più significativo'' <SUP>[[[#Note|nota 1]]]</sup> è <SPAN Style="text-decoration:underline">sempre</span> posto a 1, mentre nei Byte di ''Dati'' il bit ''più significativo'' è posto <SPAN Style="text-decoration:underline">sempre</span> a 0; | ||
+ | <BR>2) nel protocollo Midi i bit ''più significativi'', pur concorrendo a formare il valore finale complessivo del Byte, sono utili <SPAN Style="text-decoration:underline">soltanto</span> nella definizione e generica distinzione tra Byte di ''Stato'' e Byte di ''Dati'', ma non concorrono nella definizione del valore da associare al tipo di ''Evento'' (''Messaggio'') Midi o al tipodi ''Dato''. Infatti nel Byte di ''Stato'', come s'è detto, il 1° bit ''più significativo'' individua univocamente il Byte di ''Stato'' in quanto tale, e <SPAN Style="text-decoration:underline">soltanto</span> il 2°, il 3° e il 4° bit ''più significativi'' sono utili per definire i valori che distinguono i vari ''Messaggi'' Midi. Nel Byte di ''Dati'', poi, il 1° bit ''più significativo'' individua univocamente il Byte di ''Dati'' in quanto tale, e <SPAN Style="text-decoration:underline">soltanto</span> i restanti sette bit a destra sono utili per definire il valore associato al tipo di ''Dato''. | ||
− | ===Il | + | ===Il Byte di ''Stato''=== |
− | Il Byte di ''Stato'' informa | + | Il Byte di ''Stato'' informa il dispositivo ricevente sul tipo di ''Messaggio'' (sulla sua funzione) e sul ''Canale'' al quale appartiene. |
− | <BR>Per conferire queste due informazioni, il Byte di ''Stato'' divide in | + | <BR>Per conferire queste due informazioni, il Byte di ''Stato'' divide in due gruppi i bit costituenti il suo Byte, come appresso specificato: |
− | <FONT Color= | + | <FONT Color=blue><B>1</b> b b b</font> <FONT Color=darkorange>b b b b</font> |
− | + | I <SPAN Style="text-decoration:underline">primi</span> quattro bit (quelli ''più significativi''), dei quali il primo a sinistra - <SPAN Style="text-decoration:underline">sempre</span> posto a 1 - specifica che si tratta genericamente di un Byte di ''Stato'', sono utilizzati per definire il "tipo" di ''Messaggio'' Midi di appartenenza. | |
− | + | <BR>Gli <SPAN Style="text-decoration:underline">ultimi</span> quattro bit (quelli ''meno significativi'') specificano invece il ''Canale'', al quale il ''Messaggio'' Midi appartiene. Poiché l'<I>ambitus</i> di valori, rappresentabili dai quattro bit ''meno significativi'' del Byte di ''Stato'', comprende i valori da 0 a 15, il numero massimo di ''Canali'' Midi utilizzabili è 16. <SUP>[[[#Note|nota 2]]]</sup> | |
− | <BR>Gli ultimi quattro bit specificano il ''Canale'', al quale il ''Messaggio'' Midi appartiene. | ||
− | < | ||
====Il ''Canale'' Midi==== | ====Il ''Canale'' Midi==== | ||
− | Il ''Canale'' Midi è un'impostazione presente in ciascun evento Midi che permette a un dispositivo, sintonizzato <SUP>[[[#Note|nota | + | Il ''Canale'' Midi è un'impostazione presente in ciascun evento Midi che permette a un dispositivo, sintonizzato <SUP>[[[#Note|nota 3]]]</sup> su un determinato ''Canale'', di filtrare gli eventi Midi elaborando soltanto quelli appartenenti a quel ''Canale''. <SUP>[[[#Note|nota 4]]]</sup> |
====Esempio di byte di ''Stato''==== | ====Esempio di byte di ''Stato''==== | ||
− | Mostriamo un esempio di | + | Mostriamo un esempio di Byte di ''Stato'': |
<FONT Color=blue><B>1</b> 0 0 1</font> <FONT Color=darkorange>1 0 0 1</font> | <FONT Color=blue><B>1</b> 0 0 1</font> <FONT Color=darkorange>1 0 0 1</font> | ||
− | I bit suddetti specificano che è un Byte di ''Stato'', che individua un ''Messaggio'' Midi di tipo "Note-On", appartenente al ''Canale'' "10". | + | I bit suddetti specificano che è un Byte di ''Stato'', che individua un ''Messaggio'' Midi di tipo "Note-On", appartenente al ''Canale'' "10". |
+ | <BR>Il valore complessivo associato a questo esempio di Byte di ''Stato'' è pertanto "&h99". | ||
===Il Byte di ''Dati''=== | ===Il Byte di ''Dati''=== | ||
I Byte di ''Dati'' apportano informazioni fondamentali <SPAN Style="text-decoration:underline">aggiuntive</span> di dettaglio associate al ''Messaggio'' Midi inviato. I ''Messaggi'' Midi - a seconda del tipo - possono avere uno o due Byte di ''Dati''. | I Byte di ''Dati'' apportano informazioni fondamentali <SPAN Style="text-decoration:underline">aggiuntive</span> di dettaglio associate al ''Messaggio'' Midi inviato. I ''Messaggi'' Midi - a seconda del tipo - possono avere uno o due Byte di ''Dati''. | ||
<BR>Come è stato già detto, nel Byte di ''Dati'' il bit ''più significativo'' è <SPAN Style="text-decoration:underline">sempre</span> posto a 0. Pertanto il Byte di ''Dati'' può assumere <SPAN Style="text-decoration:underline">esclusivamente</span> valori compresi fra 0 e 127. | <BR>Come è stato già detto, nel Byte di ''Dati'' il bit ''più significativo'' è <SPAN Style="text-decoration:underline">sempre</span> posto a 0. Pertanto il Byte di ''Dati'' può assumere <SPAN Style="text-decoration:underline">esclusivamente</span> valori compresi fra 0 e 127. | ||
+ | |||
+ | Esempio di Byte di ''Dati'': | ||
+ | <FONT Color=#B22222><B>0</b> <FONT Color=#D55555>0 1 1 0 0 0 0</font></font> | ||
==Tipologia dei ''Messaggi'' Midi== | ==Tipologia dei ''Messaggi'' Midi== | ||
Riga 47: | Riga 52: | ||
<BR> ''System Real Time Messages''; | <BR> ''System Real Time Messages''; | ||
<BR> ''System Exclusive Messages''. | <BR> ''System Exclusive Messages''. | ||
+ | <BR>In questa pagina prenderemo inconsiderazione solo i ''Channel Voice Messages'' e i ''System Exclusive Messages''. | ||
Per comprendere meglio l'associazione dei valori ai singoli Byte (di ''Stato'' e di ''Dati'') appartenenti essenzialmente ai ''Messaggi'' Midi, è opportuno immaginare l'azione del dito di un esecutore su un pianoforte o su una tastiera elettronica con tasti dinamici. | Per comprendere meglio l'associazione dei valori ai singoli Byte (di ''Stato'' e di ''Dati'') appartenenti essenzialmente ai ''Messaggi'' Midi, è opportuno immaginare l'azione del dito di un esecutore su un pianoforte o su una tastiera elettronica con tasti dinamici. | ||
− | ...... | + | ===I Messaggi ''Channel Voice''=== |
+ | I ''Messaggi'' Midi di tipo ''Channel Voice'' sono: | ||
+ | |||
+ | ====Note Off==== | ||
+ | Il ''Messaggio'' di ''Note Off'' viene inviato per istruire che l'esecuzione di una nota, precedentemente attivata, deve essere disattivata, deve cessare. Facendo l'esempio del pianoforte, il ''Messaggio'' Midi di ''Note Off'' corrisponde in sostanza all'istruzione di rilasciare un tasto ancora premuto. | ||
+ | |||
+ | Il suo <FONT Color=red>Byte di ''Stato''</font>, a seconda del Canale attribuito, può assumere valori da &h80 a &h8F. | ||
+ | <BR>Il <FONT Color=green>primo Byte di ''Dati''</font> individua il [https://newt.phys.unsw.edu.au/jw/notes.html numero di nota], che deve ovviamente corrispondere al numero di una nota la cui esecuzione sia stata precedentemente attivata. | ||
+ | <BR>Il <FONT Color=darkorange>secondo Byte di ''Dati''</font> rappresenta la ''Velocità'' (''Velocity'') di pressione del tasto del pianoforte per eseguire una nota. Tale Byte, non essendo ovviamente rilevante in questo tipo di Evento Midi, può essere posto a 0. | ||
+ | <BR>Va detto che l'<U>effetto</u> prodotto dal ''Messaggio'' Midi di ''Note Off'' corrisponde sostanzialmente all'effetto prodotto dal ''Messaggio'' Midi di ''Note On'' con il valore del secondo Byte di ''Dati'' posto a 0. | ||
+ | |||
+ | Esempio di ''Messaggio'' di ''Note Off'': | ||
+ | <FONT Color=red>80</font> <FONT Color=green>48</font> <FONT Color=darkorange>00</font> | ||
+ | |||
+ | ====Note On==== | ||
+ | Il ''Messaggio'' di ''Note On'' viene inviato per istruire di attivare una determinata nota. Nell'esempio del pianoforte il ''Messaggio'' Midi di ''Note On'' corrisponde all'istruzione di premere un tasto. | ||
+ | |||
+ | Il suo Byte di ''Stato'', a seconda del Canale attribuito, può assumere valori da &h90 a &h9F. | ||
+ | <BR>Il primo Byte di ''Dati'' individua il [http://www.disca.upv.es/adomenec/IASPA/tema5/dibus/NoteNumbers.png numero della nota] che deve essere attivata. | ||
+ | <BR>Il secondo Byte di ''Dati'' rappresenta la ''Velocità'' (''Velocity'') di pressione del tasto del pianoforte per eseguire una nota, e può assumere un valore da 0 a 127. Come già accennato sopra, il ''Messaggio'' Midi di ''Note On'' con il valore del secondo Byte di ''Dati'' posto a 0 corrisponde in sostanza a un ''Messaggio'' Midi di ''Note Off''. | ||
+ | <BR>Più in particolare la ''Velocità'' rappresenta la velocità con cui un tasto del pianoforte viene premuto. <SUP>[[[#Note|nota 5]]]</sup> | ||
+ | |||
+ | Esempio di ''Messaggio'' di ''Note On'': | ||
+ | 90 48 64 | ||
+ | |||
+ | ====Polyphonic Key Pressure==== | ||
+ | Il ''Messaggio'' di ''Polyphonic Key Pressure'', anche chiamato ''Aftertouch Polyphonic'', rappresenta l'ulteriore pressione che si assegna a una o più note già attivate mediante il ''Note On''. | ||
+ | |||
+ | Il suo Byte di ''Stato'', a seconda del Canale attribuito, può assumere valori da &hA0 a &hAF. | ||
+ | <BR>Il primo Byte di ''Dati'' individua il [http://www.disca.upv.es/adomenec/IASPA/tema5/dibus/NoteNumbers.png numero della nota] la nota oggetto dell'effetto dell'<I>Aftertouch</i>. | ||
+ | <BR>Il secondo Byte di ''Dati'' rappresenta il valore di <I>Aftertouch Polyphonic</i> aggiuntivo da eseguire. | ||
+ | |||
+ | Esempio di ''Messaggio'' di ''Aftertouch Polyphonic'': | ||
+ | A0 48 6C | ||
+ | ====Control Change==== | ||
+ | Il ''Messaggio'' di ''Control Change'' rappresenta una quantità di circa 128 informazioni che incidono sull'esecuzione delle note. | ||
+ | Il suo Byte di ''Stato'', a seconda del Canale attribuito, può assumere valori da &hB0 a &hBF. | ||
+ | <BR>Il primo Byte di ''Dati'' individua il tipo di ''[http://www.lim.di.unimi.it/IEEE/LYON/F1_1_4_2.GIF Controllo]'' da attivare. | ||
+ | <BR>Il secondo Byte di ''Dati'' rappresenta il valore da assegnare al ''Controllo'' prescelto. | ||
+ | Esempio di ''Messaggio'' di ''Control Change'': | ||
+ | B0 07 64 | ||
+ | (volume posto a 100 per tutti gli Eventi ''Note On'' appartenenti al Canale 0 che seguono) | ||
+ | |||
+ | ====Program Change==== | ||
+ | Il ''Messaggio'' di ''Program Change'' istruisce il dispositivo del numero identificativo di strumento musicale, con il quale eseguire uno o più ''Messaggi'' di ''Note On'' che seguono. | ||
+ | |||
+ | Questo ''Messaggio'' Midi è costituito soltanto da 2 Byte. | ||
+ | <BR>Il suo Byte di ''Stato'', a seconda del Canale attribuito, può assumere valori da &hC0 a &hCF. | ||
+ | <BR>Il primo (e unico) Byte di ''Dati'' rappresenta il valore da assegnare al ''Program Change'', ossia il numero identificativo dello strumento musicale all'interno del file ''soundbank'' utilizzato. | ||
+ | |||
+ | Esempio di ''Messaggio'' di ''Program Change'': | ||
+ | C0 32 | ||
+ | (strumento n. 50 del '''''[https://en.wikipedia.org/wiki/General_MIDI General Midi]''''', corrispondente al ''Basso acustico'', assegnato a tutti gli Eventi ''Note-On'' del Canale 0 che seguono) | ||
+ | |||
+ | ====Channel Pressure==== | ||
+ | Il ''Messaggio'' di ''Channel Pressure'', anche chiamato ''Channel Aftertouch'', viene inviato quando c'è un cambiamento nella pressione generale applicata a tutte le note di un canale e non solo su una singola o singole note. | ||
+ | |||
+ | Questo ''Messaggio'' Midi è costituito soltanto da 2 Byte. | ||
+ | <BR>Il suo Byte di ''Stato'', a seconda del Canale attribuito, può assumere valori da &hD0 a &hDF. | ||
+ | <BR>Il primo (e unico) Byte di ''Dati'' rappresenta il valore di <I>Channel Aftertouch</i> aggiuntivo da eseguire. | ||
+ | |||
+ | Esempio di ''Messaggio'' di ''Channel Pressure'': | ||
+ | D0 64 | ||
+ | (evento del ''Channel Pressure'' con valore 100, assegnato a tutti gli Eventi ''Note-On'' del Canale 0 che seguono) | ||
+ | |||
+ | ====Pitch Wheel==== | ||
+ | Il ''Messaggio'' di ''Pitch Wheel'', anche chiamato ''Pitch Bend'', rappresenta l'effetto ''glissato''. Esso si applica all'evento ''Note-On'' che immediatamente lo precede. | ||
+ | |||
+ | Il suo Byte di ''Stato'', a seconda del Canale attribuito, può assumere valori da &hE0 a &hEF. | ||
+ | <BR>Il ''Messaggio'' di ''Pitch Bend'' utilizza entrambi i suoi Byte di ''Dati'' per determinare con precisione il valore della variazione di tono per il ''glissato''. | ||
+ | <BR>Il primo Byte di ''Dati'' è quello ''meno significativo'', e lo si può pensare come portatore di un'informazione di alta risoluzione, poiché contiene i 7 bit ''meno significativi'' del valore di ''glissato''. | ||
+ | <BR>Il secondo Byte di ''Dati'' è quello ''più significativo'', e lo si può pensare come portatore di un'informazione di risoluzione grossolana, poiché contiene i 7 bit ''più significativi'' del valore di ''glissato''. | ||
+ | <BR>Più in particolare nel messaggio di ''Pitch Bend'', per ottenere il valore effettivo dell'effetto ''glissato'', bisogna combinare i due Byte di ''Dati'' (LSB e MSB), creando così un unico valore di 14 bit (esclusi ovviamente i "bit" ''più significativi'' di entrambi i Byte di ''Dati'') con un intervallo compreso tra 0 e 16.383, ove il valore minimo è 0, quello intermedio è 8192 e quello massimo è 16383. | ||
+ | |||
+ | La combinazione viene effettuata secondo la seguente formula: | ||
+ | (MSB << 7) OR LSB = risultato | ||
+ | I bit del valore del 2° Byte di ''Dati'' (quello ''più significativo'') vanno spostati a sinistra di 7 posti; il risultato di tale spostamento va combinato con il 2° Byte di ''Dati'' (quello ''meno significativo'') mediante l'operatore "OR". | ||
+ | <BR>Infatti, combinando i valori massimi (&h7F) di entrambi i Byte di ''Dati'', si ottiene: (127 << 7) OR 127 = 16383 | ||
+ | |||
+ | Ciò detto, va precisato che, poiché l'effetto del ''glissato'' può avvenire sia in basso che in alto rispetto alla tonalità originaria della nota (cioè può abbassare o elevare la tonalità originaria della nota), nel 1° Byte di ''Dati'' (quello ''meno significativo'' - LSB) il valore minimo è rappresentato da 0, quello originario (ossia l'intermedio) è rappresentato dal valore 0, mentre il malore massimo è rappresentato da &h7F; nel 2° Byte di ''Dati'' (quello ''più significativo'' - MSB) invece il valore minimo è rappresentato da 0, quello originario è rappresentato dal valore &h40, mentre il malore massimo è rappresentato da &h7F. <SUP>[[[#Note|nota 6]]]</sup> | ||
+ | '''LSB''' '''MSB''' | ||
+ | &h7F &h7F 127 | ||
+ | | | | | ||
+ | | | | | ||
+ | &h00 &h40 64 | ||
+ | | | | | ||
+ | | | | | ||
+ | &h00 &h00 0 | ||
+ | |||
+ | Esempio di ''Messaggio'' di ''Pitch Bend'': | ||
+ | E0 48 40 | ||
+ | (evento di ''Pitch Bend'' con valore 8264 sul Canale 0) | ||
+ | |||
+ | ==I Messaggi ''System Exclusive''== | ||
+ | Molto brevemente si può dire che i ''Messaggi'' Midi di ''System Exclusive'' (o semplicemente ''SysEx'') vengono utilizzati per molteplici usi, legati per lo più nell'invio di informazioni per assegnare impostazioni specifiche a uno specifico dispositivo Midi, per il quale solo sono destinate ("escludendo" quelli di altri produttori). | ||
+ | <BR>I ''Messaggi'' Midi di ''System Exclusive'' possono essere costituiti da un numero variabile di Byte. | ||
+ | <BR>E' importante ricordare che ogni ''Messaggio'' di ''System Exclusive'' inizia con il Byte di valore &hF0 e termina con il Byte di valore &hF7, e che non possiede informazione di Canale. | ||
+ | |||
+ | ==Codice Gambas esemplificativo per intercettare i ''Messaggi'' Midi== | ||
+ | Di seguito è mostrato un semplicissimo codice in Gambas per intercettare i singoli dati dei ''Messaggi'' Midi provenienti da un dispositivo Midi esterno (ad esempio una tastiera) collegato al computer: | ||
+ | Private fl As File | ||
+ | |||
+ | |||
+ | Public Sub Main() | ||
+ | |||
+ | <FONT Color=gray>' ''Apre in lettura il file-device auto-creato con la connessione del dispositivo Midi esterno e lo pone in "osservazione":''</font> | ||
+ | fl = Open "/dev/snd/midiC2D0" For Read Watch | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub File_Read() | ||
+ | |||
+ | Dim dato As Byte | ||
+ | |||
+ | <FONT Color=gray>' ''Legge il file-device e assegna il valore intercettato alla variabile "dato":''</font> | ||
+ | Read #fl, dato | ||
+ | |||
+ | <FONT Color=gray>' ''Mostra nella console/terminale il dato Midi letto dal file-device:''</font> | ||
+ | Print "Byte inviato dalla tastiera = "; dato | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Application_Read() <FONT Color=gray>' ''Cliccando sul tasto "Invio" della tastiera, verrà sollevato questo Evento''</font> | ||
+ | |||
+ | fl.Close | ||
+ | Quit | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
=Note= | =Note= | ||
[1] Il bit "''più significativo''" è quello più a sinistra all'interno del Byte, e al quale è associato il valore 128: | [1] Il bit "''più significativo''" è quello più a sinistra all'interno del Byte, e al quale è associato il valore 128: | ||
<FONT Color=#B22222><B>1</b></font> 0 0 0 0 0 0 0 | <FONT Color=#B22222><B>1</b></font> 0 0 0 0 0 0 0 | ||
− | [2] In generale quando un dispositivo è impostato per elaborare soltanto le informazioni assegnate a uno specifico Canale, si parla di | + | [2] I sedici ''Canali'' Midi sono convenzionalmente rappresentati dal numero 1 fino al numero 16. |
+ | <BR>Pertanto il valore di ''indice'' 0, restituito dai bit ''meno significativi'' di un Byte di ''Stato'', è associato al ''Canale'' Midi n. 1 e così via sino al valore di ''indice'' 15, che è associato al ''Canale'' n. 16. | ||
+ | |||
+ | [3] In generale quando un dispositivo è impostato per elaborare soltanto le informazioni assegnate a uno specifico Canale, si parla di ''sintonizzazione''. | ||
+ | <BR>Così, se il dispositivo è impostato per prendere in considerazione i dati appartenenti al Canale 3, si dice che tale dispositivo è ''sintonizzato'' sul Canale 3. | ||
+ | [4] L'eccezione a questa regola generale è la modalità "Omni": un dispositivo impostato per ricevere in modalità "Omni" accetterà e risponderà a tutti i ''Messaggi'' Midi indipendentemente dal numero del Canale, al quale il ''Messaggio'' è associato. | ||
+ | <BR>La modalità "Omni" può essere impostata assegnando il valore &h7D al 1° Byte di ''Dati'' del ''Messaggio'' Midi di tipo "''Control Change'' ". | ||
− | + | [5] Va precisato che la ''Velocità'' di pressione <SPAN Style="text-decoration:underline">non</span> corrisponde meramente al volume del suono di una nota, il quale è definito mediante il valore &h07 del 1° Byte di ''Dati'' del ''Messaggio'' Midi di ''Control Change''. | |
− | < | + | [6] Si verifichino infatti semplicemente i seguenti casi: |
+ | <BR>1) valore massimo dell'effetto ''Pitch Bend'' (LSB =&h7F, MSB = &h7F) ---> (127 << 7) OR 127 = 16383; | ||
+ | <BR>2) valore intermedio (originario) dell'effetto ''Pitch Bend'' (LSB =&h00, MSB = &h40) ---> (64 << 7) OR 0 = 8192; | ||
+ | <BR>3) valore minimo dell'effetto ''Pitch Bend'' (LSB =&h00, MSB = &h00) ---> (0 << 7) OR 0 = 0. |
Versione attuale delle 17:38, 16 nov 2024
Il M.I.D.I. (Musical Instrument Digital Interface) è un protocollo di trasmissione seriale di dati alla velocità di 31250 bit al secondo.
Tali dati Midi vengono trasmessi uno dopo l'altro (in modo seriale, in sequenza), e ricevuti dal dispositivo ricevente nell'ordine sequenziale in cui sono stati trasmessi.
Un insieme di due o tre Byte, previsto dal protocollo Midi e corrispondente a un elemento costitutivo di un brano musicale, rappresenta un Messaggio Midi.
Ogni Messaggio Midi è anche considerato un Evento musicale Midi, in quanto esso "accade " nel tempo, sia in senso assoluto che in senso relativo, in quanto esso accade temporalmente anche rispetto all'Evento Midi che lo precede (fatta eccezione per il primo Evento in assoluto del brano musicale).
Indice
Byte di Stato e Byte di Dati
Si è detto che ogni Messaggio Midi è costituito da due o tre Byte. Va precisato che riguardo al significato dei Byte, costituenti il Messaggio Midi, essi vanno considerati distinti e indipendenti fra loro, e non come un unico valore numerico formato da due o tre Byte. Pertanto ogni singolo Byte del Messaggio Midi apporta una propria specifica informazione.
Da ciò deriva che ogni singola informazione è scritta utilizzando i valori rappresentabili da 8 bit (un Byte), ossia da 0 a 255 per un totale - come si sa - di 256 combinazioni possibili.
Il primo Byte costituente il Messaggio Midi è chiamato Byte di "Stato " (ma anche Messaggio di Stato). Il seguente o i seguenti sono chiamati Byte di "Dati " (ma anche Messaggio di Dati).
Pertanto l'invio da un dispositivo Midi trasmittente a un altro ricevente avviene in sequenza come appresso mostrato:
___/ PORTA| |PORTA \___ ___ USCITA|---> 2° Byte di Dati ---> 1° Byte di Dati ---> Byte di Stato --->|ENTRATA ___ \ Midi| |Midi /
Il primo Byte a uscire dal dispositivo Midi trasmittente è il Byte di Stato, poi esce il 1° Byte di Dati e infine esce il 2° Byte di Dati. Analogamente, il primo Byte a entrare nel dispositivo Midi ricevente è il Byte di Stato, poi entra il 1° Byte di Dati e infine il 2° Byte di Dati.
I Byte di Stato e i Byte di Dati strutturalmente si differenziano per l'ambitus di valori rappresentati dal loro Byte. In particolare il Byte di Stato utilizza solo i valori compresi tra 128 e 255, mentre i Byte di Dati utilizzano solo i valori compresi tra 0 e 127.
Ciò significa che:
1) nei Byte di Stato il bit più significativo [nota 1] è sempre posto a 1, mentre nei Byte di Dati il bit più significativo è posto sempre a 0;
2) nel protocollo Midi i bit più significativi, pur concorrendo a formare il valore finale complessivo del Byte, sono utili soltanto nella definizione e generica distinzione tra Byte di Stato e Byte di Dati, ma non concorrono nella definizione del valore da associare al tipo di Evento (Messaggio) Midi o al tipodi Dato. Infatti nel Byte di Stato, come s'è detto, il 1° bit più significativo individua univocamente il Byte di Stato in quanto tale, e soltanto il 2°, il 3° e il 4° bit più significativi sono utili per definire i valori che distinguono i vari Messaggi Midi. Nel Byte di Dati, poi, il 1° bit più significativo individua univocamente il Byte di Dati in quanto tale, e soltanto i restanti sette bit a destra sono utili per definire il valore associato al tipo di Dato.
Il Byte di Stato
Il Byte di Stato informa il dispositivo ricevente sul tipo di Messaggio (sulla sua funzione) e sul Canale al quale appartiene.
Per conferire queste due informazioni, il Byte di Stato divide in due gruppi i bit costituenti il suo Byte, come appresso specificato:
1 b b b b b b b
I primi quattro bit (quelli più significativi), dei quali il primo a sinistra - sempre posto a 1 - specifica che si tratta genericamente di un Byte di Stato, sono utilizzati per definire il "tipo" di Messaggio Midi di appartenenza.
Gli ultimi quattro bit (quelli meno significativi) specificano invece il Canale, al quale il Messaggio Midi appartiene. Poiché l'ambitus di valori, rappresentabili dai quattro bit meno significativi del Byte di Stato, comprende i valori da 0 a 15, il numero massimo di Canali Midi utilizzabili è 16. [nota 2]
Il Canale Midi
Il Canale Midi è un'impostazione presente in ciascun evento Midi che permette a un dispositivo, sintonizzato [nota 3] su un determinato Canale, di filtrare gli eventi Midi elaborando soltanto quelli appartenenti a quel Canale. [nota 4]
Esempio di byte di Stato
Mostriamo un esempio di Byte di Stato:
1 0 0 1 1 0 0 1
I bit suddetti specificano che è un Byte di Stato, che individua un Messaggio Midi di tipo "Note-On", appartenente al Canale "10".
Il valore complessivo associato a questo esempio di Byte di Stato è pertanto "&h99".
Il Byte di Dati
I Byte di Dati apportano informazioni fondamentali aggiuntive di dettaglio associate al Messaggio Midi inviato. I Messaggi Midi - a seconda del tipo - possono avere uno o due Byte di Dati.
Come è stato già detto, nel Byte di Dati il bit più significativo è sempre posto a 0. Pertanto il Byte di Dati può assumere esclusivamente valori compresi fra 0 e 127.
Esempio di Byte di Dati:
0 0 1 1 0 0 0 0
Tipologia dei Messaggi Midi
Ogni Evento (Messaggio) Midi è considerato un elemento fondamentale nella dinamica musicale, o perché costitutivo del brano (si pensi ad esempio all'esecuzione di una nota), o perché influenza in modo determinante l'esecuzione musicale (si pensi ad esempio allo strumento utilizzato).
I Messaggi Midi si suddividono secondo la seguente tipologia:
Channel Voice Messages;
Channel Mode Messages;
System Common Messages;
System Real Time Messages;
System Exclusive Messages.
In questa pagina prenderemo inconsiderazione solo i Channel Voice Messages e i System Exclusive Messages.
Per comprendere meglio l'associazione dei valori ai singoli Byte (di Stato e di Dati) appartenenti essenzialmente ai Messaggi Midi, è opportuno immaginare l'azione del dito di un esecutore su un pianoforte o su una tastiera elettronica con tasti dinamici.
I Messaggi Channel Voice
I Messaggi Midi di tipo Channel Voice sono:
Note Off
Il Messaggio di Note Off viene inviato per istruire che l'esecuzione di una nota, precedentemente attivata, deve essere disattivata, deve cessare. Facendo l'esempio del pianoforte, il Messaggio Midi di Note Off corrisponde in sostanza all'istruzione di rilasciare un tasto ancora premuto.
Il suo Byte di Stato, a seconda del Canale attribuito, può assumere valori da &h80 a &h8F.
Il primo Byte di Dati individua il numero di nota, che deve ovviamente corrispondere al numero di una nota la cui esecuzione sia stata precedentemente attivata.
Il secondo Byte di Dati rappresenta la Velocità (Velocity) di pressione del tasto del pianoforte per eseguire una nota. Tale Byte, non essendo ovviamente rilevante in questo tipo di Evento Midi, può essere posto a 0.
Va detto che l'effetto prodotto dal Messaggio Midi di Note Off corrisponde sostanzialmente all'effetto prodotto dal Messaggio Midi di Note On con il valore del secondo Byte di Dati posto a 0.
Esempio di Messaggio di Note Off:
80 48 00
Note On
Il Messaggio di Note On viene inviato per istruire di attivare una determinata nota. Nell'esempio del pianoforte il Messaggio Midi di Note On corrisponde all'istruzione di premere un tasto.
Il suo Byte di Stato, a seconda del Canale attribuito, può assumere valori da &h90 a &h9F.
Il primo Byte di Dati individua il numero della nota che deve essere attivata.
Il secondo Byte di Dati rappresenta la Velocità (Velocity) di pressione del tasto del pianoforte per eseguire una nota, e può assumere un valore da 0 a 127. Come già accennato sopra, il Messaggio Midi di Note On con il valore del secondo Byte di Dati posto a 0 corrisponde in sostanza a un Messaggio Midi di Note Off.
Più in particolare la Velocità rappresenta la velocità con cui un tasto del pianoforte viene premuto. [nota 5]
Esempio di Messaggio di Note On:
90 48 64
Polyphonic Key Pressure
Il Messaggio di Polyphonic Key Pressure, anche chiamato Aftertouch Polyphonic, rappresenta l'ulteriore pressione che si assegna a una o più note già attivate mediante il Note On.
Il suo Byte di Stato, a seconda del Canale attribuito, può assumere valori da &hA0 a &hAF.
Il primo Byte di Dati individua il numero della nota la nota oggetto dell'effetto dell'Aftertouch.
Il secondo Byte di Dati rappresenta il valore di Aftertouch Polyphonic aggiuntivo da eseguire.
Esempio di Messaggio di Aftertouch Polyphonic:
A0 48 6C
Control Change
Il Messaggio di Control Change rappresenta una quantità di circa 128 informazioni che incidono sull'esecuzione delle note.
Il suo Byte di Stato, a seconda del Canale attribuito, può assumere valori da &hB0 a &hBF.
Il primo Byte di Dati individua il tipo di Controllo da attivare.
Il secondo Byte di Dati rappresenta il valore da assegnare al Controllo prescelto.
Esempio di Messaggio di Control Change:
B0 07 64
(volume posto a 100 per tutti gli Eventi Note On appartenenti al Canale 0 che seguono)
Program Change
Il Messaggio di Program Change istruisce il dispositivo del numero identificativo di strumento musicale, con il quale eseguire uno o più Messaggi di Note On che seguono.
Questo Messaggio Midi è costituito soltanto da 2 Byte.
Il suo Byte di Stato, a seconda del Canale attribuito, può assumere valori da &hC0 a &hCF.
Il primo (e unico) Byte di Dati rappresenta il valore da assegnare al Program Change, ossia il numero identificativo dello strumento musicale all'interno del file soundbank utilizzato.
Esempio di Messaggio di Program Change:
C0 32
(strumento n. 50 del General Midi, corrispondente al Basso acustico, assegnato a tutti gli Eventi Note-On del Canale 0 che seguono)
Channel Pressure
Il Messaggio di Channel Pressure, anche chiamato Channel Aftertouch, viene inviato quando c'è un cambiamento nella pressione generale applicata a tutte le note di un canale e non solo su una singola o singole note.
Questo Messaggio Midi è costituito soltanto da 2 Byte.
Il suo Byte di Stato, a seconda del Canale attribuito, può assumere valori da &hD0 a &hDF.
Il primo (e unico) Byte di Dati rappresenta il valore di Channel Aftertouch aggiuntivo da eseguire.
Esempio di Messaggio di Channel Pressure:
D0 64
(evento del Channel Pressure con valore 100, assegnato a tutti gli Eventi Note-On del Canale 0 che seguono)
Pitch Wheel
Il Messaggio di Pitch Wheel, anche chiamato Pitch Bend, rappresenta l'effetto glissato. Esso si applica all'evento Note-On che immediatamente lo precede.
Il suo Byte di Stato, a seconda del Canale attribuito, può assumere valori da &hE0 a &hEF.
Il Messaggio di Pitch Bend utilizza entrambi i suoi Byte di Dati per determinare con precisione il valore della variazione di tono per il glissato.
Il primo Byte di Dati è quello meno significativo, e lo si può pensare come portatore di un'informazione di alta risoluzione, poiché contiene i 7 bit meno significativi del valore di glissato.
Il secondo Byte di Dati è quello più significativo, e lo si può pensare come portatore di un'informazione di risoluzione grossolana, poiché contiene i 7 bit più significativi del valore di glissato.
Più in particolare nel messaggio di Pitch Bend, per ottenere il valore effettivo dell'effetto glissato, bisogna combinare i due Byte di Dati (LSB e MSB), creando così un unico valore di 14 bit (esclusi ovviamente i "bit" più significativi di entrambi i Byte di Dati) con un intervallo compreso tra 0 e 16.383, ove il valore minimo è 0, quello intermedio è 8192 e quello massimo è 16383.
La combinazione viene effettuata secondo la seguente formula:
(MSB << 7) OR LSB = risultato
I bit del valore del 2° Byte di Dati (quello più significativo) vanno spostati a sinistra di 7 posti; il risultato di tale spostamento va combinato con il 2° Byte di Dati (quello meno significativo) mediante l'operatore "OR".
Infatti, combinando i valori massimi (&h7F) di entrambi i Byte di Dati, si ottiene: (127 << 7) OR 127 = 16383
Ciò detto, va precisato che, poiché l'effetto del glissato può avvenire sia in basso che in alto rispetto alla tonalità originaria della nota (cioè può abbassare o elevare la tonalità originaria della nota), nel 1° Byte di Dati (quello meno significativo - LSB) il valore minimo è rappresentato da 0, quello originario (ossia l'intermedio) è rappresentato dal valore 0, mentre il malore massimo è rappresentato da &h7F; nel 2° Byte di Dati (quello più significativo - MSB) invece il valore minimo è rappresentato da 0, quello originario è rappresentato dal valore &h40, mentre il malore massimo è rappresentato da &h7F. [nota 6]
LSB MSB &h7F &h7F 127 | | | | | | &h00 &h40 64 | | | | | | &h00 &h00 0
Esempio di Messaggio di Pitch Bend:
E0 48 40
(evento di Pitch Bend con valore 8264 sul Canale 0)
I Messaggi System Exclusive
Molto brevemente si può dire che i Messaggi Midi di System Exclusive (o semplicemente SysEx) vengono utilizzati per molteplici usi, legati per lo più nell'invio di informazioni per assegnare impostazioni specifiche a uno specifico dispositivo Midi, per il quale solo sono destinate ("escludendo" quelli di altri produttori).
I Messaggi Midi di System Exclusive possono essere costituiti da un numero variabile di Byte.
E' importante ricordare che ogni Messaggio di System Exclusive inizia con il Byte di valore &hF0 e termina con il Byte di valore &hF7, e che non possiede informazione di Canale.
Codice Gambas esemplificativo per intercettare i Messaggi Midi
Di seguito è mostrato un semplicissimo codice in Gambas per intercettare i singoli dati dei Messaggi Midi provenienti da un dispositivo Midi esterno (ad esempio una tastiera) collegato al computer:
Private fl As File Public Sub Main() ' Apre in lettura il file-device auto-creato con la connessione del dispositivo Midi esterno e lo pone in "osservazione": fl = Open "/dev/snd/midiC2D0" For Read Watch End Public Sub File_Read() Dim dato As Byte ' Legge il file-device e assegna il valore intercettato alla variabile "dato": Read #fl, dato ' Mostra nella console/terminale il dato Midi letto dal file-device: Print "Byte inviato dalla tastiera = "; dato End Public Sub Application_Read() ' Cliccando sul tasto "Invio" della tastiera, verrà sollevato questo Evento fl.Close Quit End
Note
[1] Il bit "più significativo" è quello più a sinistra all'interno del Byte, e al quale è associato il valore 128:
1 0 0 0 0 0 0 0
[2] I sedici Canali Midi sono convenzionalmente rappresentati dal numero 1 fino al numero 16.
Pertanto il valore di indice 0, restituito dai bit meno significativi di un Byte di Stato, è associato al Canale Midi n. 1 e così via sino al valore di indice 15, che è associato al Canale n. 16.
[3] In generale quando un dispositivo è impostato per elaborare soltanto le informazioni assegnate a uno specifico Canale, si parla di sintonizzazione.
Così, se il dispositivo è impostato per prendere in considerazione i dati appartenenti al Canale 3, si dice che tale dispositivo è sintonizzato sul Canale 3.
[4] L'eccezione a questa regola generale è la modalità "Omni": un dispositivo impostato per ricevere in modalità "Omni" accetterà e risponderà a tutti i Messaggi Midi indipendentemente dal numero del Canale, al quale il Messaggio è associato.
La modalità "Omni" può essere impostata assegnando il valore &h7D al 1° Byte di Dati del Messaggio Midi di tipo "Control Change ".
[5] Va precisato che la Velocità di pressione non corrisponde meramente al volume del suono di una nota, il quale è definito mediante il valore &h07 del 1° Byte di Dati del Messaggio Midi di Control Change.
[6] Si verifichino infatti semplicemente i seguenti casi:
1) valore massimo dell'effetto Pitch Bend (LSB =&h7F, MSB = &h7F) ---> (127 << 7) OR 127 = 16383;
2) valore intermedio (originario) dell'effetto Pitch Bend (LSB =&h00, MSB = &h40) ---> (64 << 7) OR 0 = 8192;
3) valore minimo dell'effetto Pitch Bend (LSB =&h00, MSB = &h00) ---> (0 << 7) OR 0 = 0.