Le matériel:
Une carte MSP Launchpad (un investissement de $4.30, frais d'expéditions inclus!), un clavier MIDI, un câble MIDI, un connecteur MIDI femelle (DIN-5), résistances (220 Ω, 1 kΩ, 1,8 kΩ et 100 kΩ), un comparateur LM393 (ou solution équivalente pour élever à 5 volts le signal émis par le Launchpad), source de tension de 5 V.
Le circuit:
Tout d'abord il faut savoir que le launchpad émettra le signal MIDI par l'entremise de sa pin "P1.2". Toutefois, ce signal numérique de 3,3 V est inférieur à la norme MIDI qui est de 5 V; il faut donc ajouter un étage d'amplification (le comparateur LM393). Ce signal est ensuite acheminé à la broche 4 du connecteur MIDI (un câble MIDI achemine ce signal jusqu'à l'entrée "MIDI-IN" du clavier).
J'ai utilisé un LM393 parce que j'en avais sous la main. Il existe d'autres solutions possibles (un MOSFET, par exemple).
Le code:
Puisque j'ai utilisé Energia pour programmer le Launchpad, il s'agit d'un simple sketch Arduino.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/***************************************************** | |
* | |
* Sketch Energia permettant au Launchpad d'émettre | |
* des mesages MIDI. | |
* | |
* Mélodie: Fur Elise (Beethoven) | |
* | |
* Voir http://electroniqueamateur.blogspot.com/2012/08/envoi-de-messages-midi-par-le-msp430.html | |
* | |
* Inspiré d'un sketch pour Arduino par Tom Igoe | |
* ( http://www.arduino.cc/en/Tutorial/MIDI ) | |
* | |
* | |
******************************************************/ | |
#define tempo 70 | |
// définition des notes utilisées (en hexadécimal) | |
#define Mi2 0x28 | |
#define La2 0x2D | |
#define Mi3 0x34 | |
#define Sold3 0x38 | |
#define La3 0x39 | |
#define Si3 0x3B | |
#define Do4 0x3C | |
#define Mi4 0x40 | |
#define Sold4 0x44 | |
#define La4 0x45 | |
#define Si4 0x47 | |
#define Do5 0x48 | |
#define Re5 0x4A | |
#define Red5 0x4B | |
#define Mi5 0x4C | |
void setup() { | |
Serial.begin(31250); | |
} | |
void loop() { | |
melodie(); | |
noteOn(0x90, Mi4, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi4, 0x00); | |
delay(tempo); | |
noteOn(0x90, Sold4, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Sold4, 0x00); | |
delay(tempo); | |
noteOn(0x90, Si4, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Si4, 0x00); | |
delay(tempo); | |
noteOn(0x90, Do5, 0x45); | |
noteOn(0x90, La2, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, La2, 0x00); | |
delay(tempo); | |
noteOn(0x90, Mi3, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi3, 0x00); | |
noteOn(0x90, Do5, 0x00); | |
delay(tempo); | |
noteOn(0x90, La3, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, La3, 0x00); | |
delay(tempo); | |
noteOn(0x90, Mi4, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi4, 0x00); | |
delay(tempo); | |
melodie(); | |
noteOn(0x90, Mi4, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi4, 0x00); | |
delay(tempo); | |
noteOn(0x90, Do5, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Do5, 0x00); | |
delay(tempo); | |
noteOn(0x90,Si4, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Si4, 0x00); | |
delay(tempo); | |
noteOn(0x90, La4, 0x45); | |
noteOn(0x90, La2, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, La4, 0x00); | |
delay(tempo); | |
noteOn(0x90, Mi3, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi3, 0x00); | |
delay(tempo); | |
noteOn(0x90, La3, 0x45); | |
delay(8*tempo); | |
noteOn(0x90, La3, 0x00); | |
noteOn(0x90, La2, 0x00); | |
delay(tempo); | |
delay(8*tempo); | |
} | |
void melodie (void){ | |
noteOn(0x90, Mi5, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi5, 0x00); | |
delay(tempo); | |
noteOn(0x90, Red5, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Red5, 0x00); | |
delay(tempo); | |
noteOn(0x90, Mi5, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi5, 0x00); | |
delay(tempo); | |
noteOn(0x90, Red5, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Red5, 0x00); | |
delay(tempo); | |
noteOn(0x90, Mi5, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi5, 0x00); | |
delay(tempo); | |
noteOn(0x90, Si4, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Si4, 0x00); | |
delay(tempo); | |
noteOn(0x90, Re5, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Re5, 0x00); | |
delay(tempo); | |
noteOn(0x90, Do5, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Do5, 0x00); | |
delay(tempo); | |
noteOn(0x90, La4, 0x45); | |
noteOn(0x90, La2, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, La4, 0x00); | |
delay(tempo); | |
noteOn(0x90, Mi3, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi3, 0x00); | |
delay(tempo); | |
noteOn(0x90, La3, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, La3, 0x00); | |
noteOn(0x90, La2, 0x00); | |
delay(tempo); | |
noteOn(0x90, Do4, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Do4, 0x00); | |
delay(tempo); | |
noteOn(0x90, Mi4, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi4, 0x00); | |
delay(tempo); | |
noteOn(0x90, La4, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, La4, 0x00); | |
delay(tempo); | |
noteOn(0x90, Si4, 0x45); | |
noteOn(0x90, Mi2, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi2, 0x00); | |
delay(tempo); | |
noteOn(0x90, Mi3, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Mi3, 0x00); | |
delay(tempo); | |
noteOn(0x90, Sold3, 0x45); | |
delay(4*tempo); | |
noteOn(0x90, Sold3, 0x00); | |
noteOn(0x90, Si4, 0x00); | |
delay(tempo); | |
} | |
// envoi du message MIDI | |
void noteOn(int cmd, int pitch, int velocity) { | |
Serial.write(cmd); | |
Serial.write(pitch); | |
Serial.write(velocity); | |
} | |
La seule partie un peu "intéressante" est la routine "noteOn", à la toute fin, qui envoie un message midi par l'entremise de la pin TX (P1.2) du Launchpad:
void noteOn(int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
}
(Tout comme la version 1.0 de l'environnement Arduino, Energia requiert la commande "Serial.write" plutôt que "Serial.print" lorsqu'on veut envoyer des bytes.)
Le reste du sketch consiste à envoyer à la routine "noteOn" les notes appropriées, au moment approprié.
Yves Pelletier (Twitter: @ElectroAmateur)
Aucun commentaire:
Enregistrer un commentaire