MIDI To CV/Gate

Ce module est destiné à connecter un appareil MIDI (Synthétiseur, clavier maître, carte son ...) sur un synthétiseur analogique qui ne comporte pas d'entrée MIDI.

  Les synthétiseurs analogiques utilisent des tensions électriques pour commander leurs différents paramètres. Les oscillateurs par exemple, génèrent des notes dont la hauteur est fonction d'un tension présente à leur entrée. Ce module MIDI CV/Gate, permet de transformer les données numériques MIDI en tensions électriques utilisables par un synthétiseur analogique. Il peut fonctionner avec tous les modèles qui acceptent une tension de 1 Volt/octave tels que les Dotcom (Synthesizers.com), les MOSLAB, ou les Yusynth pour lesquels il a été conçu, mais également les EMS ou encore les Moog, à condition pour ces deux derniers de modifier le signal de Gate.

Ce module fournit 4 sorties analogiques (CV) ainsi que 5 sorties de Gate/Trigger

  Les Triggers et Gate peuvent servir à déclencher les générateurs d'enveloppes en fournissant une tension de +5V. Lorsque l'on enfonce une touche du clavier, le Trigger fournit une brève impulsion alors que le Gate maintient le +5V jusqu'au relâchement de la note.

 Ce module possède 3 modes, un mode monophonique, un mode polyphonique sur 1 canal MIDI et un mode polyphonique sur 4 canaux MIDI. 

Nouveau : version 2.3 (09/2010) (Cette version ne fonctionne qu'avec le firmware 2.3)

Cette nouvelle version apporte les améliorations suivantes :

- Le module peut désormais être alimenté avec une simple alimentation symétrique. Le +5 V n'est plus obligatoire.

- La sortie Trig/Gate délivre maintenant un signal de synchro MIDI 24. Indispensable pour synchroniser un séquenceur MIDI.

- Le module ne plante plus lorsque l'on change de mode alors que l'on est en train de jouer.

 

 

MODE POLYPHONIQUE

1 canal MIDI

 Dans ce mode il est possible de jouer jusqu'à 4 notes simultanément. La première est envoyée sur la sortie CV1, la deuxième sur le sortie CV2 etc ...Chaque sortie CV possède sa propre sortie Gate. La 5ème sortie Trig/Gate fournit un signal de type Trigger à chaque fois qu'un note est jouée. Enfin, la valeur de la molette de Pitch Wheel est ajoutée à chacune des 4 voies.

4 canaux MIDI

Chaque sortie est pilotée indépendamment par son propre canal MIDI. Les numéros de canaux doivent se suivre (par ex 3,4,5,6). Ce mode est très utile lorsque le module est piloté par un séquenceur

 

MODE MONOPHONIQUE

 Dans ce mode, seule la dernière note jouée est prise en compte. Sa valeur est envoyé simultanément sur les deux sorties CV1 et CV2, additionnée de la valeur de la molette de Pitch Wheel. La sortie CV3 fournit la tension de Vélocité et la sortie CV4 la tension de Modulation. Le signal de Gate est présent sur les 3 sorties Trig/Gate, Gate1/Gate et Gate2/Gate. Les deux dernières sorties Gate3/Trig et Gate4/Trig délivrent des signaux Trigger.

 

 

 

  La tension des sorties CV est de précisément 1 Volt/octave. Le module peut gérer 128 notes, soit plus que les grands claviers de 88 touches. L’accord est parfaitement rigoureux sur toute l’étendue des notes, l’erreur ne pouvant jamais dépasser 1/32ème de demi ton.

  L’accord est réalisé sur la gamme tempérée, mais en modifiant le firmware, il est possible d’utiliser d’autres gammes comme celle de Pythagore ou Zarlino, ou des gammes orientales telles que la Rast ou des gammes chinoises anciennes. Il est également possible de jouer des gammes micro tonales, jusqu’à un maximum de 202 notes par octave.

  Il est aussi possible de panacher les gammes suivant les octaves et même de définir une fréquence particulière pour chaque note.

Le Schéma

 Le schéma reprend simplement les datasheets des constructeurs. Comme il est de tradition, les données MIDI transitent par un optocoupleur et la conversion numérique/analogique est réalisée par des convertisseurs 12 bits MCP4822 de Microchip.

 



Version 2.3. Cliquez sur l'image pour ouvrir le fichier pdf.

 

Fonctionnement

 

  Les signaux MIDI parviennent sur la broche de réception Rx (RB2) de l’UART du PIC 16F88 ou 16F87. Ces deux micro contrôleurs sont identiques, le 88 contenant en plus un convertisseur Analogique/Numérique qui n'est pas utilisé ici. Ce PIC communique avec les convertisseurs MCP4822 par un bus SPI, qui est la simplicité même puisqu’il ne comprend que 2 fils, un pour l’horloge (SCK = RA4) et un pour les données (SDI = RA2). Il faut toutefois un fil supplémentaire pour la sélection des circuits. La broche RA3 est utilisée pour sélectionner le DAC 1 et la broche RA1 pour le DAC 2. Ces convertisseurs 12 bits, contiennent une référence de tension, ainsi qu’un amplificateur de sortie ce qui leur permet d’attaquer directement les amplis op. Un petit condensateur de 0.1 µF placé sur les sorties Vout filtre les éventuels résidus de l’horloge SPI.

  La tension de sortie maximale des convertisseurs est de 2,048 ou 4,096 V suivant la gain de l’ampli interne (Ce gain est réglé par logiciel). Il faut donc multiplier cette valeur par 2,604 à l'aide des amplis op CA3140 pour obtenir les 10 V nécessaire aux 10 octaves dont nous avons besoin. L’accord s’effectue par un trimmer vertical 25 tours qui permet un accord très précis, ainsi le La à 1760 Hz peut être facilement accordé au Hz près. Chaque circuit CA3140 possède son propre réglage d'offset. Ceci est très important surtout mode polyphonique, car les accords seront parfaitement justes quel que soit l'ordre dans lequel les notes ont été jouées.

Les signaux de Gate sont pris directement sur les broches du PIC avec des résistances de protection de 470 ohms. Une diode en série permet de réunir si besoin plusieurs de ces signaux en un seul directement à l'aide d'un câble en Y ou d'un module Multiple. Les LED sont alimentées par des transistors NPN de type BC547C ou équivalents. 

  Enfin, le connecteur 6 broches de l’alimentation est compatible avec les standards Yusynth et Dotcom.

 

Le PCB

Version Polyphonique (nouvelle version 2.3)

Il existe deux versions du PCB de ce module, l'une pour les modulaires type Dotcom/Yusynth avec un connecteur d'alimentation 6 broches et une au format Doepfer avec un connecteur double 2 x 8 ou 2x5. Ce module peut en effet être indifféremment alimenté en +/- 15 ou +/- 12 V

Cliquez ici pour télécharger la version Dotcom/Yusynth

Cliquez ici pour télécharger la version Doepfer

 Le PCB peut être facilement réalisé au fer à repasser (PnP Blue). Le texte  doit être vu à l’endroit quand on regarde le côté cuivre, par conséquent les dessins fournis peuvent être directement imprimés sur le PnP Blue.
Lors de l’implantation, il ne faudra pas oublier les straps et bien veiller à l'orientation des CI. Les CA3140 sont à l'envers des autres circuits. Les valeurs de composants ne sont pas critiques. Les résistances à 5 % type SFR conviennent. Notez seulement que les valeurs des couples de résistances qui fixent le gain des AOP (130 Kohms et 200 Kohms) ne doivent pas trop s'écarter des valeurs indiquées sinon l'accordage risque de ne pas être possible. Dans ce cas prenez plutôt une valeur plus faible pour la 130 K et plus forte pour la 200 K.

Les réglages

Commencez par annuler les offsets des AOP à l'aide des ajustables B. Pour cela connectez un multimètre sur une sortie CV et tourner l'ajustable correspondant de manière à vous rapprocher le plus possible de 0 mV. On doit facilement arriver à mieux de 0,1 mV.

Ensuite il faut accorder les 4 sorties. Connectez d'abord les sorties CV sur les entrées d'un VCO allumé avant d'effectuer ces réglages. Vous devez obtenir exactement 1 Volt par Octave.


Implantation des composants 

 

Suivez cette implantation si vous possédez une alimentation + 5 V

Suivez cette implantation si vous ne possédez pas d'alimentation + 5 V.

 

Suivez cette implantation si vous utilisez une alim type Doepfer

 

La capacité de 0,1 µF de découplage du PIC doit être soudée sur la face cuivrée du PCB. Pour cela, il sera peut-être plus facile d'utiliser un composant CMS.

Note importante : Ce module a été conçu pour fonctionner avec une tension symétrique de +/- 15 V comme sur les Dotcom ou Yusynth. Toutefois, il fonctionne parfaitement bien avec une alim de +/- 12V ou même +/- 9V (dans le cas la plage de sortie est réduite)

Face avant

 

 

Le Firmware

 

  Tel qu'il a été conçu, le module MIDI CV/Gate offre une très grand nombre de possibilités. Il suffit de modifier le firmware pour faire évoluer ce module, ou ajouter de nouvelles fonctions.

   Le but de ce programme est de récupérer les messages MIDI, puis de les analyser afin de ne conserver que les données utiles. Ces données sont ensuite envoyées aux convertisseurs numériques/analogiques qui les transforment en tensions électriques utilisables par les synthétiseurs.

 

Le protocole MIDI

Pour comprendre le fonctionnement de ce programme, il est nécessaire d'avoir quelques notions sur le protocole MIDI. Le Web regorge d’informations à ce sujet, aussi je voudrais juste ici donner le minimum nécessaire. Pour de plus amples informations sur le MIDI, vous pouvez consulter cet excellent site (en anglais).


  Parmi tous les messages MIDI, les seuls qui nous intéressent, c'est à dire ceux de Notes, de Vélocité, de Pitch Wheel et de Modulation sont composés d’une salve de 3 octets. Le premier d'entre eux détermine le type de message et les deux suivants contiennent les données. Ainsi, lorsque l’on appuie sur une touche du clavier, un message Note On est envoyé. Sous forme binaire, ce message s’écrit :
1001 cccc,  0nnn nnnn,  0vvv vvvv.


  Ce sont les quatre premiers bits (1001 ou 9 en décimal) qui indiquent qu’il s’agit d’un message Note On. Le demi-octet suivant cccc fournit le numéro du canal MIDI. Ce nombre étant codé sur 4 bits, il y a donc 16 possibilités, qui correspondent aux 16 canaux du protocole. Les deux octets suivants sont des octets de données et ils commencent toujours par un 0. Il n’y a donc que 7 bits utilisés ce qui donne 128 valeurs possibles. Le deuxième octet 0nnn nnnn contient le numéro de la note qui a été jouée, c'est à dire si c'est un Do, un Ré un Mi ...et le dernier octet 0vvv vvvv indique avec quelle vélocité la note a été jouée.

  Lorsque la touche du clavier est ensuite relevée, c’est cette fois un message Note Off qui est envoyé. Celui-ci possède la même structure et s’écrit :
1000 cccc  0nnn nnnn  0vvv vvvv.


  On voit que seul le premier demi-octet change, puisqu’il s’agit cette fois de 1000 au lieu de 1001 (respectivement 8 et 9 en décimal). Ce message Note Off de 4 bits est suivi comme précédemment du numéro de canal MIDI, du numéro de la note et de la vélocité. Si par exemple on joue un La sur le canal 1, la séquence d'octets (en hexadécimal cette fois !) envoyés sera la suivante:
(Note On) 90 2D 64, (Note Off) 80 2D 00. Ici, la valeur hexa 2D (45 en décimal) signifie que c’est la 45ème note qui a été jouée.


  Lorsque l’on tourne la molette de modulation, c’est le même type de message qui est envoyé. Cette fois ci la salve d’octet commence par 1011 cccc ce qui indique qu’il s’agit d’un message de type Control Change, suivi du numéro de canal MIDI. L’octet suivant désigne le type de contrôle utilisé. Ce peut être le panoramique, le volume etc... Dans notre cas, pour la modulation ce nombre est égal à 1. Le dernier octet enfin contient la valeur envoyée par ce contrôle, valeur codée sur 7 bits comme toujours.


La molette de Pitch suit les même règles, le premier demi octet s'écrivant cette fois 1110. Le codage s'effectue sur 7 ou 14 bits. Dans ce dernier cas le deuxième octet contient les 7 bits de poids faible et le troisième les 7 bits de poids fort. Le firmware n’utilise que le troisième octet. Un mouvement de la molette sur le canal 6 donnera un message tel que E5 00 45 par exemple.


  Après avoir vu ces quelques notions de base sur le MIDI, il faut savoir que malheureusement, dans la vraie vie, cela ne se passe pas du tout comme ça. En premier lieu, de très nombreux matériels MIDI n’envoient pas de messages de fin de note. Ils envoient à la place un message Note On dans lequel la vélocité est égale à 0. Pour reprendre notre exemple du La cité plus haut, les octets qui seront alors envoyés seront 90 2D 64, 90 2D 00. Le firmware doit donc être capable de traiter les deux types de messages.


  Ensuite et c’est plus vicieux, le premier octet qui détermine le type de message n’est souvent envoyé qu’une seule fois. En effet, la transmission MIDI à 31 250 bits/s est relativement lente et si l’on envoie des données pour plusieurs appareils sur le même câble, il y a un risque de saturation. Pour éviter cela et économiser la bande passante, le premier octet n’est envoyé qu’une fois et c’est au récepteur de remplacer lui-même l’octet manquant, c’est ce que l’on appelle le Running Status. Si l’on joue les notes La, Si, Do, avec une vélocité de 40h sur le canal 7 la suite d’octets en Running Status sera :
  96 2D 40, 2D 00, 2F 40, 2F 00, 30 40, 30 00. On voit qu'il n'y a que 13 octets envoyés au lieu de 16. L'octet définissant le type de message et le numéro ce canal MIDI (96h) n'a été envoyé qu'une seule fois. Le programme doit donc être capable de déterminer tout seul si l'émetteur utilise le Running Status ou non.

 

Le logiciel

  Ce programme a été écrit en C pour le compilateur HI TECH PICC STD. Il faut savoir que le langage C des PIC est tout sauf portable. Si vous désirez utiliser d’autres compilateurs c’est possible, mais il faudra réécrire toutes les instructions qui se référent aux éléments physiques du PIC, y compris la ligne de configuration des fusibles.


  Ce programme est une ébauche, écrite par un débutant. S'il est mis à la disposition de tous c’est justement dans le but d'être amélioré. Attention toutefois : je sais qu'il n’y a pas besoin d’avoir de grandes connaissances en langage C pour rendre un programme totalement illisible, aussi il est très important qu'il reste accessible aux débutants.


  A partir de là, il est possible d'ajouter de nouvelles fonctions. Je vais m’y atteler, mais ce serait bien qu’il y ait le plus de monde possible qui s’y mette. Par exemple, une fonction intéressante serait de pouvoir modifier le programme par Sysex. Cela permettrait à tous ceux qui n’ont pas de programmateur PIC de mettre à jour le programme au fur et à mesure des nouveautés.
 
  Il n’y a pas de limites ! Cela dit, pour des fonctions très différentes de la simple gestion MIDI CV (je pense à un séquenceur en particulier), il vaut mieux créer un nouveau module.

De très nombreux utilisateurs m'ont demandé comment faire pour utiliser une autre gamme avec ce module . Voilà la méthode :

Le DAC a une résolution de 12 bits, soit 4096 valeurs, mais les valeurs MIDI ne sont codées que sur 7 bits (0 – 128). C’est pour cela que l’on opère un shift (en fait une multiplication par 32) par la ligne Tx_DATA = Tx_DATA << 5;


Pour utiliser une gamme différente, il faut d’abord calculer la tension électrique voulue pour chacune des notes. Cela permet alors de calculer la valeur correspondante à envoyer au DAC sachant que l’octave (12 x 32 = 384) est égale à 1000 mV (il y a en sortie du DAC une amplification d’environ 2.6) .


Cela fait, il faut alors créer un tableau, qui à chaque valeur de note MIDI va faire correspondre la valeur à envoyer au DAC. Ces valeurs doivent être écrites en hexadécimal. En effet le processeur travaillant en 8 bits il faut découper ces valeurs en 2 tableaux, un de 8 bits et un de 4 bits.


Dans le programme on écrira donc :


const unsigned char MyScaleLo[128] = {lsb1, lsb2, …..} ;
const unsigned char MyScaleHi[128] = {msb1, msb2 …..} ;


Exemple :


On désire une tension de 1467 mV en sortie du module pour la valeur 1 en MIDI. Il faut donc envoyer au DAC la valeur :
1467 x 384 / 1000 soit 563 en décimal ou encore 0x233 en hexa. Le tableau s’écrit alors :


const unsigned char MyScaleLo[128] = {0x33, …..} ;
const unsigned char MyScaleHi[128] = {0x02, …..} ;

Ensuite, on remplace la ligne :
Tx_DATA = Tx_DATA << 5;


Par :
Lo_VAL = MyScaleLo[Tx_DATA];
Hi_VAL= MyScaleHi[Tx_DATA];
Tx_DATA = Lo_VAL +(Hi_VAL<<8);

Par cette méthode il est possible de jouer n'importe quelle gamme !

La nouvelle version 2.3 est disponible depuis septembre 2010. Elle ne peut être utilisée qu'avec le PCB 2.3. Elle permet d'éviter les plantages du module qui pouvaient arriver lorsque le Mode était changé pendant que des notes étaient jouées. La sortie Trig/Gate maintenant appelée MIDI Sync 24 est une sorti synchro de synchronisation qui répond aux signaux d'horloges MIDI (codes Clock F8 Start FA et Stop FC)

Cliquez ici pour télécharger le fichier exécutable hex ACS_MIDI v2.31.hex
Cliquez ici pour télécharger le code source en C ACS_MIDI v2.31.c

Liste des composants 

Composants  : Quantité

Actifs :

6N137 : 1
PIC 16F88 ou 16F87 (boîtier DIP 18 pin) : 1
MCP 4822 Microchip : 2
CA3140 : 4
1N4148 : 6
BC547C : 4
78L05 : 1 (seulement dans la version sans alimentation 5 V fournie)
LED Jaune : 4
LED Verte : 1

Resistances

10 : 3
220 : 5
470 : 6
1k : 5
4,7k : 8
10k : 2
33k : 4
130k : 4
200k :4
Ajustables 10 Kohms 25 tours : 4
Ajustables 22 Kohms 25 tours : 4

Condensateurs

0,1 µF : 12
22µF : 4

Divers

Self de choc type VK 200 : 1 (voir implatation)
Inverseur 3 positions on-off-on 1
Jacks femelles châssis 6.35 mm : 9
Connecteur DIN femelle 5 Broches châssis 180° : 1