Bonjour à tous,
Je suis nouveau sur forum. Je me présente très rapidement, je suis graphiste spécialisé dans le webdesign & le design IHM. Ayant une grande passion pour la MAO (Musique Assisté par Ordinateur). Je cherche a fabriqué mon propre contrôleur MIDI.
Après mettre pas mal documenté sur le web, tous les tutos, du moins une grande majorité (en anglais pour la plupart à mon grand regret), convergent vers cette solution l'arduino.
J'ai donc acquis mon premier Arduino pas plus tard que cette semaine. Après presque un trimestre d'hésitation.
J'ai profité de ce weekend pluvieux pour "étudier" cette carte et faire mes premiers.
Après quelques heures, j'ai réussi à créer mon premier programme, qui consistait à appuyer un bouton poussoir et me renvoyer une information comme quoi celui ci était fermé et vice-versa, j'ai ensuite approfondi mon code jusqu'à envoyer des notes MIDI et c'est là que je coince.
Mais avant de vous montrer mon code et vous montrez où je coince, je vais juste vous faire une présentation rapide du contrôleur midi que je veux créer. Il est inspiré d'un contrôleur midi existant, le Midi Fighter. Un boitier à 16 boutons (des boutons d'arcades OBSF 24mm) qui envoi des notes MIDI à un logiciel de MAO, dans mon cas il s'agit d'Ableton Live 9. Ce boitier est aussi composé de 16 LEDS qui s'allume lorsque le bouton est "maintenu".
(les guillemets c'est parce que mon problème vient de là, mais j'aborderai ce sujet plus tard)
Voici un modèle de midi fighter :
Cliquez sur ce lien pour voir une vidéo de la bête en action
Je me dispense dans un premier temps des potards et des faders, c'est juste la petit matrice de boutons 4x4 - rétro-éclairé qui m’intéresse vraiment pour le moment.
Etape 1 - premier code bouton enfoncé/relâche :
int boutonPin = 2; //bouton type arcade (sanwa OBSF) sur le port digit 2
int etat = 0;// <--- var qui vérifiera l'état de mon bouton
void setup()
{
Serial.begin (9600);
pinMode (boutonPin, INPUT); //bouton en mode INPUT
digitalWrite(boutonPin, HIGH);
}
void loop()
{
etat = digitalRead(boutonPin);//ecouteur d'évenement sur le boutonPin
if (etat == HIGH)
{
Serial.println("bouton HAUT");//le bouton n'est pas enfoncé
}
else
{
Serial.println("bouton BAS");//le bouton est enfoncé
}
}
Voici ce qui se passe sur mon serial moniteur
Premier constat :
Quand j’appuie et maintiens sur le bouton, j'ai le texte "bouton BAS" qui apparait et quand je le relâche celui ci mon serial moniteur, m'affiche "bouton HAUT" (jusqu'ici tous va bien)
NOTE : il est peut être important que vous sachiez que je ne travaille pas avec aucun composant électrique (pas de breadboard, pas de resistors etc...), je bosse directement sur la carte. Voici mon installation :
Je compte bien évidement investir dans quelques LED, resistor et Breadboard pour l'élaboration de mon projet.
Etape 2 - configurer mon MAC pour pouvoir simuler du MIDI :
Je présenterai sous forme de bullet points cette partie pour évider trop m'attarder, c'est essentiellement de la configuration :
-
installation de Hairless - pont SERIAL <--> MIDI / OK
-
configurer mon MAC / OK
(c'est normal qu'il est des erreurs, le code présent dans ma carte n'est pas du tout adapté)
-
vérifier qu'Ableton Live 9 reconnaisse les ports MIDI IN/OUT/ OK
Etape 3 - Retravailler mon code pour envoyer une note MIDI :
Je démarre donc cette 3eme partie en installant une librairie Arduino Midi 4.2 à partir d'un tutoriel chopé sur youtube, l’installation ce passe bien et c'est même une réussite (je pense) .
Et voici mon nouveau code (qui foire complétement, une vraie défaite) :
#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>
MIDI_CREATE_DEFAULT_INSTANCE();
int boutonPin = 2; //bouton type arcade (sanwa OBSF) sur le port digit 2
int etat = 0;// <--- var qui vérifiera l'état de mon bouton
int noteDO = 48;//<-- 48, c'est la valeur MIDI de la note C3 (DO)
void setup()
{
MIDI.begin();// commencer la connection MIDI
Serial.begin (115200); // <-- j'ai appliqué ça sans trop savoir pk
pinMode (boutonPin, INPUT); //bouton en mode INPUT
digitalWrite(boutonPin, HIGH);
}
void loop()
{
etat = digitalRead(boutonPin);//ecouteur d'évenement sur le boutonPin
if (etat == HIGH)
{
Serial.println("bouton HAUT");//le bouton n'est pas enfoncé
MIDI.sendNoteOff(noteDO,0,1);//je j'éteinds DO, velocité 127, Canal MIDI 1
}
else
{
Serial.println("bouton BAS");//le bouton est enfoncé
MIDI.sendNoteOn(noteDO,127,1);//je joue DO, velocité 127, Canal MIDI 1
}
}
Problème 1 :
Je constate que sur ma fenêtre Hairless MIDI, que des notes MIDI sont envoyer dans tous les sens et ne corresponde pas à ce que j'ai demandé d'envoyer :
Problème 2 :
Sur ableton, même résultat quand j'ouvre un instrument, j'ai des espèces de glitchs quand j’appuie sur mon bouton poussoir.
De manière aléatoire, il va lancer plusieurs notes et celle ci vont rester comme dans un état enfoncé même quand je relâche la pression du bouton.
C'est comme si je demandais à un pianiste de me jouer une note, mais qu'il refusait de jouer une fois sur deux. Et que quand il s'y mettait, il me joue des accords , le temps de ce accords varient aléatoirement aussi, ça peut être des temps court comme elles peuvent être longue voir un "freeze".
Etape 4 - réflexion/conclusion
Donc voilà où j'en suis, j'ai pris une feuille de papiers et j'ai essayé de comprendre ce qui n'allait pas dans mon code et voici ce que j'ai retenu :
- la note MIDI est tout le temps jouer car, quand je prend mon premier code (cf.étape 1) quand je maintenais la touche enfoncé, j'avais le message "bouton BAS" en mode LOOP. Et ide quand je relâchais la touche, le message "bouton HAUT" apparaissaient en mode LOOP.
J'en conclu donc, que quand j’appuie sur mon bouton la note MIDI est envoyé plusieurs fois.
Il faut donc que je trouve un moyen pour que quand j’appuie et que je l'a maintiens sur le bouton une fois, qu'une NOTE soit envoyé et ensuite il n'y ai plus de transmission. Ensuite quand je relâche le bouton, même scénario, une note est envoyé pour donner l'instruction de killer la note appeler précédemment.
-
Par contre ça ne m'explique pas pourquoi, j'ai plusieurs notes qui sont envoyé et pas que la note DO de valeur 48 que j'ai demandé d'appeler. Idem pour les propriétés de vélocité, que j'ai fixé à 127, mais qui varient de 0 à 127.
-
Pour ce qui est du canal MIDI, il reste bien à 1. (mais est ce que c'est pas une valeur par defaut)
Bref... voilà donc mon problème, ça a pris un peu de temps pour vous expliquez clairement les choses, mais le but de ce projet n'est pas seulement d'obtenir satisfaction d'avoir monter son propre contrôleur MIDI mais elle a aussi un but "pédagogique", je voudrai si j'arrive au bout de ce projet, en faire un tutoriel sur ce type de projet, car quand je vois le nombre de tutos en anglais sur ce projet, je me dis qu'un tuto en français ça pourrai dépanner plus d'un.
Je remercie d'avance, les personnes qui prendront le temps de lire ce long sujet, et de m'aider dans mon projet.
Je suis impatient de lire vos réponses.