Se connecter
Se connecter

ou
Créer un compte

ou

DIY MIDI CONTROLLER USB Plug & Play (UPGRADE NEOPIXEL RING)

  • 13 réponses
  • 7 participants
  • 4 398 vues
  • 13 followers
Sujet de la discussion DIY MIDI CONTROLLER USB Plug & Play (UPGRADE NEOPIXEL RING)
DIY MIDI CONTROLLER Usb Plug & Play


C'est avec plaisir que je me permets de partager avec vous une petite interface que j'ai réaliser
grâce a l'inspiration et à l'aide,entre autre, de membre de la communautée
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.684547,diy-midi-usb-controleur-project-arduino-uno-besoin-d-aide,post.9866350.html
Un projet qui me trotter dans la tête depuis un moment déjà
Surtout depuis que j'ai vu l'interface de Mr Stephan Bodzin et ces performances en Live
Je l'ai trouvé très ergonomique :aime:
C'est certes pour l'instant qu'un sorte de prototype élaboré ,si je puis dire, et qui fera l'objet de pas mal de modification au fil du temps ( code et interface )

Liste du Matériel :

1 x Microcontrôleur Arduino UNO R3 ATmega328P ATMEGA16U2
2 x Button Pad 2x2 LED Compatible https://coolcomponents.co.uk/products/button-pad-2x2-led-compatible
2 x Button Pad 2x2 Breakout PCB https://coolcomponents.co.uk/products/button-pad-2x2-breakout-pcb
8 x LED Yellow 5mm https://coolcomponents.co.uk/products/led-yellow-5mm
2 x Tête de bouton RN-99A https://www.conrad.fr/p/tete-de-bouton-rotatif-sci-rn-99a64mm-noir-blanc-x-h-45-mm-x-203-mm-1-pcs-1304026
2 x Tête de bouton RN-99C https://www.conrad.fr/p/tete-de-bouton-rotatif-sci-rn-99c64mm-noir-blanc-x-h-33-mm-x-16-mm-1-pcs-1304027
2 x Tête de bouton RN-99E https://www.conrad.fr/p/tete-de-bouton-rotatif-sci-rn-99e64mm-noir-blanc-x-h-229-mm-x-127-mm-1-pcs-1304029
6 x Potentiomètre 10Kohm Alpha M7 https://www.conrad.fr/p/potentiometre-rotatif-10-k-lineaire-potentiometer-service-9305-mono-02-w-1-pcs-450034
8 x Résistance carbone 220R https://www.conrad.fr/p/resistance-a-couche-carbone-405175-220-sortie-axiale-0411-05-w-1-pcs-405175
8 x Résistance 10 KR https://www.conrad.fr/p/resistance-a-couche-carbone-yageo-cfr25j10kh-10-k-sortie-axiale-0207-025-w-1-pcs-1417697
8 x Diode 1N4148TA https://www.conrad.fr/p/diode-standard-on-semiconductor-1n4148ta-do-204ah-100-v-200-ma-1-pcs-1262769
1 x Cable USB 2,0 Haute Vitesse C A vers B 15 cm
1 x USB 2.0 type B femelle vers USB 2.0 type A femelle Cliff
https://www.conrad.fr/p/adaptateur-usb-20-type-b-femelle-vers-usb-20-type-a-femelle-cliff-cp30207nmb-1-pcs-1419593

Pour la boite j'ai découpé des Morceaux de Plexiglass de 5 mm collés avec un colle Pattex Tous Materiaux transparente
http://www.pattex.fr/Pattex/produits-pattex/one-for-all/one-for-all-crystal.html
Ainsi qu'une Plaque d'aluminium de 2 mm d’épaisseur
Le plus ennuyant a été de réaliser des trous carrés ( Perceuse et lime ) mais vu le coté très tendre de la matière
cela n'est pas très difficile
Le mieux étant de faire faire la plaque par un professionnel avec une découpe laser (ceci fera l'objet d'un prochain prototype)

les-mains-dans-le-cambouis-2552962.jpg
les-mains-dans-le-cambouis-2552963.jpg
les-mains-dans-le-cambouis-2552964.jpg

Schéma de Câblage :

les-mains-dans-le-cambouis-2552965.jpg

La library Midi.h a copier dans C:\Program Files (x86)\Arduino\libraries"
https://sourceforge.net/projects/arduinomidilib/

Le code


#include <MIDI.h>  // INlcude MIDI library

int mem[] = { 0, 0, 0, 0, 0, 0, 0 ,0};

void setup()

{
  
  Serial.begin(9600);  // default midi speed rate
   
    // initialize the LED pin as an output:  
  pinMode(2, INPUT_PULLUP); // initialize the pushbutton pin as an input:
  pinMode(3, INPUT_PULLUP);
  pinMode(4,INPUT_PULLUP); 
  pinMode(5, INPUT_PULLUP);  
  pinMode(6,INPUT_PULLUP); 
  pinMode(7, INPUT_PULLUP); 
  pinMode(8, INPUT_PULLUP); 
  pinMode(9, INPUT_PULLUP);  
 
  MIDI.begin(); 
}
 
static int iAn0Val, iAn1Val, iAn2Val, iAn3Val, iAn4Val, iAn5Val;
 
void loop()
{
   {
  int sensorVal[] = 
       {
       !digitalRead(2), !digitalRead(3),
       !digitalRead(4), !digitalRead(5),
       !digitalRead(6), !digitalRead(7), 
       !digitalRead(8), !digitalRead(9),
       };
       for (int j = 0; j < 8; j++) 
           {
       if (sensorVal [j] != mem [j]) 
                {
                mem [j] = sensorVal [j];
                if (mem[j]) 
                       {
                       MIDI.sendNoteOn(j + 48, 64, 1);
                       } 
                       else 
                       {
                       MIDI.sendNoteOff(j + 48, 64, 1);       
                       }
                 }
            }
}

//Pot 01   
   static int iAn0ValPrev;
   iAn0ValPrev = 0 ;
   iAn0ValPrev = iAn0Val ; // previous value
   iAn0Val = analogRead(A0); // Divide by 8 to get range of 0-127 for midi
   if (abs (iAn0Val - iAn0ValPrev)>3)
   analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value 
   delay(10);
//Pot 02
   static int iAn1ValPrev;
   iAn1ValPrev = 0 ;
   iAn1ValPrev = iAn1Val; 
   iAn1Val = analogRead(A1);
   if (abs (iAn1Val - iAn1ValPrev)>3)
   analogPinMidiTX(2,iAn1Val,iAn1ValPrev); 
   delay(10);
//Pot 03 
   static int iAn2ValPrev;
   iAn2ValPrev = 0 ;
   iAn2ValPrev = iAn2Val; 
   iAn2Val = analogRead(A2);
   if (abs (iAn2Val - iAn2ValPrev)>3)
   analogPinMidiTX(3,iAn2Val,iAn2ValPrev);
   delay(10);
//Pot 04
   static int iAn3ValPrev;
   iAn3ValPrev = 0; 
   iAn3ValPrev = iAn3Val; 
   iAn3Val = analogRead(A3);
   if (abs (iAn3Val - iAn3ValPrev)>3)
   analogPinMidiTX(4,iAn3Val,iAn3ValPrev); 
   delay(10);
//Pot 05
   static int iAn4ValPrev;
   iAn4ValPrev = 0 ;
   iAn4ValPrev = iAn4Val; 
   iAn4Val = analogRead(A4);
   if (abs (iAn4Val - iAn4ValPrev)>3)
   analogPinMidiTX(5,iAn4Val,iAn4ValPrev);
   delay(10);
   //Pot 06
   static int iAn5ValPrev;
   iAn5ValPrev = 0;
   iAn5ValPrev = iAn5Val; 
   iAn5Val = analogRead(A5);
   if (abs (iAn5Val - iAn5ValPrev)>3)
   analogPinMidiTX(6,iAn5Val,iAn5ValPrev);
   delay(10); //here we add a short delay to help prevent slight fluctuations, knocks on the pots etc. Adding this helped to prevent my pots from jumpin up or down a value when slightly touched or knocked.
}

void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{  
  // TX Value only if it has changed
  if(iValPrev != iVal)
  {
    iValPrev != iVal ;
    iVal = iVal >> 3 ;
    MidiTX(176,iChan,iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
     
   }
}

void MidiTX(unsigned char MESSAGE, unsigned char CONTROL, unsigned char VALUE) //Valeur en Midi Command
{
   Serial.write(MESSAGE);
   Serial.write(CONTROL);
   Serial.write(VALUE);
}


J'ai laissé les résistances Push Pull car j'ignorai que cette fonction pouvait se réaliser via le code

Un foi le code inséré il faut insérer un firmware modifié avec le logiciel FLIP
Pour flasher le ARDUINO afin qu’il soit reconnu comme interface Midi Plug & Play en USB
Vous trouverez le nécessaire pour effectuer cette opération su le site : https://dartmobo.com/midi-over-usb/
Le seul inconvénient est qu'il faille flasher le microcontrôleur pour pouvoir effectuer une modification du code
Le contrôleur et ses fonctions on été testé sur le DAW Bitwig

les-mains-dans-le-cambouis-2553112.jpg
les-mains-dans-le-cambouis-2553113.jpg
les-mains-dans-le-cambouis-2553114.jpg
les-mains-dans-le-cambouis-2553115.jpg
les-mains-dans-le-cambouis-2553116.jpg



[ Dernière édition du message le 29/09/2019 à 20:23:03 ]

Afficher le sujet de la discussion
11
Petit Upgrade du Contrôleur Avec l'utilisation du Shield pour l'Arduino Mega 2650 et une toute nouvelle Boite découpé au laser :)

v[url]https://youtu.be/_68Bdxu_tUM?si=C9KrvmPrOZmGSpNq[/url]

Et le gros upgrade est la possibilité de l’utiliser avec Un Script Personnalisé pour pouvoir Commander Ableton Live (sans mappage Midi donc)



Bon Visionnage :clin:

12
Top as tu un github de tout ça ?
Je suis intéressé par la gestion des neopixe
13
14
Très intéressant, bravo. :bravo:

Serial.begin(9600);  // default midi speed rate
Normalement c'est 31250 bauds, le MIDI. :?!:

Citation de Tof son :
Je suis intéressé par la gestion des neopixe

A ce propos, il existe une très bonne carte chez Adafruit au format physique Arduino Mega, qui dispose d'un NeoPixel (plus tout un tas d'autres choses autour d'un "gros" MCU SAMD51) : la Grand Central M4 Express.

https://www.adafruit.com/product/4064

« What is full of redundancy or formula is predictably boring. What is free of all structure or discipline is randomly boring. In between lies art. » (Wendy Carlos)

[ Dernière édition du message le 03/06/2024 à 12:43:31 ]