C'est qwaaaaa ?
Il y a un certain nombre d'année, un copain possédait un de ces vieux synthétiseur électronique avec une centaine de chansons pré-enregistrées dessus.
C'était dément : les touches s'illuminaient selon ce que l'on devait jouer et pouf, en 30seconde on était un virtuose accompli du piano (ou presque).
La plupart des chansons étaient de moyenne, voir le plus souvent, de mauvaise qualité.
Cela importait peut, car on pouvait sauter la longue et pénible étape de déchiffrement d'une partition.
Le défaut des synthétiseurs c'est qu'ils ne sont pas particulièrement agréables au toucher.
Ils ne peuvent rivaliser dans ce domaine face au piano de salon et ses marteaux tapant sur les cordes d'acier.
Sintenzillo (Synthétiseur en Espéranto) s'utilise sur les pianos de salon afin de reproduire ce système de LEDs qui s'allument en fonction des notes à jouer propre aux Synthétiseurs. Le principe est simple : on pilote 88 LEDs correspondant aux 88 touches par un microControleur (Arduino Uno R3) qui receptionne les données de la partition par Bluetooth depuis un terminal Android.
Sommaire
- Le Hardware
- IC logique : 8-Bit Shift Register 74HC595N
- Module Bluetooth : HC-06
- La table de LEDs Sintenzillo
- La carte électronique
- Le Software (Android)
- Downloads
Le Hardware
IC logique : 8-Bit Shift Register 74HC595N DataSheet
Chaque LED du Sintenzillo nécessite d'être pilotée par une sortie unique du microControleur, 88 au total.
Aucun Arduino en possède autant nativement.
Grâce à cet IC, il est possible, et ce en utilisant uniquement trois sorties de l'Arduino, de multiplier virtuellement les sorties disponibles.
Deux lignes servent à la synchronisation (STCP et SHCP) et une ligne pour le passage des données (DS) afin d'activer/désactiver les sorties (Q0 - Q7).
On peut brancher ces ICs en série en reliant la data output Q7S à la data input DS d'un deuxième IC.
Dans cette configuration, lorsque l'on envoie l'information sur l'état des sorties à appliquer au premier IC, son état actuel sera transféré sur le deuxième IC.
Ce genre d'IC est si pratique que des fonctions pour son utilisation sont implémentées dans le software de programmation pour Arduino :
//DATA pour le pin DS, LOCK pour le STCP et CLOCK pour le SHCP
const unsigned short DATA = 11;
const unsigned short LOCK = 12;
const unsigned short CLOCK = 13;
void setup(){
// Bloque les sorties dans l'était actuel
pinMode(DATA, OUTPUT);
pinMode(LOCK, OUTPUT);
pinMode(CLOCK, OUTPUT);
// Bloque les sorties dans l'était actuel
digitalWrite(LOCK, LOW);
// Envoie des données : 4 pour le première IC et 1 pour le Deuxième
shiftOut(DATA, CLOCK, MSBFIRST, 1);
shiftOut(DATA, CLOCK, MSBFIRST, 4);
// Débloque les sorties pour afficher le nouvel état
digitalWrite(LOCK, HIGH);
}
Les deux pins de contrôle restantes ne seront pas utilisées dans ce projet et seront connectées respectivement au 0v pour OE (Output Enable - actif au niveau bas) qui régule si les données sont transférées d'un IC à l'autre et au 5v pour MR (Master Reset - actif au niveau bas) qui comme vous l'aurez compri reset nos ICs.
Module Bluetooth : HC-06 DataSheet
Un Bluetooth bon marché (merci Ebay et les commercants chinois) et facile d'utilisation sur l'Arduino. Deux pins d'alimentation (3.3v - disponible sur l'Arduino) et deux pins pour la communication (Tx pour le transfert et Rx pour la réception). Les pins 0 et 1 de l'Arduino sont prévues à cet effet. On branche le pin 0 de l'arduino (Rx) sur le pin Tx du HC-06 et vice versa. Dès lors on peut communiquer avec notre Arduino grâce à n'importe quel autre périphérique Bluetooth pairer à notre HC-06, dans notre cas un terminal Android.
Sketch Arduino :
char c;
void setup(){
// Initialise les ligne de communication de l'Arduino à 9600 baud/s (symboles par secondes), càd au réglage par défaut du HC-06 (modifiable).
Serial.begin(9600);
}
void loop(){
// Dès qu'un caractère est disponible on le lit.
if(Serial.available())
c = Serial.read();
}
La table de LEDs Sintenzillo
On utilise une conduite de fil électrique à la couleur du piano sur laquelle on perce des trous afin d'y loger nos LEDs, une petite pointe de colle permettra une meilleure tenue.
Les LEDs rouges représenteront les touches blanches alors que les jaunes les touches noires.
Les cathodes (pin -) des LEDs sont branchées en série afin de limiter les fils électriques dans cet espace restreint alors que les anodes (pin +) sont branchées aux sorties des ICs 74HC595N (11 ICs pour un total de 88 sorties).
Les ICs seront placées dans la conduite, si possible dans un espace suffisamment grand entre deux LEDs et également fixés avec une pointe de colle.
Ici j'ai utilisé de la colle de contact pour tout type de matériaux.
Ce genre de colle est efficace, mais attention : elle fait fondre la couche protectrice des ICs lorsque l'on en abuse.
La carte électronique
La tension d'alimentation des sorties étant de 5v, alors que celle d'une LEDs avoisine les 0.7v, des résistances en série avec nos LEDs sont nécéssaires pour la faire chuter.
Le circuit électrique le plus simple serait d'ajouter une résistance (100 Ohms) branchée entre l'anode de la LED et la sortie de l'IC Qx la pilotant.
Dans notre cas pour des raisons d'espace c'est impossible (de plus on devrait utiliser 88 résistances).
On va donc utiliser un circuit de plusieurs résistances en parrallèle entre les cathodes des LED (toutes les cathodes sont branchées en série avec un fil de retour unique) et le 0v.
Il nous faudra ensuite régler la valeur total de la résistance équivalente en fonction du nombre de LEDs allumée.
Ainsi lorsque trois LEDs sont allumées, on fera notre retour par trois résistances de 100Ohms en parallèle.
Etant donné qu'il me restait des ICs 74HC595N, j'ai décidé de les mettre à profit pour activer/désactiver le retour par les résistances.
On branche nos résistances aux sorties de l'IC puis on pilote notre résistance équivalente ainsi: en mettant la sortie à un niveau bas (0v) on ajoute une résistance au circuit et en mettant la sortie à un niveau haut (5v) on l'enlève.
De plus, des diodes seront branchées à chaque sortie pour éviter tout courant électrique lorsqu'elles sont au niveau haut.
Avec un IC on peut ainsi piloter jusqu'à huit résistances.
On en utilisera donc deux pour le cas ou le morceau de piano nécessiterait de jouer à dix doigts.
Le Software (Android)
Les librairies utilisées sous l'Apache License
Pour l'affichage d'image SVG : ici et ici
J'aime beaucoup le format SVG, il nous permet d'avoir une haute résolution quelle que soit la taille de l'écran. En effet il s'agit d'un format de fichier vectoriel. La plupart des tutos de programmation Android vous diront d'utiliser différente images matricielles de plusieurs résolutions différentes puis de choisir la bonne en fonction de la taille de l'écran. Personnellement je trouve qu'une telle solution est plus contraignante qu'autre chose.
Pour la lecture/écriture de fichier MIDI : ici
Le format MIDI est le type de fichier musical vers lequel je me suis tourné pour ce projet.
Très répandu, on trouve facilement presque n'importe quelle musique existante sur internet.
Il est encodé sous la forme d'événement à enclencher à un moment précis.
Par exemple un événement de type NoteOn indique que l'on commence à jouer une note.
Cet événement possède trois attributs principaux : Value qui est la hauteur de la note ,Velocity qui indique le volume et Tick qui indique à quel moment enclencher cet événement.
Les événements principaux utiles à ce projet sont : NoteOn/NoteOff, Tempo ainsi que ProgramChange (qui lui sert à différencier quel instruments sont utilisés dans le fichier MIDI).
La communication Android-Arduino
Une fois notre fichier MIDI déchiffrer sous Android, il nous faudra formater les données sous une autre forme afin de les envoyer à l'Arduino. Dans ce but, on regardera à chaque apparition d'un nouvel événement quels sont les NoteOn actifs et à quel Tick ce changement se produit. Dès lors on saura quelles LEDs doivent être allumées à quel instant. Le transfère Bluetooth ayant lieu en caractère ASCII une ligne complète de données formatées ressemble à :
'001000128000000000000000000000000255252'
Chaque IC utilisera trois caractères de cette chaîne pour se configurer. Le dernier des ICs en série (celui pour les notes les plus haute du piano) recevra le code 001 c'est-à-dire 00000001 en binaire (8e note la plus haute allumée) le deuxième recevra 000, le 3e 128 (10000000) et ainsi de suite. Les deux premiers ICs étant ceux du circuit de résistances reçoivent des valeurs clairement différentes : 255 (11111111) afin de n'activer aucune résistance et 252 (111111100) afin d'en activer deux.
Les modes d'utilisation
MIDI player
Permet de jouer les fichiers midi sur l'Android sans utiliser Sintenzillo.
Normal
Dans ce mode, le morceau défilera sur le Sintenzillo que vous jouez ou non en même temps. Il est possible de lire la musique sur l'Android simultanément, d'accélérer/ralentir la vitesse de lecture, choisir une boucle de lecture (de la minute une à deux du morceau par exemple) et d'utiliser les commande principale de Pause, Stop et Reset.
arrangement du thème de -The Legend Of Zelda- réalisé par BestOfAccordeon
Learning
Ici on utilise le micro du téléphone qui détectera les pics d'amplitude sonore afin de déterminer si de nouvelle notes ont été jouées pour avancer le morceau.
ScreenShots
Downloads
L'archive Android Studio Project
L'archive du Sketch Arduino