Subject: instrumentName sur plusieurs lignes dans une fonction

From: Remy CLAVERIE <[email-masked]>
Date: Mon, 7 Jul 2014 11:15:33 +0200 (CEST)

Bonjour à tous,

Je viens d'écrire une fonction qui me permet de graver le nom de l'instrument ou de la voix sur plusieurs lignes lorsque nécessaire. Je pensais faire cela à l'aide la méthde 'instrumentName'.

Voici ce que j'ai écrit :

shortIncipit =

#(define-music-function (parser location InstrName ) (string?)

#{

  \override Staff.InstrumentName #'self-alignment-X = #CENTER

  \set Staff.instrumentName = \markup {

  \center-align {

  \override #'(line-width . 10)

  \fontsize #2 $InstrName

}

}

#})

Elle rempli bien son rôle pour un nom d'instrument court (un seul mot) mais lorsque le nom est composé de plusieurs mots, je n'ai pas de césure avant le mot qui dépaserait la largeur de ligne. J'otiens donc un nom d'instrument long, sur uine seule ligne et qui peut même dépasser de la feuille, coté gauche.

Pourtant, lorsque je remplace la variable $InstrName par une chaîne du genre : 'Cantus primi chori', ça marche mais pas "Cantus primi chori"

L'un de vous pourrait-il m'aiguiller et pointer l'erreur que je commets ?

Je n'ai rien trouvé sur google car je ne pense par avoir utiliser les bons mots clefs. Quels peuvent-ils être ?

J'espère avoir été clair...

Merci de votre aide,

Rémy

---

From: Pierre Perol-Schneider <[email-masked]>
Date: Tue, 8 Jul 2014 13:51:48 +0200

Bonjour Remy,

Le 7 juillet 2014 11:15, Remy CLAVERIE <[email-masked]> a écrit :

> Pourtant, lorsque je remplace la variable $InstrName par une chaîne du
> genre : 'Cantus primi chori', ça marche mais pas "Cantus primi chori"
>

Avant de reprendre ton code j'aimerai comprendre ce que tu souhaites.
Si je reprend ton markup ça ne "marche" pas :

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.18.2"

\new Staff
  \with {
    instrumentName = \markup {
      \center-align {
          \override #'(line-width . 10)
          \fontsize #2 { Cantus primi chori }
        }
      }
  }
  {
    \override Staff.InstrumentName.self-alignment-X = #CENTER
    c'
  }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

J'ai essayé de trouver un markup qui ressemble à ton descriptif :

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.18.2"

#(define (general-column align-dir baseline mols)
  (let* ((aligned-mols (map (lambda (x) (ly:stencil-aligned-to x X
align-dir)) mols)))
    (stack-lines -1 0.0 baseline aligned-mols)))

#(define-markup-command (textCenter layout props args)(markup-list?)
  #:properties ((baseline-skip))
  (general-column CENTER baseline-skip (wordwrap-internal-markup-list
layout props #f args)))

\markup\italic "Ce que tu souhaites ?"
\new Staff
  \with {
    instrumentName = \markup {
      \override #'(baseline-skip . 3)
      \override #'(line-width . 15)
      \textCenter
      \fontsize #2 { Cantus primi chori }
    }
  }
  { c' }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Cordialement,
Pierre

---

From: Remy CLAVERIE <[email-masked]>
Date: Tue, 8 Jul 2014 17:39:27 +0200 (CEST)

Bonjour Pierre,

Merci de ta réponse. Ton code fonctionne bien mais il ne répond pas que partiellement à mon problème que je n'ai sans doute pas bien décrit.

Mon soucis se situe sur le passage à une fonction.

La photo Incipit1.jpg montre le résultat que je veux et la photo Incipit.png, celui que j'obtiens avec ma fonction.

Ma question est : Dans la fonction shortIncipit ci-desssous, comment traiter une chaîne de caractères en prenant en compte les césures ?

La photo Incipit1.jpg jointe montre le résultat de l'appel de la fonction : \shortIncipit "cantus primi chori".

Et la fonction shortIncipit est ci-dessous :

(let* ((aligned-mols (map (lambda (x) (ly:stencil-aligned-to x X align-dir)) mols)))

(general-column CENTER baseline-skip (wordwrap-internal-markup-list layout props #f args)))

shortIncipit =

#(define-music-function (parser location InstrName ) (markup?)

#{

\center-column {

 {

\textCenter { #InstrName }

 }

}

}

#})

Il n'y a donc pas le retour à la ligne que je souhaite après 'primi'. Or, si je modifie la ligne

\textCenter { #InstrtName } pour : \textCenter { Cantus primi chori } cela donne le résultat que je souhaite (photo Incipit.jpg).

Il y a certainement une subtilité dans le type de la variable pour InstrName que je n'ai pas compris.

Pour être complet, il me semble avoir vu la solution sur cette liste, mais je ne l'ai pas retrouvée...

Encore merci pour ton aide,

Rémy

PS : ce n'est pas la grande forme actuellement. J'espère tout de même avoir été plus clair.

> Message du 08/07/14 13:51
> De : "Pierre Perol-Schneider" 
> A : "Remy CLAVERIE" 
> Copie à : "lilypond-user-fr" 
> Objet : Re: instrumentName sur plusieurs lignes dans une fonction
> 
>
Bonjour Remy,

Le 7 juillet 2014 11:15, Remy CLAVERIE  a écrit :

 
J'ai essayé de trouver un markup qui ressemble à ton descriptif :
>   (let* ((aligned-mols (map (lambda (x) (ly:stencil-aligned-to x X align-dir)) mols)))
>   (general-column CENTER baseline-skip (wordwrap-internal-markup-list layout props #f args)))
> 
Cordialement,
Pierre

---

From: Remy CLAVERIE <[email-masked]>
Date: Wed, 9 Jul 2014 15:37:38 +0200 (CEST)

Bonjour Pierre,

Merci pour ce code. Ce que je ne comprends pas c'est pourquoi on ne peut pas intégrer la commande '\textCenter' dans la fonction shortIncipit pour avoir qq chose qui pourrait ressembler à :

shortIncipit =
 #(define-music-function (parser location InstrName ) (markup?)
   #{
     \set Staff.instrumentName = \markup {
     \override #'(line-width . 12)
     \textCenter { #InstrName }
   }
   #}

Aurais-tu une explication ?

Merci de ton aide,

Rémy

> Message du 08/07/14 23:59

Donc voilà où ça nous mène :
>     \override #'(line-width . 12)
>     #InstrName 
>   }
>   #})
> 
> myInst = \markup\textCenter { Cantus primi chori }
> 
> { \shortIncipit\myInst c' }
> 
>
Bonne soirée,
Pierre

---

From: Pierre Perol-Schneider <[email-masked]>
Date: Tue, 8 Jul 2014 23:52:15 +0200

Re,
Le 8 juillet 2014 17:39, Remy CLAVERIE <[email-masked]> a écrit :

> \textCenter { #InstrtName } pour : \textCenter { Cantus primi chori } cela
> donne le résultat que je souhaite (photo Incipit.jpg).
>
>
>

Si c'est \wordwrap que tu cherches, je ne vois pas comment faire pour
obtenir une disposition centrée :

\version "2.18.2"

shortIncipit =

myInst = \markup\wordwrap { Cantus primi chori }

Pierre

PS. Bah alors, une petit coup de mou ?

---

From: Pierre Perol-Schneider <[email-masked]>
Date: Tue, 8 Jul 2014 23:59:28 +0200

\version "2.18.2"

shortIncipit =

Bonne soirée,
Pierre

---

From: Pierre Perol-Schneider <[email-masked]>
Date: Thu, 10 Jul 2014 13:38:50 +0200

Bonjour Rémy,

Avec l'aide de Harm de la liste anglophone voilà le code qui suit ton
cahier des charges ;-) :

\version "2.18.2"

#(define (general-column align-dir baseline mols)
  (let* ((aligned-mols
           (map (lambda (x) (ly:stencil-aligned-to x X align-dir)) mols)))
    (stack-lines -1 0.0 baseline aligned-mols)))

#(define-markup-command (center-text-string layout props arg)
  (string?)
  #:properties ((baseline-skip)
                wordwrap-string-internal-markup-list)
  (general-column CENTER baseline-skip
               (wordwrap-string-internal-markup-list layout props #f arg)))

shortIncipit =
#(define-music-function (parser location instr-name ) (markup?)
  #{
    \set Staff.instrumentName =
      \markup {
        \override #'(line-width . 12)
        \center-text-string #instr-name
      }
  #})

\layout { indent = 30 }

{ \shortIncipit "Cantus primi chori" c' }

> Aurais-tu une explication ?
Oui et non...
Le problème vient de textCenter mais ce soir je prendrai le temps de
décortiquer tout le code.

A+
Pierre

---

From: Pierre Perol-Schneider <[email-masked]>
Date: Tue, 8 Jul 2014 14:05:05 +0200

Le 7 juillet 2014 11:15, Remy CLAVERIE <[email-masked]> a écrit :

> Elle rempli bien son rôle pour un nom d'instrument court (un seul mot)
> mais lorsque le nom est composé de plusieurs mots, je n'ai pas de césure
> avant le mot qui dépaserait la largeur de ligne.
>

D'un autre côté, un code simplifié te donnerait le choix de la césure :

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.18.2"

myShortIncipit =
#(define-music-function (parser location InstrNameI InstrNameII) (markup?
markup?)
  #{
    \set Staff.instrumentName = \markup {
      \override #'(baseline-skip . 2.5)
      \override #'(line-width . 15)
      \fontsize #2
      \center-column { #InstrNameI #InstrNameII }
    }
  #})

\layout {
  indent = 25
  \context {
    \Staff
    \override InstrumentName.padding = #2
  }
}

{ \myShortIncipit "Cantus" "primi chori" c' }

{ \myShortIncipit "Cantus primi" "chori" c' }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Pierre