MIDI, OSC et autres protocoles
Forums thématiques MIDI, OSC et autres protocoles

Tutoriel : Sysex and sun

Par jemap le 09/11/2015 - (Tout public)

Sysex and sun

 

Comme il est dit dans la célèbre chanson, le sysex vous apporte du soleil, tout au moins un éclairage nouveau sur vos appareils midi.
Sysex est la contraction de "system exclusive", un message midi propre à un appareil midi et déterminé librement par son constructeur.


De quoi c'est fait, un sysex ?

"Pas de sysex sans midi" ; ce proverbe trop peu connu nous rappelle qu'un sysex est un message midi, donc une simple suite de chiffres entre 0 et 255.
Le premier chiffre est 240 pour prévenir d'un début de sysex.
Le dernier chiffre est 247 pour prévenir d'une fin de sysex.
Les valeurs entre les deux sont des chiffres compris entre 0 et 127.
En midi, tout message commence par un chiffre entre 128 et 255 pour annoncer un type de message, puis une suite de valeurs entre 0 et 127. Facile, sauf que les chiffres sont souvent exprimés en hexadécimal pour intimider le débutant.

Prenons par exemple le sysex de demande générale d'identification en hexadécimal : F0 7E 7F 06 01 F7
On constate :
- qu'il commence par F0 (240),
- qu'il finit par F7 (247),
- que les valeurs entre les deux ne dépassent pas 7F (127),
- que chaque chiffre est une paire de valeurs hexadécimales.
Un appareil midi qui reçoit cette demande doit en principe répondre par F0 7E 7F 06 02 ... F7, message sysex qui respecte les mêmes règles.


A quoi sert un sysex ?

Les sysex servent à contrôler les paramètres d'un appareil midi ou à regrouper tous les paramètres d'un son ou d'une configuration.
Le contrôle est bien plus étendu qu'avec les control changes midi.
Le sysex permet également de transférer les données internes de l'appareil (les paramètres d'un son par exemple, une banque de sons d'un synthétiseur, les affectations de messages midi d'un contrôleur) vers un autre instrument identique ou vers un support de stockage tel un fichier avec une extension ".syx" sur le disque dur de votre ordinateur.
Un fichier sysex préalablement sauvegardé pourra être rechargé et renvoyé vers votre instrument pour restaurer des paramètres.
Les constructeurs utilisent souvent des fichiers sysex pour mettre à jour l'OS des appareils midi, c'est à dire l'"operating system" qui gère les menus et fonctionnalités,  avec ajout de fonctions et corrections de bugs éventuels.
Des messages sysex peuvent être inclus dans un fichier midi avec une extension ".mid".


"A compter, tu réapprendras." disait Yoda à Luke lorsqu'il lui enseigna l'hexadécimal.

Les sysex sont majoritairement exprimés en hexadécimal, du latin "hexa" six, "déci" dix et "mal" fois ;
6 + 10 = 16 signes sont utilisés pour compter (on parle de "base 16" dans les milieux autorisés).
Il faut donc réapprendre à compter.

L'humain moyen est doté de dix doigts et compte assez rapidement en base 10 : on utilise 10 signes 0 1 2 3 4 5 6 7 8 9. Au-delà de 9, on prend le chiffre suivant disponible 1 et on ajoute la série 0 à 9, puis on prend 2 et on ajoute la série 0 à 9, etc. En ne prenant que 2 signes, on peut compter jusqu'à 99. On parle de décimal.

Un ordinateur est un très puissant calculateur : il sait compter jusqu'à 1 parce qu'il n'a qu'un doigt, virtuel, mais il compense par sa grande mémoire et sa grande vitesse. Pour simplifier, l'électricité qui parcourt un circuit d'ordinateur lui indique éteint = 0, allumé = 1.
Ces signes 0 et 1 sont des bits pour compter en base 2 ; on parle de binaire. Tout fichier ou message informatique est binaire.
Un appareil midi utilise ce langage informatique binaire et communique chaque chiffre en un paquet de 8 bits, soit un octet du latin "octo" huit. En anglais un octet est un "byte" à ne pas confondre avec "bit".
Comme pour le décimal, après 1 on prend le chiffre suivant disponible 1 et on ajoute la série 0 à 1 :
00000000 = 0
00000001 = 1
00000010 = 2
00000011 = 3
...
10000000 = 128
...
11111111 = 255
On constate que lorsque le premier bit le plus à gauche est 1, on dépasse 127 ce qui correspond en midi à un indicateur de type de message (de 128 à 255).
A ma connaissance, les manuels de Dave Smith, l'un des fondateurs du midi, expriment le midi et les sysex en binaire.
On passe du binaire au décimal en multipliant chaque bit par 2 à la puissance correspondant au rang du bit dans l'octet moins 1 :

Par exemple, 10101011 =
   1 x 2 puissance 7 (7 = 8ème rang -1)
+ 0 x 2 puissance 6
+ 1 x 2 puissance 5
+ 0 x 2 puissance 4
+ 1 x 2 puissance 3
+ 0 x 2 puissance 2
+ 1 x 2 puissance 1
+ 1 x 2 puissance 0 = 128 + 0 + 32 + 0 + 8 + 0 + 2 +1 = 173

 

Entre le décimal humain et le binaire électronique, les informaticiens ont inventé l'hexadécimal.
En hexadécimal on compte avec 16 signes 0 à 9 et A à F, avec A = 10, B=11, C=12, D=13, E=14 et F=15.
Comme pour les autres bases, après F on prend le premier chiffre disponible et on ajoute la série 0 à F :
0 1 2 3 4 5 6 7 8 9 A B C D E F   10 11 ... 1E 1F   20 21 ... 2E 2F ... ... FF

Pour ne pas confondre les valeurs lorsqu'un document mélange plusieurs bases comme cet article, ces bases ayant des signes en commun, on ajoute une lettre "b" pour binaire, "d" pour décimal, "h" pour hexadécimal : 11b (valeur 3) n'est pas 11d (valeur 11) et n'est pas 11h (valeur 17).

Les avantages de l'hexadécimal sont :
- il ne faut que deux signes pour compter jusqu'à FFh au lieu de trois en décimal et 8 en binaire (FFh = 255d = 11111111b) ;
- il permet aux informaticiens de protéger leur territoire des envahisseurs qui n'ont que dix doigts ;
- il permet de garder le sysex du côté obscur ;

L'hexadécimal ne sert qu'à représenter des chiffres dans les manuels ou sur un écran.
Tout sysex est constitué d'octets représentés en paires de signes hexadécimaux.
Une paire de signes hexadécimaux est un octet de 8 bits, c'est donc un simple chiffre entre 0 et 255.

Pour convertir l'hexadécimal en décimal, multipliez le premier signe par la base 16 et ajoutez le second chiffre :
35h = 3 x 16 + 5 = 53d
BDh = 11 (B) x 16 + 13 (D) = 189d
40h= 4 x 16 + 0 = 64d
7Fh = 7 x 16 + 15 (F) = 127d
F0h = 15 (F) x 16 + 0 = 240d
F7h = 15 (F) x 16 + 7 = 247d
En décimal, vous auriez fait 53d = 5 x 10 + 3

Pour passer du binaire à l'hexadécimal, on coupe l'octet en deux ; par exemple 01111010 devient 0111 et 1010 ; on convertit chaque groupe de 4 bits : 0+4+2+1=7d=7h et 8+0+2+0=10d=Ah ; on obtient 7Ah.

Pour votre culture, vous pouvez inventer votre propre base de comptage : par exemple en alphabétique on a 26 signes de A à Z ; en utilisant 2 signes, on peut compter de AA à ZZ.
Plus généralement, le nombre de signes disponibles à la puissance nombre de signes utilisés - 1 = chiffre maximum obtenu :
- base 10 puissance 2 - 1 = 99 avec 2 signes en décimal.
- base 2 puissance 8 - 1 = 255 avec 8 signes en binaire (un octet midi)
- base 16 puissance 2 - 1 = 255 avec 2 signes en hexadécimal (un octet midi)
- base 26 puissance 2 - 1 = 675 avec 2 signes alphabétiques, inutilisable en pratique.
Les men in black connaissent un extraterrestre qui a 36 doigts et compte avec 36 signes jusqu'à 36² - 1 avec 2 de ces signes, mais très lentement.


Qu'est-ce que ça dit un sysex ?

L'association internationale des constructeurs midi définit certaines structures de sysex comme notre demande d'identification F0 7E 7F 06 01 F7. On trouve dans les manuels des sysex qui gèrent les paramètres globaux, les configurations pour les contrôleurs, un son ou une banque de sons pour les instruments, la gestion unitaire de chaque paramètre.
Les constructeurs prévoient en principe les messages de requêtes (request en anglais), par exemple un sysex qui demande à un appareil de renvoyer un paramètre ou tous les paramètres ou une banque. A ces messages de requêtes reçus, un appareil midi renvoit un sysex de réponse (dump en anglais). On peut envoyer directement un message de sysex dump, sans avoir reçu de requête préalable, pour fixer une valeur de paramètre ou restaurer une banque de paramètres.

Un sysex peut parfois contenir des valeurs qui nécessitent un retraitement :
- certains paramètres nécessitent des valeurs supérieures à 7Fh ou 127d. Il faudra combiner plusieurs octets, en général un "ms" "most significant" ou le plus signifiant multiplié par 128  et additionné à un "ls" "less significant" ou le moins signifiant : par exemple, 01d (ms) x 128d + 60d (ls) = 178d (> 127d).
- certains octets peuvent contenir plusieurs valeurs ; par exemple, 75h est 01110101b en binaire, le premier 0 à gauche étant ignoré, on a sept valeurs 0 éteint/off ou 1 allumé/on pour des effets, un arpéggiateur, un glide, etc.
- des constructeurs peuvent organiser des paquets de valeurs convertis en une suite d'octets de sysex ; par exemple, 7 valeurs de 8 bits sont empaquetés ou rangés selon une disposition particulière dans 8 octets de 7 bits le premier bit à gauche étant toujours à zéro en midi.
Il faudra donc encoder/décoder les sysex pour retrouver les valeurs d'origine ; tests, concentration et cachets d'aspirine sont alors à prévoir.


Comment sont filtrés les sysex ?

Les sysex ne disposent pas de canal midi pour filtrer les messages.
Les en-têtes de sysex qui suivent F0 doivent en principe identifier l'appareil midi en rappelant des valeurs parmis celles renvoyées par la réponse F0 7E 7F 06 02 ... F7 à la requête F0 7E 7F 06 01 F7. Ainsi, les en-têtes garantissent qu'un sysex à destination d'un appareil n'ira pas perturber un autre appareil.

Tout sysex incomplet ou avec le mauvais en-tête ou contenant une valeur supérieure à 7F sera toujours ignoré.

Les constructeurs ajoutent souvent des contrôles supplémentaires :
- un ou plusieurs octets qui suivent un en-tête peuvent annoncer le nombre d'octets qui suivent, le sysex étant ignoré si le nombre annoncé ne correspond pas au décompte constaté en réception ;
- un "checksum" ou addition de contrôle, c'est à dire un octet placé à la fin, avant F7, fait la somme des valeurs d'octets qui précèdent en s'arrangeant pour rester inférieur à 7F ; le sysex est ignoré si le checksum annoncé dans le sysex envoyé n'est pas identique au checksum calculé par l'appareil qui reçoit le sysex ; parfois, le checksum est optionnel et peut être contourné par un octet général 7F.
- un octet d'ID ou numéro d'identification permet de distinguer les appareils d'un même modèle dans un réseau midi ;
comme pour le checksum, un ID égal à 7F est parfois accepté par tous les appareils, sans filtrer les messages ;
l'ID fait partie des informations renvoyées par la réponse F0 7E 7F 06 02 ... F7 à la requête F0 7E 7F 06 01 F7.

Les informations renvoyées par la requête F0 7E 7F 06 01 F7 ne sont pas normées et peuvent être difficiles à interpréter sans manuel.


Quelles sont les sources de sysex ?

- les manuels d'appareils midi ; les sysex sont souvent en fin de manuel ou dans un manuel à part.
- ce que votre appareil midi retransmet dans vos phases de tests, c'est à dire un "dump" après un "request" ;
- internet : de précieux renseignements sur les sysex ont été découverts par les internautes et ne figurent pas dans les manuels du constructeur.

De rares appareils ne bénéficient pas des sysex par choix du constructeur :
l'appareil midi ne répondra alors pas à la requête F0 7E 7F 06 01 F7 et aucune mention de sysex n'est faite dans les manuels.


Quels sont les outils pour communiquer en sysex ?

Vous aurez besoin au moins de l'un des outils suivants :
- un ou deux cables midi pour échanger des sysex entre appareils du même modèle.
- un cable usb pour échanger des sysex avec un ordinateur. Si votre appareil midi n'a pas de port usb, il faut le connecter par câbles midi à une interface midi qui elle disposera de l'usb/firewire/thunderbolt.
- quelques stan ou séquenceurs permettent d'enregistrer et renvoyer des sysex.
- midi-ox (Windows) ou snoize (Mac) sont des utilitaires qui gèrent les sysex.
- des applications comme Max for Live ou Synthmaker, désormais Flowstone en autonome ou inclus dans Imageline FL Studio.
- des librairies de développement d'applications informatiques comme jack ou winmm.dll.
- un gestionnaire de fichiers hexadécimal pour visualiser le contenu d'un fichier .syx ou .mid.
- un outil de conversions décimal/hexadécimal/binaire : une calculatrice scientifique ou un tableur.