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.
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