MiniPhonic : Une plateforme de synthèse audio basée sur Arduino (2)
sur

Grâce aux frameworks logiciels et aux bibliothèques devenus particulièrement puissants au fil du temps, il est aujourd’hui possible de mettre en œuvre des fonctions complexes même avec un système compact et peu onéreux. Dans la première partie de la série d’articles MiniPhonic, nous avons décrit le schéma-bloc et les fonctions principales du logiciel Basic Synth. Dans cette seconde partie, nous abordons l’application Sequence et le firmware, tout en détaillant le matériel des cartes principale et d’affichage, avec instructions d’assemblage et liste des composants. Passons à la pratique !
Sequence
Cette application est également basée sur la bibliothèque Mozzi de Tim Barras, et utilise une version modifiée du logiciel OscPocketO de Staffan Melin, qui permet de modifier certains paramètres en temps réel. Le schéma-bloc de l’application Sequence est montré en figure 1. Les principales caractéristiques sont les suivantes :
- Séquenceur 16 notes avec 4 motifs, extensible si besoin, également avec sortie sur MIDI OUT.
- Les séquences sont affichées en notation musicale alphanumérique (ex. C, C#, D…).
- Deux oscillateurs à table d’ondes DCO1 et DCO2 avec cinq formes d’onde remplaçables.
- Détune et transposition disponibles pour le second oscillateur.
- Générateur d’enveloppe à quatre paramètres, ATTACK, DECAY, SUSTAIN LEVEL et RELEASE, contrôlables en temps réel via des potentiomètres.
- Filtre passe-bas avec fréquence et résonance réglables.
- Générateur de modulation de filtre avec paramètres Slow, Fast et Random sélectionnables.
- 4 panneaux mémorisables, extensibles si nécessaire.
- Possibilité d’utiliser un clavier externe via MIDI IN pour jouer en temps réel.
Le module principal de cette application est le SEQUENCER. Il permet de générer des séquences de notes répétées en boucle, stockées sur 4 patterns de 16 notes chacune, résidant en EEPROM et donc non volatiles.

Pour chaque note, vous pouvez varier la hauteur, c’est-à-dire le numéro de note MIDI et son état : STATE_OFF coupe la note (pause), STATE_ON joue la note à volume normal, STATE_BOLD joue la note accentuée.
Une fonction de transposition permet d’ajuster tout un pattern à une tonalité donnée sans avoir à modifier chaque note individuellement. Le séquenceur dispose aussi d’entrées/sorties SYNC, facilitant la synchronisation avec d’autres synthétiseurs.
Le séquenceur contrôle les deux oscillateurs DCO1 et DCO2, qui acceptent aussi les données du port MIDI, afin que vous puissiez jouer en temps réel, indépendamment du séquenceur. Les boutons MNU+ et MNU- permettent d’accéder aux menus.
Regardons plus en détail :
SEQUENCE : actionner les boutons VAL+ et VAL- démarre/arrête le séquenceur.
SYNC : active la synchronisation interne ou externe via le connecteur approprié. L’option EXT24 est utilisé pour synchroniser le séquenceur à 24 ppq (pulses per quarter note ; 140 bpm max.).
PATTERN : VAL+ et VAL- permettent de choisir parmi les quatre motifs disponibles.
ED pat : permet d’éditer le motif ; utilisez les boutons LEFT et RGHT pour naviguer entre les notes, appuyez sur VAL+ et VAL- pour changer la note qui est exprimée en notation alphanumérique, c’est-à-dire qu’à la troisième ligne de l’écran, les notes sont affichées selon la norme internationale : C, C’ (do dièse), D, D’ (ré dièse), E, F, F’ (fa dièse), G, G’ (sol dièse), A, A’ (la dièse), B. Le nombre en dessous indique l’octave dans laquelle la note sonne.
STATE : état de chaque note ; là encore, on peut naviguer entre les notes avec les boutons LEFT et RGHT, et avec VAL+ et VAL- on peut changer l’état de la note
- = note coupée
O = note jouée normalement
B = note accentuée
TEMPO : métronome (en bpm).
GATE : durée relative de chaque note en % ; par exemple, une valeur de 30 fait que la note sonne pendant 30% de la durée suivie d’une pause de 70%.
SH pat : transpose le motif vers le haut ou vers le bas en appuyant sur VAL+ et VAL- un demi-ton à la fois.
WAVEFORM : permet, avec VAL+ et VAL-, de choisir parmi cinq formes d’onde pour DCO1 : Sin = sinusoïdale, Tr = triangulaire, Saw = dent de scie, Square et une forme atypique appelée Phasor.
FILTER mode : toujours avec VAL+ et VAL-, on peut changer les modes de fonctionnement du filtre : Fixed où la fréquence de coupure du DCF gMFilterCutoff, est manipulée par potentiomètre, Random où la fréquence varie aléatoirement et avec une vitesse définie par MG1, Man.Mod où une modulation de forme triangulaire est appliquée avec une vitesse toujours définie par MG1 et enfin Fast, comme la précédente mais avec vitesse fixe. MG1 peut être atteinte depuis le mixer, entrée FRM1.
WAVEFORM2 : Permet, via VAL+ et VAL-, de choisir parmi cinq formes d’onde pour DCO2 : Sine, Triangular, Saw, Square et l’atypique Phasor.
DETUNE2 : Permet, via VAL+ et VAL-, de désaccorder légèrement la fréquence de DCO2 : une valeur de 2 génère un effet chorus très prononcé.
TRANSPOSE2 : VAL+ et VAL- transposent DCO2 par rapport au numéro de note MIDI.
KEY PLAY : joue immédiatement les 4 premières notes du pattern en cours en appuyant sur les quatre boutons LEFT, VAL-, VAL+ et RGHT. Le numéro de note MIDI correspondant est indiqué au-dessus de chaque bouton. Utile pour tester les sons ou jouer en temps réel, surtout en l’absence de clavier.
TOOLS : S sauvegarde la configuration courante, y compris les patterns, en mémoire non volatile, L charge la configuration et les patterns précédemment sauvegardés, R crée une séquence aléatoire dans le pattern actuel, B crée une ligne de basse monodique (même note) mais avec toutes les notes à l’état O pour pouvoir la modifier facilement.
Encore une fois, la fonction P permet de choisir parmi 3 panneaux, main, adsr et mixer respectivement.
Le Firmware Sequence
Dans l'initialisation (vers la ligne 1520) :on trouve tous les réglages de l’instrument et les initialisations nécessaires. Plus précisément, les broches sont configurées et l’affichage est initialisé avec la commande :
gUILCD.begin(20, 4)
Ensuite, quelques caractères personnalisés sont créés, non inclus dans le jeu LCD par défaut, utiles pour afficher les séquences de pattern :
gUILCD.createChar(0, Dodiesis);
gUILCD.createChar(1, Rediesis);
gUILCD.createChar(2, Fadiesis);
gUILCD.createChar(3, Soldiesis);
gUILCD.createChar(4, Ladiesis);
Ensuite, on trouve les crédits et numéros de version du logiciel et l’initialisation MIDI précédée des connexions à la bibliothèque MIDI de HandleNoteOn et NoteOff :
// Connect the HandleNoteOn function to the library,
// so it is called upon reception of a NoteOn.
MIDI.setHandleNoteOn(HandleNoteOn);
// Put only the name of the function
MIDI.setHandleNoteOff(HandleNoteOff);
// Put only the name of the function
// Initiate MIDI communications, listen to
// all channels
MIDI.begin(MIDI_CHANNEL_OMNI);
Vous remarquerez qu’il existe plusieurs fonctions NOTE ON. La fonction principale est playNote(), située vers la ligne 420, et utilisée par le séquenceur. La fonction playNoteOn(), en revanche, est spécifique au mode KEY PLAY, qui permet de jouer les quatre premières notes du pattern en cours en utilisant les touches LEFT, VAL-, VAL+ et RGHT.
Enfin, la fonction HandleNoteOn() sert à gérer les entrées depuis le clavier connecté au port MIDI IN.
Bien sûr, il existe aussi deux fonctions réciproques qui terminent la note jouée, playNoteOff et HandleNoteOff. À la ligne 1570, on trouve les déclarations et la connexion de ces fonctions à la bibliothèque MIDI.
À partir de la ligne 1580, suivent tous les réglages de la bibliothèque Mozzi, afin que le synthétiseur puisse jouer immédiatement ; de même (vers la ligne 1610), suivent les réglages du séquenceur.
L’interface utilisateur (User Interface Draw) est lancée vers la ligne 1630 avec la fonction UIDraw(), puis la bibliothèque Mozzi startMozzi(CONTROL_RATE) est démarrée.
Passons maintenant à la fonction updateControl() trouvée à la ligne 1640, où tous les contrôles sont implémentés, et immédiatement après on trouve la requête du port MIDI au cas où un clavier serait connecté :
if(MIDI.read()){
gMEnvelope.noteOn(); // play from MIDI input
PanelHandle(); // handle panel
}
La fonction PanelHandle() permet de modifier les paramètres gérés par les quatre potentiomètres, comme vu précédemment pour le Basic Synth. Ceci est suivi par le moteur du séquenceur (vers 1648), où la synchronisation est d’abord gérée puis le programme vérifie si la double croche en cours est terminée avant de passer à la note suivante.
if (gSyncNoteOn) {
playNote();
gSyncNoteOn = false;
Ici aussi, on trouve la fonction PanelHandle() pour pouvoir modifier les paramètres à chaque fois qu’une note est jouée, suivi par le traitement de la note suivante, jusqu’à ce que le nombre maximal de notes soit dépassé, auquel cas on revient à la première note.
PanelHandle(); // --- Sequence/Mozzi
gSeqNoteIndex++;
if (gSeqNoteIndex >= MAX_NOTES) {
gSeqNoteIndex = 0;
}
}
La durée de la note est ensuite vérifiée et la note Off ainsi que la synchronisation out sont appelées pour les dispositifs externes, et l’enveloppe est mise à jour avec gMEnvelope.update().
À ce stade, l’interface utilisateur est sollicitée pour vérifier si des touches sont enfoncées avec gMEnvelope.update().
Enfin, la mise à jour audio updateAudio() suit. C’est la fonction la plus importante car elle englobe le traitement du flux audio, comme vu pour le Basic Synth. En fait, le switch
switch(gSeqStatus[gSeqPatternIndex][NIdx])
établit le niveau gMGain, c’est-à-dire le volume de la note jouée, qui sera ensuite utilisé par la CHAÎNE SYNTHÉTISEUR 2 (visible dans l’encadré correspondant dans cet article). La boucle contenant l’appel principal à la bibliothèque Mozzi audioHook() termine le programme.

Réalisation pratique
En utilisant les images de la carte et les listes de composants comme référence, il est conseillé de commencer l’assemblage par les CMS sur leurs faces de soudure respectives, en commençant par les composants passifs. Ensuite, vous poursuivrez avec l’assemblage des traversants (TH) sur l’autre côté.

Il est conseillé d’enfermer le MiniPhonic dans un boîtier, comme illustré dans l’image d’introduction de cet article et à la figure 2. On y remarque la disposition de la carte principale (voir le schéma à la figure 3) et de la carte d’affichage (figure 4), connectées par une nappe plate.

IC3 est un amplificateur audio TDA2822D de STMicroelectronics, dont la sortie est transmises à la fois aux prises mono femelles L et R 6,3 mm et à la prise casque stéréo 3,5 mm à l’arrière du boîtier du MiniPhonic.

Les potentiomètres et boutons utilisés sont courants. Le premier potentiomètre en haut à gauche de la photo de la carte principale (voir l'encadré Liste des composants de la carte principale) ne doit pas être monté.
Une attention particulière doit être accordée au connecteur SYNC et, en particulier, à la connexion AUDIOBUS, mise en évidence en vert dans le schéma de câblage de la figure 5. Si plusieurs synthétiseurs sont connectés en parallèle, tous les canaux audio doivent également être connectés en parallèle ; toutefois, il est important de noter que la sortie totale sera diminuée de 6 dB, en raison de la charge représentée par les autres synthétiseurs connectés.

Si vous préférez utiliser une table de mixage (solution recommandée), il est conseillé de déconnecter l’AUDIOBUS du connecteur, éventuellement en l’équipant d’un interrupteur, afin que chaque synthétiseur ait son propre canal. Le même connecteur SYNC fournit également l’alimentation depuis le connecteur DC IN, permettant d’utiliser une seule alimentation (transformateur mural) pour tous les synthétiseurs. Il est important de noter que chaque synthétiseur consomme environ 200 mA.

Figure 6 montre le nom du panneau actif — ici mixer — suivi de trois paramètres : LEVL_1, LEVL_2 et FRM1, ainsi qu’un espace vide. Ces paramètres sont assignés aux potentiomètres P1, P2 et P3 respectivement, tandis que P4 reste inutilisé dans ce panneau. Les paramètres LEVL_1 et LEVL_2 règlent le niveau des deux oscillateurs, tandis que FRM1 contrôle la fréquence de MG1. Ce panneau fait partie du Basic Synth.

Figure 7 montre le panneau main avec le menu ED PAT. La troisième ligne montre la séquence des notes, tandis que la quatrième ligne affiche les octaves respectives. La première note est un C à l’octave 0, suivie d’un C# (do dièse) dans la même octave, puis un D, également à l’octave 0, et ainsi de suite. La séquence se termine par un D# à l’octave 1.
Plateforme MiniPhonic : considérations finales
La plateforme MiniPhonic, en plus de permettre le développement de petits synthétiseurs et d’apprendre les bases de la synthèse sonore et du protocole MIDI, se prête aussi à de nouveaux développements. Par exemple, le connecteur SYNC est conçu pour transporter les signaux SDI, SDO, SCK et SS en externe, permettant ainsi un flux de données SPI. Ce flux pourrait être utilisé comme support pour un signal audio multicanal et les signaux de contrôle associés, exploitables pour implémenter des composants externes tels que des VCF analogiques, des VCA et d’autres dispositifs.
Grâce à la puissance du processeur ARM, on pourrait étendre le Basic Synth pour le rendre polyphonique, disons 3 voix, tout en maintenant la structure actuelle. Les applications décrites ci-dessus restent en outre ouvertes à de futures modifications et améliorations, dans le but d’exploiter tout le potentiel du processeur ARM.

Ici, le filtre, initialement conçu pour l’Arduino UNO R3, qui est le maillon faible de la chaîne, mérite d’être mentionné. Lorsque la RÉSONANCE est portée au maximum, le filtre devient instable et a tendance à osciller, introduisant une distorsion importante. Selon nous, ce composant devrait être le premier à être repensé. Cependant, il faut saluer le concepteur de la version actuelle, qui a réussi à faire fonctionner le système sur un Arduino UNO R3, une belle prouesse !


Le package logiciel complet du projet MiniPhonic est disponible en téléchargement sur la page Elektor Labs dédiée.
Des questions sur le projet Miniphonic ?
Vous avez des questions techniques ou des commentaires sur le projet MiniPhonic ou cet article ? Vous pouvez contacter la rédaction d’Elektor à editor@elektor.com.
Note de la rédaction : Le projet de plateforme de synthèse audio MiniPhonic a été publié à l’origine dans Elettronica IN.
Discussion (0 commentaire(s))