SEQUENINO : séquenceur MIDI/CV/GATE







Cahier des charges



Voici la liste des fonctionnalités qui m'intéressent, ou du moins qui me paraissent être un minimum sur un séquenceur digne de ce nom :




La réalisation



L'ensemble sera logé dans un boitier quelconque, cela importe peu.

Moi j'ai choisi celui-ci. Là, c'est le boitier brut.




Depuis, j'ai fait quelques modifications. Les boulons qui permettent la fixation de l'écran LCD sont maintenant collés à l'araldite sous la facade, ils ne dépassent plus sur le dessus. J'ai imprimé une facade sur du papier que j'ai plastifié. Cette facade tient avec les vis du boitier et l'ensemble des écrous des interrupteurs, encodeurs et prises.



L'alimentation sera externe via la prise d'alimentation de l'arduino (ou l'entrée Vin), dans ce cas prévoir au moins 7 ou 8V minimum pour que la régulation 5V interne à l'arduino se fasse correctement.

Attention: ces 5V serviront de référence pour les convertisseurs numériques analogiques et il est important que la tension soit bien régulée et stabilisée. La sortie 5V de l'arduino, alimentera les éléments annexes (LCD, eeprom, DAC, opto-coupleur,etc...)

Le bloc secteur que j'utilise me donne 8V alternatif, je me suis contenté de redresser et de mettre 2 condensateurs de filtrage avec une résistance calculée de manière à avoir au moins 8V en charge en sortie d'alimentation. La régulation est effectuée ensuite par l'arduino. Si vous avez un bloc secteur qui vous donne 9V continu, vous n'avez pas besoin de faire quoique ce soit, il pourra alimenter l'arduino directement.

J'ai donc prevu une prise d'alimentation sur le coté du boitier qui est reliée à une petite platine d'alimentation. Cela dit, vous pourrez prendre la prise disponible sur le coté de la carte de l'arduino, elle convient aussi très bien et elle est reliée directement au régulateur de l'arduino.




A coté de cette prise se trouve l'inverseur qui permet de commuter la prise midi-out en midi-thru. Je précise que le midi-thru est hardware, il est conçu autour de 2 hex-inverters.(Vous pouvez d'ailleurs installer une prise dédiée pour le midi-thru, dans ce cas, inutile de mettre un inverseur.)
On peut aussi alimenter l'ensemble via la prise USB, mais les alimentations USB des PC ne sont pas très bien régulées et on peut entendre des variations dans le pitch des notes (Sur les sorties CV, le midi-out n'est pas impacté) suivant l'humeur du PC, dans ce cas il vaut mieux utiliser un chargeur USB externe, mais encore une fois, la régulation sera meilleure avec une alimentation 9V externe via la prise d'alimentation de d'arduino.

L'ensemble des composants peut tenir sur un petit shield.




Sur la droite, j'ai aménagé un petit passage dans le boitier pour la prise USB afin de pouvoir programmer l'Arduino quand le coffret est fermé.
A coté se trouve un interrupteur qui coupe la liaison midi pour éviter les erreurs de transmission du programme vers l'arduino.
Voici l'autre partie du boitier, le dessus. Vu du dessous :) . MMMmmmmmm, le bon cablage de bucheron !!!




Au milieu se trouve l'écran LCD piloté en I2C. A gauche les prises midi-in et out/thru.

En bas les 6 jacks : 2 x CV, 2 x gate, 1 entree clock externe, 1 entree reset

Sur le haut, les plaques de perfboard (je sais, c'est vraiment pas joli...) qui soutiennent les 2 encodeurs rotatifs et les différents interrupteurs.

Le schéma est assez simple. Cliquez sur l'image ci-dessous pour le voir en grand



J'utilise une bonne quantité des fonctionnalités hardware de l'arduino. L'USART pour le midi, le bus I2C pour l'écran LCD et l'EEPROM, le bus SPI pour les 2 DAC. Pour économiser des pins, je mets les interrupteurs sur une chaine de résistances alimentée sous 5V et la sortie de cette chaine arrive sur une entrée analogique. En analysant la tension on peut trouver le bouton qui a été appuyé. Ce système permet de brancher plusieurs interrupteurs sur une seule entrée analogique de l'Arduino.

Les entrées clock et reset sont protégées avec une diode zener. Un montage plus élégant aurait consisté ) mettre 2 diodes en séries comme sur le montage suivant, vous pouvez le faire à la place des zeners si le coeur vous en dit.

ADC-PROTECTION


Le timer 1 est utilisé pour cadencer l'horloge interne du séquenceur. Si l'horloge externe vient part le midi, c'est la midi-clock qui gèrera l'avance de pas. Pour la partie clock externe en analogique, 2 prises jacks sont réservées, une pour l'horloge (l'avance pas à pas du séquenceur) et une autre pour le reset (si cette entrée passe à l'état haut, le séquenceur revient à 0). Je dis analogique mais disons que c'est une horloge de type utilisée sur les synthés analogiques. Cela reste un signal carré avec des niveaux 0 ou 1 (0V ou 5V). Cela dit, on peut imaginer n'importe quoi pour cette horloge, dés l'instant qu'il a une amplitude de 5V : un LFO, un mélange de signaux, de l'audio, ou bien par exemple un bruit blanc balancé dans un sample&hold déclenché par un lfo avec une forme d'onde de dingue et on prend la sortie du S&H pour servir d'horloge. On peut aussi utiliser un signal carré en PWM... Bref, n'importe quoi convient, des l'instant qu'il y a de temps en temps des fronts montants pour générer un top d'horloge. Idem pour le reset... Ce séquenceur est conçu pour être relié sur un synthé analogique, donc en gros n'importe quelle sortie du synthé peut être utilisée comme horloge.



Les interruptions



Le MIDI :

La bibliothèque MIDI n'est pas utilisé dans ce programme, c'est volontaire de ma part et cela pour plusieurs raison.
J'ai positionné les interruptions en réception sur l'USART. Etant donné que la bibliothèque MIDI n'est pas utilisé, il faudra décoder le flux midi lorsqu'il se présentera. L'avantage de l'interruption sur l'USART est qu'on ne déclenchera le décodage que si du flux de donnée se présente sur l'entrée RX de l'arduino. Je n'ai pas utilisé l'interruption en sortie midi.

Les timers :

La clock externe :

J'utilise la fonction attachInterrupt() pour qu'une interruption se déclenche sur un niveau haut de la prise clock externe. Même chose pour l'entrée clock reset. Les interruptions sont déclenchées sur les fronts montants

Voici un récapitulatif des interruptions utilisées dans le programme

Interruption Fonction Vecteur
USART MIDI-IN USART_RX_vect
Timer 1 Horloge Interne Sequenceur TIMER1_OVF_vect
Timer 2 lecture encodeur et noyau séquenceur TIMER2_OVF_vect
INT0 clock externe MyHandleClockSeqCv
INT1 reset externe MyHandleStopSeqCv


Ne pas utiliser les fonctions d'affichage LCD au sein d'une interruption sous peine de bloquer le programme. En effet, le protocole I2C utilise lui même des interruptions pour fonctionner et les fonctions d'affichage se mettent en attente indéfiniment. Pour pouvoir afficher des données, il vaut mieux le faire dans la boucle principale en cours d'execution et si l'affichage dépend d'un contexte particulier modifié dans une interruption, on utilise des flags tel que flagAffLcd1, flagAffLcd2, flagAffLcd3.(cela permet aussi à l'interruption de s'éxécuter plus vite, l'affichage sur un LCD étant de toute façon un peu lent)




Edition des presets



On branche le boitier. Il chargera le preset 0 de la banque 0 par défaut. 2 banques de 127 presets sont disponibles. Dans un preset sont sauvegardés les notes des 2 pistes (ou 1 pistes de 32 pas), les longueurs de gates (ou velocités suivant le mode) et tous les paramètres du boitier (horloge, mode de sortie, division horloge, sens de défilement, etc...)

Voici l'écran de base d'une des 2 pistes.




On voit les 16 notes de la pistes. En haut à droite le carré signifie que le sequenceur est à l'arrêt. En lecture on a une flèche.
NT1 signifie note de la piste 1. (NT2 pour l'autre piste). S32 signifie que nous avons 32 steps donc en fait les 2 pistes sont jouées séquentiellement.

Up signifie que le jeu se fait dans le sens Up, de la note 1 jusqu'a la 32ème.

L'interrupteur de l'encodeur de gauche est dédié à la piste 1. Si on se trouve sur la piste 2 et que nous appuyons dessus nous irons donc sur la piste 1. Même chose pour l'encodeur de droite qui permet d'aller sur la piste 2.

Une fois la piste sélectionnée par une pression sur un encodeur, une seconde pression permet d'aller sur la partie gate de la piste



Pour la partie rotation des encodeurs, voila ce qui a été choisi. Celui de gauche sélectionne la note (ou le gate, suivant l'écran) en déplacant un curseur ">" pour indiquer ce qui est édité. L'encodeur de droite édite la valeur, c'est tout simple. On peut le faire pendant le jeu bien sur.

Je passe sur l'édition des notes, puisqu'il suffit de choisir la note avec l'encodeur. Pour la partie Gate, une valeur de 0 fait que la note ne sera pas jouée et que si la précédente est en cours de jeu (longueur qui dépasse 1 step), elle sera coupée. Nous pouvons utiliser des valeurs de 1 à 126. Arrivé à 127, l'affichage passe à On, cela veut dire que le gate ne sera pas redéclenché et la note continuera à jouer sans redéclenchement (par exemple on mets 4 fois de suite C3 pour jouer un C3 sur 4 steps et les 3 derniers gates de ces notes à On pour la maintenir, la note durera 4 steps).

Nous avons 3 modes de jeu (suivant ce qui sera choisi dans le setup).
Voici l'écran des vélocités. On voit écrit VL2, car la vélocité se trouve uniquement sur la piste 2.



La touche Func modifie le comportement des encodeurs. En mode édition de note, l'appui sur la touche Func combinée à la rotation d'un encodeur fait monter ou descendre toutes les notes de la séquences de 1 octave. En edition de gate, les valeurs montent ou descendent de 5ms.




Les presets



On accède à la gestion des presets en appuyant sur le bouton à gauche de l'écran LCD. Nous arrivons sur la vue chargement des presets. Si on appuie de nouveau sur ce bouton on rebascule sur l'édition des presets.




L'encodeur de gauche permet de faire défiler les presets avec leur nom. Le numero est précisé en bas à gauche (P001), l'encodeur de droite permet de sélectionner la banque (B000 ou B001 dans le cas de l'eeprom que j'ai installé qui fait 256K. Attention, 256K signifie Kbits, la taille totale est à diviser par 8 pour arriver à 32K octets).

Une fois le preset choisi on appuie sur l'encodeur de droite pour le sélectionner. Un appui sur le bouton de setup permet de repasser en mode edition.

Pour sauvegarder, c'est le même principe que pour l'édition des notes. L'appui sur l'encodeur de gauche bascule de load à Save et vice-versa. Donc, un appui sur le bouton de gauche à coté du LCD, on voit le menu load, un appui sur l'encodeur de gauche on passe sur save.




On choisi avec les 2 encodeurs la destination de sauvegarde (n° de preset et banque, les noms défilent aussi pendant le mouvement des encodeurs), pour valider la sauvegarde on appuie sur l'encodeur de droite. Une fois l'emplacement de destination validé, on passe sur l'écran d'édition du nom du preset.




Un preset a un nom de 16 caractères. On choisit la position du caractère à éditer avec l'encodeur de gauche. Une fois que le curseur est à la position de la lettre que nous devons modifier nous utilisons l'encodeur de droite pour modifier la lettre. On reprend l'encodeur de gauche pour changer de position et on édite avec celui de droite, etc...
l'appui sur l'encodeur de gauche efface la lettre en cours et passe à la suivante, cela permet de saisir un espace facilement, ou d'effacer une portion de nom.
A la première utilisation de l'appareil, lorsqu'il n'y a aucun preset de sauvegardé, l'eeprom est vite. Je vous ai fait un petit programme pour initialiser l'eeprom. J'aurai pu le faire en automatique mais jai eu la flemme :)



Le setup



La partie setup est activée en appuyant sur le bouton de droite à coté du LCD. Ce qui nous amène à l'écran suivant.



Nous avons 8 paramètres. J'utilise le même principe d'édition. L'encodeur de gauche permet de choisir le paramètre à éditer, celui de droite fait l'édition de la valeur. Voici les différentes valeurs possibles :.




Lorsque le nombre de steps est inférieur à la valeur max, ceux qui n'existent pas sont remplacés par des "..."
S11 indique qu'il y a 11 steps dans la séquence.



En lecture le carré en haut à droite se change en flèche et une astérisque se déplace à coté du step en cours de jeu.
P04 indique que le pas numéro 4 est en cours de jeu.





Mode enregistrement



Le mode enregistrement de séquence. On peut evidemment éditer tous les steps un par un à la main, mais si on dispose d'un clavier midi, on peut enregistrer les pas avec un clavier connecté sur la prise midi-in. En mode édition de séquence, il suffit d'appuyer sur le bouton Record, on passe alors en mode enregistrement. On enregistrera alors le nombre de steps réglés dans le setup. Ici 11 steps.




On peut stopper l'enregistrement en appuyant de nouveau sur le bouton record.

Au fur et à mesure de l'entrée des notes, elles apparaissent sur l'écran.




Dés que le nombre de note est atteint, on repasse automatiquement en mode édition.



Le code



Dans le fichier zip, à l'intérieur du sous-répertoire sequenceur, vous trouverez le code source du séquenceur.

Viennent ensuite les programmes d'initialisation (seqmemwrite.ino) et de lecture (seqmemread.ino) de l'eeprom.

Lorsque votre montage est cablé, seqmemwrite est a exécuter au moins une fois pour initialiser les presets. Une lecture des noms de presets est faite avec seqmemread histoire de vérifier que ca s'est bien passé. Ensuite vous pouvez installer le programme principal sequenceur.ino.

L'archive avec le code


Voila. J'espère que ce petit projet vous plaira.



Bientot d'autres petits montages en ligne... enfin des que j'aurai le temps :)