Partage
  • Partager sur Facebook
  • Partager sur Twitter

Transformer un piano en clavier midi

    16 janvier 2018 à 21:28:18

    Bonjour à tous.

    Je viens de me lancer dans un projet un peu fou. J'ai eu l'occasion il y a quelques années de récupérer un piano droit en bois. Malheureusement il n'a pas été entretenu et aujourd'hui ça coûterai aussi cher de le faire réparer que d'en acheter un nouveau.

    J'ai donc décidé de le transformer en un clavier midi. En fait, j'ai pour projet d'avoir un clavier électronique complet avec synthétiseur et tout ce qu'il faut à l'intérieur mais je vais commencer par la première étape : créer le clavier midi avec la détection de touches dynamiques.

    Concernant mon niveau, je me débrouille bien en développement et en informatique par contre mon niveau en électronique est très bas ^^.

    Afin de simplifier la création de ce clavier, j'ai acheté une carte arduino uno et j'ai commencé à jouer avec. J'ai déjà fait plusieurs tests et j'ai réussi à jouer quelques notes. Rien de bien sorcier jusque là (5 boutons poussoirs sur 5 entrées digitals).

    Actuellement, deux problèmes se posent à moi :

    • La détection de l'appuie des touches avec la vitesse d'appuie
    • Connecter 88 entrées analogiques sur la carte arduino

    Pour la détection de l'appuie des touches, je pensais utiliser des capteurs à effet hall linéaire avec des aimants.

    Est-ce que vous en avez déjà utilisé ? J'ai vu qu'il y en avait beaucoup de choix, vous auriez un conseil pour éviter certains pièges ?

    Concernant l'augmentation du nombre d'entrées, j'ai pas trop d'idée fixe.

    La première idée que j'ai, c'est d’activé un par un le capteur de chaque touche et de lire leur valeur sur la même entrée analogique. En gros, j'active le capteur de la première touche, je lis la position de la touche sur l'entrée A1, je désactive ce capteur puis j'active le capteur de la seconde touche et je lis la valeur, etc.

    Je souhaite activer les capteurs l'un après l'autre en utilisant des registres à décalage en série.

    Est-ce que cette solution vous semble viable ? J'ai peur que le décalage des bits dans les registres soit trop long et de lire deux fois le même capteur sur l'entrée analogique.

    Une autre idée, était d'utilisé un CAN sur chaque touche et d'envoyer les valeurs en utilisant le protocole i2c. Mais cette solution me parait plus compliquer à mettre en œuvre et ça coûterai beaucoup plus cher.

    Est-ce que vous avez d'autres solutions à proposées ?

    Est-ce que mes idées vous semble viable ?

    Est-ce que vous avez des conseils pour le choix des composants ?

    Si je pars sur la solution des registres à décalage, est-ce que je peux utiliser directement la sortie du registre pour alimenter un capteur ou est-ce qu'il faut mieux utiliser un transistor ?

    Voilà un peu la liste des questions que je me pose.

    Merci d'avance à ceux qui voudront bien me donner un coup de main.

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2018 à 9:39:13

      Salut !

      Pour déterminer la dynamique, je suggère de mettre sur chaque touche deux contacts : un pour la touche au repos, un pour la touche enfoncée en butée. Tu déclenches un chrono quand tu détectes que la touche quitte son état au repos (c-à-d tu viens de poser le doigt) et tu l'arrêtes que ça arrive à fond. Cette durée représente de fait la vélocité, AKA la dynamique, que tu peux coder ensuite en MIDI.

      Il te faudra un peu d'empirisme pour déterminer les valeurs extrêmes de cette vélocité (tes voisins vont t'adorer).

      • Partager sur Facebook
      • Partager sur Twitter
      "On ne remplace pas des plombs sautés avant de savoir pourquoi ils ont sauté." 2001 l'odyssée de l'espace, Arthur C. Clarke
        17 janvier 2018 à 9:57:58

        Hello!

        Super ambitieux ton projet.

        Tu peux éventuellement rajouter des entrées analogiques pour les pédales :D

        Pour la détection des touches, j'aurais peut être plus pensé à des capteurs optiques (style CNY70) sous les touches par blocs de N couplés à un ADC N canaux et relié par un bus Spi ou i2c à microcontrôleur.

        Par exemple 8 CNY70 avec un MCP3008, ce qui fait 11 blocs, qui seraient activés (slave select) par 11 sorties du microcontrôleur (ou 6 multipléxés avec des 74hct138).

        Ensuite, tu active chaque bloc un par un, en lisant les 8 distances des touches qui le composent, pour ensuite calculer déplacement s'il y a et en déduire la vitesse de frappe.

        • Partager sur Facebook
        • Partager sur Twitter
          17 janvier 2018 à 10:58:33

          Alors autant je suis d'accord pour le capteur optique (pour les problématiques d'usure notamment), mais avec le reste du système que tu proposes je crains des problèmes de latence (ou alors j'ai mal compris).

          En MIDI la vélocité est codée sur 7 bits (idem pour la hauteur de la note), alors quitte à mettre un ADC, ce serait cool d'adapter un circuit autour pour qu'il crache directement la vélocité, sans avoir à retraiter derrière. Mais je sais pas comment faire pour le moment :D

          • Partager sur Facebook
          • Partager sur Twitter
          "On ne remplace pas des plombs sautés avant de savoir pourquoi ils ont sauté." 2001 l'odyssée de l'espace, Arthur C. Clarke
            17 janvier 2018 à 11:47:58

            En effet, il peut y avoir une latence.

            Pour une meilleur rapidité, chaque module de 8 peut avoir son propre contrôleur pour lui même calculer la vélocité de ses 8 notes et être interrogé par un maître qui gère la transmission midi. Du coup, plus besoin d'ADC externe si le microcontrôleur a les 8 entrées nécessaires (genre atmega328p-au des arduino nano).

            • Partager sur Facebook
            • Partager sur Twitter
              17 janvier 2018 à 13:57:39

              Tout d'abord, merci pour vos réponses.

              Le système à double capteur me paraissait plus contraignant à mettre en place. C'est vrai que dans ce cas je n'ai plus besoin de traiter des valeurs analogiques et que je peux tout faire en digital, mais la mise en place des capteurs à besoin d'être plus précise (même écartement entre les capteurs pour toutes les touches). En plus, si je trouve que le calibrage est mauvais, il faut redémonter le clavier pour déplacer les capteurs.

              C'est vrai thecraouch que je vais avoir une phase de tests importante ^^, ça ferai l'occasion de rencontrer les voisins :p.

              Merci beaucoup Arkturus. C'est vrai que c'est ambitieux, surtout pour un néophyte mais ça me fait plaisir d'apprendre.

              J'avais bien prévu d'ajouter des capteurs pour les pédales, mais si j'arrive à finir le clavier je pense que ça ne posera pas de problème. Et puis je pourrais déjà jouer "au claire de la lune" ^^.

              Je m'étais rapidement sur les capteurs optiques car j'avais peur qu'un aimant collé sur une touche impacte également le capteur des touches voisines, je voulais justement faire des tests sur 2-3 capteurs avant de commander les 88 capteurs. Mais je n'étais tombé que sur des capteurs chers et j'avais laissé tomber.

              En tout cas, ça me semble plus facile à mettre en œuvre. Sur le capteur il donne directement la distance de détection. Pour les capteurs à effet hall, il donne en mV/G donc faut prévoir les bon aimants à mettre pour calculer les coef de distance.

              Pour les entrées dans les entrées, pourquoi vous conseillez la solution avec un bus i2c plutôt que la solution d'activer les capteurs un par un via des registres à décalage ? Est-ce plus fiable ?

              Je suis étonné, le microcontrôleur atmega328p est moins cher que le CAN oO.

              Utiliser 11 contrôleurs qui s'occupe chaqu'un de 8 capteurs puis d'envoyer le tout à l'arduino via i2c me semble être une solution élégante. Niveau performance je ne sais pas trop ce que ça donne. J'avais lu qu'utiliser un bus i2c était plus lent que d'utiliser des registres à décalage. Par contre ça permettrait de paralléliser la lecture des touches.

              • Partager sur Facebook
              • Partager sur Twitter
                17 janvier 2018 à 14:55:13

                Avec un bus i2c, ton master qui enverra les trames midi pourra interroger régulièrement les 11 blocs pour savoir si une note est joué.

                Si aucune note est jouée ou relâchée, le bloc peut renvoyer 0 pour dire qu'il n'a rien à signaler. Puis on passe au bloc suivant, qui dira peut être que 2 touches on été jouée, donc le master lui demande les valeurs de note et vélocité. Le bloc suivant dira qu'une touche a été relâchée, du coup on lui demande laquelle, et ainsi de suite pour chacun des bloc. Donc on récupère que les valeurs des touches où il s'est passé quelque chose pour ne pas surcharger le bus.

                • Partager sur Facebook
                • Partager sur Twitter
                  17 janvier 2018 à 15:29:24

                  Je vais faire une commande chez farnell pour tester tout ça.

                  Je vais prendre une puce atmega328p-pu (pour pouvoir la brancher facilement sur le breadboard) et quelques capteurs optiques pour essayer.

                  D'ailleurs, pour la version finale, il faut mieux prendre des composants traversant ou en surface comme le atmega328p-au ? Il y a une différence ?

                  J'ai pu voir que la puce atmega328p pouvais être configuré via l'arduino.

                  Tu as des conseils pour brancher le contrôleur ? Je ne me suis pas encore renseigné, je pense le faire ce soir si j'ai du temps.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 janvier 2018 à 16:12:53

                    En regardant bien, un atmega328p n'est peut être pas l'idéal, sda et scl pour l'i2c sont partagés avec les ports ADC4 et 5, ce qui ne laisse que 4 pin adc sur le p-pu et 6 sur le p-au.

                    Néanmoins, si t'en a en stock, il permet de tester le principe sur 4 touches seulement.

                    -
                    Edité par Arkturus 17 janvier 2018 à 16:13:27

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 janvier 2018 à 10:53:08

                      Effectivement !

                      Du coup, je viens de jeter un coup d'oeil et j'ai trouvé ce microcontroleur PIC18F27K40-I/SP.

                      En fait je suis tombé sur un tableau comparatif : http://www.microchip.com/ParamChartSearch/Chart.aspx.

                      Et cette puce me semblait bien. 20 entrées analogiques et une communication par i2c.

                      Qu'est-ce que vous en pensez ?

                      Par contre je crains que programmer ce microcontroleur soit plus chiant. J'ai vu qu'il fallait un matériel spécifique. On peut utiliser l'arduino mais ça semble très bidouille.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 octobre 2023 à 13:07:20

                        Bravo pour cette idée 

                        je cherche justement la même chose pour mon projet PIANOïD. 

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Transformer un piano en clavier midi

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown