Forum Programmation.python Création musicale en python

Posté par . Licence CC by-sa
Tags : aucun
4
13
juin
2014

Bonjour,
Dans le cadre d'un Travail Personnel Encadré de prépa scientifique, un de mes camarades a pour projet de faire de la musique (plus précisément des solos) générés par ordinateur.

Pour le moment, l'algorithme est plutôt simpliste, bien que fonctionnel. Il utilise une table de transitions avec des probabilités de transition entre chaque note, et génère une séquence. Après avoir trouvé les notes il ajoute par dessus une rythmique (pas toujours très adaptée) puis l'écrit sous format lilypond afin de permettre de créer du MIDI ou d'imprimer la partition en pdf.

Plusieurs solutions sont envisagées pour améliorer la qualité de la musique générée :

  • Générer des motifs par bloc, puis assembler ceux-ci de manière à avoir un tout « cohérent », mais cela demande de beaucoup plus intervenir « manuellement » dans la génération
  • Générer un rythme de manière procédurale, puis par dessus calquer des notes, ce qui permettrait d'ajouter dans les probabilités d'apparition, le temps durant lequel la note sera jouée
  • Utiliser une approche radicalement différente :
    • Un algorithme de type génétique (sur des séquences de notes) pour trouver une partition qui répond à des critères « esthétiques », mais cela centrerait tout le travail sur la génération de la fonction de fitness (ce qui n'est peut être pas souhaitable pour une présentation ultérieure du projet)
    • Générer au fur et à mesure toutes les possibilités de partition à chaque application de fonction. Pour limiter la taille des listes (qui explose très vite) on supprimerait au fur et à mesure les partitions impossibles ou jugées trop mauvaises.

Je me rend compte que ce que je marque en dernier point n'est pas tres clair, mais un exemple devrait arranger cela : 

p = [ ["la", "si", "do"], ["fa","la","sol"] ]

def mafonction (partition):
    return [ [ "do", "re" ] , [ "mi", "fa" ] ]

q = applique (mafonction, p)

q == [ ["la", "si", "do", "do", "re"], 
       ["fa","la","sol", "do", "re"],
       ["la", "si", "do", "mi", "fa"], 
       ["fa","la","sol", "mi", "fa"] ]

Je demande à tout hasard si quelqu'un aurait un jour fait quelque chose de similaire, lu un article qui pourrait aider, ou aurait des idées et des méthodes miraculeuses !

Merci d'avance

PS : le code est écrit en python pour des raisons de simplicité, et parce que c'est le langage choisi pour « l'info pour tous » en prépa scientifique.

  • # Sacré sujet

    Posté par . Évalué à 3.

    Tu peux essayer de regarder ce qu'à fait iannis xenakis

    • [^] # Re: Sacré sujet

      Posté par . Évalué à 1.

      En effet cela est assez intéressant, mais les (certes très vagues et rapides) recherches que j'ai menées ne donnent pas réellement les méthodes, mais parlent plus de côté « artistiques ». Par exemple, on peut tomber sur le site de l'IRCAM mais si cela parle bien de théorie des probabilités et des groupes qui seraient « fondateurs » d'un de ses morceaux, je n'ai pas encore trouvé d'article explicatif sur les choix et méthodes … Je vais quand même regarder plus en détail, merci du coup de main !

  • # utilisation de gamme

    Posté par . Évalué à 3.

    J'ai jamais fais de projet info dans ce sens par contre j'y ai pensé plusieurs voir sans avoir le courage de l’implémenter.

    Tu parle de transition mais tu ne parle pas de gamme en guitare un des premier truc que t'apprends dans le domaine des impros c'ets les gammes pentatonique.
    Pour simplifier au max tu joues n'importe quelle note d'une gamme pentatonique (peu importe l'ordre) mineur avec un rythme de blues et ça sonnera blues c'est con mais c'est assez efficace.

    Après en général (j'ai dit en général donc c'est pas toujours vrai) quand un truc rend bien il pas mal comporte des répétitions de parten (rythmyque ou mélodique) tu peux peut être creuser dans cette direction pour améliorer ton algo.

    Pour conclure je te conseillerai de regarder des cours d'impro sur youtube (ou autre) (cherche impro guitare ou "pentatonique") et ensuite tu peux traduire les notions de base dans ton code.
    genre ça https://www.youtube.com/results?search_query=improvisation+guitare+pentatonique
    Je sais pas si ça t'aidera mais personnellement en guitare une fois que j'ai commencé a faire des impro j'ai très vite tourné en rond sur des truc pas terrible et quand je trouve un truc bien j'ai tendance a toujours faire la même chose.
    Au final une fois les bases acquise la méthode d'écrite dans cette vidéo m'a beaucoup aider a améliorer (même si c'est pas encore terrible) https://www.youtube.com/watch?v=LLGJccTkKIU.

    • [^] # Re: utilisation de gamme

      Posté par . Évalué à 1.

      Merci pour la vidéo, l'idée d'imposer des contraintes pour avoir des mélodies plus cohérentes et ensuite faire varier les contraintes semble intéressant du point de vue de la génération ! Cela réglerait pas mal de problème posé par les suites aléatoires au niveau de la progression musicale.

      Je précise quand même que je ne sais pas jouer de musique (quelque soit l'instrument) et donc que cela est relativement nouveau pour moi, même si je savais que les gammes existaient, je ne pensais pas que cela sonnait aussi bien sur une guitare ! Mon camarade (qui a initié le projet) joue bien de la guitare, du coup je vais voir avec lui ces options.

      Pour le moment, en regardant le code, j'ai l'impression qu'on était en fait sur une gamme (mais je ne m'en était pas rendu compte) et les probabilités régissaient le passage d'une note de cette gamme à une autre (et changement d'octave).

      • [^] # Re: utilisation de gamme

        Posté par . Évalué à 1.

        Pour les gammes il faut choisir la bonne gamme en fonction du style que tu veux jouer.
        Typiquement une pentatonique mineur +la blues note ça sera nikel pour du blues.
        Après faut avoir des rythmyques qui vons aussi avec le style choisi
        Et pour faire un truc qui sonne faut pas faire nimporte quoi dans les anchainement, c'est un peu comme un poème y'a des phrasés qui reviènent en apportant des nuances.

        Je pense qu'au final faire un truc qui joue quelque chose qui sonne pas faux ça doit pas être faisable avec quelques notions par compte faire un truc qui envoie grave ça c'est méga chaud!!

        Bon courage.

  • # Progression

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

    Pour faire des solos, il te faut une progression d'abord. Quels accords sont joues? Dans quelle tonalite. Une fois que t'as ca, tu peux choisir ta ou tes gammes pour improviser.

    Ensuite, tu peux t'amuser. Joue des arpeges, joue tes notes indirectement, jour une tierce au dessus de l'accord joue', repete, etc. Utiliser des chaines de Markov pour choisir la prochaine note risque d'etre limite'. Ca a l'air plus cool, mais ca sonnera surement moins bien.

  • # SuperCollider

    Posté par . Évalué à 1.

    Comme dit précédemment, on se base sur des échelles dans la musique tonale ou modale.

    Un exemple concret sous forme d'article par Raed Belhassen : Structures modales et ornementations dans la musique arabe : modélisations et présentation d’une bibliothèque d’objets dans Csound.

    Pour le rythme, on peut utiliser un réservoir typique d'un style.

    Raed utilise Csound. Pour ma part, je te conseille SuperCollider. Ces langages dédiés t'apporteront des structures musicales établies comme les échelles ou les rythmes.

    Tiens nous au courant, tes recherches sont intéressantes.

  • # Haskore

    Posté par . Évalué à 1.

    Il y a aussi haskore, qui permet de faire de la composition algorithique en haskell. je ne connais pas très bien, mais il y a des exemples de projets qui l'utilisent sur cette page : Haskore
    Et je pense que ça ressemble à ce que tu veux faire.

    • [^] # Re: Haskore

      Posté par . Évalué à 1.

      En effet c'est assez proche, mais l'idée serait de faire quelque chose « à la main » (puisque c'est quand même un projet personnel à présenter devant un jury au final) et en plus je ne suis pas sûr qu'haskell soit un choix judicieux pour mon camarade (Caml Light a déjà fait assez de dégats !).

      De plus je n'ai pas bien compris à quoi servait Haskore (car je suis tombé dessus en faisant des recherches), de ce que j'ai lu c'est juste une bibliothèque pour exprimer de la musique en Haskell, mais la génération du solo reste quand même à faire soi même, ce qui laisse pas mal de travail !

  • # Impro-Visor

    Posté par . Évalué à 1.

    Hello,

    Je ne sais pas exactement si ça tombe dans le cadre du TP, mais il existe le logiciel open-source Impro-Visor qui combine le côté band-in-a-box avec des outils de générations de solos (gammes + dictionnaire + aléatoire, de ce que j'en ai compris). Bon après, c'est du Java et ça a l'air d'avoir un côté usine à gaz, mais peut-être que les concepts abordés pourront être utiles.

  • # python : le bon choix !

    Posté par . Évalué à 1.

    Python permet de créer les ondes sonores, de les organiser dans le temps et dans l'espace. Pour y arriver, les Lilypond, Supercollider et autres gadgets sont plutôt des handicaps car il faut se servir de langages plutôt mal conçus.

    Construire les mélodies au moyen de règles de probabilités n'est pas simple.
    Le meilleur bouquin sur la question n'est pas celui de Xenakis (Musiques formelles) mais il est en allemand: "Nach allen Regeln der Kunst" de Wilhelm Fucks.

    On est amené à utiliser des tuples de hauteurs - ce qui deviendra des tuples de
    tuples en y associant des durées.

    Pour (faire) écrire la partition, à mon avis, le bon choix c'est CMN de Bill Schottstaedt (donc quelques exercices en Lisp :)

    CMN = Common Music Notation

    A.S.

Suivre le flux des commentaires

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