[Conseil] Controleur MIDI de synthétiseur modulaire

Bonjour à toutes et à tous !

I - PROJET
Mon projet est de créer un contrôleur MIDI de synthétiseur modulaire, afin d'avoir à disposition des contrôles physiques de synthétiseur modulaire, mais dont la partie audio est virtualisée par l'ordinateur. Si vous ne savez pas ce qu'est un synthétiseur modulaire ou un contrôleur MIDI, plus de détails dans la partie suivante. Sinon, vous pouvez passer directement à la partie III.

II - SYNTHETISEUR MODULAIRE, CONTRÔLEUR MIDI

1) Le synthétiseur modulaire
La plupart des synthétiseurs qu'utilisent les musiciens sont développés par une société, qui désigne le produit, assemble touts les éléments dans une boîte, et le consommateur n'a qu'à utiliser le produit.
Mais il est possible de créer soi-même son propre synthétiseur en achetant tous les composants et en le désignant de A à Z. Cela prendrait des années à l'échelle d'une personne.
Il est possible de faire un intermédiaire ; acheter un rack (conteneur) dans lequel on va insérer des modules, qui sont des « briques élémentaire » du synthétiseur (filtre, VCO, VCA, Reverbe, générateur d'enveloppe, etc).
Une fois ces éléments installés, on peut les connecter dans l'ordre que l'on veut grâce à des « câbles de patch » qui relient un module à un autre. Il devient donc facile de créer un synthétiseur sur-mesure, qui en plus est modifiable facilement (en débranchant/rebranchant des câbles), que l'on peut améliorer et modifier à l'envie en achetant/revendant des modules.
C'est absolument génial, sauf pour un détail : c'est CHER. Vraiment. Chaque module se compte en général en centaine(s) d'euro, et ça devient rapidement un gouffre à argent. Un simple synthétiseur avec quelques modules peut déjà chiffrer au dessus de 1000€.

2) Les contrôleurs et claviers MIDI
Depuis longtemps, les musiciens utilisent des contrôleurs MIDI. Ce sont des boîtes qui permettent de contrôler un synthétiseur ou un logiciel. Par exemple, on peut utiliser un contrôleur MIDI avec des potentiomètres rotatifs ; ceux-ci peuvent contrôler les volumes des pistes dans un séquenceur audio (ou d'autres paramètres, on peut « assigner » ces contrôles librement).
Un des avantages est que l'on peut acheter un clavier MIDI, qui ne génère pas de son ; c'est juste un clavier qui envoie des informations (par exemple : « note Sol3 enclenchée pas trop fort ») à l'ordinateur.
Ainsi, l'ordinateur transforme cette information en son. On peut choisir un son de piano, mais aussi un son d'orchestre à cordes, de flûte etc... C'est l'ordinateur qui s'occupe de transformer l'information MIDI provenant du contrôleur en information sonore.
Cela permet de réduire drastiquement les coûts, car on déplace toute la partie génération du son du hardware au software : la partie hardware doit seulement récupérer une information (note du clavier enclenchée par exemple), et c'est la partie software qui génère le son, ce qui apporte de nombreux avantages, notamment au niveau du prix car il y a beaucoup moins de contraintes.

III – LE CONTROLEUR DE SYNTHETISEUR MODULAIRE

Mon but est simple ; je veux créer un outil qui physiquement soit similaire dans l'utilisation à un synthétiseur modulaire (modules interchangeables, câbles de patch pour interconnecter les modules), mais pour beaucoup moins cher.
Une solution est d'avoir un contrôleur MIDI qui ne récupère que des informations simples, du type « potentiomètre réglé à 78% » ou « prise 23 connectée à prise 48 », puis que ce soit l'ordinateur qui émule un synthétiseur modulaire, en fonction de l'état du contrôleur. La partie hardware se résume donc à des potentiomètres, boutons, connectiques branchées ou non, et de l'électronique permettant l'acquisition.

J'ai donc décidé de développer moi même ce produit, et commencé à designer certaines choses. Beaucoup de choses peuvent être améliorables, j'en suis vraiment au début du développement.
Avant même d'acheter des composants pour prototyper, je souhaiterais avoir des avis extérieurs, qui pourront peut être rapidement me dire « non mais ça c'est trop compliqué, tu peux utiliser du SPI à la place ça sera plus simple et moins cher » par exemple.

IV – Fonctionnement
La partie acquisition des données est vraiment très simple en l'occurence, je ne vais pas rentrer dans le détail de comment récupérer la valeur d'un potentiomètre et la transformer en information numérique. Les défis complexes sont surtout :
la communication entre les modules et le rack (qui contient les modules)
comment détecter les différentes configurations de câblage avec les câbles de patch

Fonctionnement Global
Mon approche globale est la suivante : le rack qui contient chaque module est le « chef d'orchestre ». C'est lui qui envoie au PC des informations dès que le contrôleur change d'état (câble débranché, câble branché, potentiomètre tourné, etc). Les modules acquièrent les données des potentiomètres/boutons en permanence, enregistrent ces données en mémoire, et quand le Rack demande aux modules leur état, alors ils l'envoient au Rack.

Cycle Global
Le Rack communique avec les autres Modules par une liaison Série I2C (peu de câbles, possibilité d'avoir entre 1 et 100 modules branchés au rack). Chaque module a sa propre adresse.
Le Rack interroge chaque module un par un pour savoir si une information a changé ou non. Chaque module scanne son propre état en permanence, stocke dans sa mémoire cet état, et lorsque le Rack lui demande son état, le module envoie au Rack son état. Cette manière de faire permet de faire du traitement en parallèle : pendant que le Rack interroge un module, tous les autres sont en train de faire de l'acquisition de donnée.

Connexion d'un câble de patch
Pour faire l'acquisition de l'état de connexion des câbles de patch, mon idée est la suivante : chaque connectique est reliée à une broche de microcontrôleur. On définit toutes les broches comme des entrées, et UNE broche comme une sortie. On met la sortie de cette broche à +5V. Si une des entrées réagit à un niveau de tension haut (avec une interruption par exemple, ou en scannant manuellement chaque entrée), alors on sait que les deux broches sont connectées. Sinon, rien n'est connecté, et on passe à la broche suivante, etc. Ça donne un temps de calcul triangulaire (je crois). S'il y a N connectiques, il y a N + N-1 + N-2 + … + N0 scans à faire (je considère qu'il n'y a pas de câble en Y ou hubs, seulement des câbles avec deux connexions).

Ce cas là est simple quand la connexion se fait au sein d'un même module. Mais si on connecte un module à un autre (ce qui arrive beaucoup plus fréquemment), alors la méthode devient un poil plus complexe. Mon idée est : Le Rack envoie au premier module l'ordre de mettre à +5V la pin A au module 1 et attends. Si un câble de patch est branché entre le premier et le deuxième module, alors le deuxième module va détecter (via une interruption par exemple) qu'une de ses broches est passée à +5V, et communique au Rack pour lui indiquer que sa broche est connectée. Dès que le Rack reçoit cette information, il sait alors que la broche X est connectée à la broche Y. Et il continue son cycle en interrogeant chaque broche. Dans notre example, quand le rack va demander au module 1 de mettre à +5V sa pin C, Une interruption va avertir le module 2 que sa pin C est à +5V, et envoyer au rack cette information. Le Rack saura donc que la pin C du module 1 est connectée à la pin C du module 2.

Temps de cycle
J'apporte un note concernant le temps de cycle du « Rack » ; ma solution est sûrement très peu optimale, mais il ne faut pas oublier que l'information de l'état du système doit être récupérée dans une échelle de temps assez grande : disons quelques milisecondes, à mon avis maximum 20 avant qu'un humain se rende compte de la latence entre ce qu'il contrôle met du temps à être détecté par le système. Cela ne m'empêche pas de faire un système cohérent et si possible optimisé, mais il n'y a nullement besoin de performances incroyables au niveau de l'exécution de chaque cycle. Le pire cas de figure me semble être le suivant : il y a beaucoup de modules, et l'utilisateur tourne rapidement deux potentiomètres en même temps.

V - Conclusion
Si vous êtes arrivé jusqu'ici, merci d'avoir lu, je ne demande pas à ce qu'on me dise comment faire ou qu'on résolve tout mes problèmes, j'ai conscience que mon savoir-faire et mon expérience sont limités, donc je souhaite savoir si en me lisant vous pourriez avoir des remarques, suggestions, ou conseils type « tu seras bloqués sur les interruptions parce que tu peux pas avoir des microcontrôleurs avec des ports qui mélangent entrées et sorties ». Je sais que c'est pas forcément facile à expliquer, posez moi toutes les question que vous voulez sur mon projet si quelque chose n'est pas clair, je ferais des modifs si possible.

Bonne journée =)

Cette rubrique est réservée aux "Réalisations et Projets Finis".
STP utilise le lien "Report to moderator" pour demander au modo de déplacer ton message dans le forum principal.