Journal FluidSynth + Firefox = Music Toys

Posté par . Licence CC by-sa
Tags : aucun
29
16
mai
2013

C'est mon premier billet ici, et j'espère que le fait qu'il fasse doublon avec mon blog perso ne pose pas trop problème… Sinon on efface, pas de soucis ;) .
Mais bon, je lis dlfp tous les jours, et j'avais envie de parler un peu de mes bidouilles ici (d'autant que c'est du libre et entre autre sur linux).

Alors voilà, j'aime bien jouer avec les techno. mozilla, et voici le résultat de quelques expérimentations.

FluidSynth est un synthé logiciel utilisant des soundfonts, c'est une bibliothèque en C, et multiplateforme.
Mozilla peut utiliser des bibliothèques C avec js-ctypes (pour ceux qui ne connaissent pas c'est similaire à Python ctypes, mais en JavaScript).
Le résultat, c'est un synthétiseur temps réel et un séquenceur à l'intérieur de Firefox :) .

Et comme çà marchait pas mal, j'ai fait 3 petites applis, que j'ai regroupé et nommé Music Toys :

  • un clavier temps réel utilisable avec la souris ou le clavier physique de l'ordinateur
  • une boite à rythme
  • un lecteur de fichier Midi

C'est donc une appli XUL, utilisable comme appli autonome XULRunner (nécessite en fait que Firefox ou XULRunner soit installé), ou comme extension Firefox.

Il vous faut également installer fluidsynth et une soundfont sf2 (par exemple Fluid GM) avec votre gestionnaire de paquet.

Le code est sous licence MPL 2

C'est en version bien beta, si çà vous tente de l'essayer, il y a des paquets deb et rpm, et une archive tar.gz pour les autres.

  • # Supaire !

    Posté par (page perso) . Évalué à 6.

    Combien de temps pour coder ça ?
    Qu'est-ce qui a été facile ? Difficile ?
    Le piano marche-tu aussi en bépo ? :)

    • [^] # Re: Supaire !

      Posté par . Évalué à 2.

      Combien de temps pour coder ça ?

      j'ai codé çà en dilettante, pour jouer sur mon temps libre, donc sur plusieurs mois. Mais les prototypes des applis ont été rapides, quelques heures (un peu plus pour le lecteur de fichier Midi)

      Qu'est-ce qui a été facile ? Difficile ?

      Rien de vraiment difficile.
      La documentation sur js-ctypes est un peu spartiate, il faut donc faire quelques essais.
      Et par exemple se rendre compte que certaines méthodes de FluidSynth qui agissent sur d'autre threads ne sont pas utilisables ici.

      Le piano a été trivial à prototyper.
      La boite à rythme est un peu plus riche, et était presque une étape pour créer le lecteur de fichier Midi.
      Le lecteur Midi, justement, est un peu plus compliqué. Il faut trouver de la doc sur le format Midi, créer de quoi lire ces fichiers binaires, et imaginer comment les lire par petits bouts.

      L'interface utilisateur prend du temps aussi, essayer qu'elle soit efficace et jolie, faire de jolis boutons, fournir une aide, traduire… Çà prend presque plus de temps que le reste.

      Le piano marche-tu aussi en bépo ? :)

      oui, il devrait ;) . Il y a actuellement 2 agencements disponibles, azerty et qwerty, mais il y a un petit éditeur pour pouvoir créer son agencement personnel.

  • # À quoi ça sert ? :)

    Posté par (page perso) . Évalué à 2.

    Tu peux me répondre à rien, évidemment, mais quel est l'avantage d'avoir développer ce logiciel dans firefox (que ce soit un plugin ou une application externe qui dépend de xulrunner). Est-ce que cette plateforme a un avantage quelconque par rapport à d'autres choix techniques (applis Qt (C++ ou Python) par exemple) ?

    • [^] # Re: À quoi ça sert ? :)

      Posté par . Évalué à 5.

      Alors, çà sert principalement à ce que je m'amuse à coder ;) .
      Le clavier est un jouet, mais il peut être utile dans de rare cas pour un musicien.
      La boite à rythme à l'air de plaire autour de moi aux musiciens, plus simple qu'un éditeur Midi complet.
      Le lecteur Midi, tel quel, n'est peut être pas très utile, mais son code me servira peut être pour d'autres trucs.

      Et le choix du XUL, la raison principale c'est que j'aime bien le XUL et que je connais (même si ce plus trop à la mode). Mais Qt ou python serait un bon choix aussi.

  • # Firefox OS

    Posté par . Évalué à 2.

    Se pourrait il que cet ensemble d'application puisse etre porté sans effort sur FirefoxOS ? À priori c'est bien pour cela que cet OS à été créé, porter sans effort des applications HTML.

    • [^] # Re: Firefox OS

      Posté par . Évalué à 1.

      C'est une bonne question, mais j'ai pas vraiment la réponse…

      Un appli purement HTML, c'est non, il faudrait une API proposant un Synth et un Sequencer similaire à ce que j'ai fait avec FluidSynth via js-ctype, et elle n'existe pas.

      Un moyen pour justement implémenter cette partie dans Firefox OS,et donc avoir un accès plus profond, comme les extensions sur Firefox, j'ai pas l'impression que çà existe. Mais peut être que je me trompe, j'aimerai bien, çà serait chouette ;) .

      Après, l'interface pourrait effectivement être réécrit en HTML, mais XUL c'est quand même bien pratique (XBL, L10N,…).

      • [^] # Re: Firefox OS

        Posté par (page perso) . Évalué à 3.

        Un appli purement HTML, c'est non, il faudrait une API proposant un Synth et un Sequencer similaire à ce que j'ai fait avec FluidSynth via js-ctype, et elle n'existe pas.

        Ce ne serait pas possible avec emscripten et la balise audio ?

        « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

        • [^] # Re: Firefox OS

          Posté par . Évalué à 0.

          Je doute très fortement. Emscripten, çà voudrait dire transformer libfluidsynth en pure JavaScript, alors que là on bénéficie justement que cette lib bas niveau soit en C, avec par exemple une horloge au poil pour le sequencer.

          La bonne piste, ce serait vraiment une entrée avec les privilèges chrome et xpcom dans Firefox OS, comme les extensions.

          • [^] # Re: Firefox OS

            Posté par . Évalué à 1.

            Mais ça poserait les mêmes problèmes de portabilité et de sécurité que native client (NaCl), non ?

            Mozilla a strictement refusé NaCl parce que le code généré n'est pas portable (puisque c'est du code machine). Niveau sécurité, un gros effort a été fournit par Google pour empêcher ce code machine de sortir du cadre du navigateur.

            Permettre l'accès à une API externe, c'est cumuler les deux défauts : l'API n'est disponible que sur certaines machines, et la sécurité n'est pas garantie comme dans native client. XUL étant fait pour écrire des applications bureau, c'était pertinent, mais l'objectif de Firefox OS étant aussi de créer des APIs javascript portables (et à terme standardisées), ce serait étonnant qu'ils acceptent ce genre de pont vers le système…

            Après, s'ils optimisent suffisamment emscripten et asm.js, on peut supposer que sur certaines machines, l'aspect bas niveau ne soit plus un problème. Dans ce cas, une solution serait d'avoir une API qui puisse faire les deux : utiliser le code machine dans un cas, ou utiliser la bibliothèque compilée avec emscripten dans l'autre, sans modification du côté du code de l'application…

            • [^] # Re: Firefox OS

              Posté par . Évalué à 1.

              Sauf que l'approche ne serait pas la même.
              Je vois bien qu'effectivement mozilla veut privilégier les web apps et standardiser des API JavaScript, mais ce ne serait pas stupide de permettre une entrée "propre" pour bidouiller, au moins pour expérimenter, sur Firefox OS.
              Sur Firefox, pas mal de choses sont tentées d'abord par extensions, et parfois intégré par la suite.

              En fouillant, cette réponse sur les newsgroups semble dire que c'est peut être envisageable.

              Does the Firefox OS browser support extensions?

              No, or, not yet.

  • # Génial

    Posté par . Évalué à 2.

    C'est vraiment chouette pour un toy ! Juste une petite déception quand j'ai vu qu'on ne pouvait pas enregistrer le clavier… sob ! Moi qui voulais enregistrer du Rachmaninov, je suis de la revue….
    Non, je déconne.
    Plus sérieusement, étant instit, je me voyais déjà enregistrant les mélodies des chants que j'apprends à mes élèves pour soutenir les petits larynxs débutants.
    Tu vas nous coder ça en deux coups de cuillère à pot, pas vrai ?

    • [^] # Re: Génial

      Posté par . Évalué à 1.

      Ah, pas bête comme idée l'enregistrement du clavier! Faut que je réfléchisse comment faire, à voir ;) .

      • [^] # Re: Génial

        Posté par (page perso) . Évalué à 1.

        J'ai envie de dire que si tu peux appliquer l'idée de l'enregistrement à la boite à rythme, ce serait pas mal non plus… limite plus à mes yeux que pour le clavier.
        Je torture un peu une basse à mes heures perdues, et avoir une rythmique que l'on peut rejouer à l'envie peut être intéressant …

        • [^] # Re: Génial

          Posté par . Évalué à 1.

          Çà, c'est déjà possible ;) , tu peux enregistrer la séquence en cours de la boite à rythme dans un fichier, et la rouvrir plus tard, la modifier, la sauvegarder, bref y'a un format de fichier disponible (du json en fait).

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.