Subject: override line-width dans une fonction

From: Loïc Chahine <[email-masked]>
Date: Sat, 22 Sep 2012 16:25:12 +0200

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.

---

From: "[email-masked]" <[email-masked]>
Date: Sat, 22 Sep 2012 16:52:53 +0200

On 22 sept. 2012, at 16:25, Loïc Chahine <[email-masked]> 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
> 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
> 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.
> 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 !
> 
%{
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 {

#(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

\textA

\tempo "Adagio"

}}}

%Cordialement,
%~Mike

---

From: "[email-masked]" <[email-masked]>
Date: Sat, 22 Sep 2012 16:57:41 +0200

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

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

---

From: Loïc Chahine <[email-masked]>
Date: Sat, 22 Sep 2012 17:06:59 +0200

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

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

---

From: "[email-masked]" <[email-masked]>
Date: Sat, 22 Sep 2012 17:42:44 +0200

On 22 sept. 2012, at 17:06, Loïc Chahine <[email-masked]> wrote:

> 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

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

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

\textA

\tempo "Adagio"

\textB

}}}

%Cordialement,
%~Mike

---

From: "[email-masked]" <[email-masked]>
Date: Sat, 22 Sep 2012 18:59:43 +0200

> 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

---

From: "[email-masked]" <[email-masked]>
Date: Sat, 22 Sep 2012 18:59:44 +0200

meloText =
#(define-music-function

Cordialement,
~Mike

---

From: "[email-masked]" <[email-masked]>
Date: Sat, 22 Sep 2012 19:08:34 +0200

On 22 sept. 2012, at 17:54, Loïc Chahine <[email-masked]> wrote:

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

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

> et pour ne pas avoir les barres de mesures toutes seules à la fin ?

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

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

\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

> 
> Cordialement,
> L.C.
> 
> Le 22/09/12 17:42, [email-masked] a écrit :
>> 
> <Capture d’écran 2012-09-22 à 17.50.22.png>

---

From: Loïc Chahine <[email-masked]>
Date: Sat, 22 Sep 2012 19:26:00 +0200

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

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.

---

From: Loïc Chahine <[email-masked]>
Date: Sat, 22 Sep 2012 21:02:40 +0200

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 :
> 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 !
>
> _______________________________________________
> liste de diffusion lilypond-user-fr
> [email-masked]
> https://lists.gnu.org/mailman/listinfo/lilypond-user-fr
>
>

---

From: Loïc Chahine <[email-masked]>
Date: Sat, 22 Sep 2012 17:54:40 +0200

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, [email-masked] a écrit :
>
> On 22 sept. 2012, at 17:06, Loïc Chahine <[email-masked] 
> <mailto:[email-masked]>> wrote:
>
>> Le 22/09/12 16:52, [email-masked] <mailto:[email-masked]> 
>> 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 !
> 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.
> 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.
>
>>> 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.
>>
> 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"
>
> 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

---

From: Loïc Chahine <[email-masked]>
Date: Sun, 23 Sep 2012 20:42:56 +0200

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.