IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Convertir Fréquences en noms de notes de musique


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Convertir Fréquences en noms de notes de musique
    Bonjour à tous !

    Nous sommes 4 étudiants qui débutons en programmes informatiques, et dans le cadre d'un projet nous souhaitons réaliser une application qui puisse reconnaître des notes de musique à partir d'un son.

    Nous avons réussi à écrire le principe du programme "sur le papier", mais nous sommes bloqués sur une question: comment convertir notre tableau de fréquences, en tableau de Notes de musiques ?

    Nous avons pensé à une méthode "bourrine", c'est à dire lister toutes les notes, sur toutes les octaves et lister leur domaine de fréquence (ex: entre 80Hz et 85 Hz : mi), mais ça nous parait très long, connaîtriez-vous une autre solution ?
    La distinction des octaves ne nous importe pas (on affichera do que ce soit un do3 ou un do4)

    On créerait un classe Note, avec pour attributs, String nomNote; float [] domaineFrequence;

    La première solution ça serait de mettre toutes les fréquences exactes d'une note dans le tableau domaineFrequence (par exemple pour la: (220,440, 880) , etc) mais on ne sait pas comment dire "au voisinage de 440, ça sera toujours un la", surtout que les intervalles entre les fréquences ne sont pas constants, vu que ça marche par puissances de 2 (si il y avait par exemple 4 Hz d'intervalle à chaque fois, ça serait plus simple, on compare nos fréquences aux fréquences des notes + ou - 2 hz). Dans cette solution qu'on ne sait pas appliquer, on aurait eu à créer seulement 12 instances de Note.

    La deuxième solution, c'est de distinguer les octaves, du coup dans le tableau domaineFrequence, on rentrerait les "bornes" du domaine de fréquence (80,85) pour mi1 par exemple, mais dans ce cas-là on devrait créer pratiquement une centaine d'instances et écrire tous les domaines de fréquences à la main !

    Bref un vrai casse-tête !

    Si quelqu'un peut nous aider ça serait super !
    Merci beaucoup !

    Bibiche1

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je procéderais tout d'abord comme ça (non optimisé) :
    • créer une classe qui représente une note (attributs ; fréquence + toute méta permettant d'afficher la réponse finale : nom, octave..., peu importe)
    • créer une liste de notes, dans une plage de fréquences déterminées (les octaves audibles humainement par exemple)
    • à partir de la fréquence de la note à chercher (je suppose que vous l'avez, parce que la déterminer est un autre problème), parcourir la liste des notes
      • pour chaque note de la liste, calculer la différence entre sa fréquence et celle de la note à chercher
      • on conserve toujours 2 notes (plus la valeur de la différence pour non seulement la comparer durant le parcours, mais aussi pour la traiter à la fin) au cours du parcours :
        • celle dont la différence positive est la plus petite
        • celle dont la différence négative est la plus petite en valeur absolue (donc celle qui est la plus grande)
      • à la fin du parcours, on a 1 ou 2 couples note/différence de fréquences : on va traiter maintenant uniquement les valeurs absolues des différences
      • on ne conserve que le/les couples telles que la différence est inférieur à un seuil (la il faut plutôt des compétences relatives au son qu'à l'info le pour déterminer)
      • s'il reste une note, on l'a trouvée
      • s'il en reste 2, on prend à priori celle dont la distance est la plus petite (je ne suis pas un expert en son et fréquences, mais il n'est pas impossible qu'il faille pondérer l'une par rapport à l'autre (celle qui est de fréquence la plus faible ou la plus forte) si les différences sont assez proches (donc que leur différence est inférieure à un certain seuil





    Ensuite, pour optimiser, on peut regrouper les notes par groupes (par exemple sur la base des octaves) et déterminer si la fréquence de la note rechercher est dans un intervalle de fréquence : attention à ne pas faire de comparaison exacte, puisque à priori la fréquence de la note recherchée est obtenue sur un sample, donc approximative, donc représentée par un float ou double. En gros, ça correspond pour chercher si une note est dans l'intervalle [min,max] à chercher en réalité si elle est dans l'intervalle [min-valeur, max+valeur] (ou min est la fréquence de la note qui a la plus petite fréquence du groupe, et max celle de la note qui a la fréquence la plus grande, facile à déterminer quand on créé la liste de notes, dans l'ordre de la plus petite fréquence à la plus grande).
    Si une note n'appartient pas au groupe, on ne calcule pas la différence avec les notes du groupe (une note recherchée peut matcher plusieurs groupes, puisque les intervalles se superposent, mais on évite de comparer les notes avec un groupe de note vraiment trop éloignée.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour !
    Tout d'abord merci de votre réponse !
    Quand vous parlez de liste, vous parlez d'objets comme LinkedList ?

    Nous n'y avions pas pensé

    C'est au niveau des "seuils" que nous avons aussi des doutes, les distances sont à pondérer comme vous le dîtes, mais nous ne savons pas trop comment.

    Pour l'optimisation, je n'ai pas bien saisi le principe :/

    Encore merci de votre aide !

    Bibiche1

    PS: oui nous avons bien la fréquence de la note à chercher, nous voulons juste pouvoir l'associer au nom de la note

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par bibiche1 Voir le message
    Bonjour !
    Tout d'abord merci de votre réponse !
    Quand vous parlez de liste, vous parlez d'objets comme LinkedList ?
    Un ArrayList fera l'affaire, voire un simple tableau, vu que cette liste ne varie pas, est de taille finie et connue dès le départ, et n'est que parcourue.

    Citation Envoyé par bibiche1 Voir le message
    C'est au niveau des "seuils" que nous avons aussi des doutes, les distances sont à pondérer comme vous le dîtes, mais nous ne savons pas trop comment.
    Là, je ne peux répondre, je m'y connais pas assez en acoustique, ou je ne sais quelle autre science que ça concerne. Cependant, en regardant rapidement ce qui est dit ici, il semble qu'il soit inutile de se prendre la tête avec ça, et qu'on puisse obtenir un résultat par simple calcul (bien sûr, informatiquement parlant, il faut tenir compte des erreurs d'approximations des calculs, et de l'éventuelle inexactitude relative de la mesure de fréquence, surtout pour les fréquences basses, avec des demis-tons très proches les uns des autres, et, donc, plus susceptibles d'être confondus, lors de l'évaluation du calcul).

    Citation Envoyé par bibiche1 Voir le message
    Pour l'optimisation, je n'ai pas bien saisi le principe :/
    Cemmences par faire la recherche séquentielle non optimisée. Ensuite, tu verras s'il est nécessaire d'optimiser (vu le nombre de notes, 12, sur 10 octaves audibles, autant que je m'en souvienne, ça fait 120 différences à calculer, ça ne sera pas forcément nécessaire d'optimiser, tout dépend des performances que vous attendez (temps réel ou pas)) . Mais, pour expliciter l'idée, c'est juste de dire qu'au lieu de calculer toutes les différences avec toutes les notes de l'intervalle complet, c'est de diviser l'intervalle complet en sous-intervalles, et d'en éliminer sur principe d'une comparaison qui permette de déterminer qu'on est sûr qu'aucune note de d'un l'intervalle ne peut correspondre à la note cherchée (et que dans ce cas, il est inutile de parcourir les notes). Par exemple, c'est ce qu'on fait lorsqu'on fait une recherche dichotomique (dans ce cas, on peut considérer que les sous-intervalles sont organisés en arbre binaire).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    J'ai fait ce genre de truc il y'a des années avec fmod. Et j'ai reporté le code en java. Ca m'a donné entière satisfaction.

    Ca utilisait 2 simple tableau (plus rapide que la liste a parcourir déjà je pense).

    Tu peux jetter un oeil la dessus, voici la source exemple de fmod :
    http://subversion.assembla.com/svn/d...tection/main.c
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Salut à tous !
    nous avons trouvé une solution qui marche, nous avons fait un tableau de 13 notes (du do3 au do 4) et si la frequence à comparer n'est pas dans l'intervalle du tableau on la divise ou multiplie par 2 (en prenant soin de noter que l'octave a changé dans une variable).
    Il n'y a plus que 13 notes à comparer, et ça marche super bien !

    merci beaucoup de votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Note de musique d'après fréquence
    Par metalsephiroth dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 13/07/2011, 17h13
  2. Réponses: 15
    Dernier message: 12/01/2008, 22h26
  3. [XSLT] Convertir toutes les noms de balise en minuscule ?
    Par ghohm dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/07/2006, 12h49
  4. Fichier Midi : récupérer les notes de musique
    Par zardi dans le forum Multimédia
    Réponses: 2
    Dernier message: 20/12/2005, 02h38
  5. Note de musique
    Par DelphiCool dans le forum Composants VCL
    Réponses: 52
    Dernier message: 30/06/2003, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo