Une interface à encodeurs pour SIDASTER
Ce petit projet est basé sur un excellent shield appelé SIDASTER.
Plutot qu'un long et ennuyeux baratin, je vous invite à aller visiter le lien suivant qui vous donnera tous les détails sur ce shield.
www.banson.fr
Le shield en question...
Ce shield permet de programmer facilement et en midi le chipset son MOS6581 de chez Commodore. L'avantage de ce shield est que tout est intégré : le pilotage du SID, l'interface MIDI avec optocoupleur, la sortie audio bufferisée, bref c'est complet et extrêmement bien conçu, il se construit sous forme de kit et moyennant quelques euros de composants il est très simple à monter.
Il faudra tout de même ajouter un chip SID, mais on en trouve encore sur le Net
Une fois ce shield assemblé, vous le pluggez sur un arduino, vous uploadez le code et vous disposez d'un veritable synthetiseur midi doté de fonction plutôt avancée pour l'époque où ce chip a été conçu.
- 3 oscillateurs avec choix de formes d'ondes pour chacun
- 3 types de filtres (BP, HP, LP) avec frequence et resonance réglables
- une enveloppe par oscillateur
- plus quelques goodies (PWM sur le square, ring-modulation et bien d'autres choses
A l'origine, le chip était monté dans les commodores 64 et 128 notamment.
Il était connecté sur le bus d'adresse du commodore. L'idée du shield est de pouvoir faire la même chose et de convertir des messages MIDI en messages compréhensibles par le SID.
Chaque fonction du SID est associée à un registre 8 bits. Pour les données nécessitant 16 bits, on utilisera 2 registres. Le principe de mise en oeuvre, peut se résumer à ceci.
1) Envoi d'une commande pour sélectionner le registre
2) Ecriture des données dans ce registre
3) Validation de l'écriture pour la prise en compte des données par le SID
C'est simple à voir comme ca, mais c'est un peu plus complexe à réaliser. Pour le détail, je vous renvoie sur l'excellent site de Vince.
www.banson.fr
Ce shield est prêt à l'emploi et fonctionne du premier coup avec le code de Vince, c'est un vrai régal. On est immédiatement replongé dans les sons des ordis des années 80, un vrai bonheur. Je vous invite aussi à visiter le reste de son site qui réserve plein de bonnes surprises, notamment un petit synthé en cours de développement.. Je ne vous en dis pas plus...
L'interface à encodeurs
Mon interface n'a rien de révolutionnaire, elle permet juste d'avoir quelques commandes directes sous la main sans passer par le midi.
Voici le cahier des charges
- affichage des données sur écran LCD
- edition des données via des encodeurs rotatifs munis de poussoirs
- sauvegarde/ rechargement des presets
- Une sortie midi THRU.
Voici le schéma de principe de ce que j'ai mis en oeuvre. Attention, ce schéma tient compte des fonctionnalités déja implémentées dans le shield de Vince, vous devrez bien sur acquérir ce shield avant de construire l'interface...
Ce schéma est plutot simple. On a 4 encodeurs rotatifs. Ceux-ci sont lu via une interruption générée par un timer toute les 2ms. L'ensemble des interrupteurs met à la masse une portion d'une chaine de résistances, ce qui permet d'avoir une tension variable que nous allons mesurer sur une entrée analogique afin de définir quel bouton a été appuyé.
L'écran LCD est un modèle 4x20 caractère branché sur le bus I2C. L'eeprom fait 256Kbits (ou 32Ko...), elle permet de sauver et recharger les presets, elle fonctionne sur le même bus que le LCD. L'ensemble des données éditables est sauvegardée dans chaque preset, ainsi que son nom
(éditable lui aussi). Il faut formater l'EEPROM avant utilisation, un petit programme s'en charge.
Pour la sortie MIDI-TRHU, je me contente d'envoyer le signal reçu sur la pin D0, de l'envoyer dans 2 inverseurs et de cabler une prise din, le signal MIDI-IN est ainsi dupliqué.
Rien de spécial à ajouter si ce n'est la présence des résistances de pull-up à installer sur les lignes SDA, SCL. Ce n'est pas forcément obligatoire mais c'est fortement conseillé dans les datasheets.
Comme j'avais la flemme de faire un circuit imprimé, j'ai acheté un protoshield (chinois....) et j'ai cablé directement dessus mes composants : l'EEPROM et l'hex-inverter.
Vous devinerez facilement que ce protoshield sera empilé sur celui de Vince :D
Petite modification (pas obligatoire cela dit) par rapport au montage initial de Vince. A la base, le SID a besoin de 12V et 5V pour fonctionner. L'arduino se contente de 5V. L'entrée Vin de l'arduino et l'entrée 12V du shield sont en parallèle, ce qui permet de n'avoir qu'une seule alimentation globale de 12V, le régulateur de l'arduino fait ensuite son travail pour générer du 5V à partir du 12V, la sortie 5V de l'arduino permet d'alimenter tous les composants qui ont besoin de cette tension (dont le SID). L'ennui, c'est que mon montage ajoute une EEPROM, un hex-inverter et un LCD, sans compter le fait que le SID se sert lui aussi généreusement sur le 5V régulé, ce qui ajoute un peu de consommation et le régulateur de l'arduino souffre un peu pour alimenter tout ca. Honnêtement, je pense que le régulateur ne craint rien mais il chauffe vraiment beaucoup. J'ai décidé de séparer l'alimentation 12V du SID-Aster, de celle de l'arduino. Pour assurer tout de même une bonne régulation 5V, j'alimente l'entrée Vin de l'arduino en 9V seulement (3V de moins à faire chuter, ce déja ca de gagné).
Il suffit de couper la liaison entre l'entrée Vin et la patte correspondante sur le shield SID-Aster. Vous tirerez ensuite 2 fil dédiés vers les 2 alimentations.
Au final, j'ai mis le tout dans une boite qui trainait dans l'atelier. J'ai peint le dessus en plexiglas avec de la bombe noir mat
Photos des menus
L'utilisation est assez simple. Le bouton de l'encodeur 1 permet de séquencer les menus concernant la forme d'onde de l'oscillateur 1, l'enveloppe, le tuning, etc. Même chose pour l'encodeur 2 qui édite les fonctions de l'oscillateur 2 et l'encodeur 3 pour l'oscillateur 3. L'interrupteur de l'encodeur 4 permet d'éditer les fonctions communes comme le filtre, le routage audio et le volume global.
L'interrupteur séparé permet de basculer entre le mode édition et le mode sauvegarde/chargement des presets.
Pour résumer, on choisi les données à éditer avec les différents interrupteurs et on édite les données en manoeuvrant les encodeurs. C'est tout...
Voici maintenant quelques photos de menus.
Choix forme d'onde oscillateur, avec réglage de PWM si forme d'onde carrée. Synchro des oscillateurs et modulateur en anneau (RING)
Enveloppe (Attaque, Decay, Sustain, Release)
Tuning grossier et fin de l'oscillateur
Ces trois menus existent bien sur pour les 2 autres oscillateurs et sont accessibles via les interrupteurs des encodeurs 2 et 3
Viennent ensuite les réglages communs à tous les oscillateurs.
Edition du filtre : frequence de coupure et résonnance.
Mode du filtre HP, LP et BP, niveau de sortie global
Routage des 3 voies vers le filtre (oui ou non), entrée externe (si vous l'avez cablée...)
Chargement d'un preset
Enfin, initialisation de l'EEPROM avec le petit programme séparé.
Je n'ai pas pris des photos du reste (vérification eeprom, sauvegarde presets, edition du nom de preset....)
Les programmes
Je viens de me mettre à l'arduino, soyez indulgent avec la programmation qui n'est pas un modèle du genre.
Notamment pour l'affichage qui est un peu une usine à gaz. Il faudrait d'ailleurs que je trouve un moyen de faire un jour une fonction d'affichage en tache de fond afin d'allèger le processeur. Le Bus I2C est pratique puisque qu'il n'utilise que 2 fils, par contre, il est pas vraiment rapide. Dans le cadre de mon utilisation, je n'avais pas trop le choix, le port série était réservé au midi, et je n'avais pas assez de PIN (minimum 6 pour un fonctionnement de LCD en 4 bits), donc l'I2C était bien pratique.
Maintenant qu'on en parle, c'est vrai qu'il est vraiment crade ce code. Je pense que bientot je vais en réécrire une partie. Notamment, je vais utiliser un système de flags comme sur mon montage de séquenceur pour gèrer les rafraichissements de données à l'écran, ne pas gérer l'affichage dans les parties autre que la partie principale des gestions des menus (par exemple, SURTOUT PAS dans les routines midi...) et je vais mettre en place les interruptions sur le midi, ca sera plus performant que les lectures de dingue sous forme de MIDI.read() un peu partout dans le code (Autre bonne raison de ne plus afficher les données dans le code midi puisque je ne pourrai plus le faire à cause justement des interruptions, en effet, le bus I2C, du moins la librairie LiquidCrystal_I2C, n'est pas utilisable au sein d'une interruption, donc c'est réglé).
L'archive suivante contient le code à charger dans l'arduino.
Cette archive contient 3 dossiers :
- SIDmemwrite : programme pour formater l'EEPROM
- SIDmemread : programme pour lire l'EEPROM et vérifier eventuellement que ca fonctionne bien. Pas très utile à mon humble avis....
- SIDasterIII : programme principal. Ce programme nécessitera bien sur la librairie du SIDaster que vous trouverez sur le site de Vince.
Archive des programmes
Pour le fonctionnement du shield et sa construction, je vous rapelle le lien sur le site de Vince.
www.banson.fr
Petit goodies mais vraiment mals programmés j'ai rajouté des fonctions de LFO (sur le pitch, le filtre et la PWM) mais j'ai tellement honte que je n'ai pas envie d'en parler, enfin grosso modo ca fonctionne mais il faudra refaire tout ca proprement. Un jour peut être. D'ailleurs, pour dire vrai, il faudrait que je réécrive tout le programme proprement mais c'est une autre histoire :)