Subject: markup avec cercle plein (circle fill)

From: Gerard <[email-masked]>
Date: Sun, 3 May 2020 10:47:19 +0200

Bonjour,

Le récent café-lily m'a émoustillé du côté de l'esthétique !

Du coup, j'aimerai bien amélioré ma tablature diato.

L'image "ligne-diato" montre ce que j'ai actuellement, l'image 
"ligne-basses" montre ce que j'aimerai obtenir.

J'utilise une fonction (fournie par la liste, merci !):

------------------------
bp =
#(define-music-function
(parser location button)
(string?)
(make-music
'TextScriptEvent
'direction 1
'text ( markup #:with-color ColorBassP #:fontsize 1 #:circle #:bold button)
))

----------------------

J'ai fouillé, il n'a guère que dans le LSR "Circle of Fifths" que j'ai 
vu quelque chose mais ça ne m'inspire pas (le "C" est apparemment 
entouré d'un cercle plein en "white").

Merci à qui pourra m'aider :

1. à remplir mon cercle en blanc

2. à décaler ma basse sur la ligne

Bon dimanche !

Gérard

---

From: Valentin Villenave <[email-masked]>
Date: Sun, 3 May 2020 11:30:41 +0200

> 'text ( markup #:with-color ColorBassP #:fontsize 1 #:circle #:bold button)

Il doit y avoir plus simple :

%%%%

\layout {
  \context {
    \ChordNames
    \consists Staff_symbol_engraver
    \consists Bar_engraver
    \override StaffSymbol.line-count = 1
    \override StaffSymbol.line-positions =#'(2)
    noChordSymbol = \markup \bold "/"
    \override ChordName.stencil =
    #(lambda (grob)
       (let* ((cause (ly:grob-property grob 'cause))
              (props (ly:prob-immutable-properties cause))
              (rest? (memq 'rest-event (assoc-get 'class props)))
              (stencil (ly:text-interface::print grob))
              (th .25))
         (if rest?
             stencil
             (ly:stencil-translate-axis
              (ly:stencil-scale
               (circle-stencil
                (stencil-whiteout-box stencil 1 360)
                th (- th))
               (- 1 th) (- 1 th))
              (/ th 2) Y))))
  }
}

\chords { g4 r g r d1 }

%%%%

V.

---

From: survoje <[email-masked]>
Date: Sun, 3 May 2020 12:15:45 +0200

> Il doit y avoir plus simple :

:-D

Merci Valentin,

Ça marche mais je me débats avec un éventuel VerticalAxisGroup que je 
teste partout mais qui n'influence ma ligne basse que je voudrais 
rapprocher de la mélodie.

Question annexe :

je pourrais mettre ce \layout dans un "include" ?

Gérard

---

From: Valentin Villenave <[email-masked]>
Date: Sun, 3 May 2020 12:25:19 +0200

> rapprocher de la mélodie.

Sans bout de code, ça va être difficile à débugger…

> je pourrais mettre ce \layout dans un "include" ?

Oui bien sûr, ou même dans une variable.

V.

---

From: survoje <[email-masked]>
Date: Sun, 3 May 2020 13:34:16 +0200

> Sans bout de code, ça va être difficile à débugger…

Je pensais que tu pouvais lire le code "à distance" :-D

ci-dessous :

--------------------------------------------

%% mai 2020
%% Essai totalement fictif (non valable musicalement)
% aménagement ligne de basse accord (MG)
%% solution \layout de Valentin Villenave

\version "2.18.2"

\header {
   title = "Essai_VV"
}

% appel des fonctions de la "maindroite"
\include "MonDiato.ly"

%--------------------

melodie = \relative c' {
   \clef G
   \key c \major
   \time 4/4
   \set Staff.midiInstrument = "flute"
   a'4 a a b c d c b a c a b}

maindroite = {
   s4-\tg #"7" s-\tg #"5" s4-\tg #"7" s4-\tc #"6"
   s4-\pg #"8" s-\pc #"7" s-\pg #"8" s-\pc #"6" s4-\tg #"7" s4-\pc #"8" 
s4-\pc #"8" s4-\tg #"7"
}

lignebasse = \chords { g4 r g r d1 g4 r g r }
%----------------------
\score {
\new StaffGroup <<
     \new Staff{
       \clef "G"
       \context Voice = "melodie" {\melodie}}
     %=================== Tablatures
   \new DrumStaff
     \with {
       \override StaffSymbol #'line-count = #1
       \remove "Time_signature_engraver"
       \remove "Clef_engraver"
     }
     %=== main droite (mélodie)
     <<
       \set Staff.instrumentName = \markup{\column{C G}}
       {\autoBeamOff
        \maindroite
       }
     >>
  \new DrumStaff
     \with {
       \override StaffSymbol #'line-count = #0
       \remove "Time_signature_engraver"
       \remove "Clef_engraver"}
     %====== main gauche (basse accord)
     <<
       \set Staff.instrumentName = \markup{\column{MG}}
       \lignebasse

     >>

     >>

   \layout {
     \context {
       \ChordNames
       \override VerticalAxisGroup.default-staff-staff-spacing =
       #'((basic-distance . 1.5)
          (padding . -5))

---

From: Valentin Villenave <[email-masked]>
Date: Sun, 3 May 2020 15:04:08 +0200

> % aménagement ligne de basse accord (MG)

Puisqu’on est dans un StaffGroup, je pense qu’il est possible
d’intervenir dans le StaffGrouper précisément :

%%%%

\layout {
  \context {
    \ChordNames
    \StaffGroup
    \override StaffGrouper.staff-staff-spacing =
    #'((basic-distance . 3)
       (minimum-distance . 0)
       (padding . 0))
  }
}

%%%%

Au demeurant, cette manière de saisir la portée du milieu me semble
pouvoir être également simplifiée, Déjà sans rien changer à
"MonDiato.ly", il y a de fortes chances que le # devant les chiffres
ne soit pas du tout nécessaire. Mais même au-delà, sans avoir vu
exactement comment ça fonctionne, il me semble qu’on pourrait utiliser
une syntaxe de saisie bien plus légère, par exemple comme ceci :

%%%%

\layout {
  \context {
    \FiguredBass
    \consists Staff_symbol_engraver
    \consists Bar_engraver
    \override StaffSymbol.line-count = 1
    \override StaffSymbol.line-positions =#'(-2)
    figuredBassFormatter =
    #(lambda (n ev ctx)
       (if (number? n)
           (number->string n)
           n))
    \override BassFigure.stencil =
    #(lambda (grob)
       (define (lists-equal a b)
         (let lp ((a a) (b b))
           (cond ((null? a) (null? b))
                 ((null? b) #f)
                 (else (and (= (car a) (car b))
                            (lp (cdr a) (cdr b)))))))
       (let* ((text (ly:grob-property grob 'text))
              (stencil (grob-interpret-markup
                        grob
                        (make-sans-markup text)))
              (color (ly:grob-property grob 'color)))
         (if (lists-equal color red)
             (circle-stencil stencil .2 .3)
             stencil)))
  }
}

t= \override FiguredBass.BassFigure.color = #red
p= \override FiguredBass.BassFigure.color = #blue
"g" = \override FiguredBass.BassFigureAlignment.padding = #2
"c" = \override FiguredBass.BassFigureAlignment.padding = #-2
tg={\t\g} pg={\p\g} tc={\t\c} pc={\p\c}

\figures {
  \tg <7> <5> <7> \c <6>
  \pg <8>4. \c <7>8 \g <8>4 \c <6>
  \tg <7>2 \pc <8>8 <8> \tg <7>4
}

%%%%

V.

---

From: survoje <[email-masked]>
Date: Sun, 3 May 2020 19:30:51 +0200

Merci Valentin,

Ça marche, j'ai réussi à comprendre, à adapter quelques réglages. Il me 
reste un petit souci esthétique. Là je n'ai pas trouvé où régler.

Sur l'image jointe, on a l'illusion d'optique que les notes bleues sont 
plus petites que les cerclées rouges . Comment les augmenter un tout 
petit poil en taille et les déplacer un peu vers le bas pour corriger ce 
petit défaut.

Je mets le .ly quasi définitif (pour moi, ça me convient), si ça interésse.

Cordialement

Gérard
(j'ai beaucoup appris ! mon fichier Diato.ily va se réduire comme peau 
de chagrin !)

---

From: Valentin Villenave <[email-masked]>
Date: Sun, 3 May 2020 23:36:07 +0200

On 5/3/20, survoje <[email-masked]> wrote:
> Ça marche, j'ai réussi à comprendre, à adapter quelques réglages.

C’est même un chouia plus simple : les fonctions \tg etc. permettent
de n’ajouter que ce qui change : au lieu de
    \pg \pc \tc \tg
on peut mettre :
   \pg \c \t \g

Et dans le cas de deux types identiques qui se suivent, pas besoin de
les ré-indiquer (cf ci-dessous).

Autre petite correction, il n’y a plus de DrumStaff puisque j’utilise
un contexte FiguredBass pour la tablature et un contexte ChordNames
pour les accords (d’ailleurs au passage, ça permet d’indiquer les
accords mineurs quand il y en a). C’est donc dans ces contextes-là
qu’on peut régler les instrumentName s’il y a lieu.

> petit poil en taille et les déplacer un peu vers le bas pour corriger ce

J’ai corrigé pour que les chiffres entourés prennent exactement la
même place que les chiffres pas entourés (et je les grossis même un
peu).

Il y a même encore une dernière petite astuce qui permet d’avoir
encore moins à saisir : dans le cas de notation monodique assez
simple, comme ici, on peut tout simplement plaquer le rythme de la
mélodie sur celui des doigtés, ce qui évite d’avoir à saisir les
valeurs rythmiques dans la tablature.

Voici donc ce à quoi je parviens :

%%%%

\version "2.20.2"
%----------------------------------------

\header
{
  title = \markup {\column {"Bourrée des dindes"}}
  arranger = "Tablature diato Corgeron C/G"
  piece = "Bretagne"
}

t= \override FiguredBass.BassFigure.color = #darkred
p= \override FiguredBass.BassFigure.color = #darkblue
"g" = \override FiguredBass.BassFigureAlignment.padding = #2
"c" = \override FiguredBass.BassFigureAlignment.padding = #-2
tg={\t\g} pg={\p\g} tc={\t\c} pc={\p\c}

%---------------------------------------
global =
{
  \clef treble
  \time 2/4
  \tempo 4 = 120
  \key g \major
}

%----------------------------
LaVoix=
\relative c'
{\global
 \repeat volta 2{
   d4 e8 fis8
   g2
   a8. b16 c8 b8
   a8 g8 fis8 e8\break
   d4 e8 fis8 g2
   a8. b16 c8 b8 a2}\break
 \repeat volta 2{
   a8. b16 c8 b8 a8. b16 c8 b8
   a8 g8 fis8 e8 e4 d4\break
   a'8. b16 c8 b8 a8. b16 c8 b8
   a8 g8 fis8 a8 g2}
}

% ---------------------------
% \pg = poussé SOL, \pc = poussé DO, tg = tiré SOL, \tc = tiré DO
% \
TablatureDroite=
\figuremode {
  \pg <5> \t <5> \c <6>
  \pg <6>
  \tg <7> \c <6> \g <8> \c <6>
  \g <7> \p <6> \t <6> <5>
  \p <5> \t <5> \c <6> \pg <6>
  \t <7> \c <6> \g <8> \c <6>
  \g <7>
  <7> \c <6> \g <8> \c <6>
  \g <7> \c <6> \g <8> \c <6>
  \g <7> \p <6> \t <6> <5>
  <5> \p <5>
  \t <7> \c <6> \g <8> \c <6>
  \g <7> \c <6> \g <8> \c <6>
  \g <7> \p <6> \t <6> <7>
  \p <6>
}

%-------------------------------
% la note = basse, r symbolise l'accord (une valse se noterait g4 r r d4 r r..)
TablatureGauche = \chordmode {
  g4 r g r
  a:m r a:m r d r g r
  a:m r d r
  a:m r a:m r a:m r d g
  a:m r a:m r d r g2
}
%---------------------------------------

appliquerRhythme =
#(define-music-function (sequence cible) (ly:music? ly:music?)
   (define (flatten-music music)
     (let ((musiclist '()))
       (let loop ((music music))
         (let ((elt (ly:music-property music 'element))
               (elts (ly:music-property music 'elements)))
           (if (null? elt)
               (if (null? elts)
                   (set! musiclist (append musiclist (list music)))
                   (map! loop elts))
               (map! loop (list elt)))))
       (make-sequential-music musiclist)))
   (define (extract-durations music)
     (map (lambda (elem) (ly:music-property elem 'duration))
          (filter (music-type-predicate '(note-event))
                  (ly:music-property music 'elements))))
   (define (apply-duration element duration)
     (let ((subelements (ly:music-property element 'elements)))
       (if (null? subelements)
           (set! (ly:music-property element 'duration) duration))
       (map (lambda (subelement)
              (set! (ly:music-property subelement 'duration) duration))
            subelements)))
   (define (apply-durations durations music)
     (for-each apply-duration
               (filter (music-type-predicate '(rhythmic-event))
                       (ly:music-property music 'elements))
               (apply circular-list durations))
     music)
   (music-map (let ((i -1)
                    (ls (extract-durations
                         (flatten-music sequence))))
                (lambda (n)
                  (or (null? (ly:music-property n 'duration))
                      (begin
                       (set! i (1+ i))
                       (ly:music-set-property!
                        n 'duration
                        (list-ref ls i))))
                  n))
              cible))

%---------------------------------------

\score {
  \new StaffGroup <<
    \new Staff{
      \clef "G"
      \context Voice = "melodie" { \LaVoix}
    }
    \new FiguredBass \with {
      instrumentName = \markup{\column{\vspace #9 C G}}
    } \appliquerRhythme \LaVoix \TablatureDroite
    \new ChordNames \with {
      instrumentName = \markup{\column{MG " "}}
    } \TablatureGauche
  \layout {
    \context {
      \FiguredBass
      \consists Instrument_name_engraver
      \consists Staff_symbol_engraver
      \consists Bar_engraver
      \override StaffSymbol.line-count = 1
      \override StaffSymbol.line-positions =#'(-3)
      figuredBassFormatter =
      #(lambda (n ev ctx)
         (if (number? n)
             (number->string n)
             n))
      \override BassFigure.stencil =
      #(lambda (grob)
         (define (lists-equal a b)
           (let lp ((a a) (b b))
             (cond ((null? a) (null? b))
                   ((null? b) #f)
                   (else (and (= (car a) (car b))
                              (lp (cdr a) (cdr b)))))))
         (let* ((text (ly:grob-property grob 'text))
                (stencil (grob-interpret-markup
                          grob
                          (make-sans-markup text)))
                (color (ly:grob-property grob 'color))
                (circled-stencil (circle-stencil stencil .1 .5)))
           (if (lists-equal color darkred)
               circled-stencil
               (ly:stencil-outline
                (ly:stencil-scale stencil 1.1 1.1)
                circled-stencil))))
    }
    \context {
      \ChordNames
      \consists Instrument_name_engraver
      \consists Staff_symbol_engraver
      \consists Bar_engraver
      \override StaffSymbol.line-count = 1
      \override StaffSymbol.line-positions =#'(2)
      noChordSymbol = \markup \bold "/"
      \override ChordName.stencil =
      #(lambda (grob)
         (let* ((cause (ly:grob-property grob 'cause))
                (props (ly:prob-immutable-properties cause))
                (rest? (memq 'rest-event (assoc-get 'class props)))
                (stencil (ly:text-interface::print grob))
                (th .25))
           (if rest?
               stencil
               (ly:stencil-translate-axis
                (ly:stencil-scale
                 (circle-stencil
                  (stencil-whiteout-box stencil 1 360)
                  th (- th))
                 (- 1 th) (- 1 th))
                (/ th 2) Y))))
    }
    \context {
      \StaffGroup
      \override StaffGrouper.staff-staff-spacing =
      #'((basic-distance . 3)
         (minimum-distance . 0)
         (padding . 0))
    }

  }
  \midi {}
}

%%%%

V.

---

From: Gerard <[email-masked]>
Date: Mon, 4 May 2020 09:21:15 +0200

La partition diato est superbe ! De ma partition d'origine, il ne reste 
que le \header et lamelodie !!!

Il ne reste que quelques erreurs de saisie dans la tablature,quelques 
poussés au lieu de tirés mais surtout, ce n'est pas une bourrée de 
Bretagne !

Je suis admiratif de ta science et de ta patience (et rapidité) à 
répondre (ça vaut pour d'autres de la liste).

Je ne touche plus au code qui satisfait totalement mes besoins mais je 
vais en mettre un exemplaire dans un "bac à sable" pour, en le 
torturant, (essayer de) le comprendre à l'aide la documentation Lilypond.

J'ai juste une petite remarque, j'ai mis "markup avec cercle plein 
(circle fill)" dans le sujet (mon problème de départ), alors qu'on 
arrive au bilan final à un exemple complet et nickel pour accordéon 
diatonique qui pourrait servir d'exemple.

Encore merci beaucoup et merci à Lilypond qui permet ces belles choses.

Gérard