Skyduino:~#
Articles
arduino, C/C++, programmation, projet

[Toute plateforme] Classe c++ de lecture midi

Bonjour tout le monde !

Aujourd’hui je vais vous faire un article tout en musique, on va (re)parler des fichiers midi ! 🙂

J’avais par le passé réalisé un lecteur midi (enfin deux) sur base arduino, mais c’était quelque chose de très bancale.
Mon ancien code n’était pas très propre et comportait de gros bug … pas génial donc …

La semaine dernière j’ai reçu un mail d’un membre de la communauté arduino anglaise qui me demandé des renseignements afin de concevoir son propre lecteur midi.
Du coup, j’ai repris mon code avec lui pour lui expliquer et j’ai au passage trouvé une grande partie des bugs que je cherchais par le passé.

Puis m’est venu une idée, faire un classe C++ qui ne dépendrait d’aucune plateforme et qui pourrait donc être utilisée n’importe où, sur ordi, sur arduino, sur lpcx, everywhere 🙂

J’ai donc retroussé mes manches, et voici le résultat ! 🙂

Tout fonctionne sur la base de « callbacks », de cette manière quelque soit la plateforme il suffit de lui donner des pointeurs vers fonctions et la classe se débrouillera avec.
La classe prend en arguments toute une série de fonction bas niveau, permettant de manipuler un fichier (ou n’importe quelle autre source de données), mais aussi d’avertir le programme parent en cas de problème.
La classe travail ensuite avec les fonctions de callback (qu’on lui aurait spécifié au préalable) pour appeler ces fonctions au moment venu (événement midi, etc …).

Tout le gros du travail est fait par la classe Il suffit donc de lui dire quelles fonctions utiliser pour récupérer les données et quelle fonction f appeler lors de l’événement midi x.

Petite précision : Cette version NE LIT PAS les pistes midi simultanément, elle les lit piste par pistes.
Une version modifiée lisant les pistes simultanément est en cours de debug.
Lire simultanément plusieurs pistes demande de mettre en place un ordonnanceur ce qui demande beaucoup de debug …

Démonstration sur plateforme arduino

Le hardware :

Une carte arduino,
Une prise midi,
Une shield avec carte SD (ici une ethernet shield)

Le code :

Tout est disponible sur mon github, que ce soit la version PC ou la version arduino :
https://github.com/skywodd/generic_midi_parser_sequential

Et le résultat :

Alors elle est pas belle la vie ? 🙂

Enjoy 😉

Discussion

6 réflexions sur “[Toute plateforme] Classe c++ de lecture midi

  1. Salut Fabien
    C’est ce que craignait ,désolé d’etre nul à ce point , mais un peu normal ,je n’ai pas tes connaissances .
    C’est pratiquement de l’ébreu pour moi ,si tu avais fait une version plus Arduino ,j’aurai essayé de comprendre .
    Pas grave .
    @+
    William

    Publié par william | 18 avril 2012, 19 h 16 min
    • Demain je vais publier la version multi-pistes, j’ai fait une petite documentation avec.
      C’est très orienté pointeurs sur fonctions afin d’être générique.

      Il faut faire dans son code une série de fonctions bas niveau qui manipule le fichier, et des fonctions plus haut niveau qui seront appelé au moment adéquat lors d’un événement midi.

      En gros ton code doit être structuré de cette manière :
      – fonction bas niveau
      – déclaration de l’objet GenericMidiParser avec les fonctions bas niveaux du dessus en arguments
      – les fonctions de rappels (callback)
      – setup()
      — qui paramètre les différents callbacks
      – loop()
      — qui fait plein de truc comme par exemple lancer la lecture

      J’admet que ma classe est trés complexe pour un œil non habitué au pointeurs sur fonctions, mais c’est le prix à payer pour avoir quelques de générique, et débuggable sur pc, comme sur arduino.

      Publié par skywodd | 18 avril 2012, 19 h 27 min
  2. EN FRANCAIS CA VEUT DIRE QUOI 🙂

    Publié par william | 18 avril 2012, 19 h 37 min
  3. Salut,

    Pour ce qui est de l’aspect générique, c’est une bonne idée, mais pourquoi utiliser des pointeurs de fonctions au lieu d’utiliser de l’héritage de classe ? Il suffirait de redéfinir ces méthodes d’accès au fichier, et ça serait plus accessible en termes de lisibilité.

    Mais en tous cas merci pour ce bout de code, je vais tenter de l’adapter pour lire le fichier soit sur le port série, soit en mémoire, faute de lecteur SD.

    Publié par Vagrant | 4 mai 2012, 23 h 23 min
    • >> Pour ce qui est de l’aspect générique, c’est une bonne idée, mais pourquoi utiliser des pointeurs de fonctions au lieu d’utiliser de l’héritage de classe ?

      C’est vrai que faire une classe avec des surcharge serait plus simple, mais surement moins pratique pour un utilisateur moyen (besoin de faire sa propre classe, etc), aprés c’est une question de gouts.

      >> Mais en tous cas merci pour ce bout de code, je vais tenter de l’adapter pour lire le fichier soit sur le port série, soit en mémoire, faute de lecteur SD.

      Regarde mon article sur le streaming de fichier (deux articles après celui ci) j’ai déjà adapter le systéme pour une utilisation avec le port série, par contre via le port série c’est extrêmement lent 😉

      Publié par skywodd | 5 mai 2012, 13 h 14 min
  4. Trés belle réalisation. Ce soir, j’ai du pain sur la planche, il faut que regarde tous tes posts 🙂

    Merci pour ce blog.

    Publié par Thierry | 16 mai 2012, 20 h 59 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.