Par Florent Ecochard
Salut!
Cet article ne va pas parler de robotique mais plutôt de MAO: musique assistée par ordinateur. Vous avez déjà du entendre parler de Fruity Loops (ou bien FL studio, son autre nom), de Reason ou bien de Ableton Live, ou encore de Traktor/VirtualDJ. Tout ces logiciels sont des logiciels permettant la composition/le mix de musique.
Ayant depuis quelques temps commencé à m’amuser un peu sur ces logiciels (voici un tuto pour ceux qui voudraient s’y initier), je me suis dit que ce serait sympa de fabriquer des contrôleurs permettant de gérer les différents effets du logiciel de façon plus ergonomique.
L’idée était d’avoir un boîtier contenant plusieurs potentiomètres, faders et autres boutons, le tout connecté à un « cerveau » envoyant le message MIDI à l’ordinateur. N’ayant pas de fiche midi ni d’interface MIDI-USB, j’ai également cherché à faire passer le message via le pseudo-USB de l’Arduino (celle-ci utilise un protocole série intégrée dans un connecteur USB).
Je vais donc vous expliquer la procédure que j’ai suivi!
I. La partie informatique 1: les logiciels à installer
Cette partie vous explique comment configurer votre ordinateur pour qu’il interprète le signal série de l’Arduino comme un signal MIDI classique. Je vous previens tout de suite, je suis sous windows donc certains logiciels que je vous ferais installer ne marchent pas sous Mac/Linux, j’éditerai ce tuto lorsque je connaîtrais la procédure complète pour ces deux OS…
Il y a deux logiciels à installer: LoopBe1 et Serial-MIDI converter.
a) un port MIDI virtuel: LoopBe1
LoopBe1 est un petit logiciel qui permet d’émuler un port MIDI afin de permettre à d’autres logiciels de communiquer entre eux via le MIDI. Dans notre cas, il va permettre au signal MIDI généra par notre SM_converter d’être interprété par les logiciels de MAO comme un signal provenant d’un port MIDI classique (oui je sais, je répète souvent MIDI mais y’a pas vraiment de synonymes 😉 ). Voici le lien vers la page de téléchargement.
b) le convertisseur Serial<–>MIDI
Le deuxième logiciel à installer va nous permettre de convertir les données série (ou plutôt série via USB) envoyées par la Arduino en données MIDI interprétables par le logiciel ; et vice et versa.
C’est une petite GUI en Processing développée par Spiekenzielabs, à télécharger ici. Ne faites pas comme ils vous disent: n’installez pas MidiYoke, passez directement à la fin de la page où se trouvent les liens de téléchargement pour SMv2d (ou plus récent si il y a)
II. le circuit électronique
C’est tout ce qu’il y a de plus simple: des potentiomètres/faders branchés en pont diviseur de tension dont la sortie va sur des entrées analogiques de la Arduino:
III. le code Arduino
J’ai entièrement commenté le code donc rien à dire de plus 😉
// TRAME MIDI (cccc = canal):
// |===============MESSAGE=================|============DONNEE1============|=========DONNEE2==========|
// | 1000 cccc = note off => 128(10) | 0xxx xxxx: hauteur note | 0xxx xxxx: vélocité |
// | 1001 cccc = note on => 129(10) | 0xxx xxxx: hauteur note | 0xxx xxxx: vélocité |
// | 1110 cccc = pitch bend => 224(10) | 0000 0000: code | 0xxx xxxx: vitesse |
// | 1011 cccc = control change => 176(10) | 0xxx xxxx: numero | 0xxx xxxx: valeur |
// --------------------------------------------------------------------------------------------------
//========================
//Analog pin ZERO
int valuePinZero=0;
int valuePinZero2=0;
//Analog pin ONE
int valuePinOne=0;
int valuePinOne2=0;
//Analog pin TWO
int valuePinTwo=0;
int valuePinTwo2=0;
void setup()
{
Serial.begin(57600); // vitesse de communication
}
void loop()
{
//controleur ZERO
//————————
valuePinZero = (analogRead(0)/8); //lecture de la valeur du potentiomètre
if (valuePinZero-valuePinZero2 >=2 || valuePinZero2-valuePinZero >=2) { //si cette valeur varie de plus de 2 entre deux lectures...
valuePinZero2 = valuePinZero; //...on actualise
MIDI_TX(176,75, valuePinZero); //et on envoi un message du type (CONTROLLEUR CANAL 0, NUMERO 75, VALEUR = valeur lue) ==> voir tableau
//delay(100); //pour le debuggage
}
//controleur ONE
//————————
valuePinOne = (analogRead(1)/8);
if (valuePinOne - valuePinOne2 >=2 || valuePinOne2 - valuePinOne >=2)
{
valuePinOne2 = valuePinOne;
MIDI_TX(176,76, valuePinOne);
//delay(100);
}
//controleur TWO
//————————
valuePinTwo = (analogRead(2)/8);
if (valuePinTwo - valuePinTwo2 >=2 || valuePinTwo2 - valuePinTwo >=2)
{
valuePinTwo2 = valuePinTwo;
MIDI_TX(176,77, valuePinTwo);
//delay(100);
}
}
void MIDI_TX(unsigned char MESSAGE, unsigned char DONNEE1, unsigned char DONNEE2) //fonction d'envoi du message MIDI ==> voir tableau
{
Serial.write(MESSAGE); //envoi de l'octet de message sur le port série
Serial.write(DONNEE1); //envoi de l'octet de donnée 1 sur le port série
Serial.write(DONNEE2); //envoi de l'octet de donnée 2 sur le port série
}
Il vous reste juste à uploader le code sur votre carte 😉
IV. La configuration des différents logiciels
La première chose à faire une fois que votre carte est prête avec le code dessus et le circuit branché est de lancer LoopBe1 (il doit se lancer automatiquement normalement).
Ceci fait, il vous faut lancer SM_v2d (serial-midi converter) et le configurer:
a) choix du port
le logiciel va vous lister tous les ports ouverts, vous devez sélectionner celui correspondant à votre carte. Tapez la lettre correspondante (A pour moi)
b) selection de la vitesse (baud rate)
La vitesse est définie dans le programme Arduino, j’ai mis 57600 (touche E).
c) Choix du port d’entrée
Le port à choisir est notre port virtuel, LoopBe (touche A):
d) port de sortie
Ce choix n’est pas très important étant donné qu’on ne gère que l’entrée Arduino, mettez quand même LoopBe (touche D):
e) récapitulatif
ça y est, c’est configuré: le logiciel vous affiche un récapitulatif de la config. Ne fermez pas la fenêtre, elle doit rester ouverte tant que vous voulez utiliser votre contrôleur…
V. Le réglage du logiciel de MAO
Dans cette partie je détaillerai uniquement le réglage pour FL studio parceque c’est le seul que je connaisse mais quel que soit le logiciel, la procédure est la même que pour n’importe quel contrôleur MIDI.
Voilà comment il faut procéder:
Appuyer sur F10 pour afficher la fenêtre de réglages MIDI:
Vous cliquez sur LoopBe1 Internal MIDI dans l’onglet Input, et vous cochez Enable. Vous pouvez ensuite fermer la fenêtre.
Ensuite, clic droit sur le paramètre que vous souhaitez contrôler (ici le volume maître)
Cliquez sur Link to controller , une pop-up s’ouvre:
Tournez simplement le potentiomètre que vous souhaitez utiliser et le tour est joué: il contrôle le volume! Vous pouvez affecter un effet à chacun des trois potentiomètre du montage, et si vous voulez changer le paramètre qu’il dirige, refaites simplement la manip avec le nouveau paramètre: FL Studio supprimera automatiquement l’affectation précédente 😉
VI. Video
Si vous avez une question, une correction à apporter ou un commentaire à faire, LâsHé vÔ kOmz!!









Bonjour,
J’ai réussi à mettre en place votre tuto sur un mac mais je ne comprends pas comment l’utiliser proprement pour un simple bouton.
Ma question est simple quelle valeur dois-je mettre dans la fonction midi_tx dans le cas d’un simple bouton.
Cdt
Jon
Salut!
tout d’abord désolé de répondre aussi tard
Donc pour envoyer une note lors de l’appui sur un bouton vous devez preciser à la fonction MIDI_TX que c’est un message NoteOn que vous envoyez, puis la hauteur de la note et enfin sa vélocité.
Le nibble correspondant à NoteOn est 1001(2), c’est à dire 129(10). Ainsi, pour un A0 (21 en MIDI) de vélocité 127, vous devez appeler MIDI_TX de cette façon:
MIDI_TX(129,21, 127);
N’oubliez pas d’ensuite envoyer un NoteOff (nibble 1000(2) 128(10)) soit lors du relâchement du bouton, soit après un delay 😉
La liste des numeros MIDI pour chaque note est présente ici: http://www.phys.unsw.edu.au/jw/notes.html
J’espère avoir répondu à ta question et encore une fois je suis désolé pour le retard!
boujour a tous
j’ai un petit probleme avec l’envoya de note, je fait tous comme froblog a dit mais sa marche pas, par contre avec le controleur (176) sa marche nickel , pouvait vous m’aider?
j’aimerais atribuer un note a un bouton poussoir (jutilise reason).
merci a tous de votre aide. 🙂
seb976
c’ est bon j’ ai trouvé mon noteon et en 144 et noteoff 129 sous reason.
merci pour ce super tuto. 🙂 🙂
Ravi d’avoir pu t’aider 😛
I added a 4th potentiometer and this is my code
int valuePinZero = 0;
int valuePinZero2 = 0;
// Analog pine ONE
int valuePinOne = 0;
int valuePinOne2 = 0;
// Analog pin TWO
int valuePinTwo = 0;
int valuePinTwo2 = 0;
// Analog pin THREE
int valuePinThree = 0;
int valuePinThree2 = 0;
void setup ()
{
Serial.begin (57600); // communication speed
}
void loop ()
{
// Controller ZERO
// ——–
valuePinZero = (analogRead(0)/8); // read the value of the potentiometer
if (valuePinZero-valuePinZero2 >=2 || valuePinZero2-valuePinZero >=2) { // If this value varies by more than 2 between reads …
valuePinZero2 = valuePinZero; //…on updates
MIDI_TX(176,75, valuePinZero); // and send a message like (CHANNEL CONTROLLER 0, NUMBER 75 VALUE = read value) ==> see table
// Delay (100); // For debugging
}
// Controller ONE
// ——–dropoff Window
valuePinOne = (analogRead(1)/8);
if (valuePinOne – valuePinOne2 >=2 || valuePinOne2 – valuePinOne >=2)
{
valuePinOne2 = valuePinOne;
MIDI_TX(176,76, valuePinOne);
// Delay (100);
}
// TWO Controller
// ——–dropoff Window
valuePinTwo = (analogRead(2)/8);
if (valuePinTwo – valuePinTwo2 >=2 || valuePinTwo2 – valuePinTwo >=2)
{
valuePinTwo2 = valuePinTwo;
MIDI_TX(176,77, valuePinTwo);
// Delay (100);
}
// THREE Controller
// ——–dropoff Window
valuePinThree = (analogRead(4)/8);
if (valuePinThree – valuePinThree2 >=2 || valuePinThree2 – valuePinThree >=2)
{
valuePinThree2 = valuePinThree;
MIDI_TX(176,78, valuePinThree);
// Delay (100);
}
}
void MIDI_TX(unsigned char MESSAGE, unsigned char data1, unsigned char data2) // send function of the MIDI message ==> see table
{
Serial.write (MESSAGE); // send the message byte to the serial port
Serial.write (data1); // send the data byte 1 of the serial port
Serial.write (data2); // send the data byte 2 on the serial port
}
I added the THREE controller parts of the code for the extra potentiometer.
Is there a way to add a toggle on/off button to this code?
Is there also a way to make it so that my 4th pot is connected to Analog 3 instead of 4? Because It doesn’t work when I try to connect it to 3.
Bonjour,
Je suis actuellement en Terminale STI2D sur un lycée de l’agglomération Nantaises. Et je suis confronté a un projet pour le BAC. Mon projet consiste tout simplement a créer un controleur MIDI avec a dispositions des boutons et potentiometre, une care arduino nano(ou plusieurs) ou arduino uno, d’un PC, d’arduino et processing et tout logiciels souhaités.
Seulement je suis face a un soucis a propos de ce controleur MIDI. J’ai pourtant suivi le TUTO qui est un très bon debut pour mon projet.
Cependant, est-ce possible de rentrer en contact pour discuter de tout cela et eventuellement échanger a ce porpos .
Nous restons, moi et le reste de mon groupe, a votre disposition en attendant votre réponse.
Cordialement
P.S: je suis disponible tout le temps par email et sinon demain matin durant 4h je suis en projet justement.
Cordialement
Salut!
Demain je serai en cours mais si vous avez des questions vous pouvez soit les poser ici (si elles sont susceptibles d’aider les lecteurs de l’article,) soit par email à blogderobotique @ gmail.com , je me ferais un plaisir de vous aider! C’est quoi comme type de projet? l’équivalent d’un PPE?
p-s: j’ai supprimé ce que je pensais être un commentaire doublon sur la page « à propos », est-ce bien vous? (que je le « désupprime » si ce n’est pas un doublon)
Bonjour,
ma question tourne plus sur le hardware : savez-vous comment brancher plus de six sorties analogiques sur une carte Arduino Uno? On m’a parlé de shield, mais je n’ai pas trouvé plus d’information, sur où les trouver ou comment les fabriquer… Je débute plus en électronique qu’en informatique, et on m’a dit de bien faire attention avec les composants car une erreur peut coûter très cher. J’aimerai bien arriver à un résultat optimal, mais ce nombre de sorties me bloque dans mes projets. Si vous connaissez la solution, merci d’avance !
Baptiste
Salut!
Tu as 2 solutions, la moins chère mais plus compliquée et la plus facile mais plus coûteuse.
La solution la moins chère et la plus personnalisable est d’utiliser des multiplexeurs tels que le CD4067BE qui sont des petits circuits intégrés te permettant d’augmenter tes E/S analogiques. tu peux en brancher plusieurs en cascade afin d’avoir encore plus d’E/S! Il existes plusieurs bibliothèques arduino et les schémas qui vont avec pour ce type de C.I. , je te laisse googliser tout ça!
La solution de facilité mais moins performante et plus chère est d’acheter une carte d’extension des E/S en kit ou prémontée telle que celle-ci: http://www.arobose.com/shop/cartes-d-extension-robot/15-module-i-o-expansion-pour-arduino.html
j’espère t’avoir aidé!
p-s: des mots clés qui pourraient te servir dans tes recherches: « i/o expender » et « arduino multiplexer library » en anglais, et « extension E/S » et « bibliothèque multiplexeur arduino » en français 😉
Florent
Merci beaucoup pour tes conseils, je suis rentré dans une association qui fait des bidouilles entre temps et ils m’ont dit à peu près la même chose que toi. Le code que tu as compilé est encore difficile à comprendre mais je progresse !
Pas de problème! N’hésite pas si tu as d’autres questions
Bonjour,
J’ai suivis ton tuto et j’ai un petit problème quand je contrôle le volume comme ta vidéo. J’ai bon tourner mon potentiomètre le volume ne monte que très légèrement voir oscille comme si il y avait des erreurs de transition. Et au bout de quelques seconde loopbe1 mute le port MIDI et me dit :
« error : Do not connect MIDI OUT and MIDI IN of loopbe1 within a single application »
Quand je dé mute ca refonctionne mais j’obtiens de nouveau le message d’erreur quand je tournes le potentiomètre
J’ai vu que sur le site d’arduino il y a un tuto midi, c’est quasiment le même code que toi mais pour des boutons. Le baute rate est à 31250, j’ai essayer avec celui-la, je n’ai plus les messages d’erreurs de loopbe1 mais je ne contrôle plus rien, ou enfin si je contrôle tout dans le programme de façon aléatoire : volume général, play, stop, son de mon séquenceur. Tout dépend de la vélocité à la quelle je tourne mon potentiomètre.
Salut!
Ça m’a déjà fait cette erreur, c’est effectivement un problème de vitesse… Une solution est de placer quelques delay à certains endroits de ton code. Pourrait tu me le copier afin que je puisse t’aider plus efficacement?
J’ai ajouté dans un premier temps un délais de 10ms juste a la fin du test. Cela n’a pas fonctionné, J’ai par contre remarqué que mon potentiomètre était mal connecté, erreur dans mon cablage et je l’ai fait grillé … J’ai recommencer avec un autre en mettant une résistance de protection de 220ohm en série et ca ça fonctionne sans prob.
Griller un potentiomètre? T’as fait fort ^^ Une résistance de protection pour un potentiomètre me parait assez étrange (L’Arduino sors max 5V 40mA c’est-à-dire 0.20W, en sachant que ton potentiomètre doit à priori tenir 1/2W je vois pas comment tu peux le cramer) mais tant que ça marche, tout va bien 😉 C’est un potentiomètre de quelle valeur? Tu pourrais m’expliquer l’erreur de câblage que tu as faite? C’est juste pour essayer de comprendre, tu n’es pas obligé de me répondre 😛
c’était un pot de 500k. En fait j’ai connecté la pin de gauche sur le 5 volt la pin du milieu sur la masse et celle de droite sur l’entrée analogique de l’arduino (je me suis trompé avec la couleur de mes fils). Une fois le pot tourné a fond vers la droite la résistance s’approche de 0 ohm. Cela fait presque un court circuit, j’ai du le laisser 1 minute comme ça quand je me suis rendu compte qu’il y avait une lumière rouge dans le pot. Je me suis dit : « tiens il y a une led dans le pot pour prévenir qu’il est a fond a droite et qu’il faut pas le laisser comme ça… depuis quand il y a une led dans un pot ??? » et puis l’odeur et la fumée sont venues. Résultat j’ai mit une résistance de 220 ohm en série dans le cas ou je laisse mon autre pot dans le même état que le précédent en me trompant dans le câblage :p
Haha tu as de la chance, tu aurais pu cramer le régulateur de ta carte arduino ^^
Bonjour, j’aimerais avoir si quelqu’un à déjà créer un contrôleur midi avec arduino mais pas avec des potentiomètre mais des capteurs a infrarouge car je possède quelque problème car il m’aie impossible de connecter deux capteurs en même temps car l’un prends la priorité sur l’autre.
Je ne comprends pas très bien ton problème de priorité… Pourrais tu publier ton code ou bien m’expliquer ton problème plus en détail? j’ai déjà utilisé des capteurs IR pour du contrôle MIDI et je n’ai pas eu de souci…
Non c’est bon j’ai trouvé la solution c’etait un problème d’affectation sur le logiciel
Tant mieux alors 😉
Hello can you please help me with the use of IR sensors for midi control please with some code because I was trying to adapt your code to mine but I have a problem in the line 24 Serial.begin (57600); it says too few arguments to function MIDI_tx can you help me with that please. THANKS
Could you send me your exact code so I know where the problem is? At first sight it seems that you haven’t sent all the parameters needed in the MIDI_tx function but the problem could come from the way you read your sensor’s value… I can’t provide you further help without your code
[…] 3ème méthode était de connecter en USB l’Arduino sur le PC et récupérer grâce à un logiciel la liaison série en la convertissant en MIDI. Finalement j’ai choisi cette méthode même si il y a un temps […]
Salut frog, j’ai testé et ça marche nickel. la j’en suis à 9 potar 🙂
J’ai remarqué que pour les buggs, cela venait du cable usb pour mon cas, prob résolu.
J’ai une petite question à propos des boutons, je voudrais que mes boutons controlent le mute/solo dans le pattern par exemple (pas de piano roll), avec le noteOn&Off ça peut le faire ?
Oui normalement t’as deux possibilités: soit un noteOn/Off, soit un controlChange avec 0/127 comme valeurs: le bouton est ouvert tu envoies 0, le bouton est fermé tu envoies 127! Les deux cas sont sensés être gérés par FL studio, à toi de faire ton choix 😉
EDIT: je vois que tu as un SoundCloud, n’hesite pas à faire une perf et à me filer le lien que je le mette dans l’article 😀
[…] https://2froblog.wordpress.com/2012/07/19/controleur-midi-via-lusb-avec-arduino-49/ […]
Bonjour, bien que tout soit très clair dans le tuto (merci au passage), je n’y connais vraiment pas grand chose.
Est-il possible de clarifier un point?
Voila :
//controleur ONE
valuePinOne = (analogRead(1)/8);
if (valuePinOne – valuePinOne2 >=2 || valuePinOne2 – valuePinOne >=2)
Cela concerne le (analogRead (1)/8).
Si (1) équivaut à l’emplacement du pin où s’insert le potard, Que signifie le /8 ?
Est- ce le nombre de pins global sur la carte?
Pourtant les entrées vont de 0 à 5, soit 6…
Salut! C’est pour diviser la valeur renvoyée par analogread qui est codée sur 10 bit (de 0 à 1023) car un message midi est codé sur un octet (de 0 à 127) : 1023/8~=127
J’aurais pu aussi écrire :
map(analogread(0), 0, 1023, 0, 127);Je t’invite à te renseigner sur cette fonction qui est très utile (j’aurais d’ailleurs mieux fait de l’utiliser dans mon code)
Ah Ok, rien à voir avec le positionnement de la broche alors. Je vais me renseigner sur cette fonction. merci.
Salut !
J’ai fait un code un peu plus simple et n’ayant pas de bugs (pour moi en tout cas).
J’ai ajouté un delay entre « po1=analogRead(0)/8 » et « if( p01 != p02 ) » pour qu’il ne s’emballe pas, afin d’avoir la mesure juste.
!= veut dire « différent de ». Voilà pourquoi la mesure doit être exact !
Voilà le code pour un potar:
int p01; int p02; void setup() { Serial.begin(9600); } void loop() { p01 = analogRead(0)/8; delay(10); if(p01 != p02 ) MIDI_TX(176,75,p01); p02 = p01; delay(10); } void MIDI_TX(int command,int MIDInote, int MIDIvelocity) { Serial.write(command); Serial.write(MIDInote); Serial.write(MIDIvelocity); }Effectivement c’est plus logique mais la raison pour laquelle j’ai laissé un intervalle de 2 est que parfois un bruit peut venir légèrement perturber la mesure (surtout si tes fils sont longs et mal isolés) et ainsi faire varier la valeur de p01 et remplir ta condition… le delay est aussi une bonne idée : il permet au programme de ne pas aller plus vite que le baudrate du protocole midi! Merci pour ce feedback 🙂
hello, i tried the code
says too few arguments to funtcion void MIDI_TX(int,int,int)
my setup:
https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-xpa1/v/t34.0-12/10846673_757058897675932_490389259_n.jpg?oh=c25528f08ad9268f606c528e8c23aa43&oe=5482861E&__gda__=1417832001_fde3f9242b744ac18e8087a464179afd
plz helpz
c genial le code mais pour mettre des platine on fe comment (je connait que tres peu de code pour l’arduino)
Que veux tu dire par platine? Des jogwheels de type contrôleur DJ? Renseigne toi sur les encodeurs rotatifs (ou roues codeuses) et si tu ne comprends pas comment t’en servir reviens me voir je t’écrirai un petit code 😉
Hello, i think that i saw you visited my site thus i came to “return the favor”.I’m attempting to find things to improve my web site!I suppose its ok to use some of your ideas!!
Well of course you can, though i’m not sure that both our sites are on the same topic…
salut , étant programmateur arduino de bon niveau et musicien , je me suis lancé dans le projet d’un launchpad arduino .. le seul probleme c’est que j’ai pas trop compris comment envoyer un signal midi recueilli par un bp help me pls 😀
Je ne sais pas si tu as lu le commentaire de Jon (premier commentaire sur cet article) qui avait la même question que toi… Tu bloques sur la détection de l’appui ou sur l’envoi du message MIDI?
Vois si la réponse que j’ai donné à Jon te convient, et si tu ne comprends toujours pas dis-le moi j’essaierai de t’expliquer plus clairement ^^
en effet ^^ j’avais pas compris , mais en relisant … c’est plus clair O.O merci pour ce tuto sinon 😀
Pas de problème, content d’avoir pu aider! 🙂
Salut à toi !
je m’y suis remis et il y a du nouveau 🙂
Ajout d’un bouton poussoir pour contrôler la Waveform du VST : AudioRealism BassLine 2
Je me suis inspiré d’un stylo bic pour faire le code^^ Et ça marche 😉
Tu verras dans le code que lorsque j’appuis sur le BP, l’état est LOW ;et quand je le relâche, il est HIGH.
Et sans oublier, une track que j’ai fait avec les potars pour contrôler ABL2 (ça date quand même):
https://soundcloud.com/zar-zax/acidcore-track
Schèma de la partie BP:
+5
T
|
10KΩ
|
|¯¯¯¯¯|¯¯¯¯¯broche digitale 3
| |
\ 10nF
| |
|¯¯¯¯¯
|
┴
Ground
Voilà le code 9 potars et un BP:
int p01;
int p02;
int p11;
int p12;
int p21;
int p22;
int p31;
int p32;
int p41;
int p42;
int p51;
int p52;
int p61;
int p62;
int p71;
int p72;
int p81;
int p82;
const int BP = 3;
int etatBP;
int xBP;
int yBP;
void setup()
{
Serial.begin(9600);
pinMode(BP, INPUT);
etatBP = HIGH;
xBP=0;
yBP=0;
}
void loop()
{
p01 = analogRead(0)/8;
p11 = analogRead(1)/8;
p21 = analogRead(2)/8;
p31 = analogRead(3)/8;
p41 = analogRead(4)/8;
p51 = analogRead(5)/8;
p61 = analogRead(6)/8;
p71 = analogRead(7)/8;
p81 = analogRead(8)/8;
etatBP = digitalRead(BP);
delay(10);
if(p01 != p02 )
MIDI_TX(176,75,p01);
p02 = p01;
if(p11 != p12 )
MIDI_TX(176,76,p11);
p12 = p11;
if(p21 != p22 )
MIDI_TX(176,77,p21);
p22 = p21;
if(p31 != p32 )
MIDI_TX(176,78,p31);
p32 = p31;
if(p41 != p42 )
MIDI_TX(176,79,p41);
p42 = p41;
if(p51 != p52 )
MIDI_TX(176,80,p51);
p52 = p51;
if(p61 != p62 )
MIDI_TX(176,81,p61);
p62 = p61;
if(p71 != p72 )
MIDI_TX(176,82,p71);
p72 = p71;
if(p81 != p82 )
MIDI_TX(176,83,p71);
p82 = p81;
// Ce qui suit, est pour le bouton poussoir
if((etatBP == LOW)&& (xBP == 0) && (yBP==0))
{
MIDI_TX(176,84,127);
yBP=1;
}
if((etatBP == HIGH) && (xBP ==0) && (yBP==1))
{
xBP=1;
}
if((etatBP == LOW) && (xBP == 1) && (yBP==1))
{
MIDI_TX(176,84,0);
yBP=0;
}
if((etatBP == HIGH) && (xBP == 1) && (yBP==0))
{
xBP=0;
}
}
void MIDI_TX(int command,int MIDInote, int MIDIvelocity)
{
Serial.write(command);
Serial.write(MIDInote);
Serial.write(MIDIvelocity);
}
Salut!
Très cool ton son, par contre pour la partie bouton, voilà ce que j’aurais fait (bien que ton code marche parfaitement):
Ainsi, à chaque appui sur le bouton, var vaut successivement 0 et 127 et le message est envoyé!
A confirmer cependant, je n’ai pas pu tester mais normalement ça devrait marcher!
En tout cas merci pour ton retour, et bravo pour ta track!
Salut !
J’ai testé ton code mais cela ne fonctionnait pas. J’ai fais quelques peties modifs et ça donne ça:
const int BP = 2;
int etatBP;
int etatBP_prec;
int var;
void setup()
{
Serial.begin(9600);
pinMode(BP, INPUT);
etatBP = HIGH;
etatBP_prec = HIGH;
var = 127;
}
void loop()
{
etatBP = digitalRead(BP);
delay(10);
if((etatBP == LOW) && (etatBP != etatBP_prec))
{
var=127-var ;
MIDI_TX(176,84,var);
etatBP_prec=etatBP;
}
if(etatBP == HIGH)
{
etatBP_prec=HIGH;
}
}
void MIDI_TX(int command,int MIDInote, int MIDIvelocity)
{
Serial.write(command);
Serial.write(MIDInote);
Serial.write(MIDIvelocity);
}
Comme tu peux le voir, j’ai ajouté une deuxième condition pour que l’état de etatBP_prec change quand on relâche le bouton.
Je suis sûr que l’on peut simplifier le code, mais pour l’instant je sèche.
Merci en tout cas pour m’avoir montré la voie !
Es tu disponible pour quelques questions concernant l’arduino?
Oui à priori!
Bonne nuit! Comment serait le code pour déclencher le jeu avec un buttom de poussée?
Que signifies-tu par « le jeu »? ,You can ask your question in english if you’re more comfortable with it 😉
Bonsoir,
Les vacances passées, moi et un pote nous replongeons dans l’univers
Arduino. Nous avons comme projet commun de créer un contrôleur midi/usb,
avec plusieurs entrées numériques et analogiques. Jusque là rien de bien
compliqué.
Afin de simplifier le fonctionnement et ne pas passer par un émulateur
de port midi ainsi qu’un convertisseur serial midi, pouvons nous brancher
une prise midi sur la broche Tx, ainsi que la masse et le +5v en série
avec une résistance de 220 ohms. Et à cette prise midi y connecter un
câble Midi/USB afin que le logiciel de MAO reconnaisse directement arduino
en contrôleur midi.
J’ai réalisé ce montage, ça a fonctionné une fois, mais après démontage et
réinstallation plus rien…
J’aurai voulu savoir si ce montage est effectivement possible, car après
de nombreux essais, le logiciel de MAO ne détecte plus arduino comme contrôleur!
Un exemple du code:
const int BP = 2;
int etatBP;
int xBP;
int yBP;
int valuePinZero=0;
int valuePinZero2=0;
void setup()
{
Serial.begin(31250);
pinMode(BP, INPUT);
etatBP = HIGH;
xBP=0;
yBP=0;
}
void loop()
{
etatBP = digitalRead(BP);
valuePinZero = (analogRead(0)/8);
if (valuePinZero-valuePinZero2 >=2 || valuePinZero2-valuePinZero >=2) {
valuePinZero2 = valuePinZero;
MIDI_TX(176,75, valuePinZero);
}
if((etatBP == LOW)&& (xBP == 0) && (yBP==0))
{
MIDI_TX(176,84,127);
yBP=1;
}
if((etatBP == HIGH) && (xBP ==0) && (yBP==1))
{
xBP=1;
}
if((etatBP == LOW) && (xBP == 1) && (yBP==1))
{
MIDI_TX(176,84,0);
yBP=0;
}
if((etatBP == HIGH) && (xBP == 1) && (yBP==0))
{
xBP=0;
}
}
void MIDI_TX(unsigned char MESSAGE, unsigned char DONNEE1, unsigned char DONNEE2)
{
Serial.write(MESSAGE);
Serial.write(DONNEE1);
Serial.write(DONNEE2);
}
Merci à toi pour ta réponse!
Salut, j’ai également ce petit projet en tête (mais pas encore le temps pour le faire).
Au niveau du code, il n’y a rien a signaler, le serial.begin est bien à 31250 bauds.
Par contre pour le montage, il y a deux façons de procéder:
1er cas (comme ton montage):
+5V -> 220 ohm -> broche 4 du midi
Ground -> broche 2
TX -> broche 5
2ème cas:
+5V -> 220 ohm -> broche 4
Ground -> broche 2
TX -> 220 ohm -> broche 5
A ce que j’ai pu lire là dessus, le deuxième schéma serait plus adapté pour du OUT (à confirmer). Je ferai le test dans deux semaines avec un potar et un bouton pour confirmer 😉
Et aussi, si tu as une interface audio qui prend en charge le midi, essayes plutôt avec ça. J’ai testé le câble usb/midi et c’est pas toujours ça… Bonne journée !
Salut!
La solution de facilité est d’utiliser une Teensy++ car cette petite carte gère nativement le protocole MIDI via USB (ainsi que PS/2 et d’autres protocoles), sans s’inquièter des histoires de ports virtuels. Pour ton problème je confirme tout ce qu’a dit *zAr-zAx* au niveau du montage et du baudrate, sinon pour le fait que je n’ai jamais utilisé de résistance sur le TX du connecteur MIDI. Cette résistance sert en effet à ne pas cramer la partie émettrice des optocoupleurs présents sur certain appareils MIDI, et une sortie arduino n’est pas assez puissante pour causer un tel dégât…
Revérifie ton montage, ça peut paraître bête mais une erreur d’inattention est très vite arrivée en prototypage!
Et *zAr-zAx* a encore raison en te demandant quel type d’interface tu utilises entre ton contrôleur et ton ordinateur, c’est peut-être de ce côté que ça cloche.
HORS SUJET: *zAr-zAx*: as-tu pu tester ma solution de code donnée plus haut?
Je viens de tester pour un bouton et ça fonctionne à peu près bien.
Dans fl studio, lorsque j’assigne le bouton je met « force boolean » (click sur la flèche à côté de « mapping formula ») pour que cela fasse 0-100%.
J’ai fait le motage avec la résistance sur la broche 5. Il faut faire attention au câblage, on a vite fait de se tromper entre 2 et 5…
Je testerai avec note on & off
Salut ! Pour commencer un gros merci pour ce super tuto.
Il y a pas mal de temps J’ai comme projet de me fabriquer un midi controller, je viens de terminer mon boitier, maintenant viens le plus difficile! je parle bien sur du code arduino.
j’ai une carte arduino mega 2560, 24 boutons(type arcade), 5 potards et 5 fader. j’aimerais configurer 4×4 boutons comme du genre drumpad, 4 autre pour changer les note de mon drumpad, les 4 restant reste a voir… ensuite pour les potards et fader tout est déjà expliquer. 🙂 je peu t’envoyer des photo pour que tu est une meilleur ide de mon Project.
Bref en gros j’aimerais bien des conseille, et, si ce n’ai pas trop te demander un petit exemple du code.
Bonne Soirer 🙂
Salut!
Je ne vais pas écrire le code à ta place mais une fois que tu aura fait quelque chose n’hésite pas à me poser des questions sur les trucs qui ne marchent pas! pour utiliser autant de potards/boutons tu aura besoin de multiplexeurs, je te laisse chercher un peu plus haut dans les commentaires j’ai déjà expliqué le fonctionnement général et donné je crois quelques pistes de recherche pour les mettre en oeuvre.
Bonne chance pour ton projet!