Subject: \include in scheme fiunctions

From: Pierre-Yves Saumont <[email-masked]>
Date: Sun, 27 Feb 2022 11:25:20 +0100

Bonjour,

La documentation Lilypond indique que n'importe quel code Lilypond peut
être utilisé dans une fonction Scheme en le plaçant dans un bloc #{ ... #},
mais il semble que ce ne soit pas le cas pour \include.

J'essaie de construire un programme pour manipuler des partitions de Big
Band. Le but est d'extraire d'un certain nombre de partitions les parties
d'un certain nombre d'instruments et de faire un PDF par instrument
comportant les pages adéquates.

Au départ, il y a une liste de titres (10 à 15) et une liste d'instruments
(16 à 22).

Pour l'instant, je doit créer manuellement un fichier comportant les lignes
suivantes:

\include "../Doxy/Doxy_music.ly"
\include "partAltoI.ly"
\include "../Alfie/Alfie_music.ly"
\include "partAltoI.ly"
\include "../CestSiBon/CestSiBon_music.ly"
\include "partAltoI.ly"
\include "../BeyondTheSea/BeyondTheSea_music.ly"
\include "partAltoI.ly"
\include "../CloseToYou/CloseToYou_music.ly"
\include "partAltoI.ly"
.
.
.
include "../Doxy/Doxy_music.ly"
\include "partAltoII.ly"
\include "../Alfie/Alfie_music.ly"
\include "partAltoII.ly"
\include "../CestSiBon/CestSiBon_music.ly"
\include "partAltoII.ly"
\include "../BeyondTheSea/BeyondTheSea_music.ly"
\include "partAltoII.ly"
\include "../CloseToYou/CloseToYou_music.ly"
\include "partAltoII.ly"
.
.
.
include "../Doxy/Doxy_music.ly"
\include "partTenorI.ly"
\include "../Alfie/Alfie_music.ly"
\include "partTenorI.ly"
\include "../CestSiBon/CestSiBon_music.ly"
\include "partTenorI.ly"
\include "../BeyondTheSea/BeyondTheSea_music.ly"
\include "partTenorI.ly"
\include "../CloseToYou/CloseToYou_music.ly"
\include "partTenorI.ly"
.
.
.

Cela fait beaucoup de frappe inutile si on considère que les données
réelles sont simplement deux listes. La liste des titres :

Doxy
Alfie
CestSiBon
BeyondTheSea
CloseToYou
.
.
.

et la liste des instruments

AltoI
AltoII
TenorI
TenorII
Baritone
.
.
.

J'ai essayé de créer une fonction telle que :

part = #(define-void-function (score instrument) (string? string?)
   #{
     \include "../Doxy/Doxy_music.ly"
     \include "partAltoI.ly"
   #})

(Ici, je ne construis pas encore les noms des fichiers à partir des
arguments de la fonction, j'essaye simplement de voir si ça peut
fonctionner.)

L'appel de la fonction tel que \part "Doxy" "AltoI" produit l'erreur
suivante :

.../include/LilyJAZZwithBarNums.ily:62:1 <http://0.0.0.0/>: error: syntax
error, unexpected SCM_TOKEN, expecting end of input

#(define jazz-map '(

/tmp/frescobaldi-1mgd5_wr/tmpys2kq_gz/March2022_parts_alto1.ly:13:1
<http://0.0.0.1/>: error: error in #{ ... #}

\part "Doxy" "AltoI"

Le message dit que l'erreur est dans LilyJAZZwithBarNums.ily, mais comme ça
marche en dehors d'une fonction, je ne pense pas que le fichier soit en
cause.

Y a-t-il un moyen d'obtenir le résultat souhaité ? Et accessoirement, y
a-t-il un moyen de lire une variable lilypond dans un autre fichier sans
faire un \include du fichier complet ? (L'include du fichier complet
produit parfois des effets indésirables si une variable est manquante dans
un fichier, car la valeur utilisée par le \include précédent est alors
toujours en cours. Il y a également des problèmes avec l'incrémentation de
taille de polices qui deviennent cumulative. Il y a visiblement un problème
de "scope", les variables importées par \include semblant globales, mais
pouvant être redéfinies par le \include suivant.)

Merci pour toute suggestion qui me permettrait d'avancer dans ce projet.

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 27 Feb 2022 13:46:33 +0100

Le 27/02/2022 à 11:25, Pierre-Yves Saumont a écrit :
> Bonjour,
>
> La documentation Lilypond indique que n'importe quel code Lilypond 
> peut être utilisé dans une fonction Scheme en le plaçant dans un bloc 
> #{ ... #}, mais il semble que ce ne soit pas le cas pour \include.
>
> J'essaie de construire un programme pour manipuler des partitions de 
> Big Band. Le but est d'extraire d'un certain nombre de partitions les 
> parties d'un certain nombre d'instruments et de faire un PDF par 
> instrument comportant les pages adéquates.
>
> Au départ, il y a une liste de titres (10 à 15) et une liste 
> d'instruments (16 à 22).
>
> Pour l'instant, je doit créer manuellement un fichier comportant les 
> lignes suivantes:
>
> .../include/LilyJAZZwithBarNums.ily:62:1 <http://0.0.0.0/>: error: 
> syntax error, unexpected SCM_TOKEN, expecting end of input
>
> #(define jazz-map '(
>
> Le message dit que l'erreur est dans LilyJAZZwithBarNums.ily, mais 
> comme ça marche en dehors d'une fonction, je ne pense pas que le 
> fichier soit en cause.
>
> Y a-t-il un moyen d'obtenir le résultat souhaité ? Et accessoirement, 
> y a-t-il un moyen de lire une variable lilypond dans un autre fichier 
> sans faire un \include du fichier complet ? (L'include du fichier 
> complet produit parfois des effets indésirables si une variable est 
> manquante dans un fichier, car la valeur utilisée par le \include 
> précédent est alors toujours en cours. Il y a également des problèmes 
> avec l'incrémentation de taille de polices qui deviennent cumulative. 
> Il y a visiblement un problème de "scope", les variables importées par 
> \include semblant globales, mais pouvant être redéfinies par le 
> \include suivant.)
>

L'ennui avec votre \include au milieu de #{ #}, c'est que
la construction #{ #} est faite pour écrire des valeurs.
Ainsi, vous pouvez faire

{
   ##{
     c'1
   #}
}

mais pas

{
   ##{
     mus = { c'1 }
     \mus
   #}
}

Votre \include contient manifestement des affectations et ce
genre de choses, qui ne peuvent pas aller dans un #{ #}.
Mieux vaut faire quelque chose comme

\version "2.22.1"

#(let ((titres '("Doxie"
                  "Alfie"
                  ;; ...
                  ))
        (instruments '("AltoI"
                       ;; ...
                       )))
    (for-each
     (lambda (t)
       (for-each
        (lambda (i)
          (ly:parser-include-string
           (format #f
                   "\\include \"../~a/~a_music.ly\" \\include \"part~a.ly\""
                   t t i)))
        instruments))
     titres))

Cela dit, en règle générale je recommanderais plutôt de
rendre les fichiers Truc_music.ly compilables, en définissant
des fonctions AltoI, etc. que vous appelez ensuite dans
Truc_music.ly.

Cordialement,
Jean

---

From: Pierre-Yves Saumont <[email-masked]>
Date: Sun, 27 Feb 2022 14:53:39 +0100

Merci ! Ca commence à fonctionner un peu mieux. J'ai toutefois encore
plusieurs problèmes.

1) Les fichiers ne sont pas trouvés même s'il sont dans le même répertoire.
La seule façon pour que ça fonctionne est d'indiquer le chemin d'accès
complet depuis la racine. J'ai essayé avec ../ pour remonter d'un niveau,
avec rien ou avec ./ en mettant les fichiers au même niveau que le
programme exécuté, les fichiers ne sont pas trouvés. Seul le chemin complet
fonctionne.

2) Existe-t-il un moyen de placer les parties de chaque instrument (avec
tous les titres) dans un fichier PDF séparé?

3) Que signifie rendre "les fichiers Truc_music.ly compilables,"? Lors de
la saisie, j'ajoute à chaque fichier _music le code suivant:

\score {
  <<
  \new Staff <<\altoIMusic>>
  \new Staff <<\tenorIMusic>>
. . .
}

Ce qui me permet de voir ce que je saisi dans Frescobaldi. J'enlève ces
lignes quand la saisie est terminée. Est-ce cela un fichier "compilable" ?

Merci pour votre aide.

N.B. J'envoie ce message en faisant "Répondre à tous", est-ce la façon
correcte de procéder? En faisant "Répondre", ça n'envoie pas à la liste.

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 27 Feb 2022 15:27:31 +0100

Le 27/02/2022 à 14:53, Pierre-Yves Saumont a écrit :
> 1) Les fichiers ne sont pas trouvés même s'il sont dans le même 
> répertoire. La seule façon pour que ça fonctionne est d'indiquer le 
> chemin d'accès complet depuis la racine. J'ai essayé avec ../ pour 
> remonter d'un niveau, avec rien ou avec ./ en mettant les fichiers au 
> même niveau que le programme exécuté, les fichiers ne sont pas 
> trouvés. Seul le chemin complet fonctionne.

Je parie que vous avez édité votre fichier et ne l'avez pas sauvegardé
dans Frescobaldi, qui compile alors un fichier temporaire dans un autre
dossier. Essayez en sauvegardant d'abord.

> 2) Existe-t-il un moyen de placer les parties de chaque instrument 
> (avec tous les titres) dans un fichier PDF séparé?

Oui, \book. Par exemple :

\version "2.22.1"

clarinette = { a'1 }
saxophone = { c'1 }

\book {
   \bookOutputSuffix clarinette
   { \clarinette }
}

\book {
   \bookOutputSuffix saxophone
   { \saxophone }
}

\book {
   <<
     \new Staff \clarinette
     \new Staff \saxophone
   >>
}

La documentation est ici :

http://lilypond.org/doc/v2.23/Documentation/notation/multiple-output-files-from-one-input-file.html

> 3) Que signifie rendre "les fichiers Truc_music.ly compilables,"? Lors 
> de la saisie, j'ajoute à chaque fichier _music le code suivant:
>
> \score {
>   <<
>   >>
> Ce qui me permet de voir ce que je saisi dans Frescobaldi. J'enlève 
> ces lignes quand la saisie est terminée. Est-ce cela un fichier 
> "compilable" ?

Non, oubliez, je me suis emmêlé les pinceaux avec
votre structure de fichiers.

> correcte de procéder? En faisant "Répondre", ça n'envoie pas à la liste.

Oui, c'est cela. Dans les destinataires (Pour ou CC), vous devez avoir au
minimum l'adresse de la liste, pour que tout le monde reçoive le message.
C'est une bonne pratique de garder aussi l'adresse des personnes à qui
vous répondez, car cela leur fera recevoir votre message plus vite (la
distribution à tous les membres peut prendre un peu de temps), et pour
certains cela fait atterrir le message dans un dossier prioritaire
ou leur accorde plus d'importance d'une manière ou d'une autre. Par exemple,
je suis abonné à la liste python-dev (sans aucun rapport avec LilyPond),
mais comme elle est à haut trafic, j'ai un filtre qui marque automatiquement
les messages de cette liste comme lus, et je la regarde seulement
une fois de temps en temps, donc si vous répondez à un message que
j'ai posté sur python-dev, je risque de ne pas le voir s'il ne m'est
pas aussi adressé directement. Pour les personnes qui sont actives
sur cette liste de la même manière que moi sur python-dev, c'est utile.

Cordialement,
Jean

---

From: Pierre-Yves Saumont <[email-masked]>
Date: Sun, 27 Feb 2022 18:30:57 +0100

Je connaissais l'usage de \book et  \bookOutputSuffix (grâce à votre
réponse dans la liste Frescobaldi !), mais mon problème est que je n'arrive
pas à les utiliser dans ce cas précis.

J'ai essayé avec la fonction (avec un exemple minimal simplifié) :

#(let ((instruments '("AltoI"
                      "TenorI"
                       ))
       (titres '("AuClairDeLaLune"
                 "JAiDuBonTabac"

                  )))
    (for-each
     (lambda (i)
          (ly:parser-include-string (format #f "\\book{\\bookOutputSuffix
~a" i))
       (for-each
        (lambda (t)
          (ly:parser-include-string
           (format #f
                   "\\include \"./~a/~a_music.ly\" \\include \"./_part~a.ly
\""
                   t t i)))
        titres) (ly:parser-include-string(format #f "}")))
     instruments))

C'était un peu téméraire ! Et bien sûr, ça ne fonctionne pas!

J'ai également essayé sans la fonction:

book{
  \bookOutputSuffix AltoI

  \include "./AuClairDeLaLune/AuClairDeLaLune_music.ly"
  \include "./_partAltoI.ly"

  \include "./JAiDuBonTabac/JAiDuBonTabac_music.ly"
  \include "./_partAltoI.ly"
}

\book{
  \bookOutputSuffix TenorI

  \include "./AuClairDeLaLune/AuClairDeLaLune_music.ly"
  \include "./_partTenorI.ly"

  \include "./JAiDuBonTabac/JAiDuBonTabac_music.ly"
  \include "./_partTenorI.ly"
}

Cela ne fonctionne pas non plus, mais la raison semble différente.
J'obtiens des message d'erreur du type :

./AuClairDeLaLune/AuClairDeLaLune_music.ly:3:1 <0>: error: syntax error,
unexpected SYMBOL

title = "Au clair de la lune"

ou :

./_parts.ly:4:23 <2>: error: unknown escaped string: `\title'

title = \markup {

\title }

Il semble donc qu'en ajoutant \book { ... } la déclaration title = "Au
clair de la lune" dans le fichier AuClairDeLaLune_music.ly n'est plus
syntactiquement correcte. Je suppose qu'on ne peux pas déclarer des
variables à l'intérieur de \book? Mais alors comment faire?

Cordialement,

Pïerre-Yves