probleme polyphnie midi

salut,

j'ai un probleme concernant le midi et arduino:

je me sert de live ableton comme séquenceur midi,
qui est relier a mon arduino uno par une prise midi que jai connecté sur l’entrée rx,
ensuite j’utilise 4 électros aimants qui s'active ou se désactive en fonction des notes midis reçu

exemple: la note on midi n°64 enclenche le solénoïde n° 1,

la note on midi n°65 enclenche le solénoïde n° 2;
etc..

tout marche, sauf que je n'arrive pas à faire de la polyphonie mon programme n'active qu’une note sur un accord,
j'ai pas trouver la solution,ou pas compris.. bien que j’ai vus des projets similaire fonctionner..

je joins le code pour montrer ou j'en suis..

, si quelqu’un peut m’aider ou me renseigner un lien, c’est vraiment sympa,
merci dans tout les cas !!

_4_solenoide_plus_midi.ino (2.93 KB)

Bonjour,

Dans ton sketch, quand tu reçoit une note, tu coupes tous les autres solénoides. Il faut couper le solénoide uniquement pour le note concernée
Par exemple pour la note 61

  // lelectroaimant 1 sallume pour la note On n°61
  if (channel == 144 && note == 61)
  {
    if (velocity > 0 )
      digitalWrite(solenoide1, HIGH);
    else
      digitalWrite(solenoide1, LOW);
  }

merci pour la reponse,
sa commence a marcher sauf que de cette facon la :

// lelectroaimant 2 sallume pour la note On n°62
  if (channel == 144 && note == 62 ) {

    if ( velocity > 0) {
      digitalWrite(solenoide2, HIGH);
    }
    else {
      digitalWrite(solenoide2, LOW);
    }
  }

je peut superposer les notes mais le code prend plus en compte le "else", les notes reste "on" à jamais

et de cette autre façons :

 // lelectroaimant 1 sallume pour la note On n°61
  if (channel == 144 && note == 61 &&  velocity > 0 ) {


    digitalWrite(solenoide1, HIGH);
  }

  else {
    digitalWrite(solenoide1, LOW);

  }

sa marche pas en supperposant les notes mais sinon le note "on" et "off" fonctionne,

et je comprend pas bien la difference entre les deux exemples alors que sa reagit completement differement !

navet:
je peut superposer les notes mais le code prend plus en compte le "else", les notes reste "on" à jamais

bonsoir
Il ne faut pas utiliser de else , mais un if pour note on et un autre pour note off

salut Artouste,

pareille sa reste bloque sur note on:

 // lelectroaimant 1 sallume pour la note On n°61
  if (channel == 144 && note == 61 )
  {
    if (velocity > 0)
      digitalWrite(solenoide1, HIGH);
   if (velocity == 0) 
      digitalWrite(solenoide1, LOW);
  }

comprend pas pourquoi il capte pas le velocity == 0 ?

navet:
salut Artouste,

pareille sa reste bloque sur note on:

 // lelectroaimant 1 sallume pour la note On n°61

if (channel == 144 && note == 61 )
 {
   if (velocity > 0)
     digitalWrite(solenoide1, HIGH);
  if (velocity == 0)
     digitalWrite(solenoide1, LOW);
 }




comprend pas pourquoi il capte pas le velocity == 0 ?

debug par serial pour verifier la velocité

essaie aussi de remplacer

if (velocity == 0)

par

if (velocity < 1)

du coup sa marche, effectivement en regardant dans le moniteur il me donner rien en note off,
du coup jai repris un exemple midi de la librairie MIDI avec une fonction pour les note on et une autre pour les note off et la polyphonie marche!

je mets le code si jamais sa sert..

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

#define LED 13
int solenoide1 = 3;  //n° de sotie electroaimant (solenoides)
int solenoide2 = 4;
int solenoide3 = 5;
int solenoide4 = 6;


void handleNoteOn(byte channel, byte pitch, byte velocity)
{ digitalWrite(LED, HIGH);
  if (channel == 1 && pitch == 61 && velocity > 0 )
  {
    digitalWrite(solenoide1, HIGH);
  }
  if (channel == 1 && pitch == 62 && velocity > 0 )
  {

    digitalWrite(solenoide2, HIGH);
  }

  if (channel == 1 && pitch == 63 && velocity > 0 )
  {

    digitalWrite(solenoide3, HIGH);
  }

  if (channel == 1 && pitch == 64 && velocity > 0 )
  {

    digitalWrite(solenoide4, HIGH);
  }
}

void handleNoteOff(byte channel, byte pitch, byte velocity)
{ digitalWrite(LED, LOW);
  if (channel == 1  )
  {

    digitalWrite(solenoide1, LOW);
  }

  if (channel == 1   )
  {

    digitalWrite(solenoide2, LOW);
  }

  if (channel == 1   )
  {

    digitalWrite(solenoide3, LOW);
  }

  if (channel == 1  )
  {

    digitalWrite(solenoide4, LOW);
  }
}


void setup() {

  pinMode(solenoide1, OUTPUT);
  pinMode(solenoide2, OUTPUT);
  pinMode(solenoide3, OUTPUT);
  pinMode(solenoide4, OUTPUT);
  pinMode(LED, OUTPUT);

  MIDI.setHandleNoteOn(handleNoteOn);
  MIDI.setHandleNoteOff(handleNoteOff);


  MIDI.begin(MIDI_CHANNEL_OMNI);
  Serial.begin(31250);
}

void loop()
{

  MIDI.read(10);
}

en tout cas merci pour les réponses
ce forum est super effcaces!!