override line-width dans une fonction

Bonjour à tous !
J’ai fait plusieurs expériences avec mon petit problème, sans obtenir le résultat souhaité. Je vous les livre donc ici en détail, en espérant que quelqu’un pourra m’aider à trouver la solution.

Si j’écris :
\score {
\new Staff {
\relative d' {
\textLengthOn

\tempo "Largo"
\key es \major
<bes es g>4 <bes es g>8. <bes es g>16 <bes es g>2-\fermata \bar "||"

% \textA

\tempo "Adagio"
r8 bes( ces a) << { bes f'~ f16 d es ges, ges8 f16. ges32 d8 } \\
{ s8 as'~ as16 f ges es es8 d16. es32 bes8 } >> r8 r2 |

\stopStaff \once \override TextScript #'extra-offset = #'( 0 . 5 )
s1-\markup { \textB }
\startStaff

s8 f''(-\p ges e) << { f es~ es16 c des bes' | bes8 a16. bes32 a8 } \\
{ s8 c,~ c16 a bes des | des8 c16. des32 c8 } >> r8 r2 |

}}}

où :
textB =
\markup {
\override #'(font-name . "Didot")
\column {
\override #'(line-width . 18 )
\justify {
Tout mon feu s’est éteint…
mon imagination s’est glacée,
le marbre sort froid de mes mains…
}

Pas de problème, toutes les indications sont respectées. Si maintenant j’essaie de faire une fonction pour me simplifier la tâche, et donc de faire :

meloText =
#(define-music-function
(parser location Largeur Texte)
(number? string?)
#{\stopStaff \once \override TextScript #'extra-offset = #'( 0 . 4 )
s1-\markup {
\override #'(font-name . "Didot")
\column {
\override #'(line-width . 30)
\justify {
$Texte
}
\startStaff
#}
)

textA = \meloText #30 #"Il n'y a point là d'âme ni de vie… Ce n'est que de la pierre"

et de décommenter la ligne \textA dans mon \score { … }, hé bien la ligne \override #'(line-width . 30) n’est pas prise en compte et le texte prend ses aises et se place sur une seule ligne.
Si enfin je mets \override #'(line-width . $Largeur), la compilation plante.

J’ai donc fait quelques petites recherches, et j’ai essayé de remplacer la ligne \override #'(line-width . $Largeur) par \override #'(cons line-width . $Largeur). Ça ne plante plus, mais l’indication n’est toujours pas respectée. Idem avec \override #'(cons line-width . 30).
J’ai aussi essayé, purement expérimental parce que je l’ai aperçu dans des résultats Google, \override #'(cons 'line-width . $Largeur) ; ça plante pas mais ça fait toujours rien. J’ai aussi essayé sans le dollar. J’ai aussi essayé de remettre \textLengthOn dans la fonction.

Je suis d’autant plus surpris que l’autre \override, celui pour le choix de la fonte, est, lui, parfaitement respecté.

Du coup je me retrouve bloqué. Est-ce que c’est un bug ? Je ne pense pas, et je crois plutôt qu’il faut écrire cette ligne d’une autre manière quand on veut la mettre dans une fonction, mais mes recherches à la fois dans le manuel Extending et sur Google ont été infructeuses. Je suis du coup bloqué pour travailler sur ma partition, parce que si je dois changer ma syntaxe, je vais écrire des lignes et des lignes pour rien !

Merci d’avance pour votre aide !
L.C.

%{
C'est un problème d'espace de noms (namespace en anglais). Il faut que tu mettes une commande de markup dans la fonction de musique:
%}

\version "2.17.0"

textB =
\markup {
\override #'(font-name . "Didot")
\column {
\override #'(line-width . 18 )
\justify {
Tout mon feu s’est éteint…
mon imagination s’est glacée,
le marbre sort froid de mes mains…
}
}
}

#(define-markup-command (melo-text layout props linewidth text)
  (number? string?)
  (interpret-markup layout props
    (markup #:override '(font-name . "Didot")
            #:override `(line-width . ,linewidth)
            (make-column-markup (list (make-justify-markup (string-split text #\space)))))))

meloText =
#(define-music-function
(parser location Largeur Texte)
(number? string?)
#{\stopStaff \once \override TextScript #'extra-offset = #'( 0 . 4 )
s1-\markup \melo-text #Largeur #Texte
\startStaff
#}
)

textA = \meloText #30 #"Il n'y a point là d'âme ni de vie… Ce n'est que de la pierre"

\score {
\new Staff {
\relative d' {
\textLengthOn

\tempo "Largo"
\key es \major
<bes es g>4 <bes es g>8. <bes es g>16 <bes es g>2-\fermata \bar "||"

\textA

\tempo "Adagio"
r8 bes( ces a) << { bes f'~ f16 d es ges, ges8 f16. ges32 d8 } \\
{ s8 as'~ as16 f ges es es8 d16. es32 bes8 } >> r8 r2 |

\stopStaff \once \override TextScript #'extra-offset = #'( 0 . 5 )
s1-\markup { \textB }
\startStaff

s8 f''(-\p ges e) << { f es~ es16 c des bes' | bes8 a16. bes32 a8 } \\
{ s8 c,~ c16 a bes des | des8 c16. des32 c8 } >> r8 r2 |

}}}

%Cordialement,
%~Mike

···

On 22 sept. 2012, at 16:25, Loïc Chahine <****@****> wrote:

Bonjour à tous !
J’ai fait plusieurs expériences avec mon petit problème, sans obtenir le résultat souhaité. Je vous les livre donc ici en détail, en espérant que quelqu’un pourra m’aider à trouver la solution.

Si j’écris :
\score {
\new Staff {
\relative d' {
\textLengthOn

\tempo "Largo"
\key es \major
<bes es g>4 <bes es g>8. <bes es g>16 <bes es g>2-\fermata \bar "||"

% \textA

\tempo "Adagio"
r8 bes( ces a) << { bes f'~ f16 d es ges, ges8 f16. ges32 d8 } \\
{ s8 as'~ as16 f ges es es8 d16. es32 bes8 } >> r8 r2 |

\stopStaff \once \override TextScript #'extra-offset = #'( 0 . 5 )
s1-\markup { \textB }
\startStaff

s8 f''(-\p ges e) << { f es~ es16 c des bes' | bes8 a16. bes32 a8 } \\
{ s8 c,~ c16 a bes des | des8 c16. des32 c8 } >> r8 r2 |

}}}

où :
textB =
\markup {
\override #'(font-name . "Didot")
\column {
\override #'(line-width . 18 )
\justify {
Tout mon feu s’est éteint…
mon imagination s’est glacée,
le marbre sort froid de mes mains…
}
}
}

Pas de problème, toutes les indications sont respectées. Si maintenant j’essaie de faire une fonction pour me simplifier la tâche, et donc de faire :

meloText =
#(define-music-function
(parser location Largeur Texte)
(number? string?)
#{\stopStaff \once \override TextScript #'extra-offset = #'( 0 . 4 )
s1-\markup {
\override #'(font-name . "Didot")
\column {
\override #'(line-width . 30)
\justify {
$Texte
}
}
}
\startStaff
#}
)

textA = \meloText #30 #"Il n'y a point là d'âme ni de vie… Ce n'est que de la pierre"

et de décommenter la ligne \textA dans mon \score { … }, hé bien la ligne \override #'(line-width . 30) n’est pas prise en compte et le texte prend ses aises et se place sur une seule ligne.
Si enfin je mets \override #'(line-width . $Largeur), la compilation plante.

J’ai donc fait quelques petites recherches, et j’ai essayé de remplacer la ligne \override #'(line-width . $Largeur) par \override #'(cons line-width . $Largeur). Ça ne plante plus, mais l’indication n’est toujours pas respectée. Idem avec \override #'(cons line-width . 30).
J’ai aussi essayé, purement expérimental parce que je l’ai aperçu dans des résultats Google, \override #'(cons 'line-width . $Largeur) ; ça plante pas mais ça fait toujours rien. J’ai aussi essayé sans le dollar. J’ai aussi essayé de remettre \textLengthOn dans la fonction.

Je suis d’autant plus surpris que l’autre \override, celui pour le choix de la fonte, est, lui, parfaitement respecté.

Du coup je me retrouve bloqué. Est-ce que c’est un bug ? Je ne pense pas, et je crois plutôt qu’il faut écrire cette ligne d’une autre manière quand on veut la mettre dans une fonction, mais mes recherches à la fois dans le manuel Extending et sur Google ont été infructeuses. Je suis du coup bloqué pour travailler sur ma partition, parce que si je dois changer ma syntaxe, je vais écrire des lignes et des lignes pour rien !

Merci d’avance pour votre aide !
L.C.

Petit commentaire supplémentaire - au lieu d'utiliser extra-offset, tu peux changer la valeur de Y-offset en fonction de la hauteur du stencil pour que le texte soit centré dans la portée.

Cordialement,
~Mike

···

On 22 sept. 2012, at 16:52, ****@**** wrote:

On 22 sept. 2012, at 16:25, Loïc Chahine <****@****> wrote:

Bonjour à tous !
J’ai fait plusieurs expériences avec mon petit problème, sans obtenir le résultat souhaité. Je vous les livre donc ici en détail, en espérant que quelqu’un pourra m’aider à trouver la solution.

%{
C'est un problème d'espace de noms (namespace en anglais). Il faut que tu mettes une commande de markup dans la fonction de musique:
%}

Merci, Mike !
Mais j’ai pas tellement compris en fait… surtout ça :

#(define-markup-command (melo-text layout props linewidth text)
   (number? string?)
   (interpret-markup layout props
     (markup #:override '(font-name . "Didot")
             #:override `(line-width . ,linewidth)
             (make-column-markup (list (make-justify-markup (string-split text #\space)))))))

Pourquoi est-ce qu’à l’avant-dernière ligne on met un accent grave au lieu de l’apostrophe et une virgule ?
Bon la dernière ligne j’imagine que c’est des propriétés spéciales pour que ça aille à la ligne etc.

Pour ton autre mail :

Petit commentaire supplémentaire - au lieu d'utiliser extra-offset, tu peux changer la valeur de Y-offset en fonction de la hauteur du stencil pour que le texte soit centré dans la portée.

J’ai pas trop compris non plus.

Bon en tout cas, même si j’ai pas tout compris, je peux me remettre dans la partition ! Merci !
Bien à toi,
L.C.

···

Le 22/09/12 16:52, ****@**** a écrit :

%{
C'est un problème d'espace de noms (namespace en anglais). Il faut que tu mettes une commande de markup dans la fonction de musique:
%}

Merci, Mike !
Mais j’ai pas tellement compris en fait… surtout ça :

#(define-markup-command (melo-text layout props linewidth text)
(number? string?)
(interpret-markup layout props
(markup #:override '(font-name . "Didot")
#:override `(line-width . ,linewidth)
(make-column-markup (list (make-justify-markup (string-split text #\space)))))))

Pourquoi est-ce qu’à l’avant-dernière ligne on met un accent grave au lieu de l’apostrophe et une virgule ?

C'est une convention de Scheme qui s'appelle quasiquote. Tu peux également faire (cons 'line-width linewidth) sans accent et sans virgule - ça revient au même.
http://www.gnu.org/software/guile/manual/html_node/Expression-Syntax.html

Bon la dernière ligne j’imagine que c’est des propriétés spéciales pour que ça aille à la ligne etc.

C'est une copie du markup tel que tu l'avais écrit mais en Scheme. Les commandes make-X-markup n'acceptent que des listes. Le column est facultatif dans les exemples que tu as fournis - tu peux le supprimer et le résultat visuel ne changerait pas. J'évoque string-split pour éclater le string en une liste de plusieurs strings (et donc plusieurs markups) en utilisant l'espace comme séparateur.

http://www.gnu.org/software/guile/manual/html_node/List_002fString-Conversion.html

Pour ton autre mail :

Petit commentaire supplémentaire - au lieu d'utiliser extra-offset, tu peux changer la valeur de Y-offset en fonction de la hauteur du stencil pour que le texte soit centré dans la portée.

J’ai pas trop compris non plus.

Je ne me suis pas bien exprimé. En gros tu voudras chopper la valeur de la hauteur du stencil et la manipuler. Je ne l'ai pas bien utilisé ci-dessous mais tu pourras l'adapter. Essaie :

\version "2.17.0"

#(define-markup-command (melo-text layout props linewidth text)
(number? string?)
(interpret-markup layout props
(markup #:override '(font-name . "Didot")
#:override `(line-width . ,linewidth)
(make-column-markup (list (make-justify-markup (string-split text #\space)))))))

meloText =
#(define-music-function
(parser location Largeur Texte)
(number? string?)
#{\stopStaff
\once \override TextScript #'Y-offset =
#(lambda (grob)
(cdr (ly:stencil-extent (ly:grob-property grob 'stencil) Y)))
s1-\markup \melo-text #Largeur #Texte
\startStaff
#}
)

textA = \meloText #30 #"Il n'y a point là d'âme ni de vie… Ce n'est que de la pierre"
textB = \meloText #18 #"Tout mon feu s’est éteint… mon imagination s’est glacée, le marbre sort froid de mes mains…"

\score {
\new Staff {
\relative d' {
\textLengthOn

\tempo "Largo"
\key es \major
4 8. 16 2-\fermata \bar "||"

\textA

\tempo "Adagio"
r8 bes( ces a) << { bes f'~ f16 d es ges, ges8 f16. ges32 d8 } \
{ s8 as'~ as16 f ges es es8 d16. es32 bes8 } >> r8 r2 |

\textB

s8 f''(-\p ges e) << { f es~ es16 c des bes' | bes8 a16. bes32 a8 } \
{ s8 c,~ c16 a bes des | des8 c16. des32 c8 } >> r8 r2 |

}}}

%Cordialement,
%~Mike

···

On 22 sept. 2012, at 17:06, Loïc Chahine <****@****> wrote:

Le 22/09/12 16:52, ****@**** a écrit :

Merci encore, Mike, c’est vraiment bien comme ça !
Et je vais lire le passage de la doc que tu m’indiques !

Dernier petits problèmes, je pense bien illustrés par l’illustration ci-jointe.
Alors j’imagine qu’il y a un moyen d’override quelque chose pour avoir la portée sur la clef et l’armature au début même si elle s’en va ensuite, et pour ne pas avoir les barres de mesures toutes seules à la fin ?
Pour la partie de basse, je fais juste \stopStaff s1 \startStaff, comme dans le modèle qui m’a été donné.

Et question subsidiaire : est-ce que je pourrai pas mettre un tout petit peu d’espace entre le texte et la barre de mesure qui est à sa droite ?

Cordialement,
L.C.

···

Le 22/09/12 17:42, ****@**** a écrit :

On 22 sept. 2012, at 17:06, Loïc Chahine <****@**** > <mailto:****@****>> wrote:

Le 22/09/12 16:52, ****@**** <mailto:****@****> >> a écrit :

%{
C'est un problème d'espace de noms (namespace en anglais). Il faut que tu mettes une commande de markup dans la fonction de musique:
%}

Merci, Mike !
Mais j’ai pas tellement compris en fait… surtout ça :

#(define-markup-command (melo-text layout props linewidth text)
(number? string?)
(interpret-markup layout props
   (markup #:override '(font-name . "Didot")
           #:override `(line-width . ,linewidth)
           (make-column-markup (list (make-justify-markup (string-split text #\space)))))))

Pourquoi est-ce qu’à l’avant-dernière ligne on met un accent grave au lieu de l’apostrophe et une virgule ?

C'est une convention de Scheme qui s'appelle quasiquote. Tu peux également faire (cons 'line-width linewidth) sans accent et sans virgule - ça revient au même.
Expression Syntax (Guile Reference Manual)

Bon la dernière ligne j’imagine que c’est des propriétés spéciales pour que ça aille à la ligne etc.

C'est une copie du markup tel que tu l'avais écrit mais en Scheme. Les commandes make-X-markup n'acceptent que des listes. Le column est facultatif dans les exemples que tu as fournis - tu peux le supprimer et le résultat visuel ne changerait pas. J'évoque string-split pour éclater le string en une liste de plusieurs strings (et donc plusieurs markups) en utilisant l'espace comme séparateur.

List/String Conversion (Guile Reference Manual)

Pour ton autre mail :

Petit commentaire supplémentaire - au lieu d'utiliser extra-offset, tu peux changer la valeur de Y-offset en fonction de la hauteur du stencil pour que le texte soit centré dans la portée.

J’ai pas trop compris non plus.

Je ne me suis pas bien exprimé. En gros tu voudras chopper la valeur de la hauteur du stencil et la manipuler. Je ne l'ai pas bien utilisé ci-dessous mais tu pourras l'adapter. Essaie :

\version "2.17.0"

#(define-markup-command (melo-text layout props linewidth text)
  (number? string?)
  (interpret-markup layout props
    (markup #:override '(font-name . "Didot")
            #:override `(line-width . ,linewidth)
            (make-column-markup (list (make-justify-markup (string-split text #\space)))))))

meloText =
#(define-music-function
(parser location Largeur Texte)
(number? string?)
#{\stopStaff
\once \override TextScript #'Y-offset =
#(lambda (grob)
  (cdr (ly:stencil-extent (ly:grob-property grob 'stencil) Y)))
s1-\markup \melo-text #Largeur #Texte
\startStaff
#}
)

textA = \meloText #30 #"Il n'y a point là d'âme ni de vie… Ce n'est que de la pierre"
textB = \meloText #18 #"Tout mon feu s’est éteint… mon imagination s’est glacée, le marbre sort froid de mes mains…"

\score {
\new Staff {
\relative d' {
\textLengthOn

\tempo "Largo"
\key es \major
<bes es g>4 <bes es g>8. <bes es g>16 <bes es g>2-\fermata \bar "||"

\textA

\tempo "Adagio"
r8 bes( ces a) << { bes f'~ f16 d es ges, ges8 f16. ges32 d8 } \\
{ s8 as'~ as16 f ges es es8 d16. es32 bes8 } >> r8 r2 |

\textB

s8 f''(-\p ges e) << { f es~ es16 c des bes' | bes8 a16. bes32 a8 } \\
{ s8 c,~ c16 a bes des | des8 c16. des32 c8 } >> r8 r2 |

}}}

%Cordialement,
%~Mike

Problème repéré - il faut faire :

meloText =
#(define-music-function
(parser location Largeur Texte)
(number? string?)
#{\stopStaff
\once \override TextScript #'outside-staff-priority = ##f
\once \override TextScript #'Y-offset =
#(lambda (grob)
(- (interval-center (ly:stencil-extent (ly:grob-property grob 'stencil) Y))))
s1-\markup \melo-text #Largeur #Texte
\startStaff
#})

pour que le texte soit centré sur la portée.

Cordialement,
~Mike

···

On 22 sept. 2012, at 17:42, ****@**** wrote:

On 22 sept. 2012, at 17:06, Loïc Chahine <****@****> wrote:

Le 22/09/12 16:52, ****@**** a écrit :

%{
C'est un problème d'espace de noms (namespace en anglais). Il faut que tu mettes une commande de markup dans la fonction de musique:
%}

Merci, Mike !
Mais j’ai pas tellement compris en fait… surtout ça :

#(define-markup-command (melo-text layout props linewidth text)
(number? string?)
(interpret-markup layout props
(markup #:override '(font-name . "Didot")
#:override `(line-width . ,linewidth)
(make-column-markup (list (make-justify-markup (string-split text #\space)))))))

Pourquoi est-ce qu’à l’avant-dernière ligne on met un accent grave au lieu de l’apostrophe et une virgule ?

C'est une convention de Scheme qui s'appelle quasiquote. Tu peux également faire (cons 'line-width linewidth) sans accent et sans virgule - ça revient au même.
http://www.gnu.org/software/guile/manual/html_node/Expression-Syntax.html

Bon la dernière ligne j’imagine que c’est des propriétés spéciales pour que ça aille à la ligne etc.

C'est une copie du markup tel que tu l'avais écrit mais en Scheme. Les commandes make-X-markup n'acceptent que des listes. Le column est facultatif dans les exemples que tu as fournis - tu peux le supprimer et le résultat visuel ne changerait pas. J'évoque string-split pour éclater le string en une liste de plusieurs strings (et donc plusieurs markups) en utilisant l'espace comme séparateur.

http://www.gnu.org/software/guile/manual/html_node/List_002fString-Conversion.html

Pour ton autre mail :

Petit commentaire supplémentaire - au lieu d'utiliser extra-offset, tu peux changer la valeur de Y-offset en fonction de la hauteur du stencil pour que le texte soit centré dans la portée.

J’ai pas trop compris non plus.

Je ne me suis pas bien exprimé. En gros tu voudras chopper la valeur de la hauteur du stencil et la manipuler. Je ne l'ai pas bien utilisé ci-dessous mais tu pourras l'adapter. Essaie :

Problème repéré - il faut faire :

meloText =
#(define-music-function
(parser location Largeur Texte)
(number? string?)
#{\stopStaff
\once \override TextScript #'outside-staff-priority = ##f
\once \override TextScript #'Y-offset =
#(lambda (grob)
(- (interval-center (ly:stencil-extent (ly:grob-property grob 'stencil) Y))))
s1-\markup \melo-text #Largeur #Texte
\startStaff
#})

pour que le texte soit centré sur la portée.

Cordialement,
~Mike

···

On 22 sept. 2012, at 17:42, ****@**** wrote:

On 22 sept. 2012, at 17:06, Loïc Chahine <****@****> wrote:

Le 22/09/12 16:52, ****@**** a écrit :

%{
C'est un problème d'espace de noms (namespace en anglais). Il faut que tu mettes une commande de markup dans la fonction de musique:
%}

Merci, Mike !
Mais j’ai pas tellement compris en fait… surtout ça :

#(define-markup-command (melo-text layout props linewidth text)
(number? string?)
(interpret-markup layout props
(markup #:override '(font-name . "Didot")
#:override `(line-width . ,linewidth)
(make-column-markup (list (make-justify-markup (string-split text #\space)))))))

Pourquoi est-ce qu’à l’avant-dernière ligne on met un accent grave au lieu de l’apostrophe et une virgule ?

C'est une convention de Scheme qui s'appelle quasiquote. Tu peux également faire (cons 'line-width linewidth) sans accent et sans virgule - ça revient au même.
http://www.gnu.org/software/guile/manual/html_node/Expression-Syntax.html

Bon la dernière ligne j’imagine que c’est des propriétés spéciales pour que ça aille à la ligne etc.

C'est une copie du markup tel que tu l'avais écrit mais en Scheme. Les commandes make-X-markup n'acceptent que des listes. Le column est facultatif dans les exemples que tu as fournis - tu peux le supprimer et le résultat visuel ne changerait pas. J'évoque string-split pour éclater le string en une liste de plusieurs strings (et donc plusieurs markups) en utilisant l'espace comme séparateur.

http://www.gnu.org/software/guile/manual/html_node/List_002fString-Conversion.html

Pour ton autre mail :

Petit commentaire supplémentaire - au lieu d'utiliser extra-offset, tu peux changer la valeur de Y-offset en fonction de la hauteur du stencil pour que le texte soit centré dans la portée.

J’ai pas trop compris non plus.

Je ne me suis pas bien exprimé. En gros tu voudras chopper la valeur de la hauteur du stencil et la manipuler. Je ne l'ai pas bien utilisé ci-dessous mais tu pourras l'adapter. Essaie :

Garde la portée et utilise :
\once \override TextScript #'whiteout = ##t

\once \override Staff . BarLine #'transparent = ##t

\once \override TextScript #'X-extent =
#(lambda (grob)
(coord-translate
(ly:stencil-extent (ly:grob-property grob 'stencil) X)
'(0 . 1.0)))

où 1.0 est la longueur de l'espace.

Cordialement,
~Mike

···

Merci encore, Mike, c’est vraiment bien comme ça !
Et je vais lire le passage de la doc que tu m’indiques !

Dernier petits problèmes, je pense bien illustrés par l’illustration ci-jointe.
Alors j’imagine qu’il y a un moyen d’override quelque chose pour avoir la portée sur la clef et l’armature au début même si elle s’en va ensuite,
et pour ne pas avoir les barres de mesures toutes seules à la fin ?

Pour la partie de basse, je fais juste \stopStaff s1 \startStaff, comme dans le modèle qui m’a été donné.

Et question subsidiaire : est-ce que je pourrai pas mettre un tout petit peu d’espace entre le texte et la barre de mesure qui est à sa droite ?

Cordialement,
L.C.

Le 22/09/12 17:42, ****@**** a écrit :

On 22 sept. 2012, at 17:06, Loïc Chahine <****@****> wrote:

Le 22/09/12 16:52, ****@**** a écrit :

%{
C'est un problème d'espace de noms (namespace en anglais). Il faut que tu mettes une commande de markup dans la fonction de musique:
%}

Merci, Mike !
Mais j’ai pas tellement compris en fait… surtout ça :

#(define-markup-command (melo-text layout props linewidth text)
(number? string?)
(interpret-markup layout props
(markup #:override '(font-name . "Didot")
#:override `(line-width . ,linewidth)
(make-column-markup (list (make-justify-markup (string-split text #\space)))))))

Pourquoi est-ce qu’à l’avant-dernière ligne on met un accent grave au lieu de l’apostrophe et une virgule ?

C'est une convention de Scheme qui s'appelle quasiquote. Tu peux également faire (cons 'line-width linewidth) sans accent et sans virgule - ça revient au même.
http://www.gnu.org/software/guile/manual/html_node/Expression-Syntax.html

Bon la dernière ligne j’imagine que c’est des propriétés spéciales pour que ça aille à la ligne etc.

C'est une copie du markup tel que tu l'avais écrit mais en Scheme. Les commandes make-X-markup n'acceptent que des listes. Le column est facultatif dans les exemples que tu as fournis - tu peux le supprimer et le résultat visuel ne changerait pas. J'évoque string-split pour éclater le string en une liste de plusieurs strings (et donc plusieurs markups) en utilisant l'espace comme séparateur.

http://www.gnu.org/software/guile/manual/html_node/List_002fString-Conversion.html

Pour ton autre mail :

Petit commentaire supplémentaire - au lieu d'utiliser extra-offset, tu peux changer la valeur de Y-offset en fonction de la hauteur du stencil pour que le texte soit centré dans la portée.

J’ai pas trop compris non plus.

Je ne me suis pas bien exprimé. En gros tu voudras chopper la valeur de la hauteur du stencil et la manipuler. Je ne l'ai pas bien utilisé ci-dessous mais tu pourras l'adapter. Essaie :

\version "2.17.0"

#(define-markup-command (melo-text layout props linewidth text)
(number? string?)
(interpret-markup layout props
(markup #:override '(font-name . "Didot")
#:override `(line-width . ,linewidth)
(make-column-markup (list (make-justify-markup (string-split text #\space)))))))

meloText =
#(define-music-function
(parser location Largeur Texte)
(number? string?)
#{\stopStaff
\once \override TextScript #'Y-offset =
#(lambda (grob)
(cdr (ly:stencil-extent (ly:grob-property grob 'stencil) Y)))
s1-\markup \melo-text #Largeur #Texte
\startStaff
#}
)

textA = \meloText #30 #"Il n'y a point là d'âme ni de vie… Ce n'est que de la pierre"
textB = \meloText #18 #"Tout mon feu s’est éteint… mon imagination s’est glacée, le marbre sort froid de mes mains…"

\score {
\new Staff {
\relative d' {
\textLengthOn

\tempo "Largo"
\key es \major
4 8. 16 2-\fermata \bar "||"

\textA

\tempo "Adagio"
r8 bes( ces a) << { bes f'~ f16 d es ges, ges8 f16. ges32 d8 } \
{ s8 as'~ as16 f ges es es8 d16. es32 bes8 } >> r8 r2 |

\textB

s8 f''(-\p ges e) << { f es~ es16 c des bes' | bes8 a16. bes32 a8 } \
{ s8 c,~ c16 a bes des | des8 c16. des32 c8 } >> r8 r2 |

}}}

%Cordialement,
%~Mike

Merci beaucoup, Mike, pour toutes ces nouvelles précisions !
J’ai le sentiment que je comprends à peu près le code, mais de loin :wink:

Il y a cependant un problème : je n’ai pas une mais deux portées, il faudrait donc centrer sur le système, et non sur la portée. Peut-être faut-il changer de modèle ? Actuellement les textes parlés sont collés en markup à la portée du haut, sur un s1, et la portée du bas à un s1 sans rien. C’est assez commode que ce soit collé à une portée, ça évite de devoir compter des mesures pour faire des genre de s1*9 s1-\textA s1*2 s1-\textB etc.
Je précis au passage que c’est une première version, et qu’il pourra par la suite y avoir trois ou quatre portées !

Par ailleurs, y a-t-il une sorte de padding possible à l’intérieur du whiteout ?

Dans tous les cas, merci beaucoup ! On frôle ici une perfection que j’aurais jamais pensé approcher !
Cordialement,
L.C.

Le problème n’est d’ailleurs pas tant l’alignement que le fait que le markup ne puisse pas dépasser sur la portée du bas. Dans l’absolu, ça me gênerait pas que tout soit aligné au même niveau en partant de la portée du haut !

···

Le 22/09/12 19:26, Loïc Chahine a écrit :

Merci beaucoup, Mike, pour toutes ces nouvelles précisions !
J’ai le sentiment que je comprends à peu près le code, mais de loin :wink:

Il y a cependant un problème : je n’ai pas une mais deux portées, il faudrait donc centrer sur le système, et non sur la portée. Peut-être faut-il changer de modèle ? Actuellement les textes parlés sont collés en markup à la portée du haut, sur un s1, et la portée du bas à un s1 sans rien. C’est assez commode que ce soit collé à une portée, ça évite de devoir compter des mesures pour faire des genre de s1*9 s1-\textA s1*2 s1-\textB etc.
Je précis au passage que c’est une première version, et qu’il pourra par la suite y avoir trois ou quatre portées !

Par ailleurs, y a-t-il une sorte de padding possible à l’intérieur du whiteout ?

Dans tous les cas, merci beaucoup ! On frôle ici une perfection que j’aurais jamais pensé approcher !
Cordialement,
L.C.

_______________________________________________
liste de diffusion lilypond-user-fr
lilypond-user-fr@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user-fr

Je “me” réponds une dernière fois pour dire que le problème est résolu !
Pour faire en sorte que le texte puisse déborder sur la portée du bas, il suffisait d’ajouter dans la définition de meloText
\once \override TextScript #'Y-extent = #'(0 . 0)
Le texte est alors considéré comme ayant une hauteur nulle ! C’est Nicolas Sceaux qui m’a indiqué cette solution.
Ci-joint un exemple complet, pour le cas où ça serait utile un jour à quelqu’un !
L.C.

exemple.ly (2.84 KB)