Un contrôleur MIDI très DIY.
- 14 réponses
- 9 participants
- 6 915 vues
- 23 followers
Anonyme
1096
Sujet de la discussion Posté le 27/08/2018 à 16:36:17Un contrôleur MIDI très DIY.
Salut à tous.
Pour la plaisir de partager, voici un petit contrôleur MIDI que j'ai réalisé hier.
Ne trouvant pas d'interface à mon goût je me suis lancé dans la réalisation d'un contrôleur intégrant 6 potards dont un "big knob".
Je voulais finir ça rapidement et me suis contenté d'utiliser ce que j'avais sous la main à la maison.
Coté électronique:
Rien de nouveau sous le soleil, une arduino nano fait tout le travail, comme expliqué ici:
http://www.notesandvolts.com/2016/03/arduino-midi-controller-potentiometers.html
La sortie MIDI se fait sur une DIN 5 broches classique.
Les boutons lumineux sont des boutons tactiles/capacitifs, ils contiennent toute l'électronique nécessaire et s'utilisent comme des simples switchs on/off ( Ref: VCC CTHS15CIC01 chez Mouser par exemple ).
Le plus gros défaut de ces boutons est leur temps de réaction (quelques centaines de millisecondes), pas top pour envoyer des messages MIDI à la volée mais très bien pour simplement changer de banque/contrôleur.
Coté boîtier:
Le PCB est pris en sandwich entre deux échantillons de plexi (satinés noir 10x10cm) Le plexi satiné offre un très beau rendu, et se raye moins facilement que le plexi brillant.
Une poignée de rack fait office de pied.
Les flancs sont réalisés avec une feuille plastique (PVC qu'on peut trouver en papeterie) collée avec du double-face.
A l'arrière: un bouton de reset pour faciliter le débogage, une prise MIDI classique, un mini USB pour l'alimentation 5V ( et pour potentiellement communiquer en USB-MIDI par la suite).
Voilà.
Pour la plaisir de partager, voici un petit contrôleur MIDI que j'ai réalisé hier.
Ne trouvant pas d'interface à mon goût je me suis lancé dans la réalisation d'un contrôleur intégrant 6 potards dont un "big knob".
Je voulais finir ça rapidement et me suis contenté d'utiliser ce que j'avais sous la main à la maison.
Coté électronique:
Rien de nouveau sous le soleil, une arduino nano fait tout le travail, comme expliqué ici:
http://www.notesandvolts.com/2016/03/arduino-midi-controller-potentiometers.html
La sortie MIDI se fait sur une DIN 5 broches classique.
Les boutons lumineux sont des boutons tactiles/capacitifs, ils contiennent toute l'électronique nécessaire et s'utilisent comme des simples switchs on/off ( Ref: VCC CTHS15CIC01 chez Mouser par exemple ).
Le plus gros défaut de ces boutons est leur temps de réaction (quelques centaines de millisecondes), pas top pour envoyer des messages MIDI à la volée mais très bien pour simplement changer de banque/contrôleur.
Coté boîtier:
Le PCB est pris en sandwich entre deux échantillons de plexi (satinés noir 10x10cm) Le plexi satiné offre un très beau rendu, et se raye moins facilement que le plexi brillant.
Une poignée de rack fait office de pied.
Les flancs sont réalisés avec une feuille plastique (PVC qu'on peut trouver en papeterie) collée avec du double-face.
A l'arrière: un bouton de reset pour faciliter le débogage, une prise MIDI classique, un mini USB pour l'alimentation 5V ( et pour potentiellement communiquer en USB-MIDI par la suite).
Voilà.
[ Dernière édition du message le 27/08/2018 à 17:00:52 ]
- 1
- 2
michel.29
3235
Squatteur·euse d’AF
Membre depuis 15 ans
2 Posté le 27/08/2018 à 19:31:46
Anonyme
1096
3 Posté le 27/08/2018 à 20:00:07
Citation de michel.29 :
quel usage ?
pour commander des filtres , ou d'autres fonctions d'un synthé virtuel ?
avoir un accès direct à certaines commandes d'une machine comme un JX3P ?
Absolument, piloter les plugins de synthés...
Ou tout simplement profiter de gros potards pour mon SE-02 dont les commandes sont parfois un peu petites.
Le boutons capacitifs permettent de sélectionner l'une des 4 configurations.
Pour chaque config des Midi Control Change différents sont assignés aux potards.
Je suis en train de programmer tout ça. Dernière nouveauté: le premier boutons clignote rapidement quand un control change est envoyé. Ca permet de checker en permanence ce qui sort de l'appareil.
[ Dernière édition du message le 27/08/2018 à 20:02:07 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
4 Posté le 23/10/2018 à 22:31:58
Salut King C
tout a bord merci pour ce partage ton interface est super
je suis également en train de me fabriquer une interface avec le microcontroller ARDUINO UNO REV3
Celle ci me servira pour contrôler des instruments virtuel ou des fonctions de mon DAW
J'ai suivi ce tutoriel
https://www.instructables.com/id/Easy-3-Pot-Potentiometer-Arduino-Uno-Effects-Midi-/
Ça fonctionne mais ça ne fonctionne pas tout a fait comme je voudrai car il faut que je passe par un logiciel de communication USB/MIDI or je souhaiterai me servir de l’Arduino comme interface USB
Pour s'en servir comme tel j'ai cru comprendre qu'il fallait flasher le controller avec un firmware qui prend en charge cette fonction
Est ce que l'interface que vous avez fabriqué fonctionne si on branche le cable midi au pc via un cable usb/midi on ne se servirait de l'usb que pour l'alimentation
Je suis pour l'instant qu'en phase de test et je me replonge un peu dans la programmation
le design et le nombre de fonctions viendront plus tard
tout a bord merci pour ce partage ton interface est super
je suis également en train de me fabriquer une interface avec le microcontroller ARDUINO UNO REV3
Celle ci me servira pour contrôler des instruments virtuel ou des fonctions de mon DAW
J'ai suivi ce tutoriel
https://www.instructables.com/id/Easy-3-Pot-Potentiometer-Arduino-Uno-Effects-Midi-/
Ça fonctionne mais ça ne fonctionne pas tout a fait comme je voudrai car il faut que je passe par un logiciel de communication USB/MIDI or je souhaiterai me servir de l’Arduino comme interface USB
Pour s'en servir comme tel j'ai cru comprendre qu'il fallait flasher le controller avec un firmware qui prend en charge cette fonction
Est ce que l'interface que vous avez fabriqué fonctionne si on branche le cable midi au pc via un cable usb/midi on ne se servirait de l'usb que pour l'alimentation
Je suis pour l'instant qu'en phase de test et je me replonge un peu dans la programmation
le design et le nombre de fonctions viendront plus tard
Beatless
13654
Drogué·e à l’AFéine
Membre depuis 20 ans
5 Posté le 23/10/2018 à 22:47:39
Belle réalisation KC.
Peux-tu paramétrer la valeur de tes CC ou bien ils sont figés dans ton programme?
Moi aussi je suis en train de concocter un contrôleur avec un Arduino Uno. J'apprends le C++...
Peux-tu paramétrer la valeur de tes CC ou bien ils sont figés dans ton programme?
Moi aussi je suis en train de concocter un contrôleur avec un Arduino Uno. J'apprends le C++...
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Orodreth1
130
Posteur·euse AFfiné·e
Membre depuis 6 ans
6 Posté le 23/10/2018 à 23:17:17
Bravo pour le controlleur !!!
Anonyme
1096
7 Posté le 24/10/2018 à 00:50:24
Le contrôleur propose 4 banques pour 6 potentiomètres, ce qui fait 24 Control Change. Ils sont en effet figés mais disons que c'est suffisant, je me suis fait des presets qui m'arrangent. Au pire je peux reprogrammer ça en un clin d'oeil, il suffit d'ouvrir l'IDE.
Tranceformer, il me semble en effet que tu peux envoyer tout ce que tu veux depuis le port USB de l'arduino mais au final, dans l'ordinateur, tu auras toujours besoin d'un programme pour transformer ton signal USB en données MIDI: soit sous la forme d'un logiciel, soit sous la forme d'un driver...
Mon appareil est alimenté par l'USB, ça facilite la programmation/le débogage tout en limitant le nombre de câbles (pas besoin de transfo).
Le MIDI transiste par un câble MIDI que je branche sur une carte son. Evidemment je n'ai pas à me poser de question sur les drivers puisqu'ils sont installés depuis longtemps avec la carte.
Une telle sortie est super simple à réaliser:
(Il faut à retirer le câble MIDI lors de la programmation Arduino, puis remettre le câble et enfin presser le bouton reset)
Un dernier truc: j'utilise une arduino nano qui est identique à l'uno hormis qu'elle est beaucoup plus petite et propose deux ADC supplémentaires.
[ Dernière édition du message le 24/10/2018 à 08:17:39 ]
Anonyme
1096
8 Posté le 24/10/2018 à 08:23:27
Et voici mon code:
Spoiler - Cliquer ici pour lire la suite
#include <MIDI.h>
#include <midi_defs.h>
#include <midi_message.h>
#include <midi_namespace.h>
#include <midi_settings.h>
MIDI_CREATE_INSTANCE(HardwareSerial, Serial, midiOut); // create a MIDI object called midiOut
double previous_Button;
double button_Time;
double blink_Time;
double previous_Blink_Time;
double previous_Message_Time;
double message_Time;
byte bank_Selected;
boolean button_State_A;
boolean button_State_B;
int pot_0;
int pot_1;
int pot_2;
int pot_3;
int pot_4;
int pot_5;
int old_pot_0;
int old_pot_1;
int old_pot_2;
int old_pot_3;
int old_pot_4;
int old_pot_5;
byte cc0;
byte cc1;
byte cc2;
byte cc3;
byte cc4;
byte cc5;
boolean midi_Send = 0;
boolean Led_State_A = 0;
boolean Led_State_B = 0;
boolean blink_Mode = 0;
byte midi_Ch;
void setup() {
cc0 = 1; // MOD Wheel
cc1 = 0; //
cc2 = 0; //
cc3 = 0; //
cc4 = 0; //
cc5 = 0; //
midi_Ch = 1;
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
blink_Button();
Serial.begin(31250); // setup serial for MIDI
}
void loop() {
check_Button();
check_Pot();
// digitalWrite( 2, button_State_A);
// digitalWrite( 3, button_State_B);
// digitalWrite( 2, LOW);
// digitalWrite( 2, HIGH);
blink_Time = millis();
if ( previous_Blink_Time + 30 < blink_Time) {
blink_Mode = !blink_Mode;
previous_Blink_Time = millis();
}
if ( midi_Send == 1 ) {
message_Time = millis();
if ( previous_Message_Time + 60 < message_Time) {
midi_Send = 0;
}
}
if ( midi_Send == 0 ) {
Led_State_A = button_State_A;
Led_State_B = button_State_B;
} else {
if ( blink_Mode == 0 && midi_Ch == 1)
Led_State_A = button_State_A;
if ( blink_Mode == 1 && midi_Ch == 1)
Led_State_A = !button_State_A;
if ( blink_Mode == 0 && midi_Ch == 2)
Led_State_B = button_State_B;
if ( blink_Mode == 1 && midi_Ch == 2)
Led_State_B = !button_State_B;
}
if ( midi_Send == 1 ) {
message_Time = millis();
if ( previous_Message_Time + 60 < message_Time) {
midi_Send = 0;
}
}
digitalWrite( 2, Led_State_A);
digitalWrite( 3, Led_State_B);
}
//***********************************************************************
void check_Button() {
boolean button_A = digitalRead(4);
if ( button_A == 1 ) {
button_Time = millis();
if ( button_Time > previous_Button + 1000 ) {
button_State_A = ! button_State_A;
Led_State_A = button_State_A;
previous_Button = millis();
}
}
boolean button_B = digitalRead(5);
if ( button_B == 1 ) {
button_Time = millis();
if ( button_Time > previous_Button + 1000 ) {
button_State_B = ! button_State_B;
previous_Button = millis();
}
}
bank_Selected = button_State_A + ( button_State_B * 2 );
switch (bank_Selected) {
case 0:
cc0 = 1; // MOD Wheel
cc1 = 0; //
cc2 = 0; //
cc3 = 0; //
cc4 = 0; //
cc5 = 0; //
midi_Ch = 1;
break;
case 1:
cc0 = 74; // general Midi FLT Cutoff
cc1 = 71; // general Midi FLT Q
cc2 = 73; // general midi attack
cc3 = 5; // general Midi portamento
cc4 = 1; // general Midi modulation wheel
cc5 = 72; // general Midi decay
midi_Ch = 1;
break;
case 2:
cc0 = 74; // FLT Cutoff
cc1 = 71; // FLT Q
cc2 = 59; // FLT mod
cc3 = 47; // FLT attack
cc4 = 52; // FLT decay
cc5 = 53; // FLT Sustain
midi_Ch = 2;
break;
case 3:
cc0 = 103; // LFO>osc
cc1 = 104; // LFO wave
cc2 = 102; // LFO rate
cc3 = 116; // PWM rate
cc4 = 117; // PWM mod
cc5 = 105; // LFO filter
midi_Ch = 2;
break;
}
}
//***********************************************************************
void check_Pot() {
if ( cc0 != 0 ) {
pot_0 = analogRead (A0);
if ( abs( pot_0 - old_pot_0) > 3) {
old_pot_0 = pot_0;
pot_0 = pot_0 >> 3;
midiOut.sendControlChange( cc0 , pot_0, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
if ( cc1 != 0 ) {
pot_1 = analogRead (A1);
if ( abs( pot_1 - old_pot_1) > 3) {
old_pot_1 = pot_1;
pot_1 = pot_1 >> 3;
midiOut.sendControlChange( cc1 , pot_1, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
if ( cc2 != 0 ) {
pot_2 = analogRead (A2);
if ( abs( pot_2 - old_pot_2) > 3) {
old_pot_2 = pot_2;
pot_2 = pot_2 >> 3;
midiOut.sendControlChange( cc2 , pot_2, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
if ( cc3 != 0 ) {
pot_3 = analogRead (A3);
if ( abs( pot_3 - old_pot_3) > 3) {
old_pot_3 = pot_3;
pot_3 = pot_3 >> 3;
midiOut.sendControlChange( cc3 , pot_3, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
if ( cc4 != 0 ) {
pot_4 = analogRead (A4);
if ( abs( pot_4 - old_pot_4) > 3) {
old_pot_4 = pot_4;
pot_4 = pot_4 >> 3;
midiOut.sendControlChange( cc4 , pot_4, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
if ( cc5 != 0 ) {
pot_5 = analogRead (A5);
if ( abs( pot_5 - old_pot_5) > 3) {
old_pot_5 = pot_5;
pot_5 = pot_5 >> 3;
midiOut.sendControlChange( cc5 , pot_5, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
}
void blink_Button() {
for (int i = 0; i <= 30; i++) {
digitalWrite( 2, HIGH);
digitalWrite( 3, LOW);
delay ( 30 );
digitalWrite( 2, LOW);
digitalWrite( 3, HIGH);
delay ( 30 );
}
digitalWrite( 3, LOW);
}
#include <midi_defs.h>
#include <midi_message.h>
#include <midi_namespace.h>
#include <midi_settings.h>
MIDI_CREATE_INSTANCE(HardwareSerial, Serial, midiOut); // create a MIDI object called midiOut
double previous_Button;
double button_Time;
double blink_Time;
double previous_Blink_Time;
double previous_Message_Time;
double message_Time;
byte bank_Selected;
boolean button_State_A;
boolean button_State_B;
int pot_0;
int pot_1;
int pot_2;
int pot_3;
int pot_4;
int pot_5;
int old_pot_0;
int old_pot_1;
int old_pot_2;
int old_pot_3;
int old_pot_4;
int old_pot_5;
byte cc0;
byte cc1;
byte cc2;
byte cc3;
byte cc4;
byte cc5;
boolean midi_Send = 0;
boolean Led_State_A = 0;
boolean Led_State_B = 0;
boolean blink_Mode = 0;
byte midi_Ch;
void setup() {
cc0 = 1; // MOD Wheel
cc1 = 0; //
cc2 = 0; //
cc3 = 0; //
cc4 = 0; //
cc5 = 0; //
midi_Ch = 1;
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
blink_Button();
Serial.begin(31250); // setup serial for MIDI
}
void loop() {
check_Button();
check_Pot();
// digitalWrite( 2, button_State_A);
// digitalWrite( 3, button_State_B);
// digitalWrite( 2, LOW);
// digitalWrite( 2, HIGH);
blink_Time = millis();
if ( previous_Blink_Time + 30 < blink_Time) {
blink_Mode = !blink_Mode;
previous_Blink_Time = millis();
}
if ( midi_Send == 1 ) {
message_Time = millis();
if ( previous_Message_Time + 60 < message_Time) {
midi_Send = 0;
}
}
if ( midi_Send == 0 ) {
Led_State_A = button_State_A;
Led_State_B = button_State_B;
} else {
if ( blink_Mode == 0 && midi_Ch == 1)
Led_State_A = button_State_A;
if ( blink_Mode == 1 && midi_Ch == 1)
Led_State_A = !button_State_A;
if ( blink_Mode == 0 && midi_Ch == 2)
Led_State_B = button_State_B;
if ( blink_Mode == 1 && midi_Ch == 2)
Led_State_B = !button_State_B;
}
if ( midi_Send == 1 ) {
message_Time = millis();
if ( previous_Message_Time + 60 < message_Time) {
midi_Send = 0;
}
}
digitalWrite( 2, Led_State_A);
digitalWrite( 3, Led_State_B);
}
//***********************************************************************
void check_Button() {
boolean button_A = digitalRead(4);
if ( button_A == 1 ) {
button_Time = millis();
if ( button_Time > previous_Button + 1000 ) {
button_State_A = ! button_State_A;
Led_State_A = button_State_A;
previous_Button = millis();
}
}
boolean button_B = digitalRead(5);
if ( button_B == 1 ) {
button_Time = millis();
if ( button_Time > previous_Button + 1000 ) {
button_State_B = ! button_State_B;
previous_Button = millis();
}
}
bank_Selected = button_State_A + ( button_State_B * 2 );
switch (bank_Selected) {
case 0:
cc0 = 1; // MOD Wheel
cc1 = 0; //
cc2 = 0; //
cc3 = 0; //
cc4 = 0; //
cc5 = 0; //
midi_Ch = 1;
break;
case 1:
cc0 = 74; // general Midi FLT Cutoff
cc1 = 71; // general Midi FLT Q
cc2 = 73; // general midi attack
cc3 = 5; // general Midi portamento
cc4 = 1; // general Midi modulation wheel
cc5 = 72; // general Midi decay
midi_Ch = 1;
break;
case 2:
cc0 = 74; // FLT Cutoff
cc1 = 71; // FLT Q
cc2 = 59; // FLT mod
cc3 = 47; // FLT attack
cc4 = 52; // FLT decay
cc5 = 53; // FLT Sustain
midi_Ch = 2;
break;
case 3:
cc0 = 103; // LFO>osc
cc1 = 104; // LFO wave
cc2 = 102; // LFO rate
cc3 = 116; // PWM rate
cc4 = 117; // PWM mod
cc5 = 105; // LFO filter
midi_Ch = 2;
break;
}
}
//***********************************************************************
void check_Pot() {
if ( cc0 != 0 ) {
pot_0 = analogRead (A0);
if ( abs( pot_0 - old_pot_0) > 3) {
old_pot_0 = pot_0;
pot_0 = pot_0 >> 3;
midiOut.sendControlChange( cc0 , pot_0, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
if ( cc1 != 0 ) {
pot_1 = analogRead (A1);
if ( abs( pot_1 - old_pot_1) > 3) {
old_pot_1 = pot_1;
pot_1 = pot_1 >> 3;
midiOut.sendControlChange( cc1 , pot_1, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
if ( cc2 != 0 ) {
pot_2 = analogRead (A2);
if ( abs( pot_2 - old_pot_2) > 3) {
old_pot_2 = pot_2;
pot_2 = pot_2 >> 3;
midiOut.sendControlChange( cc2 , pot_2, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
if ( cc3 != 0 ) {
pot_3 = analogRead (A3);
if ( abs( pot_3 - old_pot_3) > 3) {
old_pot_3 = pot_3;
pot_3 = pot_3 >> 3;
midiOut.sendControlChange( cc3 , pot_3, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
if ( cc4 != 0 ) {
pot_4 = analogRead (A4);
if ( abs( pot_4 - old_pot_4) > 3) {
old_pot_4 = pot_4;
pot_4 = pot_4 >> 3;
midiOut.sendControlChange( cc4 , pot_4, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
if ( cc5 != 0 ) {
pot_5 = analogRead (A5);
if ( abs( pot_5 - old_pot_5) > 3) {
old_pot_5 = pot_5;
pot_5 = pot_5 >> 3;
midiOut.sendControlChange( cc5 , pot_5, midi_Ch );
midi_Send = 1;
previous_Message_Time = millis();
}
}
}
void blink_Button() {
for (int i = 0; i <= 30; i++) {
digitalWrite( 2, HIGH);
digitalWrite( 3, LOW);
delay ( 30 );
digitalWrite( 2, LOW);
digitalWrite( 3, HIGH);
delay ( 30 );
}
digitalWrite( 3, LOW);
}
jc_voisin
2
Nouvel·le AFfilié·e
Membre depuis 14 ans
9 Posté le 25/10/2018 à 12:51:06
Je tiens d'abord à remercier King C. Ton contrôleur est méchamment bien fait et les finitions sont bluffantes.
Je suis également sur la création d'un contrôleur un peu différent.
Et de part mon expérience, je conseillerai vivement un arduino leonardo ou arduino micro pour avoir le midi par l'USB.
J'avais fait les proto sur un arduino UNO et un nano et j'ai constaté que ça ne marche pas.
Au moins avec le leonardo ou micro j'ai pu placé le port midi même si l'usb me suffit.
Je suis également sur la création d'un contrôleur un peu différent.
Et de part mon expérience, je conseillerai vivement un arduino leonardo ou arduino micro pour avoir le midi par l'USB.
J'avais fait les proto sur un arduino UNO et un nano et j'ai constaté que ça ne marche pas.
Au moins avec le leonardo ou micro j'ai pu placé le port midi même si l'usb me suffit.
Anonyme
1096
10 Posté le 26/10/2018 à 13:16:50
Citation de jc_voisin :
Je tiens d'abord à remercier King C. Ton contrôleur est méchamment bien fait et les finitions sont bluffantes.
Je suis également sur la création d'un contrôleur un peu différent.
Et de part mon expérience, je conseillerai vivement un arduino leonardo ou arduino micro pour avoir le midi par l'USB.
J'avais fait les proto sur un arduino UNO et un nano et j'ai constaté que ça ne marche pas.
Au moins avec le leonardo ou micro j'ai pu placé le port midi même si l'usb me suffit.
Merci. DIs moi qu'utilises-tu comme application sur ton ordi afin que l'usb de l'arduino soit reconnu comme Midi?
- < Liste des sujets
- Charte
- 1
- 2