Un simple controleur midi > Volume + pitch sur 2potards possible?

Salut à tous :slight_smile:

N'ayant pas trouvé la réponse à ma question sur le web je viens solliciter votre aide.

Je suis un vrai débutant électronique...arduino.. etc mais j'aimerai construire un contrôleur midi TOUT simple.

J'ai juste 2 potentiomètres connectés à ma carte arduino uno (un sur analogpin0, un autre sur analogpin1)
(les informations passeraient par l'usb via serial2midi...)

J'aimerai que le premier envoi un note-on (dès que l'on fait tourner le potentiomètre)
sur une note prédéfinie (par exemple le do médium C3)
ainsi qu'un contrôle du volume sur cette même note (un simple ControlChange, #CC7 par exemple..)
(NB=pas de note-off si ce n'est quand le volume est à 0)

Quant au 2eme il me servirai à envoyer une information de pitch-bend
le pitch reste inchangé quand le potentiomètre est à mi-course (toujours un do3 donc)
mais change dès que le potentiomètre tourne sur un range de -24/+24 par exemple (pour peu que le VSTi contrôlé accepte ce genre de bend..)

Je n'ai pas trouvé sur le net un code (sketch) pour arduino pouvant correspondre à ça, ni même un bout de code pouvant m'aider..

Bref je galère vraiment, pour quelque chose de sûrement très simple... :-/
Merci d'avance pour votre coup de pouce!

Salut,
tu as un tutorial en français ici sur un controlleur midi simple avec 4 potentiomètre et un arduino : Online Shopping Store India | Shop for Customize P,Clothes,Mobile Acc.
Des indications sur comment faire une sortie midi par là : http://itp.nyu.edu/physcomp/Labs/MIDIOutput
Si tu veux ajouter une entrée midi ça se passe par là : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1187962258/
Le midi utilise généralement la librairie serial je te conseille donc de lire la doc ici : Serial - Arduino Reference
L'exemple de la doc officielle sur le MIDI : http://arduino.cc/en/Tutorial/Midi
De la doc sur les messages MIDI : Specs
Un tutorial sur la lecture des entrées analogique (Pour lire la tension au bornes de tes potentiomètres): http://arduino.cc/en/Tutorial/AnalogInOutSerial
Après avoir lu tout ça tu devrais savoir te faire un contrôlleur midi, si tu as des questions plus précises hésites pas :wink:

Oui! Mes questions se précisent..effectivement...

Tout d'abord merci beaucoup Selur pour cette réponse, et pour ces liens! :slight_smile:

J'avais vu effectivement la plupart de ces sites
d'ailleurs le tout premier (eatyone) m'aurait bien aidé vu mon projet mais : le code qu'il donne ne marche pas chez moi!

Dommage parce que j'aurai bien voulu utiliser sa fonction de "lissage" dont il parle car j'ai exactement le même problème (instabilité des valeurs à la lecture des potentiomètres)

donc si quelqu'un connait un moyen de lisser tout ça.. :slight_smile:

Sinon j'ai enfin réussi à trouver un bout de code qui correspond pas mal! >>>

////++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//variables setup
byte MIDIchannel;
byte pitchBendMSB_now;
byte pitchBendMSB_past;
byte pitchBendLSB_now;
byte pitchBendLSB_past;
byte volume_now;
byte volume_past;
byte LedPin = 13;   // select the pin for the LED

int pitch;
int volume;

void setup() {

  Serial.begin(57600);  //start serial with midi baudrate 57600
  Serial.flush();

  delay(20);
  midi_control(MIDIchannel, 0x26, 0x00);
  midi_control(MIDIchannel, 0x64, 0x00);
  midi_control(MIDIchannel, 0x65, 0x00);
  midi_control(MIDIchannel, 0x06, 0x30); // set pitch bend range to +/- 24 semitones

  delay(2);
  midi_control(MIDIchannel, 0x64, 0x7F); // Reset RPN and NRPN
  midi_control(MIDIchannel, 0x65, 0x7F);
}


void loop() {

  pitch = analogRead(0);    // read pitch;

  if(pitch>127){
    pitch=127;
  }

  pitchBendMSB_now = pitch & 0x007F;

  if(pitchBendMSB_now <1){
    pitchBendMSB_now = 0;
  }

  if(pitchBendMSB_now != pitchBendMSB_past){
    midi_pitchBend(MIDIchannel, pitchBendLSB_now, pitchBendMSB_now );
  }
  pitchBendMSB_past=pitchBendMSB_now;


  volume = analogRead(1); // read Volume;

  if(volume>127){
    volume=127;
  }

  volume_now = volume & 0x007F;

  if(volume_now <1){
    volume_now = 0;
  }

  if(volume_now != volume_past){
    midi_control(MIDIchannel, 0x07, volume_now);
  }
  volume_past=volume_now;

  delay(10);
}

//++++++++++++++++++++++Functions+++++++++++++++++++++++++++++++++

void midi_control(byte channel, byte control, byte data) {
  digitalWrite(LedPin, HIGH);   // sets the LED on
  Serial.print((0xB0 | channel ), BYTE);  //  control change command
  Serial.print(control & 0x7F, BYTE);  //  control value 0 to 127
  Serial.print(data & 0x7F, BYTE);  //  volume 0-127
  digitalWrite(LedPin, LOW);    // sets the LED off
}


void midi_pitchBend(byte channel, byte dataLSB, byte dataMSB) {
  digitalWrite(LedPin, HIGH);   // sets the LED on
  Serial.print((0xE0 | channel ), BYTE);  //  control change command
  Serial.print(dataLSB & 0x7F, BYTE);  //  control value 0 to 127
  Serial.print(dataMSB & 0x7F, BYTE);  //  pitch 0-127
  digitalWrite(LedPin, LOW);    // sets the LED off
}

////++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Je l'ai trouvé au sein d'un projet beaucoup plus complexe et je l'ai donc simplifié au maximum. D'ailleurs je pense l'avoir bien "nettoyé" mais si vous voyez encore des trucs qui sont inutiles pour moi dans ce code n'hésitez pas! (Je rappelle que je ne suis pas du tout programmeur)

J'ai donc à présent mon potentiomètre0 qui envoie des messages de pitchbend
et mon potentiomètre1 qui envoie des informations de volume.
Super. C'est déjà une belle avancée XD

DONC:

  • Je n'ai toujours pas de note-on (mais bon ça à la limite…je pense rajouter un bouton switch pour ça. J'ai abandonné l'idée de le lier à la commande de volume..)

  • La réponse des capteurs est limitée à une toute petite partie de la course des potentiomètres (en plus j'avais pris des pot 10 tours pour avoir la plus grande course possible..)
    Mon problème maintenant : comment "remapper" à l'aide de mon code? de façon à ce que mes infos 0-127 soient bien sur toutes l'étendue de mes potards (0-1023 c'est bien ça?)

  • Toujours ce problème de "lissage" des valeurs en sortie serial. Même si les écarts de valeurs ne sont pas bien grands (cela donne un pitch et un volume plutôt…instable)
    Ceci dit, l'effet risque d'être vraiment atténué si je règle mon problème n°2, non? Car je pense que pour l'instant mes potentiomètres envoient tout simplement jusqu'à 127 et donc chaque variation s'entend beaucoup.

Je pense qu'après ces derniers points ce sera pas mal :slight_smile:

Donc si vous avez des idées, merci d'avance!

PS: Pour la sortie MIDI, pas d'ajout de broche DIN prévu, je passe de toutes façons par l'USB (via serial2midi qui marche très bien)

Pour "remaper" une valeur tu as la division :

1024 / 8 = 128  512 / 8 = 128

Tu as aussi le % mais ça serait pas super adapter dans ton cas (mais ça reste très utile pour contraindre une valeur en programation :wink: )
Pour le +/- 24 tu divise / 21 et tu retranches 24 et tu aura une valeur entre -24 et + 24

Pour le lissage tu pourrais utiliser 2 variables dont une qui ne change que la valeur que s'il y a un changement.

int Buffer=0;
int Control=0;

Buffer = analogRead(0);

if (Buffer != Control) {
   Control = Buffer;
   functionquienvoilemidi(Control);
}

ou

if (abs(Buffer-Control) > 2) {
  Control = Buffer;
  functionquienvoilemidi
}

Ca y est j'ai réussi mon remapping sur mes 2 potards :slight_smile:
Il ne me reste plus que le "lissage" mais ça risque d’être un peu plus complexe je m'y plongerai plus tard..

merci encore selur!

Dis moi.. Une petite question (légèrement hors topic), j'ai vu que tu étais un spécialiste de la modif du Monotron
et comme j'aurai bien aimé avoir la possibilité d'utiliser mon contrôleur également de façon autonome j'avais justement pensé brancher le ptit Monotron dessus...
C'est possible de faire ça assez facilement? (toujours la même chose: 2 potentiometres :1 pour le pitch (avec une étendue plus grande que le ribbon d'origine si possible..) et 1 autre pour le volume global du Monotron)

Peut-être sans arduino pour le coup...? J'avais vu une photo du CI du monotron où l'on voyait très clairement les points de soudure pour pitch, CV, ground etc.. Il suffit de connecter un potentiomètre sur ces différents points, ou c'est plus compliqué que ça?

spécialiste c'est un bien grand mot ... Pour le potentiomètre un côté à la masse l'autre au +V (3V sur le monotron) la pin du milieu au point de contrôle, il va te falloir un interrupteur aussi pour gérer le GATE (Note On / Off)

OK
Donc c'est bien ça, il suffit de connecter le potentiomètre ground/+v et la pin du milieu au point "pitch"
Cool! :slight_smile:
Le registre sera plus étendu ou restera limité comme le ribbon d'origine?

Sinon le point GATE n'est que pour les Note On / Notes Off alors... Où puis-je récupérer le volume général?

Voici la photo dont je parlais précédemment: