Subject: Re: \include in scheme fiunctions

From: Jean Abou Samra <[email-masked]>
Date: Wed, 2 Mar 2022 23:54:06 +0100

Bonjour,

Le 27/02/2022 à 18:30, Pierre-Yves Saumont a écrit :
> Je connaissais l'usage de \book et  \bookOutputSuffix (grâce à votre 
> réponse dans la liste Frescobaldi !),

Pour que tout le monde puisse comprendre : nous parlons de

https://github.com/frescobaldi/frescobaldi/issues/1423

> 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))

Il manque les \" \" autour du \bookOutputSuffix.

>        (for-each
>         (lambda (t)
>           (ly:parser-include-string
>            (format #f
>                    "\\include \"./~a/~a_music.ly <http://a_music.ly>\" 
> \\include \"./_part~a.ly <http://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?
>

Effectivement. Un \include ne fait que recopier littéralement
le contenu d'une autre fichier dans la source (pas d'espaces
de nommage). La syntaxe

\book {
   xyz = "toto"
}

n'est pas valide, donc l'équivalent avec le \include d'un fichier
qui comporte « xyz = "toto" » ne l'est pas non plus.

> Mais alors comment faire?
>

Bon, essayons une autre approche que les \include à paramètre.
Je propose :

\version "2.22.1"

% AuClairDeLaLune_music.ly

AuClairDeLaLune.partTenorI = \new Staff \relative c' {
   c4 c c d e2 d c4 e d d c1
}

AuClairDeLaLune.partTenorII = \new Staff \relative c {
   \clef bass
   e4 e e f g2 f e4 g f f e1
}

% JAiDuBonTabac_music.ly

JAiDuBonTabac.partTenorI = \new Staff \relative c' {
   c8 d e c d4 d8 e f4 f e e
}

JAiDuBonTabac.partTenorII = \new Staff \relative c' {
   s1*2^"erreur : imagination épuisée"
}

% Fichier principal

partition =
#(define-music-function (part-alist which) (list? symbol?)
    (if (eq? which 'conducteur)
        (make-simultaneous-music (reverse! (map cdr part-alist)))
        (let ((m (assq-ref part-alist which)))
          (or m
              (begin
                (ly:warning "instrument ~a non trouvé" which)
                (make-music 'SequentialMusic))))))

toutesLesPartitions =
#(define-void-function (part-alists) (list?)
    (define (add m) (add-score (scorify-music m)))
    (for-each
     (lambda (alist)
       (let ((parts (reverse! (map cdr alist))))
         (add (make-simultaneous-music parts))
         (for-each add parts)))
     part-alists))

% \include "AuClairDeLaLune_music.ly"
% \include "JAiDuBonTabac_music.ly"

\partition \AuClairDeLaLune conducteur
\partition \AuClairDeLaLune partTenorII

\pageBreak

\toutesLesPartitions #`(,AuClairDeLaLune ,JAiDuBonTabac)

Cordialement,
Jean