Publicité

Annonce

Réduire
Aucune annonce.

Python et la musique

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • #91
    Envoyé par deb76 Voir le message
    Ah, non, pas d'accord,
    Je ne comprends pas ton désaccord. Je te fais part d'un écart entre 2 modes de recherche : celui d'OpenOffice qui cherche partout, et d'OPMO qui ne recherche qu'au début (et peut-être à la fin), et tu me réponds avec une illustration où avec les codes de couleur tu mets en évidence cet écart ! (OPMO ne trouve que les verts). [Fait gaffe avec OpenOffice... en cherchant 0 3, tu trouves des 10 3 !!]

    La recherche d'OPMO est relativement simple :

    Code:
    sequence = [6, 3, 2, 5, 4, 8, 9, 10, 11, 1, 7, 0]
    pattern = [10, 11, 2, 1]
    
    pattern.sort()
    
    def norm(n):
        return n%12
    
    def neg(n):
        return (12-n)%12
    
    def analyse_p(seq,pat):
        pat.sort()
        for i in range(12):
            l1 = [norm(i+j) for j in seq]
            if sorted(l1[:len(pat)]) == pat:
                yield(i, l1[:len(pat)], l1[len(pat):])
            
    for i,l1, l2 in analyse_p(sequence,pattern):
        print ("P",i,l1,l2)
    
    for i,l1, l2 in analyse_p(list(map(neg,sequence)), pattern)):
        print ("I",i,l1,l2)
    Cela écrit :

    Code:
    P 8 [2, 11, 10, 1] [0, 4, 5, 6, 7, 9, 3, 8]
    I 4 [10, 1, 2, 11] [0, 8, 7, 6, 5, 3, 9, 4]
    Ce qui est le résultat d'OPMO. (A l'exception des R et RI, mais dans l'exemple montré, il ne s'agit que des mêmes résultats écrit à l'envers. (On pourrait utiliser l1.reverse() pour inverser une liste est afficher le résultat, mais il y a peu de plus-value).

    Le résultat (R10 ((10 5 11 9 8 7 6 2 3) (0 1 4))) (P10 ((4 1 0) (3 2 6 7 8 9 11 5 10))) me surprend : tu recherches 11 5 10, et cela isole 0 1 4. J'aurais proposé (R10 ((10 5 11) (9 8 7 6 2 3 0 1 4))) (P10 ((4 1 0 3 2 6 7 8 9) (11 5 10))) qui pour le coup reprend la logique.

    Ceci dit, en Python extraire les n derniers éléments s'écrit sequence[-n:] au lieu de sequence[:n]... adapter mon programme pour chercher une chaîne à la fin ne présenterait aucun problème.

    Adapter le programme pour chercher partout au milieu (à la OpenOffice) nécessiterait d'ajouter une boucle pour itérer au milieu, mais n'ajouterait que cette complexité.

    Ma question sur la plus-value résulte d'une comparaison entre (P9 ((3 0) (11 2 1 5 6 7 8 10 4 9))) et (R9 ((9 4 10 8 7 6 5 1 2 11) (0 3))) qui ne sont que deux présentations d'un même résultat. (L'un est la rédaction à l'envers de l'autre). C'est différent des P et I qui pour le coup sont deux résultats différents.

    --

    PS : Tu remarques que je n'essaye pas de trouver toutes les permutations (ce serait trop compliqué), mais cherche une chaine au début en comparant les versions triées. Tu noteras des notations très puissantes en Python. La notation [ f(x) for x in liste ] itère x dans une liste et retourne la liste des f(x). Plus puissant encore : la fonction "analyse_p" retourne plusieurs résultats à l'aide du mot clé yield. Cette fonction agit un peu comme return pour retourner un résultat mais n'arrête pas la fonction. AU final lorsque l'on appelle la fonction, on obtient un objet itérable (un peu comme une liste) avec tous les résultats trouvés. C'est plus élégant que d'initier un "result = []", d'ajouter des résultats au fil de l'eau "result.append(x)" et retourner le résultat à la fin "return result". Pour des grands résultats voire inifini, yield n'alloue pas de liste importante en mémoire, mais s'assure que la fonction appelante récupère les résultats au fil de l'eau.
    Dernière modification par floyer, 03 mai 2017, 22h03.
    http://www.sinerj.org/~loyer/piano/

    It's never too late to learn to play the piano. (tip of the day)

    Côté piano : Yamaha N1X, pianos VSL Syncron et Vienna Imperial, Garritan CFX, Bechstein Digital Grand, Ivory, Galaxy et beaucoup d’autres pianos virtuels - Côté synthé : Roland A-500 Pro, Native-Instruments Komplete 13, Arturia V Collection 9, Korg Collection 3, Air Music Technology plugins, OP-X Pro II, dexed (émulateur DX7 libre), Yamaha S-YXG50 - DAW : Reaper 6, Cubase Artist 9 - Interface audio : Steinberg UR22 - Casque : AKG K-702

    Commentaire


    • #92
      Salut à vous deux,

      Développement passionnant, mais je ne suis pas tout (je le suis plutôt en tant que "curieux").

      Je remarque quelques soucis mineurs de compréhension …
      qui cependant empêchent un codage effectif.

      Courage.

      C'était juste pour dire que "certains vous lisent avec intérêt", même s'ils ne participent pas au sujet.
      Roland RD2000, Nord Piano 2 HP, KORG PA900
      FocusRite Scarlett 6i6, Lucas Nano 300, 2xMonitors CM30,
      MacBookPro + Logic Pro X + divers VSTs (AU), Zoom Q2n, Boss VE-5

      Cheminer ou arriver: quel est mon but ? La musique est un chemin infini...

      Commentaire


      • #93
        AU fait, je trouvais compliqué de sortir toutes les permutations d'une liste.

        Cela se fait en 9 lignes :

        Code:
        def toutes_permutations(l):
            if l == []:
                yield []
            for i in range(len(l)):
                l1 = l[:i]
                x = l[i]
                l2= l[i+1:]
                for permut in toutes_permutations(l1+l2):
                    yield [x] + permut
        Ainsi :

        Code:
        In [119]: list(toutes_permutations( [4,8,9] ))
        Out[119]: [[4, 8, 9], [4, 9, 8], [8, 4, 9], [8, 9, 4], [9, 4, 8], [9, 8, 4]]
        (J'utilise encore yield) NB: On pourrais gagner 3 lignes sans les valeurs intermédiaires l1, x, l2, qui ne servent qu'à détailler ce que l'on fait.
        Dernière modification par floyer, 03 mai 2017, 21h23.
        http://www.sinerj.org/~loyer/piano/

        It's never too late to learn to play the piano. (tip of the day)

        Côté piano : Yamaha N1X, pianos VSL Syncron et Vienna Imperial, Garritan CFX, Bechstein Digital Grand, Ivory, Galaxy et beaucoup d’autres pianos virtuels - Côté synthé : Roland A-500 Pro, Native-Instruments Komplete 13, Arturia V Collection 9, Korg Collection 3, Air Music Technology plugins, OP-X Pro II, dexed (émulateur DX7 libre), Yamaha S-YXG50 - DAW : Reaper 6, Cubase Artist 9 - Interface audio : Steinberg UR22 - Casque : AKG K-702

        Commentaire


        • #94
          Finalement le programme complet qui cherche n'importe où dans la matrice... et affiche 2 fois ce qu'il trouve (en normal et à l'envers) :

          Code:
          def norm(n):
              return n%12
          
          def neg(n):
              return (12-n)%12
          
          def neg_list(l):
              return list(map(neg,l))
          
          sequence = [6, 3, 2, 5, 4, 8, 9, 10, 11, 1, 7, 0] 
          pattern = [0,3]
          pattern.sort()
          
          def analyse_p2(seq,pat):
              pat.sort()
              lpat = len(pat)
              for i in range(12):
                  l1 = [norm(i+x) for x in seq]
                  for j in range(12-lpat):
                      if sorted(l1[j:j+lpat]) == pat:
                          yield(i, l1[:j], l1[j:j+lpat], l1[j+lpat:])
          
          for i,l1, l2, l3 in analyse_p2(sequence,pattern):
              print ("P",i,l1,l2, l3)
              l1.reverse()
              l2.reverse()
              l3.reverse()
              print ("R", i, l3, l2, l1)
                  
          for i,l1, l2, l3 in analyse_p2(neg_list(sequence), pattern):
              print ("I",i,l1,l2, l3)
              l1.reverse()
              l2.reverse()
              l3.reverse()
              print ("RI", i, l3, l2, l1)
          Ce qui donne :

          Code:
          P 9 [] [3, 0] [11, 2, 1, 5, 6, 7, 8, 10, 4, 9]
          R 9 [9, 4, 10, 8, 7, 6, 5, 1, 2, 11] [0, 3] []
          P 10 [4, 1] [0, 3] [2, 6, 7, 8, 9, 11, 5, 10]
          R 10 [10, 5, 11, 9, 8, 7, 6, 2] [3, 0] [1, 4]
          I 5 [11, 2] [3, 0] [1, 9, 8, 7, 6, 4, 10, 5]
          RI 5 [5, 10, 4, 6, 7, 8, 9, 1] [0, 3] [2, 11]
          I 6 [] [0, 3] [4, 1, 2, 10, 9, 8, 7, 5, 11, 6]
          RI 6 [6, 11, 5, 7, 8, 9, 10, 2, 1, 4] [3, 0] []
          Dernière modification par floyer, 03 mai 2017, 22h21.
          http://www.sinerj.org/~loyer/piano/

          It's never too late to learn to play the piano. (tip of the day)

          Côté piano : Yamaha N1X, pianos VSL Syncron et Vienna Imperial, Garritan CFX, Bechstein Digital Grand, Ivory, Galaxy et beaucoup d’autres pianos virtuels - Côté synthé : Roland A-500 Pro, Native-Instruments Komplete 13, Arturia V Collection 9, Korg Collection 3, Air Music Technology plugins, OP-X Pro II, dexed (émulateur DX7 libre), Yamaha S-YXG50 - DAW : Reaper 6, Cubase Artist 9 - Interface audio : Steinberg UR22 - Casque : AKG K-702

          Commentaire


          • #95
            Je ne comprends pas ton désaccord. Je te fais part d'un écart entre 2 modes de recherche : celui d'OpenOffice qui cherche partout, et d'OPMO qui ne recherche qu'au début (et peut-être à la fin), et te me réponds avec une illustration où avec les codes de couleur tu mets en évidence cet écart ! (OPMO ne trouve que les verts).

            Mon désaccord était sur cette phrase : "Du coup, on n'a pas à chercher partoit dans la matrice". Mais je viens de me rendre compte que tu avais répondu en tant que programmeur, et notamment sur la différence de recherche entre OMPM et Libre Office, alors que pour ma part, j'avais interprété cette phrase dans le cadre de l'analyse musicale, dans la nécessité pour moi de se référer à la matrice, avec l'aide ou non de l'ordinateur. Donc, ce n'était pas par rapport aux 2 modes de recherche.
            Pour le document de Libre Office, c'était à titre informatif, pour montrer ce que j'obtenais à partir de la même recherche avec OPMO. Et surtout dans mon esprit en un c'était montrer que pour Libre Office pour obtenir les recherches je dois passer par les quatre matrices alors que pour OPMO la recherche s'effectue dans une seule matrice; et en deux pour noter que Libre Office n'arrivait pas aussi à trouver la série 11 2 3 0 1 9 8 7 6 4 10 5.

            J'ai tardé à répondre car j'ai transcris une portion de partition sur laquelle je porte mes recherches et en ajoutant la notation numérique en entiers accolée à chaque note pour que tu comprennes concrètement comment je me sers des recherches à partir des segments afin d'identifier le tracé des séries :
            http://www.deb8076.eu/CAOAnalysesMusicales/ExOPMOop22Webern.pdf et que tu peux tester avec ta dernière version de ton programme.

            Et dont je vois que tu as peaufiné les critères de recherche avec en résultat un affichage qui prend en compte les quatre formes et je dois dire que je n'en espérais pas tant. Je viens de le tester rapidement avec quelques segments et globalement c'est très positif, ça permet d'obtenir des pistes de recherche. Par contre, selon la disposition du segment, et du segment lui-même les résultats vont jusqu'à 20 lignes. Mais ce n'est pas un problème, car dans ce cas, j'essaye de repérer une note supplémentaire afin d'affiner la recherche. Et puis, par ailleurs, cela peut-être intéressant pour trouver des segments semblables permutés ou non selon les différentes formes et ça peut dans ce cas permettre de mettre en exergue certaines particularités internes de certaines des formes dérivées. Je vais regarder ça dans la journée à tête reposée en effectuant une identification.

            Mais sinon, un grand bravo pour ce programme qui dans l'état va m'être très utile.

            Commentaire


            • #96
              Bonsoir Alain,
              Envoyé par Alain44 Voir le message
              Salut à vous deux,

              Développement passionnant, mais je ne suis pas tout (je le suis plutôt en tant que "curieux").

              Je remarque quelques soucis mineurs de compréhension …
              qui cependant empêchent un codage effectif.

              Courage.

              C'était juste pour dire que "certains vous lisent avec intérêt", même s'ils ne participent pas au sujet.
              Pas de soucis. En plus, c'est une question très spécialisée. Mais le résultat est là et je suis très impressionné par le programme qu'a créé floyer. En tout cas, il va m'être très utile.

              Commentaire


              • #97
                Une petite correction :

                for j in range(13-lpat):

                En effet, pour un échantillon de taille 1, il faut le chercher à 13-1 = 12 positions et non 12-1 = 11.

                Avant, le programme ne trouvait rien à la fin.
                http://www.sinerj.org/~loyer/piano/

                It's never too late to learn to play the piano. (tip of the day)

                Côté piano : Yamaha N1X, pianos VSL Syncron et Vienna Imperial, Garritan CFX, Bechstein Digital Grand, Ivory, Galaxy et beaucoup d’autres pianos virtuels - Côté synthé : Roland A-500 Pro, Native-Instruments Komplete 13, Arturia V Collection 9, Korg Collection 3, Air Music Technology plugins, OP-X Pro II, dexed (émulateur DX7 libre), Yamaha S-YXG50 - DAW : Reaper 6, Cubase Artist 9 - Interface audio : Steinberg UR22 - Casque : AKG K-702

                Commentaire


                • #98
                  Bonjour,
                  Envoyé par floyer Voir le message
                  Une petite correction :

                  for j in range(13-lpat):

                  En effet, pour un échantillon de taille 1, il faut le chercher à 13-1 = 12 positions et non 12-1 = 11.

                  Avant, le programme ne trouvait rien à la fin.
                  J'ai fait la correction. Et puis j'ai testé ton programme sur quelques mesures en notant mes segments de recherche et leurs résultats pour l'identification des séries :

                  Et de fait, ce programme de recherche dans une matrice P I R RI fournit une aide précieuse pour ce type d'analyse.
                  Merci encore, car ça va bien m'aider.

                  Commentaire


                  • #99
                    Tu pourrais noter qu'en recherchant comme tu l'as fait un accord et son renversement, on trouve les mêmes résultats présentés différemment : à un P4 correspond un I8 car 4 et 8 sont complémentaires.

                    Ce qui m'intrigue dans l'approche, c'est qu'une recherche de note dans la séquence de 12 peut retourner une occurence qui est à cheval entre deux fragments (la séquence de 12 étant une concaténation de fragments). Du coup, je suppose que tous les résultats ne sont pas forcément intéressant.

                    Je note que la séquence se termine par un accord viennois. Un hasard ?

                    PS: On peut facilement éviter de rechercher des permutations si cela génère trop de résultats (on enlève le tri des tableaux à deux endroits : sort et sorted). Mais comme OPMO le faisait, je me suis laisser entraîner.
                    Dernière modification par floyer, 04 mai 2017, 19h42.
                    http://www.sinerj.org/~loyer/piano/

                    It's never too late to learn to play the piano. (tip of the day)

                    Côté piano : Yamaha N1X, pianos VSL Syncron et Vienna Imperial, Garritan CFX, Bechstein Digital Grand, Ivory, Galaxy et beaucoup d’autres pianos virtuels - Côté synthé : Roland A-500 Pro, Native-Instruments Komplete 13, Arturia V Collection 9, Korg Collection 3, Air Music Technology plugins, OP-X Pro II, dexed (émulateur DX7 libre), Yamaha S-YXG50 - DAW : Reaper 6, Cubase Artist 9 - Interface audio : Steinberg UR22 - Casque : AKG K-702

                    Commentaire


                    • Envoyé par floyer Voir le message
                      Tu pourrais noter qu'en recherchant comme tu l'as fait un accord et son renversement, on trouve les mêmes résultats présentés différemment : à un P4 correspond un I8 car 4 et 8 sont complémentaires.
                      Oui, sur le renversement c'est une des opérations utilisées dans le cadre de la Set Theory et du modulo 12 et qui s'illustrent bien dans une représentation circulaire :
                      Code:
                          
                          0
                      11 --- 1
                      10 --- 2
                       9  --- 3
                       8  --- 4
                       7  --- 5
                          6
                      Ce qui m'intrigue dans l'approche, c'est qu'une recherche de note dans la séquence de 12 peut retourner une occurence qui est à cheval entre deux fragments (la séquence de 12 étant une concaténation de fragments). Du coup, je suppose que tous les résultats ne sont pas forcément intéressant.
                      Ca dépend de ce qu'on recherche et puis aussi des structure intervalliques des séries qui vont induire certaines propriétés internes.
                      Si tu prends R7 tu as notamment ce partage de notes communes dans la même position:
                      Code:
                      R7   :  [7,  2,   8,  [B]6[/B]  5,  4,  3,  11,  [B]0[/B],  9,  10,  1] 
                      RI5  : [5, 10,   4,  [B]6[/B]  7,  8,  9,   1,   [B]0[/B],  3,   2,  11]
                       P1  :  [7,  4,    3,  [B]6[/B]  5,  9, 10, 11,  [B]0[/B],   2,   8,  1]
                       I11 : [5,  8,    9,  [B]6[/B]  7,  3,  2,   1,  [B]0[/B],  10,  4,  11]
                      
                      ou 
                       RI9 : [[B]9[/B],  2,  8,  [B]10  11[/B],  0,  1,  [B]5,  4[/B],  7,  6,  [B]3[/B]]
                       I3 :   [[B]9[/B],  0,  1,  [B]10  11[/B],  7,  6,  [B]5[/B],  [B]4[/B],  2,  8,  [B]3[/B]]
                      Je note que la séquence se termine par un accord viennois. Un hasard ?
                      Non, si le 3-5 est appelé accord viennois c'est en raison de son utilisation par Schoenberg, Berg, Webern et puis ensuite par un grand nombre de compositeurs contemporains. Boulez a écrit qu'il était devenu un accord académique, mais il s'en est pas mal servi dans ses premières pièces.

                      PS: On peut facilement éviter de rechercher des permutations si cela génère trop de résultats (on enlève le tri des tableaux à deux endroits : sort et sorted). Mais comme OPMO le faisait, je me suis laisser entraîner.
                      Je préfère plus que moins, donc pas de problème.
                      Dernière modification par Invité, 04 mai 2017, 22h31.

                      Commentaire


                      • Bonjour,
                        Hier j'ai eu une mauvaise surprise en constatant que l'interface Anaconda Navigator avec lequel je gère les scripts Python, et notamment ceux créés par Floyer avec ou sans Music21 se fermait immédiatement après son ouverture sur les Mac 21 et 27. Une fermeture dont je n'ai toujours pas compris la raison... Mais bon, sur le site, j'ai téléchargé la dernière version et installée en premier lieu sur l'Imac 21. Constat, Anaconda Navigator est à nouveau fonctionnel. En revanche, Music21 n'était plus reconnu. Même constat pour l'Imac 27 5K, à la seule différence que j'ai dû désinstaller Anaconda Navigator de son répertoire car sinon la nouvelle version ne s'installait pas, un message indiquant qu'en raison de la présence du programme il fallait effectuer la mise à jour à partir de ce dernier. Mais comme ce dernier se fermait immédiatement, c'était impossible. Heureusement, la suppression du répertoire a permis de réinstaller Anaconda Navigator.
                        Mais à nouveau si Python tournait sans problème, Music21 n'était plus reconnu. Et très honnêtement, hier en souvenance des difficultés inhérentes à sa reconnaissance que j'avais connues, j'ai remis ça à ce matin.

                        Et pour se faire, me rappelant que floyer avait donné la marche à suivre au message 65 de la page 7:
                        Code:
                        [COLOR=#333333]Je viens d'installer Anaconda sur un Mac "que pour moi"... après, tu peux taper dans une fenêtre "terminal"[/COLOR]
                        
                        [COLOR=#333333][FONT=Tahoma][I]
                        cd anaconda
                        ./bin/pip install music21
                        [/I][/FONT]
                        [/COLOR]
                        [COLOR=#333333]Et music21 est installé. [/COLOR]
                        
                        [COLOR=#333333]Si Anaconda est installé sur le disque dur pour tout le monde (on te demande dans ce cas un mot de passe), il faut taper :[/COLOR]
                        
                        [COLOR=#333333][FONT=Tahoma][I]
                        cd /anaconda
                        ./bin/pip install music21
                        [/I][/FONT]
                        [/COLOR]
                        [COLOR=#333333](tout le monde peut alors utiliser Anaconda, mais seul celui qui l'a installé peut le compléter ainsi.)[/COLOR]
                        J'ai testé les deux procédures qu'il faut coller dans le Terminal. Pour l'Imac21, c'est la seconde qui a fonctionné et pour le 27, ce fut la première. Et, en lançant Anaconda Navigator, j'ai retrouvé d'une part Music21 mais aussi son total fonctionnement avec MuseScore.

                        Bref, un grand merci à floyer car ses deux petites commandes sont très précieuses, elles permettent d'installer sans prise de tête Music21. Alors pour ceux qui souhaiteraient installer et travailler avec Python et Music21 sur Mac avec Anaconda Navigator, un conseil, sauvegarder bien ces deux commandes pour le terminal.

                        PS : J'ai évoqué longuement ce problème afin de noter concrètement comment il a été résolu. Ca peut se révéler utile pour d'autres utilisateurs éventuels.

                        Commentaire


                        • Content que cela serve... cela permet aussi d'installer pyaudio (./bin/pip install pyaudio) pour permettre à tes programmes d'accéder à la carte son.

                          Ainsi, une synthèse FM à deux modulateurs :

                          Code:
                          import pyaudio
                          import math
                          import struct
                          
                          sampling_rate = 44100
                          f1 = 440
                          f2 = 880
                          mod21 = 1.7
                          buffer_size = 256
                          
                          audio = pyaudio.PyAudio()
                          
                          stream = audio.open(format = pyaudio.paInt16,
                                              channels = 1,
                                              rate = 44100,
                                              output = True)
                          
                          phase=0
                          
                          for t in range(100):
                              arr = b''
                              for i in range(256):
                                  modulator = math.sin(f2*2*math.pi/sampling_rate*phase)
                                  signal = 30000 * math.sin(modulator*mod21 
                                                            + f1*2*math.pi/sampling_rate*phase)
                                  phase += 1
                          
                                  arr += struct.pack('h',math.trunc(signal))
                          
                              stream.write(arr)
                          Cela fait beaucoup de lignes (de conversion, d'ouverture du device, etc). Mais tu reconnaitras la ligne "modulateur = ..." et la ligne "signal = ..." qui contiennent la logique de la synthèse.

                          Un vrai programme remettrait la phase à zéro de temps en temps, lirait les sinus dans une table (au lieu de les calculer, etc.).

                          L'idéal serait de marier avec PyQt pour avoir une interface graphique et un son avec lequel on interagirait...
                          Dernière modification par floyer, 01 septembre 2017, 22h17.
                          http://www.sinerj.org/~loyer/piano/

                          It's never too late to learn to play the piano. (tip of the day)

                          Côté piano : Yamaha N1X, pianos VSL Syncron et Vienna Imperial, Garritan CFX, Bechstein Digital Grand, Ivory, Galaxy et beaucoup d’autres pianos virtuels - Côté synthé : Roland A-500 Pro, Native-Instruments Komplete 13, Arturia V Collection 9, Korg Collection 3, Air Music Technology plugins, OP-X Pro II, dexed (émulateur DX7 libre), Yamaha S-YXG50 - DAW : Reaper 6, Cubase Artist 9 - Interface audio : Steinberg UR22 - Casque : AKG K-702

                          Commentaire

                          Chargement...
                          X