J'ai exploré la communication entre un Arduino et un clavier musical par l'entremise du protocole MIDI. J'ai d'abord réalisé le circuit (très simple) proposé ici : il est constitué de quelques fils, une résistance de 220 Ω et un jack MIDI femelle, aussi appelés DIN5 (j'allais en commander un quand je me suis souvenu de mon antique interface Mac Man qui ne fonctionne plus avec mes ordinateurs actuels: j'ai donc récupéré ses 4 jacks MIDI).
Le code proposé sur la même page web se contente de jouer toutes les notes en ordre croissant. En plus d'émettre des message "note on", je voulais utiliser plusieurs canaux MIDI en même temps, chacun produisant le son d'un instrument distinct. C'est ce que j'ai réalisé avec le sketch ci-dessous.
J'ai assigné un son d'instrument aux canaux MIDI 0, 1 et 2 en me basant sur les spécifications du General MIDI . Par convention, le canal 10 est réservé aux percussions et n'est pas affecté par les messages "program change".
On joue une note par un message "note on" en spécifiant le canal, le numéro de la note (référence ici) et sa vélocité (son volume sonore, en gros). On interrompt la note de la même façon, en lui assignant une vélocité de zéro. Lorsqu'on oublie d'interrompre la note, ça peut être très laid!
Cette première expérimentation pourrait ouvrir la voie à des projets plus ambitieux comme exécuter des fichiers MIDI stockés sur une carte SD, ou construire un contrôleur MIDI...
-
-
Le code proposé sur la même page web se contente de jouer toutes les notes en ordre croissant. En plus d'émettre des message "note on", je voulais utiliser plusieurs canaux MIDI en même temps, chacun produisant le son d'un instrument distinct. C'est ce que j'ai réalisé avec le sketch ci-dessous.
J'ai assigné un son d'instrument aux canaux MIDI 0, 1 et 2 en me basant sur les spécifications du General MIDI . Par convention, le canal 10 est réservé aux percussions et n'est pas affecté par les messages "program change".
On joue une note par un message "note on" en spécifiant le canal, le numéro de la note (référence ici) et sa vélocité (son volume sonore, en gros). On interrompt la note de la même façon, en lui assignant une vélocité de zéro. Lorsqu'on oublie d'interrompre la note, ça peut être très laid!
Cette première expérimentation pourrait ouvrir la voie à des projets plus ambitieux comme exécuter des fichiers MIDI stockés sur une carte SD, ou construire un contrôleur MIDI...
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
/********************************************************************************************* | |
MIDI OUT DEMO | |
Ce sketch permet à l'Arduino de jouer une mélodie sur un clavier MIDI. | |
Plus d'infos: | |
http://electroniqueamateur.blogspot.com/2011/07/communication-midi-avec-un-arduino.html | |
**********************************************************************************************/ | |
/* On définit quelques notes qu'on va utiliser: ce sera plus pratique que les valeurs hexadécimales! | |
Voir http://www.wavosaur.com/download/midi-note-hex.php */ | |
#define NOTE_G2 0x2B | |
#define NOTE_C3 0x30 | |
#define NOTE_C4 0x3C | |
#define NOTE_D4 0x3E | |
#define NOTE_E4 0x40 | |
#define NOTE_F4 0x41 | |
#define NOTE_G4 0x43 | |
#define NOTE_A4 0x45 | |
#define NOTE_B4 0x47 | |
#define NOTE_C5 0x48 | |
#define NOTE_D5 0x4A | |
#define NOTE_E5 0x4C | |
#define NOTE_F5 0x4D | |
#define NOTE_G5 0x4F | |
#define NOTE_A5 0x51 | |
#define NOTE_B5 0x53 | |
// appelé pour jouer une note | |
void noteOn(int cmd, int pitch, int velocity) { | |
Serial.write(cmd); | |
Serial.write(pitch); | |
Serial.write(velocity); | |
} | |
// appelé pour modifier le timbre de l'instrument | |
void ProgChange(int channel, int prognumber) { | |
Serial.write(0xC0 + channel); | |
Serial.write(prognumber); | |
} | |
void setup() { | |
Serial.begin(31250); // réglage du baud rate à la norme MIDI | |
} | |
void loop() { | |
// préparation des instruments: | |
ProgChange(0, 34); // Bass guitar sur le canal 0 | |
ProgChange(1, 16); // orgue sur le canal 1 | |
ProgChange(2, 80); // synthé sur le canal 2 | |
// le canal 9 joue toujours des percussions | |
// on joue une courte mélodie: | |
noteOn(0x99, 42, 0x45); // Closed Hi-Hat | |
noteOn(0x99, 36, 0x45); // Bass Drum | |
noteOn(0x90, NOTE_C3, 0x45); // Basse | |
noteOn(0x92, NOTE_E5, 0x50); // Synthé | |
delay(200); | |
noteOn(0x99, 42, 0x00); // Closed Hi-Hat fin | |
noteOn(0x99, 36, 0x00); // Bass Drum fin | |
noteOn(0x92, NOTE_E5, 0x00); // Synthé fin | |
noteOn(0x99, 42, 0x45); // Closed Hi-Hat | |
noteOn(0x92, NOTE_D5, 0x50); // Synthé | |
delay(200); | |
noteOn(0x99, 42, 0x00); // Closed Hi-Hat fin | |
noteOn(0x90, NOTE_C3, 0x00); // Basse fin | |
noteOn(0x92, NOTE_D5, 0x00); // Synthé fin | |
noteOn(0x99, 42, 0x45); // Closed Hi-Hat | |
noteOn(0x99, 38, 0x45); // Bass Drum | |
noteOn(0x91, NOTE_C4, 0x65); // orgue | |
noteOn(0x91, NOTE_E4, 0x65); // orgue | |
noteOn(0x91, NOTE_G4, 0x65); // orgue | |
delay(200); | |
noteOn(0x99, 42, 0x00); // Closed Hi-Hat fin | |
noteOn(0x99, 38, 0x00); // Bass Drum fin | |
noteOn(0x99, 42, 0x45); // Closed Hi-Hat | |
delay(200); | |
noteOn(0x99, 42, 0x00); // Closed Hi-Hat fin | |
noteOn(0x91, NOTE_C4, 0x00); // orgue fin | |
noteOn(0x91, NOTE_E4, 0x00); // orgue fin | |
noteOn(0x91, NOTE_G4, 0x00); // orgue fin | |
noteOn(0x99, 42, 0x45); // Closed Hi-Hat | |
noteOn(0x99, 36, 0x45); // Bass Drum | |
noteOn(0x90, NOTE_G2, 0x45); // Basse | |
noteOn(0x92, NOTE_G5, 0x50); // Synthé | |
delay(200); | |
noteOn(0x99, 42, 0x00); // Closed Hi-Hat fin | |
noteOn(0x99, 36, 0x00); // Bass Drum fin | |
noteOn(0x92, NOTE_G5, 0x00); // Synthé fin | |
noteOn(0x99, 42, 0x45); // Closed Hi-Hat | |
noteOn(0x92, NOTE_E5, 0x50); // Synthé | |
delay(200); | |
noteOn(0x99, 42, 0x00); // Closed Hi-Hat fin | |
noteOn(0x90, NOTE_G2, 0x00); // Basse fin | |
noteOn(0x92, NOTE_E5, 0x00); // Synthé fin | |
noteOn(0x99, 42, 0x45); // Closed Hi-Hat | |
noteOn(0x99, 38, 0x45); // Bass drum | |
noteOn(0x91, NOTE_C4, 0x65); // orgue | |
noteOn(0x91, NOTE_E4, 0x65); // orgue | |
noteOn(0x91, NOTE_G4, 0x65); // orgue | |
delay(200); | |
noteOn(0x99, 42, 0x00); // Closed Hi-Hat fin | |
noteOn(0x99, 38, 0x00); // Bass drum fin | |
noteOn(0x99, 42, 0x45); // Closed Hi-Hat | |
delay(200); | |
noteOn(0x99, 42, 0x00); // Closed Hi-Hat fin | |
noteOn(0x91, NOTE_C4, 0x00); // orgue fin | |
noteOn(0x91, NOTE_E4, 0x00); // orgue fin | |
noteOn(0x91, NOTE_G4, 0x00); // orgue fin | |
} |
À lire également
Beaucoup d'autres projets MIDI avec l'Arduino:
- Fabrication d'un module MIDI (in et out) pour Arduino
- S'entraîner à lire les notes sur une portée avec Arduino
- Jouer des fichiers MIDI avec Arduino
- Séquenceur MIDI à base d'Arduino
- Arpégiateur MIDI à base d'Arduino
- Identificateur d'accords MIDI
- Clavier MIDI à base d'Arduino
- Pédalier d'orgue MIDI à base d'Arduino
- Flûte à bec MIDI à base d'Arduino
- MIDI par usb avec Arduino Leonardo
- MIDI sans fil avec Arduino
Yves Pelletier (Twitter: @ElectroAmateur)
Bonjour
RépondreSupprimerJe débute avec arduino et programmation je m'intéresse au midi, et je cherchais un exemple de changement d'instrument; le fameux "program change" je vais donc m'inspirer de votre sketch
Merci de faire partager vos connaissances; à la retraite, on a un peu de temps pour bricoler.
Je vois que vous parlez de lecture de fichier Midi sur carte SD, j'aimerais bien faire çà pour mon orgue de barbarie.
Comptez-vous développer ce projet et le faire partager?
Amicalement
Michel
Bonjour Michel,
RépondreSupprimerSi je réussis un jour à lire un fichier MIDI sur une carte SD, c'est certain que je vais m'en vanter sur ce blog... Mais ça risque d'être long: je progresse lentement...
Bonjour Yves
RépondreSupprimerMerci pour votre pour votre réponse et bon courage.
michel
Bonjour Yves
RépondreSupprimerQuelqu'un (Popsword) a fait exactement ce qui nous intéresse, mais je ne sais ni comment le contacter, ni s'il est prêt à partager son travail, car l'anglais et moi, on est fachés! J'ai fait l'erreur de prendre Espagnol, et je le paye très cher aujourd'hui.
Voici le lien qui me fait baver:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1294764466
Dis-moi si tu arrives à quelque chose.
Amicalement
michel
Oui, j'avais déjà lu cette discussion il y a quelques semaines. Malheureusement, l'auteur termine en disant qu'il ne fournira pas d'informations supplémentaires concernant son projet!
RépondreSupprimerRe
RépondreSupprimeroui, c'est malheureusement ce que j'avais cru comprendre. Comme quoi, tout le monde n'est pas prêt à partager!
Amicalement
michel
intéressan, et oui , dommage que sur le forum la personne ne veuille pas en dire plus.
RépondreSupprimerje viens de commander un arduino uno R3. tout ce que j'espère, c'est qu'avec, je pourrais enregistrer une séquence pianotée sur un clavier de synthé, et puis la rejouer si je veux, même en continu, et j'aimerais pouvoir ajuster la vitesse, kes paramètres de chaque note ( vélocité, longueur .. ) dites moi, estce que je me plante de direction ou est-ce que je peux espérer ? merci !
Bonjour Adrien,
RépondreSupprimerÇa peut certainement se faire, il reste à voir comment...
Bravo ! super partage, merci ! j'espère arriver à midifier mon pédalier
RépondreSupprimer