Implémentation MIDI
I Exemples de messages MIDI
<Exemple1> 92 3E 5F
9n correspond au statut de Note On, et n au n° de canal MIDI. Comme 2H = 2,
3EH = 62 et 5FH = 95, il s'agit d'un message de Note On sur le canal MIDI 3, note
n° 62 (nom de la note : D4) de vélocité 95.
<Exemple2> C9 20
CnH correspond au statut de Program Change, et n au n° de canal MIDI. Comme
9H = 9 et 20H = 32, il s'agit d'un message de Program Change sur le canal MIDI
n° 10, programme n° 33 (kit de batterie n° 33).
<Exemple3> E3 00 28
EnH correspond au statut du paramètre Pitch Bend Change, et n au n° de canal
MIDI. Le 2ème octet (00H=0) est le LSB et le 3ème octet (28H=40) est le MSB, mais
la valeur de Pitch Bend est un numéro à signe où 40 00H ( = 64 x 128 + 0 = 8192) est
égal à 0. La valeur du Pitch Bend est donc :
28 00H - 40 00H = 40 x 128 + 0 - (64 x 128 + 0) = 5120 - 8192 = -3072
<Exemple4> B3 64 00 65 00 06 0C 26 00 64 7F 65 7F
BnH correspond au statut de Control Change, et n au n° de canal MIDI. Pour les
messages de Control Change, le 2ème octet correspond au numéro de contrôleur, et
le 3ème octet à sa valeur. Si deux ou plusieurs messages consécutifs ont le même
statut, le MIDI dispose d'une fonction intitulée "running status" qui permet de ne
pas répéter l'octet de statut du deuxième message et des suivants. Les messages ci-
dessus ont donc le sens suivant :
B3 64 00
canal MIDI 4, octet inférieur du n° de RPN :
(B3) 65 00
(canal MIDI 4) octet supérieur du n° de RPN :
(B3) 06 0C
(canal MIDI 4) octet supérieur de la valeur du RPN :
(B3) 26 00
(canal MIDI 4) octet inférieur de la valeur du RPN :
(B3) 64 7F
(canal MIDI 4) octet inférieur du n° de RPN :
(B3) 65 7F
(canal MIDI 4) octet supérieur du n° de RPN :
Autrement dit, les messages ci-dessus indiquent qu'une valeur 0C 00H a été
transmise pour le RPN n° 00 00H sur le canal MIDI n° 4, puis que le paramètre RPN
n° 7F 7FH a été sélectionné.
Le RPN n° 00 00H sélectionne la sensibilité du Pitch Bend, et la valeur du MSB fixe
le nombre de demi-tons souhaité. Une valeur de 0CH = 12 règle donc le Pitch Bend
sur sa plage d'action maximale de +- 12 demi-tons (1 octave). Sur les modules de
sons GS, le LSB du paramètre de réglage de la sensibilité du Pitch Bend est ignoré,
mais il est quand même nécessaire de le transmettre (avec la valeur 0) afin que
l'opération se déroule correctement.
Une fois que vous avez sélectionné le numéro de RPN ou NRPN souhaité, tous les
messages de Data Entry transmis sur le canal correspondant sont pris en compte.
Par conséquent, pensez toujours à sélectionner le paramètre sur 7F 7FH une fois
que vous avez transmis la valeur souhaitée afin d'éviter toute mauvaise surprise.
C'est la raison pour laquelle on trouve le (B3) 64 7F (B3) 65 7F à la fin.
Il est préférable de ne pas trop charger vos séquences (fichier MIDI standard, par
exemple) d'événements faisant appel à la fonction Running Status (voir
<Exemple 4>). En effet, si la lecture est interrompue en cours de morceau, puis
ramenée vers le début ou avancée, le séquenceur risque de ne pas pouvoir
transmettre le bon statut, et le module de sons risque de ne pas interpréter
correctement les données. Essayez, dans la mesure du possible, de donner à chaque
événement son propre statut.
Il faut aussi que le choix du n° de RPN ou NRPN et le réglage de sa valeur soient
faits dans le bon ordre. Sur certains séquenceurs, les événements reçus sur le même
tic d'horloge (ou sur deux tics consécutifs) risquent de ne pas être transmis dans le
bon ordre. Pour cette raison, il est préférable de décaler légèrement chaque
événement (d'environ 1 tic pour une résolution de 96 à la noire, et d'environ 5 tics
pour une résolution de 480 à la noire).
* TPQN : nombre de tics à la noire
146
G Exemple de message de System Exclusive
et de calcul de la Checksum
Les messages exclusifs Roland (RQ1, DT1) sont terminés par une Checksum (avant
F7) garantissant la bonne réception des messages. La valeur de cette Checksum est
définie par l'adresse et les données (ou la taille) du message exclusif transmis.
❍ Calcul de la Checksum
(Les valeurs hexadécimales sont signalées par un "H")
La Checksum est une valeur obtenue par l'addition de l'adresse, de la taille et de la
Checksum elle-même et en inversant les 7 bits de l'octet inférieur LSB.
Voici un exemple de calcul de la Checksum. Nous partons du principe que le
message exclusif transmis comporte l'adresse bb cc ddH et les données ou la taille
ee ff gg hhH.
aa + bb + cc + dd + ee + ff + gg + hh = total
sum / 128 = quotient ... reste
128 - reste = Checksum
(Par contre, la Checksum est égale à 0 si le reste est égal à 0).
<Exemple1> Réglage du panoramique de la caisse claire
(Trigger 2) du kit de batterie n° 1 sur "ALTERNATE".
D'après le "Tableau des adresses des paramètres", l'adresse du kit de batterie n° 1
est 01 00 00 00H, l'adresse d'Offset du paramètre de Pad de l'entrée Trigger 2 est 03
00H celle du paramètre de panoramique est 26H. Par conséquent,
01 00 00 00
03 00
00H
+)
26
01 00 03 26
00H
et "ALTERNATE" est une valeur de 20H,
0CH
00H
F0
41
10
00 3F 12
7FH
(1)
(2)
(3)
(4)
7FH
(1) Statut du message exclusif, (2) n° ID (Roland), (3) n° ID d'appareil (17)
(4) n° ID du modèle (TD-6), (5) n° ID de la commande (DT1), (6) EOX (fin du
message exclusif)
Calculons à présent la Checksum :
01H + 00H + 03H + 26H + 20H = 1 + 0 + 3 + 38 + 32 = 74 (total)
74 (sum)/ 128 = 0 (quotient) ... 74 (reste)
Checksum = 128 - 74 (reste) = 54 = 36H
Il faut donc transmettre le message F0 41 10 00 3F 12 01 00 03 26 20 36 F7.
<Exemple2> Requête de transmission du réglage de volume
global du kit de batterie n° 1
D'après le "Tableau des adresses des paramètres", l'adresse du kit de batterie n° 1
est 01 00 00 00H, l'adresse d'Offset du paramètre commun du kit de batterie est 00
00H et celle du paramètre de volume global est 15H. Par conséquent,
01 00 00 00
00 00
+)
15
01 00 00 15
Comme la taille = 00 00 00 01H,
F0
41
10
00 3F
(1)
(2)
(3)
(4)
(1) Statut du message exclusif, (2) n° ID (Roland), (3) n° ID d'appareil (17)
(4) n° ID du modèle (TD-6), (5) n° ID de la commande (RQ1), (6) EOX (fin du
message exclusif)
Calculons à présent la Checksum :
01H + 00H + 00H + 15H + 00H + 00H +00H + 01H = 1 + 0 + 0 + 21 + 0 + 0 + 0 + 1 =
23 (total)
23 (total) / 128 = 0 (quotient) ... 23 (reste)
Checksum = 128 - 23 (reste) = 105 = 69H
Il faut donc transmettre le message F0 41 10 00 3F 11 01 00 00 15 00 00 00 01 69 F7.
01 00 03 26
20
??
(5)
adresse
données checksum (6)
11
01 00 00 15
00 00 00 01
(5)
adresse
taille
F7
??
F7
Checksum (6)