Accordéon Midi
Répondre à la discussion
Affichage des résultats 1 à 27 sur 27

Accordéon Midi



  1. #1
    Janosch

    Accordéon Midi


    ------

    Salut tout le monde!
    Je me suis lancé dans un projet qui me dépasse un peu, je compte sur vous pour m'aider a avancer:
    "midifier" mon accordéon!
    Alors par où commencer...
    Je vais tenter de décrire où j'en suis:

    voila déjà le matériel dont je dispose:
    - 1 accordeon (évidemment) 37notes a droite, 24 a gauche.
    - 2 Arduino (un Mega et un Uno)
    - des fourches optiques (http://www.gotronic.fr/pj-365.pdf) (pour l'instant j'en ai que 3 mais j'attende les 58 autres)
    -1 capteur de pression (http://www.robotshop.com/capteur-pre...-bmp085-5.html)
    -écran LCD (http://www.robotshop.com/eu/dfrobot-...d-arduino.html) (on verra plus tard ça je pense).
    -du cable, des connecteurs...
    -Je pense avoir ce qu'il faut en outillage (fer a souder, multimetre...)

    Le principe: j'imagine que vous avez compris,
    Je met les optos au dessus de la mécanique des touches (quand la touche est enfoncée, elle interrompt la transmission led/collector), le capteur de pression dans le soufflet,
    je branche tout ça suir mon arduino, relie tout ça avec un cable midi a mon synthé, et voila.

    Au niveau du code (c'est surtout la que je galère) J'arrive a "lire" la pression (dans le serial),
    pour l'instant je branche un opto par pin (le mega en a 50 donc pas de probleme pour la main droite...)
    on m'a déja parlé de multiplexage sur ce forum (merci daudet78) mais si je peux éviter ça m'arrange.

    Quelqu'un peut m'expliquer le meilleur moyen de partager du code avec vous (je le met en piece jointe? quel fomat?),
    pour que je puisse vous montrer?

    -----

  2. #2
    invite936c567e

    Re : Accordéon Midi

    Bonjour

    Pour présenter du code, il faut l'insérer entre des balises « [CODE]...[/CODE] ». Pour ce faire, tu peux directement taper ces balises, ou bien cliquer sur le bouton « Aller en mode avancé » afin de pouvoir utiliser le bouton d'édition « # » prévu à cet effet.

    Ces balises permettre de préserver l'indentation du code. Tu peux également y rajouter de la couleur et utiliser les différentes options de formatage.

    Par exemple, le code suivant :

    [CODE]
    void setup()
    {
    ¨¨ // initialisation
    }

    void loop()
    {
    ¨¨ // boucle principale
    }
    [/CODE]


    ... donne ceci :
    Code:
    void setup()
    {
       // initialisation
    }
    
    void loop()
    {
       // boucle principale
    }

  3. #3
    invite936c567e

    Re : Accordéon Midi

    Concernant le multiplexage, je pense que tu pourras t'en passer.

    En effet, l'ATmega2560 de l'Arduino Mega autorise toutes ses entrées-sorties (y compris les entrées analogiques A0 à A15) à être reconfigurées comme des entrées numériques avec une résistance de pull-up intégrée. Il est donc tout-à-fait envisageable de brancher directement tes 61 optocoupleurs sur les 70 entrées/sorties disponibles sur la carte.

  4. #4
    Janosch

    Re : Accordéon Midi

    Voila où j'en suis:

    Code:
    #include <Wire.h>
    #include <Adafruit_BMP085.h>
    
    int A3Pin = 54;  
    int Bb3Pin = 53;  //C'est la que j'ai branché mes optointerrupteurs
    
    
    Adafruit_BMP085 bmp;
    
    void setup() 
    {
        Serial.begin(31520);   //c'est ça qu'il faut comme vitesse pour le midi
        bmp.begin(); 
        pinMode(A3Pin, INPUT);
        pinMode(Bb3Pin, INPUT);
    }
    
    void loop() 
    {
        if (digitalRead(A3Pin) == HIGH) 
       {          
        int note = 0x39;{ //0x39 correspond a la note A3 (La)
       
        noteOn(0x90, note, 0x45);   //0x90 correspond au canl utilisé (1) 0x45 a la vélocité.
        delay(1000);
       }
    }
        else 
       {     
        int note = 0x39; {
        noteOn(0x90, note, 0x00); /*ici je renvoi la même note 
        mais avec une vélocité (volume) a 0 
        car il me semble qu'il n'existe pas de commade noteoff*/
       }
    }
       
       
        if (digitalRead(Bb3Pin) == HIGH) 
       {          
        int note = 0x3A; //0x3A correspond a la note Bb3 (Si bémol)
       {    
        noteOn(0x90, note, 0x45);   
        delay(1000);
       }
    }
        else 
       {     
        int note = 0x3A; {
        noteOn(0x90, note, 0x00); 
       }
    }
    }
       
    void noteOn(int cmd, int pitch, int velocity)
    {
      Serial.write(cmd);
      Serial.write(pitch);
      Serial.write(velocity);
    
    {
    }
    }


    (pour l'instant je n'ai inclu que 2 optos dans mon code)

    En gros j'ai 3 problèmes
    1)Je n'ai pas encore inclu le capteur de pression car je sais pas comment convertir ses données en hexadécimal. aide?
    2)Sinon ca beug grave quand même, quand j'upload ça dans l'arduino, y'a mon synthé qui clignote de partout, tout les réglages(du synthé) se modifient..
    3)les optos fonctionnent mais le soucis est que la note es répètée (c'est pour ça que j'ai mis un delay() sinon c'est très laid).

  5. A voir en vidéo sur Futura
  6. #5
    invite936c567e

    Re : Accordéon Midi

    1) Il n'y a pas de « conversion hexadécimale » à faire avec le capteur. Il « suffit » de lire la valeur numérique au travers de son interface I2C.

    2) Si ton synthé clignote et se dérègle, c'est parce son entrée MIDI est branchée sur la même interface série que celle qui sert à programmer l'Arduino. Tu devrais donc débrancher ton câble MIDI avant de lancer l'upload de ton programme.

    D'une manière générale, on doit débrancher les circuits de l'application avant de programmer l'Arduino. En effet, si la programmation devait mener à présenter des niveaux de sortie incompatibles avec l'application qui reste branchée (une sortie de l'Arduino connectée à une sortie de l'application, ou une combinaison de niveaux non supportée par l'application), on risque de griller un circuit (de l'Arduino ou de l'application).

    Dans ton cas, si tu ne fais que re-programmer le même code amélioré sans modifier l'affectation des entrées/sorties, alors tu peux te permettre de ne pas débrancher tes optocoupleurs.

    3) Si les notes se répètent, c'est très certainement parce que ce n'est pas ok au niveau des optocoupleurs.

    Il faut déjà vérifier que les résistances de pull-up sont en place. Comme je vois dans le code que tu n'as pas activé celles qui sont intégrées à l'Arduino, as-tu au moins pensé à en ajouter à l'extérieur ?

    Par ailleurs, il est tout-à-fait possible qu'il y ait des « rebonds » au niveau de la détection des touches, qu'il faudra éventuellement traiter logiciellement.

  7. #6
    Janosch

    Re : Accordéon Midi

    1)il me semblait que les interfaces midi communiquaient en hexadécimal...peut tu m'expliquer comment j'integre la valeur de mon capteur de pression dans mon code?
    je fais ça pour lire les données de mon capteur:
    Code:
    #include <Wire.h>
    #include <Adafruit_BMP085.h>
    
    // Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
    // Connect GND to Ground
    // Connect SCL to i2c clock - on '168/'328 Arduino Uno thats Analog 5, on Mega thats digi 21
    // Connect SDA to i2c data - on '168/'328 Arduino Uno thats Analog 4, on Mega thats digi 20
    // EOC is not used, it signifies an end of conversion
    // XCLR is a reset pin, also not used here
    
    
    Adafruit_BMP085 bmp;
    
    void setup() {
      Serial.begin(9600);
      bmp.begin(); 
       }
      
    void loop() {
       int Velocity = map(bmp.readPressure(), 98520, 105000, 0, 127);  //pour avoir une valeur entre 0 et 127
       Velocity = constrain(Velocity, 0, 127);
       
        Serial.print("Pressure = ");
        Serial.println(bmp.readPressure());
        Serial.print("Velocity = ");
        Serial.println(Velocity);
        
    }


    2)ok

    3)J' ai effectivement mis des résistances de 10k externes, sinon je n'ai aucune idée de comment faire pour remédier à ce problème de note répétée.

    en tout cas merci de vous pencher sur mon problème

  8. #7
    invite936c567e

    Re : Accordéon Midi

    Correction: si les notes se répètent, c'est parce que le programme les répète en permanence, à chaque exécution de la boucle principale (... Mais cela n'empêche pas de devoir régler par ailleurs la question de la résistance de pull-up et du rebond éventuel).

    Quand tu détectes qu'une touche a été enfoncée, il faut que tu mémorises son état afin de savoir les fois suivantes si tu dois ou non envoyer la commande MIDI au synthé.

  9. #8
    Janosch

    Re : Accordéon Midi

    J'aurais bien aimé trouver par moi même comment faire, mais je trouve pas (pour mémoriser l'état de l'opto)...
    coup de main?

  10. #9
    Janosch

    Re : Accordéon Midi

    Si tu peux au moins me donner des mots clés pour que je puisse cibler mes recherches,
    parce que la je vois pas trop quoi taper...

  11. #10
    invite936c567e

    Re : Accordéon Midi

    Voici un exemple qui (aux erreurs d'étourderie près) pourrait t'inspirer.

    Code:
    (...)
    
    // Niveau de déclenchement anti-rebond (minimum 1=immédiat) 
    #define THRESHOLD 16
    
    // Nombre de touches configurées
    #define NBKEYS 2
    
    // Tableau des pins utilisées par les touches
    const int keyPin[NBKEYS] = {
      54, 53
    };
    
    // Tableau des notes MIDI correspondant aux touches
    const int keyPitch[NBKEYS] = {
      0x39, 0x3A
    };
    
    // Tableau des états des touches
    int keyState[NBKEYS];
    
    int velocity; // Volume du son, modifié par le capteur de pression
    
    void setup()
    {
      
      (...) // Autres initialisations
      
      Serial.begin(31250); // interface MIDI à 31250 bauds
    
      int i;
      for (i=0; i<NBKEYS; i++) {       // Pour chaque touche :
        keyState[i] = 0;               // état initial de la touche = OFF
        pinMode(keyPin[i], INPUT);     // pin configurée en entrée
        digitalWrite(keyPin[i], HIGH); // résistance de pullup activée
      }
      
      velocity = 0x45; // Volume par défaut
    }
    
    void loop()
    {
      int i;
    
      (...) // Autres travaux
    
      for (i=0; i<NBKEYS; i++) {
        if (digitalRead(keyPin[i]) == HIGH) {  // Détection touche enfoncée :
          if (keyState[i] < THRESHOLD) {       // vérifie que la note est actuellement OFF
            keyState[i]++;
            if (keyState[i] == THRESHOLD) {    // délai anti-rebond atteint ?
              sendNote(keyPitch[i], velocity); // envoie commande note ON
              keyState[i] = THRESHOLD<<1;      // mémorise note ON
            }
          }
        } else {                               // Détection touche relâchée :
          if (keyState[i] > THRESHOLD) {       // vérifie que la note est actuellement ON
            keyState[i]--;
            if (keyState[i] == THRESHOLD) {    // délai anti-rebond atteint ?
              sendNote(keyPitch[i], 0);        // envoie commande note OFF
              keyState[i] = 0;                 // mémorise note OFF
            }
          }
        }
      }
    }
    
    void sendNote(int pitch, int velocity)
    {
      Serial.write(0x90);
      Serial.write(pitch);
      Serial.write(velocity);
    }
    (note au passage que la fréquence du MIDI est 31250Hz et non pas 31520Hz)

  12. #11
    Janosch

    Re : Accordéon Midi

    Ahlala merci mille fois!
    tu m'épargnes des nuits de boulot.

    Je vais essayer tout ça, et surtout essayer de comprendre, y'a des trucs qui m'échappent!
    Je te tiens au jus.

  13. #12
    invite936c567e

    Re : Accordéon Midi

    Pour rendre l'anti-rebond efficace, je pense qu'il faudra peut-être rajouter un court délai à la fin de loop() afin de ralentir son exécution, et/ou augmenter la valeur de THRESHOLD .

  14. #13
    Janosch

    Re : Accordéon Midi

    Je pense pas, ça a l'air de marcher nickel.
    En plus je peux virer mes résistances pull up si j'ai bien compris?

  15. #14
    invite936c567e

    Re : Accordéon Midi

    Citation Envoyé par Janosch Voir le message
    Je pense pas, ça a l'air de marcher nickel.
    Il faut voir à l'usage, quand le reste du code (capteur de pression, etc.) sera présent.
    Citation Envoyé par Janosch Voir le message
    En plus je peux virer mes résistances pull up si j'ai bien compris?
    Oui.

  16. #15
    Janosch

    Re : Accordéon Midi

    J'ai pas encore tout a fait saisi comment intégrer le capteur de pression. Tu es sur qu'il ne faut pas convertir en hexadécimal?
    Bon, jvais aller manger déjà.
    J'essairai ça tout a l'heure.

  17. #16
    invite936c567e

    Re : Accordéon Midi

    La conversion hexadécimale, c'est quand on veut afficher une valeur numérique en base 16.

    La librairie Adafruit qui prend en charge le capteur BMP085 fournit les valeurs numériques binaires directement exploitables par l'Arduino.

  18. #17
    Janosch

    Re : Accordéon Midi

    pas trop compris pour la conversion hexadécimale...
    Pourquoi dans ce cas on écrit les notes, le canal midi, la vélocité,etc en hexadécimal?...

    Attends... c'est bien du hexadécimal ça ?:
    Code:
    const int keyPitch[NBKEYS] = {
      0x29, 0x2A
    (...)
    
       velocity = 0x45; // Volume par défaut


    sinon je fais ça pour avoir une vélocité de 0 a 127:
    Code:
    void loop() {
       int Velocity = map(bmp.readPressure(), 99500, 105000, 0, 127);
       Velocity = constrain(Velocity, 0, 127);
    }


    Je peux le garder tel quel?

  19. #18
    invite936c567e

    Re : Accordéon Midi

    Citation Envoyé par Janosch Voir le message
    Pourquoi dans ce cas on écrit les notes, le canal midi, la vélocité,etc en hexadécimal?...
    C'est n'est bien qu'une question d'affichage. Pour les nombres qu'on fait apparaître dans le code source, la notation hexadécimale n'est qu'une manière de les représenter. On pourrait tout aussi bien utiliser une autre notation pour obtenir le même résultat : par exemple, qu'on écrive 0x45 (hexadécimal), 69 (décimal), 085 (octal) ou b01000101 (binaire), au bout du compte c'est toujours la même valeur qu'on retrouve dans la mémoire de l'Arduino. S'il y a une conversion, c'est seulement au niveau du compilateur, pour interpréter le code source.

    Les cas où l'on doit effectivement faire une conversion dans le programme, c'est :
    - quand on visualise sur un afficheur ou quand on transmet par liaison série le texte correspondant à notation hexadécimale d'une valeur numérique,
    - l'opération inverse, qui consiste à interpréter le contenu d'un texte saisi au clavier afin d'en déduire la valeur numérique correspondante

    Bref il ne faut pas confondre la valeur numérique 0x45, et le texte constitué des caractères "0", "x", "4" et "5".

    Citation Envoyé par Janosch Voir le message
    sinon je fais ça pour avoir une vélocité de 0 a 127:
    Code:
    void loop() {
       int Velocity = map(bmp.readPressure(), 99500, 105000, 0, 127);
       Velocity = constrain(Velocity, 0, 127);
    }


    Je peux le garder tel quel?
    À mon avis, comme tu dois faire d'autres calculs pour ajuster l'échelle des valeurs issues du capteur, tu as tout intérêt à ne garder que le « bmp.readPressure() ». Au final, ton calcul ne tiendra compte que de la valeur minimale réelle de la pression (correspondant au soufflet au repos) et d'un coefficient réglable ou fixé expérimentalement (correspondant à l'échelle de volume sonore).

  20. #19
    Janosch

    Re : Accordéon Midi

    Ok pour l'hexadécimal.
    Il faudra quand même que tu m'explique (si tu veux bien) comment faire la conversion (je compte rajouter unLCD plus tard).
    Je ne vois pas bien de quoi tu veux parler quand tu dit
    tu dois faire d'autres calculs pour ajuster l'échelle des valeurs issues du capteur

  21. #20
    invite936c567e

    Re : Accordéon Midi

    Je dis que tu dois faire d'autres calculs, parce que lorsque tu disposes d'une valeur comprise entre 0 et 127 pour figurer une pression absolue comprise entre 995 et 1050 hPa (par pas de 43,3 Pa), tu n'as pas encore vraiment l'information de "vélocité" que réclame le synthé MIDI.

    Dans ton cas de figure, la vélocité doit correspondre à la pression relative entre l'intérieur du soufflet et l'air ambiant, lequel présente une pression qui varie en fonction de l'altitude et des conditions météo.

    Bref, si tu t'en tenais seulement à la pression issue du capteur comme dans le code que tu as donné plus haut, alors le synthé jouerait différemment selon l'endroit et le temps qu'il fait.


    Tu peux déterminer la pression de l'air ambiant en mesurant la pression dans le soufflet au repos, ou bien en détectant la valeur minimale de la pression au cours du fonctionnement.

    Tu devras par exemple avoir un code comme celui-ci :
    Code:
    void setup()
    {
      (...)
      Pext = bmp.readPressure();
      (...)
    }
    
    void loop()
    {
      (...)
      Ppump = bmp.readPressure();
      velocity = (int)(K*(Ppump - Pext));
      if (velocity<0) {
        velocity = 0;
        Pext = Ppump;
      } else
      if (velocity>127)
        velocity = 127;
      (...)
    }
    ... avec K un coefficient réel (float) choisi de manière à produire une vélocité de 127 au maximum de pression du soufflet.

  22. #21
    Janosch

    Re : Accordéon Midi

    En fait moi je comptais rajouter un potard avec lequelle j'ajusterai les données de mon capteur (pour que celui-ci ait toujours la même étendue(je sais pas si c'est clair)).
    Mais je préfère faire ca logiciellement, même si j'avou ça me dépasse un peu ton bout de code, enfin... je vois ce qu'il est censé faire mais je ne vois pas trop comment l'incorporer avec le reste de mon sketch.
    Je regarderais ça de plus prés demain matin.
    Merci beaucoup de m'avoir aidé jusque là!

  23. #22
    Janosch

    Re : Accordéon Midi

    J'arrive pas à utiliser ton code...
    Arduino me dit Que "Pext", "Ppump", "k" ne sont pas déclarés.
    Qu'est ce qu'il faut faire ? les déclarer en tant qu'entiers (int)?...et pour k il faut que je mette quoi?
    Si tu peux aussi me dire comment faire pour imprimer
    le bmp.readPressure() sur le moniteur (j'arrive pas à cause du baudrate je pense).
    Merki

  24. #23
    invite936c567e

    Re : Accordéon Midi

    Il faut effectivement déclarer les variables qu'on utilise. Pour Pext et Ppump, elles sont du type retourné par readPressure() (peut-être un type long ? il faudrait vérifier). Cette information est dans la doc de la librairie Adafruit.

    Pour K, j'ai parlé d'un type float.


    Si tu ne peux pas "imprimer" sur le moniteur de l'Arduino, c'est probablement parce que tu tentes d'utiliser la même interface série pour la sortie MIDI et pour la communication avec le PC.

  25. #24
    Janosch

    Re : Accordéon Midi

    1)Y'a rien dans la doc... faut que je fouille dans la librairie?

    2)Je suis pas sûr d'avoir bien compris le rôle de "k".
    C'est lui qui ramène la valeur maximale de Ppump a 127, c'est ça?
    Il faut que je le calcule?
    comme ça ?:
    Pext= 100000 et Ppump au Max = 102000
    102000-100000= 2000
    127/2000 = 0.0635
    k=0.0635 ?

    3)J'ai recablé et reprogrammé la "sortie midi" sur le serial1 pour que je puisse utiliser
    le serial pour le bmp.Readpressure().
    mais je sais pas où le placer dans le sketch...

    là je fais
    Code:
    void setup()
    {
      Serial.begin(9600);
      Serial1.begin(31250); 
      bmp.begin(); 
    (...)
    }
    
    void loop()
    {
      Serial.println(bmp.readPressure());
    (...)

    Mais ça marche pô.

  26. #25
    Janosch

    Re : Accordéon Midi

    un coup de main s'il te plait?

  27. #26
    inviteef69fa4f

    Re : Accordéon Midi

    Salut
    Ton projet m'intéresse beaucoup car j'ai presque le même...
    Plus exactement dans mon cas il s'agira d'un concertina midi, mais le principe sera identique :
    des capteurs sur les touches (dans mon cas je compte remplacer les boutons par des boutons-poussoirs
    et pas mettre des capteurs opto sous les boutons d'origine), un capteur de pression dans le soufflet,
    un arduino (ou un miduino, qui a la sortie midi déjà câblée) et un peu de programmation.

    Mon projet est moins avancé que le tien car j'ai même pas encore acheté l'arduino, j'aurais le temps cet été.

    Tu as sans doutes comme moi trouvé ces deux sites :
    https://github.com/accordion-mega/Ac...ion-Mega-story
    http://midikits.net23.net/products_prices.htm

    Je pense que je vais commencer par acheter un kit miduino déjà programmé, jouer un peu avec et essayer de reconstituer
    le programme qu'il y a derrière (puisque le concepteur n'a pas l'air disposé à partager ses programmes).

    Pour le capteur de pression, j'ai vu que tu as pris un capteur barométrique. Je pensais plutôt mettre un capteur différentiel,
    qui mesure directement la différence de pression entre l'intérieur et l'extérieur. Ca me semble plus adapté car plus
    précis, et pas soumis au problème de la variation de la pression atmosphérique.
    J'ai vu ça, qui a l'avantage d'avoir déjà une interface qui délivre un signal entre 0 et 5 volts, avec deux potentiomètres
    pour régler le gain et le niveau zéro : http://www.interface-z.com/produits/cs20_souffle.html
    C'est un peu plus cher mais directement branchable sur l'arduino, et comme j'ai pas envie de trop me prendre la tête sur
    la partie électronique...

    Je ne peux pour l'instant pas trop t'aider sur la partie programmation mais je serais fort intéressé de savoir ou tu en est
    et si tu as trouvé une solution à tes derniers problèmes...
    A bientôt

    David

  28. #27
    Janosch

    Re : Accordéon Midi

    Salut!

    Je ne connais pas trop ton capteur (je ne suis pas non plus une lumière en électronique), mais j'ai réussi à faire marcher le mien, et ça marche très bien.
    Très facile à connecter (4 fils) et j'ai rajouté un bouton poussoir, qui me sert a calibrer mon capteur
    (quand j'ai le soufflet fermé j'appui sur le bouton (en début de concert de préférence ) et arduino prend la pression dans le soufflet au moment où j'appuie comme pression de référence).
    En tout cas je suis content de voir qu'il y'en a d'autres qui ont des projets comme le mien!
    si tu as des questions n'hésite pas, je ne suis pas sûr de pouvoir t'aider, c'est mon premier projet électronique/arduino, mais ça avance bien!
    (je dois encore imprimer le typon que j'ai fait et finioler un peu le code, et c'est bon!)

Discussions similaires

  1. midi
    Par invite87a94f89 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 28/12/2008, 21h48
  2. Claviers midi, synthétiseurs, capteurs midi
    Par acx01b dans le forum Électronique
    Réponses: 0
    Dernier message: 14/04/2005, 10h07
  3. Editeur MIDI
    Par invite866d051d dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 03/01/2005, 21h27
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...