Sintenzillo

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.

Sintenzillo

Sommaire

  1. Le Hardware
    1. IC logique : 8-Bit Shift Register 74HC595N
    2. Module Bluetooth : HC-06
    3. La table de LEDs Sintenzillo
    4. La carte électronique
  2. Le Software (Android)
    1. Les librairies
    2. La communication Android-Arduino
    3. Les modes d'utilisation
    4. ScreenShots
  3. 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.

Pin config

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);
}

Sintenzillo_1

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();
}

HC_06_1 HC_06_2

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.

Sintenzillo_2 Sintenzillo_3

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.

Diagram

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.

carte

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.

Sintenzillo_4 carte_2

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

ScreenShot_2 ScreenShot_3

ScreenShot_1 ScreenShot_4

Downloads

L'archive Android Studio Project
L'archive du Sketch Arduino