Subject: TextScript dans une définition markup

From: martial <[email-masked]>
Date: Fri, 11 Dec 2020 11:09:08 -0700 (MST)

Bonjour, 

je cherche à inclure dans une  définition de commande markup 
un \override TextScript 
je tourne en rond depuis 2 jours !

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.21.81"

#(define-markup-command (Stabilo layout props color xdim ydim)
   (color? pair? pair?)
   #{ \override TextScript.layer = #-1 #} ;ne retourne rien
   (interpret-markup layout props
     #{
       \markup {
         \with-dimensions-from \null
         %\override TextScript.layer = #-1 %renvoie une erreur
         \override #'(corner-radius . 3)
         \rounded-box %liseret
         \with-color $color  % mettre couleur
         % la taille -x à x de -y à y et arrondi
         \filled-box #xdim #ydim #1
       }
     #}))

\relative c' {
  % calque sous les lignes
  % cherche solution pour inclure le TextScript. layer dans la commande
Stabilo 
  \override TextScript.layer = #-1
  \clef treble
  \key g \major
  <>-\markup \Stabilo  #"pink" #'(-6 . -5) #'(2 . 6)
  c4 d e fis |
  g4 f? e
  -\markup \Stabilo  #yellow #'(-5 . 5) #'(-3 . 6)
  c |
  d4 e4 fis %
  \bar "|."
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Si si il y a toujours une LilyPond solution :-) 
Merci d'avance

-----
♫artial♪
--
Sent from: http://lilypond-french-users.1298960.n2.nabble.com/

---

From: Gloops <[email-masked]>
Date: Fri, 11 Dec 2020 13:06:15 -0700 (MST)

Peut-être ça ?

%%%%
\version "2.20.0"
         \override #'(layer . -3)
         \with-color $color

\relative c' {
  % calque sous les lignes
  % cherche solution pour inclure le TextScript. layer dans la commande
Stabilo
  \clef treble
  \key g \major
  <>-\markup \Stabilo  #red #'(-6 . -5) #'(2 . 6)
  c4 d e fis |
  g4 f? e
  -\markup \Stabilo  #yellow #'(-5 . 5) #'(-3 . 6)
  c |
  d4 e4 fis %
  \bar "|."
}
%%%%%

---

From: martial <[email-masked]>
Date: Fri, 11 Dec 2020 13:19:36 -0700 (MST)

Merci mais déjà testé 
ça ne passe pas sous les lignes
<http://lilypond-french-users.1298960.n2.nabble.com/file/t300440/Capture_d%E2%80%99%C3%A9cran_du_2020-12-11_21-17-09.png> 

-----
♫artial♪

---

From: Gloops <[email-masked]>
Date: Fri, 11 Dec 2020 13:39:22 -0700 (MST)

\version "2.20.0"

\relative c' {
  % calque sous les lignes
  
  \override Staff.TextScript.layer = #-1000 
  \clef treble
  \key g \major
  <>-\markup \Stabilo  #red #'(-6 . -5) #'(2 . 6)
  c4 d e fis |
  g4 f? e-\markup \Stabilo  #yellow #'(-5 . 5) #'(-3 . 6)
  c  d4 e4 fis r %
  \bar "|."
}

---

From: Pierre Perol-Schneider <[email-masked]>
Date: Fri, 11 Dec 2020 22:37:58 +0100

-1000, c'est violent...
Pourquoi pas:

\relative c' {
  % calque sous les lignes
  % cherche solution pour inclure le TextScript. layer dans la commande
Stabilo
  \clef treble
  \key g \major
  <>-\tweak layer #-1 -\markup \Stabilo  #red #'(-6 . -5) #'(2 . 6)

  c4 d e fis |
  g4 f? e
  -\tweak layer #-1

afin que les autres TextScript éventuels ne soient pas  affectés par une
malencontreuse mise en couche inférieure.
Cordialement,
Pierre

---

From: martial <[email-masked]>
Date: Fri, 11 Dec 2020 16:28:13 -0700 (MST)

Testé aussi le -1000
ne le fait pas :-(

-----
♫artial♪

---

From: martial <[email-masked]>
Date: Fri, 11 Dec 2020 16:32:33 -0700 (MST)

Ah, si pas d'autre solution même avec un \once \override  dans le le
#define-markup-command
 -\tweak  \layer -1 fera l'affaire.
mais du coup la commande est moins concentré
-\tweak layer -1 -\markup  \Stabilo couleur  x y 
Merci ! 

-----
♫artial♪

---

From: Gloops <[email-masked]>
Date: Fri, 11 Dec 2020 17:51:40 -0700 (MST)

\version "2.20.0"

#(define-markup-command (myMarker layout props color xdim ydim) (color?
pair? pair?)   
  (interpret-markup layout props   
    (markup  (#:with-dimensions (cons 0 0)(cons 0 0) 
               (#:with-color color
                 (#:filled-box  xdim  ydim 1) )))))

roundedRectangle =
#(define-music-function ( y-lower y-upper frame-color fill-color radius)
   (number? number? scheme? scheme? number?)
   #{
     \once\override HorizontalBracket.stencil =
     $(lambda (grob)
        (let* (
                (area (ly:horizontal-bracket::print grob))
                (thick (ly:grob-property grob 'line-thickness 0.2))
                (pad (ly:grob-property grob 'broken-bound-padding 0))
                (X-ext (ly:stencil-extent area X))
                (X-ext (cons (- (car X-ext) thick) (+ (cdr X-ext)  thick)))
                (open-on-left  (=  1 (ly:item-break-dir (ly:spanner-bound
grob LEFT ))))
                (open-on-right (= -1 (ly:item-break-dir (ly:spanner-bound
grob RIGHT))))
                (X-ext (cons
                        (if open-on-left  (+ (car X-ext) pad) (car X-ext))
                        (if open-on-right (- (cdr X-ext) pad) (cdr X-ext))))
                (Y-ext (cons y-lower y-upper))
                (outer-rect empty-stencil)
                )
          ; calculate outer borders:
          (set! outer-rect
                (if (color? frame-color)
                    (ly:make-stencil (list 'color frame-color
                                       (ly:stencil-expr (ly:round-filled-box
X-ext Y-ext radius))
                                       X-ext Y-ext))
                    empty-stencil)
                )
          ; shrink X-ext for use with inner stuff:
          (set! X-ext (cons (+ (car X-ext) thick) (cdr X-ext)))
          (set! X-ext (cons (car X-ext) (- (cdr X-ext) thick)))
          ; shrink Y-ext for use with inner stuff:
          (set! Y-ext (cons (+ (car Y-ext) thick) (cdr Y-ext)))
          (set! Y-ext (cons (car Y-ext) (- (cdr Y-ext) thick)))
          (ly:grob-set-property! grob 'layer -10)
          (ly:stencil-add
           outer-rect
           ; draw (inner) fill-rectangle
           (if (color? fill-color)
               (ly:make-stencil (list 'color fill-color
                                  (ly:stencil-expr (ly:round-filled-box
X-ext Y-ext (- radius thick)))
                                  X-ext Y-ext))
               empty-stencil)
           )
          ))
     \once\override HorizontalBracket.Y-offset = #0
     \once\override HorizontalBracket.shorten-pair = #'(-2.3 . -0.5)
   #})

#(define-markup-command (sticker layout props frame-color fill-color arg)
(color? color? markup?)
   (let* ((stencil (interpret-markup layout props arg))
          (X-ext (ly:stencil-extent stencil X))
          (Y-ext (ly:stencil-extent stencil Y))
          (cnt 0)
          (step 0)
          (dist-y (- (cdr Y-ext) (car Y-ext))))
     (set! cnt (round (/ dist-y 0.7)))
     (if (> cnt 0)
         (set! step (/ dist-y cnt))
         (set! step 0))
     (ly:stencil-add
      (makeDeltaSpan
       (car Y-ext) (cdr Y-ext) (car Y-ext) (cdr Y-ext) frame-color
fill-color
       step step #f #f 0.1 ; thick
       0 X-ext #f #f 0)
      stencil)))

\layout {
  \context {
    \Voice
    \consists "Horizontal_bracket_engraver"
  }
}

\score {
  \relative c' {
    \clef treble
\key g \major 
<> -\markup\myMarker #red #'(-6 . -5) #'(2 . 6)
  c4  d  e fis |
  g4  \roundedRectangle #-4 #3  #black #yellow #2
  f? \startGroup  e c  \stopGroup  d4 e4 fis r %
  \bar "|."

  }
}

---

From: Gloops <[email-masked]>
Date: Fri, 11 Dec 2020 18:11:45 -0700 (MST)

\version "2.20.0"

#(define-markup-command (myMarker layout props color xdim ydim) (color?
pair? pair?)   
  (interpret-markup layout props   
    (markup  (#:with-dimensions (cons 0 0)(cons 0 0) 
              #:override '(box-padding . 0)  
              #:override '(corner-radius . 2)  
               #:override '(thickness  . 2)  
              #:rounded-box   
               (#:with-color color
                 (#:filled-box  xdim  ydim 2) )))))

roundedRectangle =

\layout {
  \context {
    \Voice

\score {
  \relative c' {
    \clef treble
\key g \major 

  }
}

---

From: martial <[email-masked]>
Date: Sat, 12 Dec 2020 01:18:39 -0700 (MST)

bonjour,
merci 
beau code, un peu ésotérique pour moi. 
Ça fonctionne, Cependant je n'arrive pas avec \markup \sticker  
comment on entre l'argument "arg" ?

-----
♫artial♪

---

From: Jean Abou Samra <[email-masked]>
Date: Sat, 12 Dec 2020 19:06:18 +0100

Hello,

> je tourne en rond depuis 2 jours !

En Scheme, une fonction est une suite d'expressions qui sont évaluées l'une
après l'autre. La valeur de la dernière expression évaluée est renvoyée par
la fonction. Celles qui précèdent ne peuvent servir que si elles ont des
effets de bord (par exemple, dans le contexte de LilyPond, modifier une
propriété). Donc, ce bout de code est évalué, et le résultat… jeté à la
poubelle ! Évidemment, ce n'est pas ce que vous souhaitiez.

Voici une solutionpour factoriser la retouche du layer à l'intérieur
de la commande :

\version "2.21.80"

% Commande de markup auxiliaire, qui lit une propriété et crée
% le coup de stabilo.

#(define-markup-command (Stabilo-markup layout props color xdim ydim)
                         (color? number-pair? number-pair?)
   (interpret-markup layout props
     #{
       \markup
       \with-dimensions-from \null
       \with-color #color
       \filled-box #xdim #ydim #3
     #}))

% On utilise le raccourci pratique et nouveau en 2.20, \etc,
% qui permet de transférer le reste de l'évaluation des arguments
% à l'endroit où l'identifieur est rappelé avec \Stabilo. Ceci évite
% une fonction musicale.

Stabilo = \tweak layer -1 -\markup \Stabilo-markup \etc

% Exemple.

\relative c' {
   \clef treble
   \key g \major
   c4\Stabilo #green #'(-6 . -5) #'(2 . 6)
   d e fis |
   g4 f?
   e\Stabilo  #yellow #'(-5 . 5) #'(-3 . 6)
   c |
   d4
   e4\Stabilo #black #'(-2 . 2) #'(-2 . 2)
   fis
   \bar "|."
}

Cordialement,
Jean

---

From: martial <[email-masked]>
Date: Sat, 12 Dec 2020 16:17:19 -0700 (MST)

b'soir,
 
Sioux la solution ! 
et merci pour l'explication

Cordialement

-----
♫artial♪