|
From: | Pierre-Yves Saumont |
Subject: | Re: \include in scheme fiunctions |
Date: | Sun, 27 Feb 2022 14:53:39 +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 "../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.
>
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
[Prev in Thread] | Current Thread | [Next in Thread] |