Convertisseur midi vers CV/Gate pour x0xheart








Le concept



Inutile de dire que possèder une TB-303 n'est pas donné à tout le monde, compte tenu notamment de son prix sur le marché de l'occasion...

En surfant sur le net, je suis tombé sur un circuit appelé x0xheart. Ce circuit est une copie de tb303, entièrement monté sur circuit imprimé. On peut se procurer ce circuit pour 80$ environ plus les frais de port.

x0xheartPCB.png


Il suffit de rajouter 8 potentiomètres, quelques interrupteurs et si vous possédez un convertisseur CV/Gate, ce module est directement utilisable.

Voici le lien où vous le procurer :

http://www.openmusiclabs.com/projects/x0x-heart/


Le circuit est sufisamment compact pour être logé dans un petit boitier. Il possède même un connecteur au format Eurorack, qui permet de l'installer dans un module intégrable à un modulaire au format eurorack (Modulaire Doepfer par exemple).

J'ai tout installé dans un petit boitier métallique pour avoir un petit synthé autonome utilisable en midi.

Voici les travaux à effectuer :

Je ne prévois pas de LCD, la sérigraphie est suffisamment parlante.



Le schéma



Voici le schéma du circuit et des différents composants annexes (switches, entrée midi, alimentation).







Le convertisseur



La carte x0xheart attend un signal de type CV/gate au standard Volt/Octave. Je vais utiliser un DAC 12 bits de type MCP4921. Ce DAC se programme en SPI et permet d'obtenir en sortie une tension de 0 à 5V, avec 4096 subdivisions (12bits).



Voici la description des regsitres du DAC. Les bits 15 à 12 concernent le paramètrages du DAC, les bits 11 à 0 sont ceux du convertisseur proprement dit.



Sans entrer trop dans les détails, je dois obtenir une tension correcte à la sortie en fonction de la note demandée. Je dispose du numero de note midi, c'est tout. En recherchant sur le net, j'ai trouvé un tableau de correspondance entre numéro de note midi et fréquence, et j'ai trouvé un autre tableau qui faisait la correspondance entre tension et fréquence pour le standard Volt/Octave. En croisant les tableaux et en faisant quelques calculs, j'ai établi un tableau final permettant de faire la correspondance entre note midi et valeur à programmer dans le DAC pour avoir la tension désirée.

Il suffit ensuite quand une note se présente sur l'entrée midi, le lire sa valeur en midi, de pointer sur l'index correspondant de mon tableau afin de récupèrer la valeur à programmer dans le DAC et d'envoyer cette donnée en SPI sur le DAC.

Avantage de ce système, vous pouvez modifier le tableau pour le transformer en Hertz/Volt ou bien tout autre standard puisque chaque note à sa valeur pour le DAC. Ce système est déja utilisé dans mes autres montages et cela donne toute satisfaction. Evidemment, les puristes me diront qu'un convertisseur de 16 bits serait meilleur et ils auraient raison, mais je veux faire simple et pas cher.



L'entrée MIDI



La aussi c'est très simple. Je prend un optocoupleur 6N138. La prise midi est reliée sur les broches 2 et 3 de cet optocoupleur via une résistance de 220 ohms. On récupère les données sur la pin 6 branchée à une résistance de pull-up de 270 ohms. L'alimentation en 5V se fait sur la pin 8 de ce chip, la pin 5 étant à la masse.

Il suffit ensuite de relier la pin 6 du 6N138 sur l'entrée série de l'arduino (pin D0).

L'arduino se sert des mêmes composants interne pour l'entrée série et sa "propre" programmation. Il faut donc pouvoir isoler l'entrée midi quand on programme l'arduino via le port USB. Pour cela on insère sur le trajet un bête interrupteur pour isoler l'entrée midi.



La prise midi sur un des cotés du boitier.



Pour l'instant, j'utilise la librairie MIDI disponible pour l'arduino mais je compte refaire cette partie de code par interruption, cela donnera un code plus propre et offrira plus de possibilités. Cela permettra aussi de réduire la latence.



La gestion des paramètres



Comme d'habitude du simple. J'ai 6 switches et plusieurs possibilités de branchement :

1) utiliser 6 entrées sur l'arduino
2) utiliser un multiplexeur pour limiter le nombre de broches mais si je limite les entrées, je dois commander le multipleur en 3 bits, donc je ne gagne pas grand chose.
3) faire un clavier matriciel mais la aussi cela prend pas mal d'entrées
4) utiliser une seule entrée analogique et commander cette entrée en tension via les switches

C'est la dernière solution que je vais utiliser. Je relie toutes les pins 1 des switches à la masse et les pins 2 sont branchées à différents endroits d'un pont de résistances alimentées au bout par 5V. En appuyant sur les boutons je mets plus ou moins à la masse ce réseau de résistance et je mesure la tension au niveau de la premiere résistance. Cela me donne 5V si aucun switch n'est appuyé et différentes tensions suivant le switch qui est manoeuvré.

En lisant la pin A0 de l'arduino en analogique, je mesure des tensions variables suivant le bouton qui est appuyé. Une liste de tests successifs permet de connaitre le numero du bouton qui est pressé. C'est simple et ca ne prend qu'une seule entrée analogique sur l'arduino. On ne peut évidemment pas multiplier à l'infini ce nombre de switches car la precission du CAN est limitée mais jusqu'a 8 boutons cela reste correct.

Il faut évidemment une tension d'alimentation stable, puisque les valeurs à comparer seront déclarées dans le programme. Si la tension de référence varie, les tensions mesurées aussi. Le montage est calculé pour 5V. On peut se servir des 5V régulés fournis par l'Arduino.



Donc les switches ne commandent pas directement les fonctions de la carte x0xheart, c'est l'arduino qui s'en charge. Pourquoi me direz vous ? parce que cela me permet de faire des toggles genre on/off avec de simple boutons poussoir, de commander des leds, mais surtout, cela me permet de commander aussi ces toggles en midi. Ce qui veut dire que je peux changer par exemple la forme d'onde des oscillateurs en appuyant sur le premier switch, mais aussi en positionnant une valeur sur le control-change 110 par exemple.



Les pins de commandes servent aussi à alimenter les leds. Installez si possible des leds basses consommation pour ne pas écrouler les sorties de l'Arduino. De plus, ces leds reflètent le niveau logique des sorties. Certaines logiques sont inversées dans le x0xheart, donc une led allumée peut reflèter une fonction qui est arrêtée.




Les potentiomètres



Rien à dire de particulier. J'ai monté les potentiomètre sur la facade et je les ai reliés au circuit x0xheart comme spécifié sur la documentation du produit.

Seul goodie, le potentiomètre de résonnance. On peut soit en mettre un double, soit 2 simples. J'en ai mis 2 simple, cela permet d'avoir une résonnance séparée pour l'accent. C'est très bien expliqué dans la documentation.

.



J'ai utilisé quelques fils de cuivres rigides qui sont soudés sur le corps des potentiomètres afin de construire une fixation sommaire pour le circuit x0xheart. ce n'est pas très joli mais c'est rapide à monter. De votre coté, faites un montage avec des entretoises ca sera quand même plus propre que ce que j'ai fait...






Le montage



J'ai utilisé un shield vierge pour installer mes composants qui sont en nombre assez réduit, quelques résistances, une diode et 2 circuit intégrés.

Voici le protoshield de base que j'ai utilisé. Vous pouvez en trouver des moins cher sur le net, non "estampillé" arduino et fabriqué en chine ca ira très bien aussi.

shield1.jpg


Je vous conseille aussi d'aller jeter un oeil sur le net concernant les clones d'arduino nano mini. Ces circuits sont équivalents à l'arduino Uno, et disposent même de 2 entrées analogiques supplémentaires. Les pins sont à l'écartement 2.54mm, on peut insèrer ce genre de carte directement dans un bread-board et on trouve ces clones pour 4 ou 5 euros. Je vous ai rien dit....


Et voici comment peupler les composants (enfin si on peut dire, vu qu'il y a trois fois rien...)

shield2.gif


Voici ce que ca donne avec le shield installé sur l'arduino.



En bas le 6N138 pour l'entrée midi, au dessus le MCP4921.



Je pars d'un bloc d'alimentation qui me donne du 9V alternatif que je redresse avec un pont et un condensateur de filtrage (en bas sur la photo).



Le tout part alimenter ensuite directement l'arduino Uno sur l'entrée Gnd et Vin. L'arduino se charge de stabiliser et réguler cette tension en 5V. J'utilise cette tension de 5V pour alimenter le 6N138 et MCP4921, mais aussi le circuit x0xheart.

Attention : si vous alimentez le circuit x0xheart séparemment, ne dépassez surtout pas la tension de 5V sans quoi ce circuit serait irrémédiablement détruit.



Le montage x0xheart ne consomme presque rien, il peut donc etre alimenté par l'arduino. Premier avantage, c'est simple à concevoir. Deuxième avantage, l'utilisation des 5V de l'arduino permet de mettre tout le monde d'accord car il n'y a qu'une seule référence pour l'ensemble du montage.

Je ne pretends pas que ca soit nécessaire, mais j'ai mis des leds sur les sorties de commandes du circuit afin de voir sur la facade l'état des différents paramètres. J'ai aussi ajouté une mise forcée à l'état bas via des résistances de 470K quand les sorties de l'arduino sont au niveau 0 car bien souvent elles sortent une tension de 0,5V environ et cela peut être suffisant pour déclencher certains circuits (c'est le cas sur certains étages du x0xheart), avec cette résistance j'ai vraiment 0V quand la sortie est à 0.

Voici la liste des pins de l'arduino, avec leurs fonctions, le mode (entrée ou sortie) et ce sur quoi elles sont connectées sur la x0xheart. La partie DAC est à part puisqu'elle a sa propre sortie sur le chip MCP4921.

wiring.gif


De gauche à droite, l'USB pour la programmation, l'interrupteur pour isoler l'entrée midi afin de pouvoir programmer l'arduino via USB et enfin, à l'extrême droite le connecteur d'alimentation.



Sur le coté opposé la sortie audio.



Enfin le boitier final.





Evolutions possibles



Mon montage est réduit à sa plus simple expression compte tenu du fait que ne sont accessibles que le midi in et la sortie out. Mais il existe d'autres options non cablée.




Implémentation midi



Outre les classiques messages note on et note off pour déclencher et arrêter le jeu, vous disposez de 6 control-changes pour gèrer les paramètres du x0xheart.



Petite nouveauté depuis la création de l'article, on peut désormais gèrer le canal midi de réception (canal 1 à 6 seulement...) Appareil éteint, on appuie sur un des 6 boutons pour choisir son canal midi, on reste appuyé pendant qu'on branche le x0xheart. A l'allumage il y a une vérification de ces boutons et si un est appuyé cela permet la sélection du canal midi. Donc, 6 boutons et de gauche à droite sélection du canal 1 à 6.



Code source



J'ai modifié le code source pour être compatible avec les nouveaux environnement arduino. Actuellement, le code fonctionne pour arduino 1.8.11 dans mon cas, mais cela devrait tourner avec les anciens environnement aussi. La librairie midi utilisée ici est celle de Francois Best, en version 5.0.2

Cliquez sur le lien ci-dessous pour récupèrer l'archive du code source.

Code source duino303


Cliquez sur le lien ci-dessous pour récupérer l'archive contenant la sérigraphie de la facade.

facade.png