lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Du nouveau au sujet de ly2xml?


From: Jean Abou Samra
Subject: Re: Du nouveau au sujet de ly2xml?
Date: Mon, 17 May 2021 22:01:04 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1


Le 17/05/2021 à 00:00, Jacques Menu a écrit :
Bonsoir Jean,

Désolé pour les lecteurs qui vont trouver ce message rébarbatif…

Comme je te l’avais dit, j’avais demandé, lors de ma présentation à Salzburg, s’il existait dans le flot de tâches exécutées par LilyPond un endroit où se raccrocher pour aborder ça. Personne ne semblait avoir de réponse à ce moment-là. Je suis heureux que tu nous en apportes, tu as bien compris ce que je demandais.

Quitte à faire du gros boulot, il serait effectivement de loin plus porteur de travailler à un export de Lily vers d’autres représentations des partitions que de créer un outil pour fusionner des fichiers MusicXML.

Comme je ne connais pas, tant s’en faut, le détail de ce que fait Lily, et que ça serait contre-productif que je m’y investisse, je pourrais colloborer avec quelqu’un qui aurait cette connaissance. Tu me sembles donc être le volontaire tout désigné!

L’approche consisterait à créer une description LPSR (LilyPond Score Representation) de la partition par un exporteur. Il faudrait voir ce qui devrait être écrit en Scheme et en C++ respectivement. 

C’est ce LPSR que xml2ly construit pour ensuite produire le code LilyPond à partir de ça, voir l’architecture à la page 2 de https://github.com/jacques-menu/musicformats/blob/dev/doc/musicformatsArchitecture/musicformatsArchitecture.pdf .

Pour illustrer comment la partition est décrite dans LPSR, je joins l’exemple d’une partition minimale, mais avec quand même différents aspects présents :




Il y a le source MusicXML et le log de sa conversion en LilyPond par la commande :

xml2ly -auto-output-file-name  basic/MinimalScore.xml -display-lpsr

Les numéros de lignes sont ceux des éléments dans le fichier MusicXML.

On voit dans le log les deux composants de la description LPSR : le premier est la musique (composant MSR), et le second tout à la fin ce qu’il faut en plus pour structurer la partition comme on le fait en LilyPond :

  Book blocks
  
    BookBlock
    
      BookBlockElements
        ScoreBlock
        
          ParallelMusicBLock, 1 part group
            
            PartGroupBlock for partGroup "PartGroup_1 ('0', partGroupName "Implicit")", partGroupSymbolNone, 1 element
            
              PartBlock for part Part_POne (partID "P1"), 1 element
                partName                     = ""
                partAbbreviation             = ""
                partBlockInstrumentName      = ""
                partBlockShortInstrumentName = ""
                
                StaffBlock for staff "Part_POne_Staff_One" (staffRegular), 1 element
                  (StaffBlockInstrumentName       = "")
                  (StaffBlockShortInstrumentName  = "")
                  
                  UseVoiceCommand "Part_POne_Staff_One_Voice_One", 0 stanza
          
          Layout
            layoutGlobalStaffSize : 20
          
          MidiTempo
            midiTempoDuration  = 4
            midiTempoPerSecond = 90

Je suis en train de documenter progressivement comment tout cela est fait.

Donc pour résumer : si on peut créer cette description LPSR depuis LilyPond par un exporteur, on a directement la conversion en MusicXML, Guido et braille. MIDI n’est pas encore disponible, mais j’ai déjà avancé dans cette direction.
Les nodes que tu proposes correspondraient à des msrElement de mon côté.

Par exemple, pour créer dans le composant MSR de la description LPSR une note avec un pp, comme :

a'8 \pp

on écrirait le code C++ ci-dessous, ou son équivalent en Scheme :

      // create the note
      S_msrNote
        note1 =
          msrNote::createRegularNote (
            __LINE__,
            measure1number,
            msrQuarterTonesPitchKind::kQTP_A_Natural,
            msrOctaveKind::kOctave4,
            rational (1, 8), // soundingWholeNotes
            rational (1, 8), // displayWholeNotes
            0);              // dotsNumber

      // append the dynamics to the note
      note1->
        appendDynamicsToNote (
          msrDynamics::create (
            __LINE__,
            msrDynamicsKind::kDynamicsPP,
            msrPlacementKind::kPlacementBelow));

N’hésite pas si tu as des questions!

JM


Bonjour Jacques,

Je réponds en privé, sinon je crois que nous allons passer pour des extraterrestres ;-)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]