Problème Arduino vers Hairless (Serial vers Midi)

Bonjour,
J'ai récemment fait un post pour résoudre mon problème de message totalement illisible.
Ce problème est maintenant résolu.
Sauf que maintenant que je veux aller plus loin dans l'obtention d'un son sur Ableton (via Hairless), eh bah je me retrouve de nouveau face à un problème...

Alors, en fait : Maintenant que j'ai un message Midi exploitable, Hairless n'a pas l'air de vouloir comprendre.

Voici un extrait de ce qui en sort en pièce jointe...

Je ne retrouve que des "note Off" alors qu'elles devraient être "note On" et il y a beaucoup de "Program Change" et de "System Message", et surtout : un gros avertissement comme quoi il manque "1 data byte" sauf que dans les préférences, je suis au max (8 data bytes).

Et donc, bien évidemment, Ableton ne capte rien du tout !

Voici mon code si jamais ça peut aider :

#include <MIDI.h>

//*******************************************************************************************************************
// User settable variables
//*******************************************************************************************************************


MIDI_CREATE_DEFAULT_INSTANCE();
int pinRead;
int pinAssignments[12] = {
  'A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'A11'
};
byte PadNote[16] = {
  57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72
};         // MIDI notes from 0 to 127 (Mid C = 60)
int PadCutOff[16] =
{
  400, 400, 200, 800, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400
};           // Minimum Analog value to cause a drum hit
int MaxPlayTime[16] = {
  90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90
};               // Cycles before a 2nd hit is allowed
#define midichannel 2;                              // MIDI channel from 0 to 15 (+1 in "real world")
boolean VelocityFlag  = true;                           // Velocity ON (true) or OFF (false)

//*******************************************************************************************************************
// Internal Use Variables
//*******************************************************************************************************************
boolean activePad[16] = {
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};                   // Array of flags of pad currently playing
int PinPlayTime[16] = {
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};                     // Counter since pad started to play
byte status1;

int pin = 0;
int hitavg = 0;
//*******************************************************************************************************************
// Setup
//*******************************************************************************************************************
void setup()
{
  MIDI.begin();                                // connect to the serial port 115200

}
//*******************************************************************************************************************
// Main Program
//*******************************************************************************************************************
void loop()
{
  for (int pin = 0; pin < 16; pin++)                       //
  {
    //int pin = 3;
    //   for (pinRead=0; pinRead < 16, pin++){
    hitavg = analogRead(pinAssignments[pin]);
    //Serial.println(hitavg);
    // read the input pin

    if ((hitavg > PadCutOff[pin]))
    {
      if ((activePad[pin] == false))
      {
        if (VelocityFlag == true)
        {
          //          hitavg = 127 / ((1023 - PadCutOff[pin]) / (hitavg - PadCutOff[pin]));    // With full range (Too sensitive ?)
          hitavg = (hitavg / 8) - 1 ;                                                // Upper range
        }
        else
        {
          hitavg = 127;
        }
        MIDI_TX(144, PadNote[pin], hitavg); //note on

        PinPlayTime[pin] = 0;
        activePad[pin] = true;
      }
      else
      {
        PinPlayTime[pin] = PinPlayTime[pin] + 1;
      }
    }
    else if ((activePad[pin] == true))
    {
      PinPlayTime[pin] = PinPlayTime[pin] + 1;
      if (PinPlayTime[pin] > MaxPlayTime[pin])
      {
        activePad[pin] = false;
        MIDI_TX(144, PadNote[pin], 0);
      }
    }
  }
}

//*******************************************************************************************************************
// Transmit MIDI Message
//*******************************************************************************************************************
void MIDI_TX(byte MESSAGE, byte PITCH, byte VELOCITY)
{
  status1 = MESSAGE + midichannel;
//  Serial.print(status1);
//  Serial.print(PITCH);
//  Serial.print(VELOCITY);
  MIDI.sendNoteOn(PITCH, VELOCITY, 2);
  delay(200);
  MIDI.sendNoteOff(PITCH, 0, 2);


}

Si quelqu'un voit quelque chose qui pourrait améliorer mon système, je lui en serait très reconnaissant !
Merci d'avance :slight_smile:

Très bonne journée.

Dans tes copies d'écran on voit que des messages "program change" sont échangés ,or dans ton programme tu n'en envois aucun à ce que j'ai vu.
Es-tu certain que la liaison série est bien configurée des 2 cotés?

fdufnews:
Dans tes copies d'écran on voit que des messages "program change" sont échangés ,or dans ton programme tu n'en envois aucun à ce que j'ai vu.
Es-tu certain que la liaison série est bien configurée des 2 cotés?

Alors comme ça, au premier abord, je dirais : oui
Mon système est bien branché au port USB qui est correctement sélectionné dans l'IDE Arduino, tout comme sur Hairless. La carte choisie est bien la bonne...
Après je ne m'y connais pas parfaitement et tu entends peut être autre chose par "configuration de liaison série"...

fireblock:
Bonjour,
J'ai récemment fait un post pour résoudre mon problème de message totalement illisible.
Ce problème est maintenant résolu.
Sauf que maintenant que je veux aller plus loin dans l'obtention d'un son sur Ableton (via Hairless), eh bah je me retrouve de nouveau face à un problème...

Alors, en fait : Maintenant que j'ai un message Midi exploitable, Hairless n'a pas l'air de vouloir comprendre.

Voici un extrait de ce qui en sort en pièce jointe...

Je ne retrouve que des "note Off" alors qu'elles devraient être "note On" et il y a beaucoup de "Program Change" et de "System Message", et surtout : un gros avertissement comme quoi il manque "1 data byte" sauf que dans les préférences, je suis au max (8 data bytes).

Et donc, bien évidemment, Ableton ne capte rien du tout !

Voici mon code si jamais ça peut aider :

#include <MIDI.h>

//*******************************************************************************************************************
// User settable variables
//*******************************************************************************************************************

MIDI_CREATE_DEFAULT_INSTANCE();
int pinRead;
int pinAssignments[12] = {
 'A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'A11'
};
byte PadNote[16] = {
 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72
};         // MIDI notes from 0 to 127 (Mid C = 60)
int PadCutOff[16] =
{
 400, 400, 200, 800, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400
};           // Minimum Analog value to cause a drum hit
int MaxPlayTime[16] = {
 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90
};               // Cycles before a 2nd hit is allowed
#define midichannel 2;                              // MIDI channel from 0 to 15 (+1 in "real world")
boolean VelocityFlag  = true;                           // Velocity ON (true) or OFF (false)

//*******************************************************************************************************************
// Internal Use Variables
//*******************************************************************************************************************
boolean activePad[16] = {
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};                   // Array of flags of pad currently playing
int PinPlayTime[16] = {
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};                     // Counter since pad started to play
byte status1;

int pin = 0;
int hitavg = 0;
//*******************************************************************************************************************
// Setup
//*******************************************************************************************************************
void setup()
{
 MIDI.begin();                                // connect to the serial port 115200

}
//*******************************************************************************************************************
// Main Program
//*******************************************************************************************************************
void loop()
{
 for (int pin = 0; pin < 16; pin++)                       //
 {
   //int pin = 3;
   //   for (pinRead=0; pinRead < 16, pin++){
   hitavg = analogRead(pinAssignments[pin]);
   //Serial.println(hitavg);
   // read the input pin

if ((hitavg > PadCutOff[pin]))
   {
     if ((activePad[pin] == false))
     {
       if (VelocityFlag == true)
       {
         //          hitavg = 127 / ((1023 - PadCutOff[pin]) / (hitavg - PadCutOff[pin]));    // With full range (Too sensitive ?)
         hitavg = (hitavg / 8) - 1 ;                                                // Upper range
       }
       else
       {
         hitavg = 127;
       }
       MIDI_TX(144, PadNote[pin], hitavg); //note on

PinPlayTime[pin] = 0;
       activePad[pin] = true;
     }
     else
     {
       PinPlayTime[pin] = PinPlayTime[pin] + 1;
     }
   }
   else if ((activePad[pin] == true))
   {
     PinPlayTime[pin] = PinPlayTime[pin] + 1;
     if (PinPlayTime[pin] > MaxPlayTime[pin])
     {
       activePad[pin] = false;
       MIDI_TX(144, PadNote[pin], 0);
     }
   }
 }
}

//*******************************************************************************************************************
// Transmit MIDI Message
//*******************************************************************************************************************
void MIDI_TX(byte MESSAGE, byte PITCH, byte VELOCITY)
{
 status1 = MESSAGE + midichannel;
//  Serial.print(status1);
//  Serial.print(PITCH);
//  Serial.print(VELOCITY);
 MIDI.sendNoteOn(PITCH, VELOCITY, 2);
 delay(200);
 MIDI.sendNoteOff(PITCH, 0, 2);

}




Si quelqu'un voit quelque chose qui pourrait améliorer mon système, je lui en serait très reconnaissant !
Merci d'avance :)

Très bonne journée.

Bonsoir
dans ton prgramme tu utilise la lib midi
et cette lib configure de base le serial à 31250 qui est la valeur standard midi, MAIS aussi bizarre que çà paraisse hairless n'accepte pas en entrée serial la valeur 31250 :smiling_imp: ,il faut forcer le serial de ton programme à 115200 (ou autres valeurs supportées) , soit par modif de la lib ou en forçant aprés le midi.begin avec un serial .begin à 115200 (il me semble avoir testé cette solution avec succès,mais c'est loin :grin: )

Bonsoir,

L'argument de begin() c'est un numéro de canal.
Pour changer la vitesse de la liaison série, il faut modifier la valeur de BaudRate dans le fichier serialMIDI.h de la librairie.