[Résolu] "Midi" et Mystères...Help !!!

Salut et bonne année, Décidement, quand ça veut pas... ça veut pas; et là il va me falloir un Docteur es -Midi. Etat des lieux: - Un mini sampleur et deux claviers (les deux claviers réagissant pareil, on dira: "clavier".) - Deux câbles blindés 50 cm, dont un en 2x1,5 (les deux câbles/prises, donnant les mêmes résultats dans toutes les manips, sont hors de cause.) - Une Méga 2560 (avec et sans opto-coupleur) -Un pc + interface midi/USB + prog basic + winm.dll (Windoze) - Un oscillo (réglé: 5V et 20ms/div). - Dans toutes les manips, seul le câble "Out" (de l'emmetteur) est raccordé; aucun réglage n'est modifié nulle part. Les résultats: - Avec l'interface et le Prog basic: Les données reçues (focale sur le N° de la note) sont bonnes avec tous les appareils. - Avec l'arduino et le sampleur (avec et sans opto) J'arrive à allumer des leds en fonction des notes envoyées. A noter que le signal est présent entre broche et masse (blindage) et pas entre broches (prise din), et se présente sous la forme d'un train d'impulsions (3,8 V; montées et descentes fines) Avec les claviers: le signal est entre broches, et non broche/masse; et ce n'est plus qu'un seul pic, non écrété de 5 à 6 V au tracé épais et à décroissance logarithmique); et évidemment, l'Arduino n'en veut pas. Sur les claviers, j'ai tentés des: GM Mode On/off, des changement de canal, et moultes autres dé-réglages plus ou moins chelous. Et ban je peux dire sans vouloir me vanter, que je n'y comprends = Rien . Et d'autant plus: Rien, qu'avec le prog basic ça marche à la perfection. J'enrage, je bouille, je disjoncte :0 :relaxed: ^_^ :roll_eyes: :roll_eyes: :( :disappointed_relieved: :fearful: :open_mouth:. EDIT: dans aucune des docs le "baud-rate " n'est mentionné.

Baud rate de 31250 bps pour la transmission MIDI

Carolyne:
A noter que le signal est présent entre broche et masse (blindage) et pas entre broches (prise din), et se présente sous la forme d’un train d’impulsions (3,8 V; montées et descentes fines)
Avec les claviers: le signal est entre broches, et non broche/masse; et ce n’est plus qu’un seul pic, non écrété de 5 à 6 V au tracé épais et à décroissance logarithmique); et évidemment, l’Arduino n’en veut pas.


Sur le MIDI out sur la prise DIN

  • le "signal " sort en collecteur ouvert sur la broche 5
  • un tirage au plus est présent sur la broche 4
  • une masse est présente sur la broche 2

Sur le MIDI in sur la prise DIN

  • le "signal " entre sur la broche 5
  • l’optocoupleur attend un tirage au plus sur la broche 4
  • il n’y a pas de masse sur le 2

Comme tu le vois la masse n’est pas nécessaire dans la liaison puisqu’elle se fait par boucle de courant entre le 4 et le 5. Donc méfiance dans les mesures. Sur le MIDI out la masse n’est présente que pour des besoins de blindage et non de référencement des signaux.
Donc:

  • si tu regardes sur le 5 d’un MIDI out alors qu’il n’est pas relié à un MIDI in, tu ne vois rien (logique collecteur ouvert sans tirage)
  • si tu regardes sur le 5 d’un MIDI out alors qu’il est relié à un MIDI in, tu vois un signal typique d’une liaison série à 31250 bauds.
    Dans les 2 cas ci-dessus je considère que tu prends la masse sur le 2 coté MIDI out et que c’est vraiment une masse (ce qui n’est pas une obligation, le blindage peut ne pas être réuni en continu à la masse électrique).

Un outil de test simple de la liaison MIDI 2 diodes LED tête-bêche entre 4 et 5.

Les liaisons sans opto-coupleur ne peuvent normalement pas fonctionner.

Merci beaucoup fdufnews. Je digère tout ça, je fais le montage avec les deux leds et je reviens. Note qu'avec le sampleur (broche-signal/masse) ça fonctionne avec et sans l'opto.

Les leds voient passer le signal (sampleur) et pic (clavier) à l'enfoncé de touche et au relaché; pas d'allumage permanent. Avec le sampleur, la led s'allume plus qu'avec le clavier(Psampl=2x pclav à la louche) Normal, dans un cas il y a un train d'impuls', dans l'autre un seul pic. Les mesures (sonde de l'oscillo toujours côté signal): Sampleur (qui baigne): Broche-signal/broche-non-signal=0V; signal=-5V Broche-signal/masse= +5V; signal=0V Broche-non-signal/masse=+5V; pas de signal Clavier (qui merde): Broche-signal/broche-non-signal=0V; pic =-5V Broche-signal/masse= 0V; pas de pic Broche-non-signal/masse= +5V; pas de pic Que conclure ? ....grratt...grraatt...grraatt...

Carolyne: Que conclure ? ....grratt...grraatt...grraatt...

Rien, tu ne dis pas si la mesure est réalisée avec une charge entre les broches 4 et 5 de la prise. Et puis pour la clarté de la chose au lieu de parler de signal et non signal utilise le numéro de la broche c'est le plus simple (je mets la masse du scope sur telle broche, la pointe de touche sur telle autre broche).

Les mesures sont faites sans charge (les pointes directement dans la prise); et le signal/non-signal, c'est que j'ai toujours le doute de savoir si la prise est vue de face ou non. Au vu des schémas, la broche-signal, c'est toujours la "5". Et par voie de conséquence, la non-signal c'est la "4". je n'arrive pas à piger l'histoire du "tirage" au +. Pourquoi avec le sampleur ça marche sans tirage et sans opto ? Comment est-ce possible qu'avec le clavier, il n'y ai que 2 pics ! Pas la moindre trace d'impulses; et pourtant ça marche avec l'interface et le prog basic ? C'est franchement "dépassant" ce truc. :relaxed:

Carolyne: Les mesures sont faites sans charge (les pointes directement dans la prise); et le signal/non-signal, c'est que j'ai toujours le doute de savoir si la prise est vue de face ou non. Au vu des schémas, la broche-signal, c'est toujours la "5". Et par voie de conséquence, la non-signal c'est la "4". je n'arrive pas à piger l'histoire du "tirage" au +.

La norme MIDI est claire, l'interface fonctionne si le récepteur place une charge entre les broches 4 et 5. Ce n'est pas utile de perdre du temps à essayer de le faire fonctionner autrement.

Carolyne: Pourquoi avec le sampleur ça marche sans tirage et sans opto ? Comment est-ce possible qu'avec le clavier, il n'y ai que 2 pics ! Pas la moindre trace d'impulses; et pourtant ça marche avec l'interface et le prog basic ? C'est franchement "dépassant" ce truc. :relaxed:

La sortie broche 5 tout en respectant la norme peut être réalisée d'un point de vue matériel de 2 façons: - une porte à collecteur ouvert - une sortie totem-pole classique

Dans le premier cas fonctionne uniquement avec une charge entre la broche 5 et la broche 4. Charge de collecteur tirée au +5V. Dans le second cas fonctionnement sans charge possible. On voit un signal entre broche 5 et masse mais attention il est inversé par rapport au signal queverrait une charge tirée au +5V.

Lorsque la sortie est à collecteur ouvert et qu'il n'y a pas de charge, la première transition fait passer le signal à 0. Ensuite le tirage au plus ne se fait plus que par le courant de fuite des entrées connectés au signal donc la remontée est très lente. D’où le signal que tu observes.

Pour conclure, je dirais qu'il n'y a pas de mystère. Tu manques juste un peu de rigueur quelques fois. Il ne faut pas essayer de faire fonctionner les interfaces en dehors de leurs spécifications.

Il y a donc bien une différence matérielle entre les deux appareils. Ce que tu viens d'expliquer, ça n'existe nulle part, pourtant c'est vraiment super important. Je vais mettre une charge (15 K, que je réduirai jusqu'à 4,7K/4K) entre 4 et 5. Y'a quand même un truc bizarre: Ce qu'il y a dans l'interface "midi/USB" qui fait que les données sortent bien du clavier, devrait être en trop pour le sampleur, puisque lui n'en a pas besoin. je copie tes explic's, il faut absolument que je comprenne comment fonctionne ce truc.

Pfiouuuuuu !!! Alors là, je ne sais pas comment tu va pouvoir expliquer ça; vois plutôt:
Test avec la carte et un prog à 3 leds.
-Je mets une R 10 K entre 4 et 5 (plus tard j’ai fait varier entre 10 et 4 sans effet notoire)

  • Le pic pointu a été remplacé par un creneau ( plus fin, plus propre, mais je n’en vois qu’un.)
  • Avec l’opto: rien
  • Je branche direct 5 sur RX et 4 sur masse + oscillo en //: Rien.
  • Je débranche l’oscillo, et sans faire gaffe, je débranche aussi la masse.
  • J’ai donc maintenant la R sur 4/5; 5 sur RX, et rien d’autre.
    Et ça marche ! (Do=led3; Do#=led11; Ré=led6)
    ça marche avec un seul fil de branché !!!
    Je rebranche la masse ->ça marche plus.
    Je débranche la masse ->ça remarche.
    Perso des trucs électriques qui marchent avec un seul fil, j’en avais jamais vu. Je suis estomaquée !!! J’en crois pas mes yeux !!
    C’est pas le top au niveau réactionnel, mais ça marche. Il faudrait que j’arrive à repasser sur deux fils.
    Du coup je mets le code, c’est celui à 6 leds que j’ai modifié pour mes essais.
// notes 21 à 47 nein ! ->36 à 47 because les petits carrés !.(A voir...)
//-----> "$ % & ' ( ) * + , - . / ";
int ledPins[] = { 11, 10, 9, 6, 5, 3  };   // PWM pins for the LEDS
char key_state[] = { 0,0,0,0,0,0 };  // key states 0 = off, 1 = on, 2 = fade in
                                     //  3 = fade out, 4 = blink
unsigned long key_val[] = { 0,0,0,0,0,0 };

//MIDI data
char mCommand = 0;
char mChannel = 0;
char mByte1 = 0;
char mByte2 = 0;

//Misc data
int incomingByte;
int dataByte;
int lNibble;
int rNibble;

// Middle C (C3)
byte l_offset = 0x3C;

// Higher C (C4)
byte h_offset = 0x48;

// Lower C (C2)
byte m_offset = 0x30;

// Number of frames to fade and blink
unsigned long fade_time = 10000;
unsigned long blink_time = 2000;

boolean validCommand = false;

boolean readMidi()
{
  if(Serial1.available() > 0) {
    incomingByte = Serial1.read();
    dataByte = incomingByte&0xFF; //keep only a byte
    
    return true;
  }
  return false;
}

void setup() {
  //  Set MIDI baud rate:
  Serial1.begin(31250);
  Serial.begin(9600);

  for (int i = 0; i < 6; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}

void loop() {
  if (readMidi()) {
    // save the left nibble and right nibble of the byte received
    lNibble = dataByte>>4;
    rNibble = dataByte&0x0f; 
   
    // lNibble is the MIDI command.  Check for a valid command. 
    if (lNibble == 0x09 || lNibble == 0x08) {
      validCommand = true;
      mCommand = lNibble;
      mChannel = rNibble;
      mByte1 = 0;
      mByte2 = 0;
    }
    else if (mByte1 == 0 && validCommand) {
      mByte1 = dataByte;
    }
    else if (mByte2 == 0 && validCommand && mByte1 != 0) {
      mByte2 = dataByte; 
      //---------------------Mon prog-------------
      Serial.println(mByte1); //à supprimer
      if(mByte1=='

) {
          nolight();
          digitalWrite(3, HIGH);
      }
      if(mByte1==’%’) {
          nolight();
          digitalWrite(11, HIGH);       
      }
      if(mByte1==’&’) {
          nolight();
          digitalWrite(6, HIGH);       
      }     
    }
  }
}

//------------------- Fonction d’extinction-----------------
void nolight() {
  digitalWrite(3, LOW);
  digitalWrite(6, LOW);
  digitalWrite(11, LOW);
}

Carolyne: Il y a donc bien une différence matérielle entre les deux appareils. Ce que tu viens d'expliquer, ça n'existe nulle part, pourtant c'est vraiment super important.

Pas si important. Si tu utilises la sortie comme préconisé avec une charge entre 4 et 5 la différence est invisible.

Carolyne: Je vais mettre une charge (15 K, que je réduirai jusqu'à 4,7K/4K) entre 4 et 5.

Il ne faut pas que la charge soit trop élevée car sinon le tirage ne sera pas assez fort et le niveau 1 ne remontera pas assez vite.

Carolyne: je copie tes explic's, il faut absolument que je comprenne comment fonctionne ce truc.

Si tu regardes le petit schéma que j'ai joint un peu plus haut, tu verras que sortie à collecteur et sortie totem-pole donnent un fonctionnement équivalent vu de l'extérieur lorsque tu exploites la sortie comme préconisé par la norme.

Tu a dû poster en même temps que moi, je vois que tu ne réponds pas à mon dernier message qui est au-dessus du tiens.
J’espère que tu est assis, parce que ça décoiffe !

Carolyne: Pfiouuuuuu !!! Alors là, je ne sais pas comment tu va pouvoir expliquer ça; vois plutôt: Test avec la carte et un prog à 3 leds. -Je mets une R 10 K entre 4 et 5 (plus tard j'ai fait varier entre 10 et 4 sans effet notoire) - Le pic pointu a été remplacé par un creneau ( plus fin, plus propre, mais je n'en vois qu'un.) - Avec l'opto: rien - Je branche direct 5 sur RX et 4 sur masse + oscillo en //: Rien.

La broche 4 c'est le +5V du MIDI out avec une résistance de protection si tu mets cette broche à la masse tu supprimes le tirage au +5V. C'est ce que je disais tout à l'heure, tu fais n'importe quoi. Il faut de temps en temps s'arrêter et réfléchir sinon tu fais des trucs incohérents.

Carolyne: -Je débranche l'oscillo, et sans faire gaffe, je débranche aussi la masse. - J'ai donc maintenant la R sur 4/5; 5 sur RX, et rien d'autre.

ça marche avec un seul fil de branché !!!!!!!!!!!!!!!!!!!!!! Je rebranche la masse ->ça marche plus. Je débranche la masse ->ça remarche.

La masse doit passer par un autre chemin (et puis les oscillo ne sont pas difficiles même sans masse on a quelque chose)

(et puis les oscillo ne sont pas difficiles même sans masse on a quelque chose)

Mais c'est pas l'oscillo qui marche, il est débranché et éteint. C'est la carte !!! Le code qui est sur la carte fonctionne !!! Les leds s'allument et s'éteignent !! Avec un seul fil !!. Et je ne peux pas brancher la masse !!! wtf ??? :P

J'ai branché le blindage à la masse, laissé la 4 en l'air. Et bien ça gagne en réactivité. On peut pratiquement dire que c'est bon. :D Y'a t-il une valeur conventionnelle , couramment utilisée pour la charge dans ce cas ? En tous cas, un gros Merci; je désespérais d'y arriver. Il y a des trucs qui sont simples quand on les connaît, mais pas si évidents quand on les découvres. Comme ces "collecteurs ouverts"; pièges à néophites. :P Je mets "Résolu" ça mérite...

Hello,

La cavalerie arrive toujour un peu en retard, mais j'ai un peu de lecture pour toi ;) http://www.sonelec-musique.com/electronique_theorie_midi_norme.html

Merci pour la lecture Xav. Concernant la liaison, fdufnews m'a sortie du marécage (que son nom soit béni par les siècles des siècles.) Concernant les messages midi, plus j'y regarde et plus je m'arrache les cheveux; heureusement que le code que Artouste m'a trouvé (qu'il soit béni dans la même bassine que fdufnews) , s'occupe du découpage du saucisson des octets. Il me reste un petit soucis, mais je crois qu'il n'est pas solvable; c'est que en dessous de 33 les caractères ASCII sont remplacés par des petits carrés (wtf ? noun dé Diou ! ]:)); et si tu regarde le code de la page précédente, tu peux voir que je me sers des caractères ASCII pour la saisie; ce qui me limite au deuxième octave (minimum) :zipper_mouth_face:. Ce qui est râlant, c'est que le prog basic + la winm.dll de Windows, lui il me sort les N° de notes en dessous de 33 en beaux et bons nombres. Mais bon, je suis sur les bons rails. :D

Carolyne:
Il me reste un petit soucis, mais je crois qu’il n’est pas solvable; c’est que en dessous de 33 les caractères ASCII sont remplacés par des petits carrés (wtf ? noun dé Diou ! ]:)); et si tu regarde le code de la page précédente, tu peux voir que je me sers des caractères ASCII pour la saisie; ce qui me limite au deuxième octave (minimum)

Je ne vois vraiment pas pourquoi tu veux absolument utiliser les codes ASCII pour décoder la trame MIDI. L’ASCII c’est pour encoder des caractères qu’elle est le rapport entre les deux?
Les messages MIDI sont quand même pas compliqué à décoder.
NOTE ON :
0b1001xxxx x = numéro du canal
0b0kkkkkkk k = numero de la note
0b0vvvvvvv v = velocité

NOTE OFF :
0b1000xxxx x = numéro du canal
0b0kkkkkkk k = numero de la note
0b0vvvvvvv v = velocité

Tu ne vas quand même pas me dire que tu ne peux pas trouver une solution simple pour sortir la valeur de la note.
En pièce jointe un doc que j’avais trouvé sur un site qui traitait du MIDI et qui à malheureusement disparu. Les messages sont clairement expliqués et on voit bien comment les tronçonner pour récupérer les morceaux intéressants. Avec quelques masques pour isoler la partie fixe et la partie variables des messages on peut facilement retrouver ses petits.

midi_messages.pdf (644 KB)

Ce que j'ai bien compris: C'est qu'il y en a ici quelque uns qui jonglent avec les bits et les octets comme s'ils jouaient aux osselets. 8) Je finirai bien par comprendre comment le code de la page précédente si prends pour analyser le message. Mais en attendant, j'ai besoin d'avancer. J'ai réussi à "accrocher" par les codes ASCII, et j'exploite le filon. En remontant dans le code, t'inquiète que j'y arriverai à les analyser ces foutus messages. :D

Hello,

As-tu déjà essayé MIDIOX ? C'est le couteau suisse MIDI, avec un moniteur d'événements.