Le protocole MIDI, bien connu de tous les musiciens, existe depuis bientôt trente ans. Si à l'origine MIDI servait surtout à interfacer des claviers, on trouve maintenant des interfaces MIDI sur les instruments les plus inattendus: guitares, saxophones, batteries etc. En général on se sert de MIDI pour enregistrer ou piloter un instrument, mais ne pourrait-on pas l'utiliser pour piloter de l'éclairage? Pour le savoir, il suffit d'essayer...
L'idée est des plus simple: elle consiste à relier un instrument compatible MIDI à un ordinateur, à capturer les événements midi depuis l'ordinateur, et à allumer des projecteurs en fonction des notes jouées sur l'instrument en utilisant des relais.
Pourquoi ne pas piloter l'éclairage via le protocole MIDI?
Le hardware
Sur le papier, ce n'est donc pas très compliqué. Dans la vraie vie, c'est un projet qui demande un peu de préparation et pas mal de travail. Pour l'instrument MIDI on a choisi une batterie, parce qu'on en avait une sous la main. Pour les projecteurs on s'est contentés de 16 projecteurs de chantier halogènes de 400W chacun, achetés quelques euros pièce sur internet. Ces projecteurs seront pilotés par 2 modules Yocto-MaxiRelay.
Des projecteurs de chantier avec des filtres colorés pour la lumière
Et des Yocto-MaxiRelay pour les commander
La principale difficulté de ce projet est le câblage: il faut interconnecter les 16 projecteurs avec les 2 Yocto-MaxiRelay. On se rend vite compte que si tous les projecteurs sont allumés à la fois, il va falloir fournir 6400W, soit près de 30A sous 220V, bien plus que ce que les 16A que l'on peut espérer tirer d'une prise électrique standard. Il nous faut donc utiliser du courant triphasé, ce qui ne va pas simplifier le câblage. Il faut aussi que le câblage présente un niveau de sécurité raisonnable lors l'utilisation du système. On a donc choisi d'utiliser une caisse de rangement dans laquelle on placera tout le câblage et l'électronique de commande. Cette caisse aura en entrée une prise triphasée, un port USB et en sortie seize prises standard permettant d'alimenter chacune un projecteur.
A l'intérieur de la caisse, il y aura donc nos deux Yocto-MaxiRelay, un Micro-USB-Hub parce qu'on a pas envie de tirer deux cables USB pour piloter nos deux Yocto-MaxiRelay, et enfin une alimentation 220v->5V pour alimenter le micro-hub parce les Yocto-MaxiRelay consomment trop pour être alimentés depuis un seul port USB.
Ça a l'air un peu compliqué, mais ce n'est qu'une multiprise géante contrôlée par USB
Un aller-retour au magasin de bricolage plus-tard, nous disposons de tout le matériel pour construire ce qui en fin de compte n'est une multi-prise commandée géante.
Tout est là, y'a plus qu'à commencer la construction
La partie puissance: un étage pour la terre, un pour les phases, et le dernier pour le neutre
Le hub USB et son alimentation externe
On installe tout ça dans la caisse
Et voila! y'a plus qu'à tester
Le Soft
Contre toute attente, la partie soft est des plus simple. Le support MIDI existe en natif dans Windows depuis XP. Ainsi Il est relativement aisé de se construire une librairie qui appelle un callback à chaque nouvelle note jouée. Le contrôle des relais, quand à lui est l'affaire de deux lignes de code. On a choisi d'implémenter tout ça en C#. Voici les deux fonctions clefs du projet, à savoir l'initialisation du hardware et le callback MIDI.
{
// open Midi port
if (MIDI.InputPort.InputCount == 0)
{
m = null;
log("Cannot find MIDI instrument");
}
else
{ // sets the midi callback
m = new MIDI.InputPort(MidiProc);
m.Open(0);
m.Start(); // and start the capture
}
// use local Yocto-devices
string errmsg = "";
yAPI.DisableExceptions();
if (YAPI.RegisterHub("usb", ref errmsg) != YAPI.SUCCESS)
{
log("Error opening Yoctopuce API: " + errmsg);
return;
}
// enumerate all 16 relays functions
relays = new YRelay[RelaysCount];
for (int i = 0; i < RelaysCount; i++)
{
relays[i] = YRelay.FindRelay("R" + i);
if (!relays[i].isOnline()) log("Relay R" + i + " is offline");
}
}
/*
* MIDI callback: each time a note is played, this callback will be called.
* We just have to activate the relays according to the note played.
*/
public void MidiProc(IntPtr hMidiIn, int wMsg, IntPtr dwInstance,
int dwParam1, int dwParam2)
{
if (wMsg != 0x3c3) return; // handle midi data only
if ((dwParam1 & 0xff) != 0x99) return; // handle notes only
int velo = (dwParam1 >> 16) & 0xff;
int note = (dwParam1 >> 8) & 0xff;
int channel = note % 16; // direct circular mapping
relays[channel].pulse(2 * velocity + 50);
}
Si vous avez envie d'essayer chez vous, le reste du projet se trouve ici. Le projet complet est aussi capable de piloter des Yocto-Color ou des Yocto-PowerColor qui sont un peu plus faciles à manipuler que des projecteurs 400W.
Une fois que tout est prêt, il n'y a plus qu'à attendre la tombée de nuit pour voir si l'effort en valait la peine, ou si on aurait pu se contenter d'un modulateur de spots à 40 francs. A vous de juger:
Remerciements
Sur ce coup-là on a eu pas mal d'aide extérieure: Merci à Jiri pour les prises de vues. Merci à François pour la gestion du son. Et surtout merci à Harold pour sa prestation à la batterie, y'a pas à dire, batteur c'est un métier.
Enfin, merci à nos voisins, qui ont su rester zen alors qu'on a enfumé tout le quartier :-)