Aide pour une fonction Scheme

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

Bonjour,

  * 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 :slight_smile: 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 }

\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

Cordialement,
Jean

···

Le 17/11/2022 à 00:50, Simon Martineau a écrit :

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 :slight_smile:

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

Simon

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