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

JavaScript Discussion :

Génaration de partition de Musique


Sujet :

JavaScript

  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 42
    Par défaut Génaration de partition de Musique
    Bonjour,
    je vous expliquer mon problème.
    Mozart a créé 12 mesures de musique qui peuvent être mise dans n'importe quelle sens et malgrès cela, ça donnera un beau morceau.

    Je voudrai faire un site internet qui génère une partition de 12 mesures aléatoire.

    Lorsque l'on clique sur un bouton cela créera une simulation de 12 doubles lancés de dés puis les additionnera les paires de lancé. On aura une suite de 12 chiffres donc.

    exemple [2, 6, 10, 10, 4, 4, 4, 6, 4, 8, 4, 2]

    Et je voudrai que dans la nouvelle page internet on ait :

    Une page avec les images 2 /6/10/10/4/4/4/6/4/8/4/2 mise bout à bout (des images de mesure que j'aurai mis au préalable dans un dossier) de manière à avoir une partion de musique.

    Merci de votre aide

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 163
    Par défaut
    Sur le fond :
    Mozart avait-il prévu de pouvoir répéter des mesures ?
    N'était-ce pas des permutations des 12 mesures SANS répétition de l'une d'elle ?
    Car si le tirage des dés donne 12 fois le même mesure, cela ne va pas être terrible .

    Sur le script à développer :

    Çà m'amuse et ça m'intéresse de le développer en javascript avec CANVAS :

    https://developer.mozilla.org/fr/Dessiner_avec_canvas

    Donc nous avons les images des douze mesures et en effectuant 12 tirages aléatoires de nombres de 0 à 11 en retirant le ième tirage si le nombre à déja été tiré on obtient un ordre formant la partitions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <script type="text/javascript">
    var partition=Array();
    var z="";
    partition[0]=getTirage();
    for (i=1;i<12;i++)    // 12 tirages
    {
    tirage=getTirage()
    for (j=0;j<partition.length;j++){if (partition[j]==tirage){j=1000}}      // pas déja tiré ?
    if (j==partition.length){partition[i]=tirage;z+=tirage.toString()+" ";} // non on le garde
    else {i--} // Déja tiré on retire le ième
    }
    alert(z);	
    function getTirage() {return (Math.floor(12*Math.random()))}	
    </script>
    Mais si tu tiens au tirage avec les dés, c'est plutôt plus facile.
    Dans quel format sont les images et peux-tu me les adresser ?

    (Une coïncidence, j'ai regardé il y a 5 minutes sur Youtube, la scène du Confutatis d'Amadeus. L'esprit de Mozart rode sur le net).

  3. #3
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Çà m'amuse et ça m'intéresse de le développer en javascript avec CANVAS :
    Même si j'entends déjà crier au crime (bah oui avec quelques images ou div on fait ça vite fait) ,voilà une bonne application du canvas qui sortira de l'ordinaire des graphiques. Suis intéressé de voir le source et le résultat final !

    ERE

  4. #4
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    Votre problème est amusant moi qui suis mélomane et un peu musicien, je ne connaissais pas cette particularité des 12 mesures.

    Par contre une solution très simple pour réaliser ce que tu veux faire emmanuel.remy existe en php. Il te suffit de créer un tableau de 12 entrées, chaque entrées étant le nom de l'image de la mesure. Puis de les mélanger !!
    Si je trouve l'équivalent en JS, je le post imédiatement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $m = Array( 'image1', 'image2', 'image3', 'image4', 'image5', 'image6', 'image7', 'image8', 'image9', 'image10', 'image11', 'image12');
     
    shuffle($m);
     
    print_r($m);
    ?>

  5. #5
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    Avant que je me fasse taper dessus, n'oublions pas que nous sommes dans un forum JS.

    Voici le code en JS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <script>
    function shuffle() {
      var funct = function ()
        {
        var dt = new Date();
        return Math.floor((1000*Math.random()+dt.getTime())%3 - 1); // retourne -1, 0 ou 1
        };
     return this.sort(funct);
    }
     
    Array.prototype.shuffle = shuffle;
    var tablo = new Array('image1', 'image2', 'image3', 'image4', 'image5', 'image6', 'image7', 'image8', 'image9', 'image10');
    tablo.shuffle();
    alert(tablo.toSource());
    </script>

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Cela existait déjà ici
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 163
    Par défaut Question à Riete
    Salut,
    Ton code est bien plus élégant que le mien.
    Mais je ne comprends pas comment la méthode sort(funct) génère un tri aléatoire en fonction de l'argument -1,0 ou+1(ce qui est bien le cas pourtant)?

    Une explication ou un lien ?

  8. #8
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    @Walterbelo: à chaque fois que tu appelles le tri du tableau la fonction qui définit l'ordre le définit de manière aléatoire (fabrication d'une valeur entiere modulo 3, donc comprise entre 0 et 2, puis on soustrait 1; la valeur finale est donc comprise entre -1 et 1

    ERE

    PS:

    Je déplacerais la dernière parenthèse du return (un modulo sur une valeur pas entière, bof)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function shuffle() {
      var funct = function ()
        {
        var dt = new Date();
      //return Math.floor((1000*Math.random()+dt.getTime())%3 - 1); // retourne -1, 0 ou 1
    return Math.floor(1000*Math.random()+dt.getTime())%3 - 1; // retourne -1, 0 ou 1
        };
     return this.sort(funct);
    }

    ERE

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 163
    Par défaut
    @Emmanuel.Remy

    Je déplacerais la dernière parenthèse du return (un modulo sur une valeur pas entière, bof)
    Monsieur est un esthète et il a bien raison.
    Mais je ne comprends toujours pas comment comment un ordre de tri choisi parmi 3 méthodes définies par -1,0,+1 peut générer un ordonnancement aléatoire.
    Je démarre toujours par 1,2,3,4,5,6,7,8,9,10,11,12
    A partir de cet ordre, je ne devrais obtenir que trois ordonnancements différents. Hors ce n'est pas le cas. Warum, sag warum !

    Et puis, pour aller au bout du bout, enregistrer les 12 mesures et les jouer après le tirage. Une idée à ce sujet ?

    PS. Mélomane et un peu musicien aussi

  10. #10
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    La fonction fournie à sort() est une fonction de comparaison.
    A chaque fois que sort() doit comparer deux valeurs elle appelle la fonction de comparaison pour savoir quelle valeur est la plus grande (ou savoir s' il y a égalité).

    Or ici la fonction de comparaison ne tient pas compte des valeurs fournies, mais renvoie aléatoirement une valeur positive, négative ou nulle; on génère ainsi la position aléatoire dans le tableau final. Toute fonction de comparaison qui génère cet aspect aléatoire fait l'affaire. On aurait pu aussi écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function shuffle() {
     return this.sort(function() {return 0.5 - Math.random()});
    }


    ERE

  11. #11
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    Ce qui me plais sur ce forum, c'est que parfois tu y passe pour aider ou apprendre quelque chose mais que finalement tu vas peut être en apprendre encore plus que tu ne le pensais.
    Bref, emmanuel.remy ta function est magistrale (a mon avis),mais même si tu donnes quelques explications, j'ai beau réfléchir ceci ne me permet que de creuser un peu plus le trou de mon ignorance. Peux tu m'aider (car je pense que tous le monde à compris sauf moi )
    Citation Envoyé par emmanuel.remy Voir le message
    La fonction fournie à sort() est une fonction de comparaison.
    A chaque fois que sort() doit comparer deux valeurs elle appelle la fonction de comparaison pour savoir quelle valeur est la plus grande (ou savoir s' il y a égalité).
    Or ici la fonction de comparaison ne tient pas compte des valeurs fournies, mais renvoie aléatoirement une valeur positive, négative ou nulle; on génère ainsi la position aléatoire dans le tableau final. Toute fonction de comparaison qui génère cet aspect aléatoire fait l'affaire. On aurait pu aussi écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function shuffle() {
     return this.sort(function() {return 0.5 - Math.random()});
    }
    Je ne vois pas comment le fait de générer aléatoirement une valeur positive, négative ou nulle; puisse génèrer la position aléatoire dans le tableau ??

  12. #12
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 42
    Par défaut
    Je me suis trompé .. lol a attendant je voudrai finir mon programme Maple car demain je doit presenté le programme je suis dans la merde...

    petit recapitulatif

    j'ai ce programme :

    Qui genere 12 lancé de 2 dés

    A la fin j'ai donc une serie de 12 chiffre
    .

    Maintenant dans ma grille de partition j'ai un tableau qui pour chaque lancée fait correspondre un numéro de musure. Je m'explique

    Voici le tableau

    A B C D E
    96 22 141 41 105 2
    32 6 128 63 146 3
    69 95 158 13 153 4
    40 17 113 85 161 5
    148 74 163 45 80 6
    ....

    Exemple au lancée A si je fai 5 alors la mesure sera la mesure 40



    Donc par exemple si le premier lancée fait 3 alors la mesure sera la mesure 32
    et si au deuxieme lancée les dée font 2 alors ce sera la mesure22 ...

    le tableau ici n'est pas complet.

    je voudrai faire un programme qui au nombre et au numéro de lancée fait correnspondre le numéro de la mesure avec le tableau.. merci d'avance



    En tout cas merci beaucoup pour tous !!

  13. #13
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    A mon avis, tu peux très bien faire le travail avec un tableau à 2 dimensions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $tab = Array();
    $tab[0][0] = 96;
    $tab[0][1] = 22;
    $tab[0][2] = 141;
    ...
    $tab[1][0] = 32;
    $tab[1][1] = 6;
    $tab[1][2] = 128;
    ...
    Ensuite il te suffit de récupéré le couple du lancé de dé et d'adressé ton tableau.

  14. #14
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 42
    Par défaut
    Merci , mais ca marche avec mapple tu crois ??

    Et une matrice ne serai pas plus simple ?

  15. #15
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut Petite disgression sur le tri
    @riete:
    Il existe quelques algorithmes de tri efficaces (quicksort, merge) mais jusqu'à présent, ils ont une caractéristique commune: ils sont récursifs et font des groupes. Imaginons devoir trier des élèves en fonction de leur taille pour la photo de classe . Une méthode performante (id est rapide) est de faire deux groupes, les grands d'un côté, les petits de l'autre. Ensuite on prend le groupe des petits et on le scinde en deux groupes: les très petits et les autres. Idem avec les grands. En répétant ce processus récursif on arrive rapidement à l'ordonnancement final (des groupes... de 1 élève).
    Dans cet algorithme on n'a pas cherché à ordonner juste dès le début, mais seulement à trier en créant des groupes, au départ celui des petits et celui des grands. La chose dont on est sûr, c'est que les élèves du groupe des petits seront TOUJOURS plus petits que n'importe élève du groupe des grands. Logique. Donc il ne sert plus à rien de comparer à un moment ou à un autre un élève du groupe des petits avec un élève du groupe des grands.
    Maintenant ajoutons un grain de folie: le professeur qui crée les groupes a eu un repas arrosé . Il crée les groupes des petits et des grands, mais sous l'emprise des effets du repas, il ne discerne plus vraiment qui est petit et qui est grand, et donc se trompe en mélangeant dans chaque groupe des petits et des grands. Ensuite il va prendre le groupe des "soit-disant petits" (il se rappelle qu'il doit les retrier !) et refaire deux groupes... en continuant à mélanger les élèves sans le vouloir . Et ainsi de suite. Puis il refait la même choses avec les "soit-disant grands". Et comme par définition les "soit-disant grands" sont plus grands que les "soit-disant petits", il ne les comparera plus jamais entre eux, et il ne pourra donc pas s'apercevoir de son erreur (sauf sur la photo...).

    Maintenant, informatiquement, le choix de répartir dans tel ou tel groupe est dirigé par la fonction de comparaison, qui compare deux éléments entre eux, en renvoyant >0 si le premier élément est supérieur au second, <0 pour l'inverse et = 0 si égalité. Si maintenant cette fonction déraille (le repas bien arrosé...) et qu'elle renvoie aléatoirement <0, >0, ou =0 (même si ce dernier cas n'a que peu d'intérêt) alors on crée des groupes mélangés (les grands qui peuvent se retrouver dans le "groupe des petits" et réciproquement). Et comme les groupes sont supposés avoir été triés correctement, le désordre s'installe sans posibilité d'y remédier. On s'en apercevra uniquement lors de l'affichage du tableau trié (la fameuse photo !).

    Un exemple: dans le cas où la fonction de comparaison est juste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    A TRIER:
    (3 7 5 2 8 6 1 4)
    1er découpage:
    (2 1 3 4)(7 6 5 8)
    2eme découpage
    (2 1)(3 4)(5 6)(8 7)
    dernier découpage 
    1 2 3 4 5 6 7 8
    Et si la fonction de comparaison déraille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    A TRIER:
    (3 7 5 2 8 6 1 4)
    1er découpage, ça déraille:
    (7 2 4 8)(5 1 3 6)
    2eme découpage, ça déraille:
    (4 8)(2 7)(1 3)(6 5)
    dernier découpage
    4 8 7 2 3 1 5 6
    Maintenant il y a une faille dans tout cela: une fois le tri des élèves fini, si le professeur s'aperçoit qu'il y a un souci - moment de lucidité visuel - il sera tenté de tout recommencer... Et on est reparti pour un tour !
    Informatiquement cela n'est pas (?) envisageable car un des objectifs d'une fonction de tri est d'être rapide. Donc une fois terminée son traitement la fonction se presse de rendre la main...

    Quant à la fonction de comparaison, elle essaie d'être juste dans le désordre qu'elle génère, d'où le 0.5, Math.random() renvoyant une valeur entre 0 et 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function() {return 0.5 - Math.random()})

    J'espère avoir répondu à tes interrogations .


    ERE

  16. #16
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 163
    Par défaut
    Merci emmanuel.remy. Très clair ton post de 14h22.
    @morphine63. Je ne comprends pas le rapport avec Maple, ni le fait que l'on passe de 12 à beaucoup de mesures (ce qui ne change rien au problème d'ailleurs).
    Un tableau à deux dimensions dans javascript c'est une matrice A[i][j] = a ligne i colonne j.

  17. #17
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    Citation Envoyé par emmanuel.remy Voir le message
    Quant à la fonction de comparaison, elle essaie d'être juste dans le désordre qu'elle génère, d'où le 0.5, Math.random() renvoyant une valeur entre 0 et 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function() {return 0.5 - Math.random()})
    J'espère avoir répondu à tes interrogations .
    C'est limpide, tu as des talents d'enseignant .
    Une petite dernière, dans ce cas précis, comme la fonction ne gère pas l'égalité que se passe t il s'il y a deux valeurs égales dans le tableau à trier ?
    Si je suis tes explication j'aurais tendance à croire qu'elles peuvent se retrouver aléatoirement 'à droite ou à gauche'.

    Bon ok j'aurais pu testé, mais c'est pour le sport.

  18. #18
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    (...) que se passe t il s'il y a deux valeurs égales dans le tableau à trier ?(...) j'aurais tendance à croire qu'elles peuvent se retrouver aléatoirement 'à droite ou à gauche'.
    Exact ! (c'est pour cela que le cas d'égalité dans la fonction de comparaison n'a pas que peu d'intérêt).


    ERE

  19. #19
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    ok, ERE

    il ne me reste plus qu'a bosser la récursivité (à rebosser)

    A+

Discussions similaires

  1. Générer des partitions de musique image
    Par morphine63 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 23/03/2009, 20h02
  2. Slice sur Partitions
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/07/2003, 17h45
  3. Note de musique
    Par DelphiCool dans le forum Composants VCL
    Réponses: 52
    Dernier message: 30/06/2003, 15h54
  4. Problème montage partition Win sous RedHat ??
    Par baba dans le forum Administration système
    Réponses: 6
    Dernier message: 18/01/2003, 11h26
  5. [TP]faire la musique
    Par kgahi dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 17/12/2002, 03h21

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