SYSTEM EXCLUSIVE: quando il pannello non basta più – Seconda parte

Written by Antonio Antetomaso on . Posted in Tutorial

Dopo la panoramica sull’argomento e il ripasso dell’esadecimale effettuati nella prima puntata, riprendiamo senza indugio ulteriore la nostra analisi dei messaggi di system exclusive, partendo proprio dall’esempio visionato la volta scorsa.

Di Antonio Antetomaso

[1]  [2]  [3]  [4]  [5]  [6]      [7]  [8]  [9]

F0   41   10   42   12   40007F   00   41   F7

Analizziamo la struttura del messaggio per poi entrare nel dettaglio di ogni singola parte. Piccola precisazione introduttiva: l’esempio in esame fa riferimento ad un messaggio costruito per un equipment Roland ma i concetti che analizzeremo possono essere facilmente generalizzati per cavarsi d’impaccio con altre apparecchiature; tutto ciò di cui abbiamo bisogno oltre alla teoria è ovviamente il manuale dell’apparecchiatura che abbiamo sottomano, sezione relativa all’implementazione del protocollo MIDI.

Bando alle ciance, cominciamo iniziando dalla lunghezza: 9 parti di cui 7 lunghe un byte, 1 lunga 6 bytes e una di lunghezza variabile. Iniziamo dalla parte comune del messaggio che prescinde dalle caratteristiche costruttive dell’apparecchiatura che abbiamo sotto mano: le parti 1 e 9 imposte dallo standard MIDI. In particolare la prima e la nona parte sono lunghe un byte e valgono sempre, rispettivamente, F0 e F7. 

La seconda parte, benché imposta dallo standard MIDI, assume un valore che dipende dalle caratteristiche costruttive dello strumento musicale. Nel caso in esame Roland impone il valore 41. 

La terza parte (anch’essa di un byte) è molto importante e prende il nome di Device ID. In pratica è un identificativo univoco assegnato allo strumento che ha il compito di identificarlo univocamente come destinatario del messaggio se lo strumento è inserito in una rete di MIDI realizzata in DAISY CHAIN (in sequenza o ad anello). Nel caso in esame, il nostro strumento Roland ha Device ID pari a 10 (16 decimale, mi raccomando!!).

Andiamo avanti con la quarta parte, il Model ID. Questo byte, nelle apparecchiature compliant con lo standard GS assume sempre il valore esadecimale di 42, ma varia nelle altre tipologie di strumenti musicali, specie quelli più vecchi.

Arriviamo alla ciccia, cioè alla parte del messaggio che identifica univocamente che cosa vogliamo fare, la quinta. Essa, lunga un byte ancora, indica se abbiamo a che fare con un messaggio destinato ad inviare dati o a ricevere dati. Eh si, perché mediante i messaggi di System Exclusive è possibile recuperare dati dall’apparecchiatura musicale in oggetto ed elaborarli/archiviarli a proprio piacimento.

Non ditemi che non avete mai salvato i banchi di suoni da voi stessi programmati dopo ore e ore di lacrime,sudore e sangue, mediante un tool tipo Sounddiver (venerando) o Midiquest??

Torniamo seri e passiamo alla sesta parte, stavolta lunga 6 bytes? Perché 6? Semplice perché questa parte indirizza univocamente la zona di memoria all’interno dello strumento che vogliamo scrivere o da cui vogliamo leggere. Quanti indirizzi sono, tanto per aprire una parentesi? Facile, 3 bytes = 24 bits se la matematica non è un’opinione e con 24 bits posso indirizzare 2^24 zone di memoria per un totale di 16777216 indirizzi, dalla posizione con indirizzo 000000h a quella con indirizzo FFFFFFh (non fatemi scrivere 24 volte 0 e 24 volte 1!!).

…e dovrei ricordarmi 16777216 indirizzi a cosa corrispondono? Ovviamente no!! E’ proprio qui che ci viene in aiuto il manuale dello strumento musicale con cui stiamo dialogando: in esso è quasi sempre riportata l’ADDRESS MAP, una mappa riportante ciascun indirizzo con il parametro corrispondente (es. volume, patch number, pitch bend e quant’altro). Naturalmente non è detto che TUTTI gli indirizzi siano usati eh? Diciamo che 3 bytes sono sufficienti a fare praticamente tutto quello che si può fare con un synth, CAFFE’ COMPRESO!!

La settima parte del messaggio, di lunghezza variabile, cambia ruolo secondo se si tratta di un messaggio di ingresso o di un messaggio di uscita. Nel caso di messaggio di ingresso (quando il byte 5 vale 12h) tale parte contiene i bytes veri e propri da inviare allo strumento. Nel caso di messaggio di uscita (quando il byte 5 vale 11h) contiene invece il numero di bytes che chiediamo di leggere dallo strumento, a partire dall’indirizzo specificato. Semplice no?

Diciamo che sesta e settima parte costituiscono il cuore di una struttura di System Exclusive.

TUTTO QUI? Magari, non dimenticate che abbiamo l’ottava parte che è quella che manda in panico quasi tutti i programmatori di messaggi SysEx, il CHECKSUM!! Che diavolo è? Semplice è un byte di controllo il cui valore è calcolato sulla base del resto del messaggio e che serve sostanzialmente a preservare da errori di trasmissione. In pratica chi riceve un messaggio di Sysex ha a disposizione il checksum per verificare, come prima cosa, che il messaggio è integro per poi passare ad interpretarlo.

Come si calcola? Beh con un algoritmo che in genere dipende dallo strumento in oggetto o, meglio, dal costruttore. Roland ha ovviamente il suo (quello più diffuso peraltro) che consiste nei seguenti passi:

1. Converti i bytes delle parti 6 e 7 in decimale e sommali tra loro, avendo cura di sottrarre 128 ogni volta che la somma supera 128

2. Sottrai il risultato finale a 128

3. Converti il risultato in esadecimale e usa questo valore come checksum

VEDIAMO UN ESEMPIO

[1]  [2]  [3]  [4]  [5]  [6]      [7]   [8]  [9]

F0   41   10   42   12   401100   4163  0B   F7

1. Conversione in decimale

40h = 64

11h = 17

00h = 0

41h = 65

63h = 99

2. Somme parziali con sottrazioni eventuali

64 + 17 = 81

81 + 0 = 81

81 + 65 = 146 ( 146 – 128 = 18 )

18 + 99 = 117

3. Sottrazione a 128

128 – 117 = 11

4. Conversione in esadecimale:

11 = 0Bh

Naturalmente, il tutto è equivalente a sommare tutti i bytes, dividere la somma per 128, considerare il resto, sottrarre quest’ultimo a 128, convertirlo in esadecimale e ottenere così il checksum.

Vediamo lo stesso esempio di prima:

1. Conversione in decimale:

40h = 64

11h = 17

00h = 0

41h = 65

63h = 99

 

2. Somma:

64 + 17 + 0 + 65 + 99 = 245

 

3. Divisione per 128

245 / 128 = 1 resto 117

 

4. Sottrazione del resto a 128

128 – 117 = 11

 

5. Conversione in esadecimale:

11 = 0Bh

 

E se la parte 6 e la parte 7 sono complessivamente lunghe 1024 bytes, quanto tempo perdo a calcolare?  Ovviamente meglio far fare tutto ad un processore, no?

Ora è il momento di vedere qualche esempio pratico, tanto per fissare il tutto prima di salutarci…

 

ESEMPIO 1

Invio di un messaggio con la parte dati di un singolo byte. Il reset GS.

 

[1]  [2]  [3]  [4]  [5]  [6]      [7]  [8]  [9]

F0   41   10   42   12   40007F   00   41   F7

 

Se avete tra le mani un synth GS compliant (ad es. un modulo Sound Canvas SC-88), non state facendo altro che inizializzarlo o, meglio, andando a scrivere 0 all’indirizzo 40007F.

 

 

ESEMPIO 2

Invio di un messaggio con la parte dati di lunghezza > 1 byte. Cambio di patch.

[1]  [2]  [3]  [4]  [5]  [6]      [7]   [8]  [9]

F0   41   10   42   12   401100   0801  26   F7

Come si nota, in questo esempio stiamo inviando i bytes 08 e 01 che andranno ad essere memorizzati nel synth a partire dall’indirizzo 401100, quindi precisamente nelle locazioni di memoria aventi indirizzo 401100 e 401101 rispettivamente.

Mediante questo meccanismo di interpretazione è comodamente possibile inviare in un unico messaggio un’unico stream di bytes che andranno ad essere immagazzinati nella macchina a partire dall’indirizzo indicato in poi.

Se inviassimo tale messaggio al nostro bravo modulo SC-88 otterremmo sul display la scritta “Piano 2w”. A proposito, diamo un’occhiata al manuale del modulo SC-88 per vedere cosa troviamo in merito al cambio di patch da attivare mediante messaggi system exclusive.

Il carattere ‘x’ indica il Part Number del synth e può assumere valori da 1 a F naturalmente. Il carattere ‘#’ inibisce l’invio dei dati all’indirizzo in cui esso compare. CC#00 0-127 indica la variazione GS della patch in questione. P.C. indica i valori ammissibili per il cambio di patch, da 1 a 128 per il caso in oggetto.

Non è come leggere Topolino, ma con un po’ di pratica si arriva facilmente alla soluzione desiderata.

 

ESEMPIO 3

Ricezione di dati dal synth

[1]  [2]  [3]  [4]  [5]  [6]      [7]      [8]  [9]

F0   41   10   42   11   401100   000002   2D   F7

Come si nota, tale messaggio presenta il valore 11 nella parte [5] ad indicare appunto che stiamo chiedendo dei dati in uscita dal nostro strumento. I tre bytes nella parte [6] stanno ad indicare l’indirizzo a partire da cui desideriamo leggere, mentre nella parte [8] è riportato il numero di bytes che desideriamo leggere (2 in questo caso).

Se inviamo tale messaggio al nostro synth esso risponderà con un altro messaggio di SysEx simile a quello dell’esempio 2 con i bytes desiderati nella parte [7].

Permettetevi di consigliarvi qualche buon tool per inviare messaggi di system exclusive al vostro synth:

 

1) Sysex librarian per Mac Osx

2) MIDI-OX per Windows

Oltre, naturalmente, all’ottimo Midi Quest 10 XL, a pagamento ma molto più completo e decisamente di altro target. Mi verrebbe da segnalarvi anche il caro e venerando Emagic Soundiver, ma ormai è in dismissione ed è molto difficile trovarlo. A mio avviso, si tratta del miglior editor MIDI mai creato, peccato…

Alla prossima!

Tags: , ,

Trackback from your site.

Leave a comment

Inserisci il numero mancante: *

ga('send', 'pageview');