!!! ATTENTION !!!
Ce projet est toujours en cours de réalisation, la partie physique est terminée, il ne reste donc plus que la programmation et cela est à venir très prochainement ...
En 2016, je possedais déjà plusieurs synthétiseurs, et j'avais vu des vidéos d'artistes faisant jouer tous leurs synthétiseurs en même temps. J'avais déjà en ma possession un logiciel séquenceur très puissant (Ableton Live 9) mais je voulais pouvoir régler en direct les notes jouées (avec un interface matériel). J'ai donc décidé de me lancer dans la conception de ce fameux séquenceur, mais avec aucune base cela a été assez laborieux au début... J'ai néanmoins persévéré et je suis aujourd'hui arrivé à un résultat satisfaisant.
En fait ce que je voulais, c'était un module capable de piloter tous mes synthétiseurs en même temps (et avec un look assez professionel aussi ...). Mais avant de me lancer dans la réalisation, j'avais regardé les séquenceurs MIDI déjà existants pour m'en inspirer, mon but étant de pouvoir envoyer des données MIDI sur plusieurs canaux afin de pouvoir avec un seul câble contrôler mes différents synthétiseurs. Je voulais aussi, avec ce séquenceur, intéragir sur Ableton et inversement afin de pouvoir déclencher des séquences via le logiciel et se synchroniser sur un même tempo.
J'avais vu sur des forums, des personnes réalisant des séquenceurs lumineux à base d'Arduino, j'ai donc commencé à m'intéresser à ces petites cartes bleues et blanches, en me disant que je pourrai faire de même, mais en envoyant des informations MIDI. En cherchant sur le net je suis tombé sur d'autres musiciens avec le même objectif que moi et ayant déjà réalisé leurs séquenceurs. Ce qui ne me plaisait pas dans ces réalisations c'était le design (toute petite boite) et la pauvreté des contrôles en façade (tout se faisait avec quelques potentiomètres, boutons et un écran). J'ai donc décidé de créer un séquenceur assez gros avec un potentiomètre pour chacune des notes de la séquence, accompagnés de boutons pour changer d'octave, un écran pour visualiser tout type d'information et des leds pour indiquer l'évolution temporelle de chaque piste. J'avais donc un début de design et une idée du fonctionnement du séquenceur, ceci n'était pas grand chose, mais sur le moment cela me semblait déjà être une grande avancée dans le projet.
Un séquenceur en général permet de faire "jouer" un synthétiseur sans besoin d'aide extérieur, par exemple imaginez que vous jouez une mélodie sur un synthétiseur. Grâce à un séquenceur, cette mélodie peut être jouée automatiquement et se répéter, on appelle cette mélodie : séquence. Cette séquence peut contenir un certain nombre de notes avant de se répeter, temporellement, ces notes se situent sur des "pas". On peut non seulement utiliser un séquenceur pour faire jouer à un synthétiseur une séquence de notes, mais on peut aussi se servir d'une séquence pour piloter autre chose (par exemple la fréquence de coupure d'un filtre). On a donc sur un séquenceur, une séquence contenant un certain nombre de pas (en général 8, 16, 32 ...) et cette séquence passe d'un pas à un autre à chaque interval de temps (défini). Le but dans un séquenceur est de pouvoir en direct changer les notes jouées (ou autre) de chaque pas. On utilise dans un séquenceur hardware (physique, donc je ne parle pas ici de séquenceurs sous logiciel même si le principe reste le même) généralement des potentiomètres accesibles en façade (néanmoins cela peut se faire autrement comme par exemple avec des boutons poussoirs). De plus, il est possible sur un séquenceur de faire jouer plusieurs séquences en parallèle. Celles-ci étant basées sur le même tempo ou non, vous pouvez imaginer un seul séquenceur faisant jouer à plusieurs synthétiseurs des mélodies différentes ne durant pas forcément le même temps.
Le séquenceur présenté sur cette page est un séquenceur fonctionnant en MIDI (sur autant de canaux que de séquences), pouvant jouer au choix (sur le même tempo ou une division de celui-ci):
- 4 séquences de maximum 32 pas
- 2 séquences de maximum 64 pas
- 1 séquence de maximum 128 pas
Le séquenceur possède 16 potentiomètres pour changer les notes associées à leur pas ainsi que deux boutons par pas permettant de monter ou de descendre d'une octave. Pour modifier, lorsqu'on utilise une séquence par exemple de 32 notes, les valeurs des pas 17 à 32, il suffit d'appuyer sur le bouton à droite de la ligne de leds associée à la séquence. Avec ce bouton il est possible quand la séquence dépasse 16 pas, d'accéder aux autres pas, on switch en fait entre les pas 1 à 16 et 17 à 32, une led permet de savoir sur quelle partie de la séquence on est en train de travailler. Il est possible de "désaccorder" toute une séquence, soit par demi-ton, soit par octave. Une matrice à leds indique le pas de chaque séquence et permet ainsi de visualiser l'avancée de celle-ci. Il est possible de raccourcir ou d'augmenter la durée d'envoi de chaque signal MIDI (correspondant à la durée de la note). Cela permet par exemple, si on utilise le séquenceur pour piloter les VCOs d'un synthétiseur, possédant une enveloppe d'amplitude, d'obtenir un rendu assez interressant avec l'apparition de la phase de sustain propre à l'enveloppe d'amplitude. Enfin ce séquenceur possède un écran LCD permettant une utilisation plus simple du module, aini que la possibilité d'arrêter à n'importe quel moment la lecture des séquences, de la remettre à zéro ou de la continuer...
Le séquenceur s'alimente via un cordon avec transformateur intégré délivrant du neuf volts en continu. On place un interrupteur entre cette entrée et le reste du montage (la résistance pouvant dissiper 5W sert à protéger l'interrupteur), puis on vient alimenter notre carte Arduino sans oublier de placer la diode de protection. On récupère aussi cette tension de neuf volts pour en obtenir une de cinq volts grâce au montage ci contre (à base de 7805).
Pour alimenter la partie commande (potentiomètres et boutons), on utilise une broche d'alimentation de l'Arduino.
Le séquenceur, comme on peut le voir sur le schéma explicatif ci contre, est composé de 6 parties principales qui sont les suivantes : boutons pour octaves, potentiomètres pour notes, LCD et boutons + potentiomètres pour navigation dans les menus, matrice à leds, sortie MIDI, interface Arduino. Le schéma permet aussi de visualiser les différentes connexions entre ces parties.
Le coeur de ce séquenceur est une carte Arduino Mega, c'est celle-ci même qui gère toutes les informations comme on peut le voir dans la partie précédente. La partie principale du code que cette carte exécute est en fait une boucle contenant dans l'ordre les instructions suivantes :
- on lit les boutons et potentiomètres
- on opère les modifications dus aux changements de valeurs des potentiomètres et dus aux appuis sur des boutons
- on vérifie si le timer dépasse le temps d'un pas, si oui on continu cette liste, sinon on repart à la première instruction
- on incrémente la valeur du pas de 1 et on remet le timer à zéro
- on gère l'affichage du pas actuel sur la matrice à led
- on envoie sur la sortie MIDI la valeur associée à la note du pas actuel
(La liste d'instruction ci-dessus est effectuée pour les différentes séquences)
Le timer qui est présenté ci-dessus permet de gérer, en même temps que le reste du programme, le pasage d'un pas à un autre des différentes séquences. A la différence d'une fonction "delay", la fonction utilisée permet de ne pas stopper la lecture du programme et ainsi de pouvoir continuer de lire les entrées, d'agir sur les sorties ... L'utilisation de cette fonction est assez simple, on définit la durée d'un pas par une valeur stockée dans la variable A, puis on lit à chaque changement de pas ou lancement de séquence la valeur du timer de l'Arduino, on stocke cette valeur dans une variable B, on pose ensuite la condition : si "timer - variable B > variable A" alors on change de pas, attention à ne pas oublier de remettre la variable B à "zéro", avec comme instruction : variable B = "valeur lu sur le timer". Ceci permet de changer de pas à chaque fois que le temps d'un pas est terminé.
Afin de pouvoir gérer tous les potentiomètres, j'ai dû utiliser une technique pour disposer de plus d'entrées analogiques sur mon Arduino, car celle-ci n'en possédant que 16 je pouvais certes gérer tous les potentiomètres liées aux réglages des notes sur chaque pas, mais je n'aurai pas pu ajouter d'autres potentiomètres. J'ai donc utilisé des multiplexeurs, plus précisément des CD4051, qui fonctionnent comme des sélecteurs contrôlés sur trois pins par des informations de type numérique (0 ou 1). Cela me permettait de connecter 8 potentiomètres sur un circuit intégré et grâce à trois sorties numériques de l'Arduino, de sélectionner l'entrée du multiplexeur à lire sur une entrée analogique de ma carte. Pour lire les valeurs des tensions sur les 8 potentiomètres, il suffit de créer un algorithme envoyant d'abord au multiplexeur, sur ses 3 pins de contrôle, les valeurs nécessaires pour sélectionner la première entrée, puis de lire la tension à la sortie du multiplexeur (ce qui équivaut à la tension délivrée par le premier potentiomètre), puis d'envoyer les valeurs nécessaires pour lire la deuxième entrée et ainsi de suite (comme le montre le schéma et le code Arduino ci dessous).
Comme le montre la partie de code ci-contre, pour lire les tensions des huit potentiomètres on lit une à une ces valeurs. On envoie tout d'abord au CD4051 nos valeurs binaires sur ses broches de controle (A, B et C) et ensuite on lit sa sortie avec une entrée analogique de l'Arduino. On répète cette opération autant de fois qu'il y a de potentiomètres connectés, tout en faisant attention de bien piloter le circuit en mettant au niveau haut les bonnes entrées de contrôle.
Pour lire les tensions des deux autres potentiomètres j'ai utilisé un simple montage diviseur de tension avec lecture de la tension délivrée, sur une entrée analogique de l'Arduino.
Les boutons servant à régler l'octave de chaque note, tout comme les autres boutons, sont connectés à la masse mais aussi au 5 volt (avec résistance !) comme le montrent les schémas ci dessous, ce qui permet à l'Arduino de lire soit un 0 (bouton non appuyé) soit un 1 (bouton appuyé) lorsque l'on utilise une entrée numérique de la carte. La différence dans les connexions des boutons servant à régler l'octave de chaque note est l'utilisation d'une échelle de résistances (pont diviseur de tensions muliples). En effet je ne possédais pas assez de ports numériques sur l'Arduino méga pour pouvoir tout gérer, j'ai donc dû utiliser cette technique pour me permettre d'utiliser mes seize boutons tout en ne monopolisant qu'une seule entrée analogique de l'Arduino. Les valeurs des résistances sont définies pour avoir des écarts de tension les plus grands et constants possibles.
Les autres boutons sont eux simplement connectés à une entrée numérique et la masse via une résistance de 10 kOhm comme le montre le schéma ci dessous et lus sur un port numérique (configuré comme entrée) de l'Arduino.
Ce qui choque le plus en voyant ce séquenceur, c'est qu'en le comparant aux autres existants on se rend compte que celui-ci possède une matrice lumineuse mais une seule ligne de potentiomètres. En effet la plupart des séquenceurs ont pour habitude d'avoir une seule ligne de leds indiquant l'avancement de la séquence mais plusieurs lignes de potentiomètres. Ceux-ci servant à régler les différentes notes de chaque séquence en même temps. Si j'ai décidé d'opter pour cet affichage, c'est que j'avais comme but premier de pouvoir créer des séquences ne durant pas le même temps, par exemple pour créer une sorte de solo de synthé avec en fond une rythmique assez lente.
La matrice lumineuse possède les dimensions suivantes : 16 x 4 leds. Le fonctionnement est assez simple, chaque led d'une ligne de 16 est reliée sur une sortie d'un registre à décalage (74HC595), ceux-ci ne possédant que 8 sorties, j'en utilise deux par ligne, mais connectés en cascade ce qui n'utilise que trois sorties numériques sur l'Arduino par ligne de leds (données, verrou, horloge).
On met déjà le verrou au niveau bas, puis on transmet nos données pour piloter les leds et on remet le verrou en position haut. "MSBFIRST" est le sens de l'envoi des informations, si vous voulez changer ce sens vous pouvez saisir à la place "LSBFIRST". Les variables "valeur1" et "valeur2" sont des nombres compris entre 0 et 255, la première instruction "shiftOut" permet d'envoyer les informations au deuxième registre et la deuxième au premier. En fait les information de la première ligne sont bien envoyées au premier registre mais comme juste après on renvoie une autre ligne d'informations, la première est "poussée" vers le deuxième regitre. Si on veut afficher une seule LED à la fois on donnera à nos variables des valeurs multiples de deux (conversion binaire), tout en pensant à mettre une des deux variables à zéro quand l'autre en est différente.
J'ai décidé d'incorporer à la façade, un écran LCD permettant d'informer l'utilisateur sur ce qui se passe dans le séquenceur. Par exemple lorsqu'on change la position d'un potentiomètre réglant la note sur un pas, la nouvelle note est indiquée momentanément sur l'écran. Cela permet aussi de créer des menus et des sous menus, où il est possible de naviguer grâce aux différents boutons et potentiomètres.
C'est bien beau d'avoir un séquenceur fonctionnel, mais si celui-ci ne peut pas transmettre ses données MIDI aux instruments, je n'en voit pas l'utilité ... J'ai donc connecté à mon Arduino un montage me permettant d'envoyer à partir des informations collectées (sur les potentiomètres, boutons ...) des informations sur une prise DIN (utilisée pour transmettre les signaux MIDI dans notre cas). Le montage que j'ai utilisé est donné sur la chaine "Notes and Volts" dans cette vidéo.
À venir...
À venir ...
Voici le visuel des façades de ce module, comme cela vous pouvez plus facilement l'imaginer dans votre setup !
Si ce module vous intérresse, rendez vous sur cette page, vous y trouverez toutes les ressources nécessaires à sa réalisation.
Pour ceux qui, comme moi en 2016, n'avaient jamais touché un Arduino, je vous conseille d'acheter "le grand livre d'Arduino" par Erik Bartmann, même si celui-ci est assez cher, il est très complet et très bien expliqué.
Je conseillle aussi à ceux qui s'interrèssent aux communication MIDI (pour faire communiquer des instruments ou pour d'autres raisons), d'aller consulter le site "Notes and Volts" et de visionner la série de vidéos sur le protocole MIDI sur sa chaine Youtube
Comme je n'avais jamais réalisé de projet comme celui-ci auparavant, je ne possedais pas de matériel de soudure, donc j'ai dû en acheter et apprendre à souder. Comme je ne savais pas à l'époque comment réaliser des circuits imprimés, j'ai utilisé des "plaquettes 1000 trous" (aussi appelées platines d'essais sans soudures). Si celles-ci sont très bien pour de l'expérimentation, elles s'avèrent inutiles si on veut un montage stable dans la durée... Si je dis cela, c'est que j'en ai fait les frais... Le problème réside dans la faible qualité dans la durée des liaisons entre les câbles et la plaquette, ainsi lorsque qu'un choc (même faible) se produit sur le boitier du séquenceur, cela vient interrompre briévement la liaison entre le 5 volt (sur plaquette) et la broche des potentiomètres (câble) par exemple.
Il est donc préferable lorsqu'on a des liaisons importantes (dans mon cas il s'agissait de liaisons visant à lire une valeur analogique avec l'Arduino, et celle ci à cause du mauvais contact passait tout le temps de sa valeur normale, à 0 volt...), d'assurer les contacts par le biais de connecteurs de qualités voir même en soudant les deux extremités, ce que j'ai fait lors de la rénovation du séquenceur (sur plaquettes avec soudures).
Il serait bon d'ajouter une mémoire permettant de sauvegarder les réglages réalisés, ce que je pense faire prochainement.
Ajouter un port MIDI IN pour communiquer avec un autre interface MIDI qui permettrait par exemple de déclencher des séquences enregistrées en fonction de la note MIDI lue sur le séquenceur.
Ajouter une entrée de synchronisation permettant de synchroniser le tempo du séquenceur sur un tempo externe.
Permettre de connecter deux séquenceurs entre-eux pour pouvoir utiliser des séquences plus longues.
19 Décembre 2017 : arrêt du projet à cause de la faible qualité des contacts (plaquettes 1000 trous)
14 Janvier 2019 : réalisation sur plaquettes d'essais avec soudures
13 Août 2019 : réalisation du circuit imprimé
En cours : montage du module