Subject: Aide pour une fonction Scheme

From: Simon Martineau <[email-masked]>
Date: Thu, 17 Nov 2022 00:50:07 +0100

Bonjour à tous,

C’est la première fonction scheme que j’écris, et j’ai besoin d’un peu d’aide :

Dans la plupart de mes partitions, j’utilise une ou plusieurs des fonctions ci dessous pour afficher les numéros de pages, et un marqueur en cas de partition transposée :

\book {
\paper {
oddHeaderMarkup = \markup {
\on-the-fly #not-part-first-page {
\fontsize #-5.5 \fromproperty #'header:title
"- p." \fromproperty #'page:page-number-string
}
}
evenHeaderMarkup = \markup {
\fontsize #-5.5 \fromproperty #'header:title
"- p." \fromproperty #'page:page-number-string
}
}
\musique
}

\book {
\bookOutputSuffix "Bb"
\paper {
oddHeaderMarkup = \markup {
\on-the-fly #first-page { \circle \pad-around #2 "Bb" }
\on-the-fly #not-part-first-page {
\fontsize #-5.5 \fromproperty #'header:title
"[Bb] - p." \fromproperty #'page:page-number-string
}
}
evenHeaderMarkup = \markup {
\fontsize #-5.5 \fromproperty #'header:title
"[Bb] - p." \fromproperty #'page:page-number-string
}
}
\transpose c d \musique
}

\book {
\bookOutputSuffix "Eb"
\paper {
oddHeaderMarkup = \markup {
\on-the-fly #first-page { \circle \pad-around #2 "Eb" }
\on-the-fly #not-part-first-page {
\fontsize #-5.5 \fromproperty #'header:title
"[Eb] - p." \fromproperty #'page:page-number-string
}
}
evenHeaderMarkup = \markup {
\fontsize #-5.5 \fromproperty #'header:title
"[Eb] - p." \fromproperty #'page:page-number-string
}
}
\transpose c a \musique
}

Mon objectif est de réduire au maximum ces trois fonctions :

\myBook \musique % pour les partitions en ut
\myBook "Bb" { \transpose c d \musique } % pour les partitions en Bb
\myBook "Eb" { \transpose c a \musique } % pour les partitions en Eb

Après quelques recherches, je suis arrivé à ce code qui est vraiment incomplet car je bloque sur les points suivants :

Comment faire pour avoir une sortie différente si pas d’argument $key (pour les partitions en Ut) ?

Comment faire pour insérer le titre et le numéro de page dans cette fonction (\fromproperty #'header:title et #'page:page-number-string) ?

Comment changer la taille du texte (\fontsize #-5.5) ?

Comment supprimer l’espace autour de l’argument $key ?

myBook =
#(define-void-function
(key music)
(string? ly:music?)
(print-book-with-defaults
#{
\book {
\bookOutputSuffix $key
\paper {
oddHeaderMarkup = \markup {
\on-the-fly \first-page {
\circle \pad-around #2 $key
}
\on-the-fly \not-part-first-page {
"[" $key "]" - p.
}
}
evenHeaderMarkup = \markup {
"[" $key "]" - p.
}
}
$music
}
#}))

Merci beaucoup !!

Simon

---

From: Jean Abou Samra <[email-masked]>
Date: Fri, 18 Nov 2022 14:36:40 +0100

Bonjour,

Le 17/11/2022 à 00:50, Simon Martineau a écrit :
>
>   * Comment faire pour avoir une sortie différente si pas d’argument
>     |$key| (pour les partitions en Ut) ?
>

D'abord, il faut rendre l'argument key optionnel en remplaçant string?
par (string? ""), où "" est la valeur par défaut s'il n'est pas fourni.

Ensuite, utiliser (if (string-null? key) ...) pour tester si key vaut "".

>   * Comment faire pour insérer le titre et le numéro de page dans
>     cette fonction (|\fromproperty #'header:title| et
>     |#'page:page-number-string|) ?
>   * Comment changer la taille du texte (|\fontsize #-5.5|) ?
>

Avec \fromproperty #'header:title, \fromproperty #'page-page-number-string
et \fontsize #-5.5 :-)  Qu'est-ce qui vous questionne ? C'est exactement la
même syntaxe que dans le code développé.

>   * Comment supprimer l’espace autour de l’argument |$key| ?
>

Avec \concat. Voir ici :
https://lilypond.org/doc/v2.22/Documentation/notation/formatting-text#selecting-font-and-font-size

En tout, cela donne :

\version "2.22.2"

myBook =
#(define-void-function
   (key music)
   ((string? "") ly:music?)
   (print-book-with-defaults
     #{
     \book {
       #(if (not (string-null? key))
            #{ \bookOutputSuffix $key #})
     \paper {
       oddHeaderMarkup = \markup {
         \on-the-fly \first-page {
           \circle \pad-around #2 $key
         }
         \on-the-fly \not-part-first-page {
           \fontsize #-5.5 \fromproperty #'header:title
           #(if (not (string-null? key))
                #{ \markup \concat { "[" $key "]"  } #}
                "")
           "- p." \fromproperty #'page:page-number-string
         }
       }
       evenHeaderMarkup = \markup {
           \fontsize #-5.5 \fromproperty #'header:title
           #(if (not (string-null? key))
                #{ \markup \concat { "[" $key "]"  } #}
                "")
           "- p." \fromproperty #'page:page-number-string
       }
     }
       $music
     }
     #}))

\header {
   title = "ABC"
}

musique = { c'1 \pageBreak c'1 }

Cordialement,
Jean

---

From: Simon Martineau <[email-masked]>
Date: Fri, 18 Nov 2022 16:09:39 +0100

Super, merci beaucoup Jean !

Pour \fromproperty #'header:title, je pensais que ça n'allait pas fonctionner : 
Si je comprends bien, la syntaxe avec # permet d'inclure un code scheme dans lilypond, j'ai cru qu'il y avait un moyen plus direct en scheme, plutôt que d'inclure un code scheme dans un code lilypond lui même inclus dans une fonction scheme :-)

Au passage, j'ai commencé à regarder votre tutoriel sur readthedocs.io, merci beaucoup d'avoir rédigé cela, c'est super utile !

Simon

---

From: Simon Martineau <[email-masked]>
Date: Sun, 20 Nov 2022 11:52:57 +0100

Bonjour,

La fonction marche parfaitement, sauf lorsque j’inclue \score dans la variable $music.

J’ai essayé en modifiant le type d’argument en ly:score? mais cela ne fonctionne pas non plus. Dans l’idéal, je voudrais que la fonction puisse marcher aussi avec un code comme le suivant :

\myBook {
\score {
<<
\accordsUt
\leadUt
}
\score {
<<
\accordsCoda
\codaUt
}
}

Est-ce possible ?

Merci beaucoup !

Simon