|
From: | Jean Abou Samra |
Subject: | Re: Description erronée de la commande book |
Date: | Sun, 12 Mar 2023 21:56:09 +0100 |
User-agent: | Evolution 3.46.4 (3.46.4-1.fc37) |
Le dimanche 12 mars 2023 à 21:02 +0100, Ben a écrit :
Dans votre exemple, vous avez raison, mais si je prends cet autre exemple, cela rend la proposition erronée:
\version "2.25.1"
\bookpart { \markup "" }
var = "coucou"
\bookpart { \score { \relative c { c d e } } }
Ici, je n'ai bien qu'un seul bloc \score, mais dès lors que j'aimerais rendre le \book explicite, cela va retourner soit une erreur, soit un résultat différent.
Oui, c'est vrai… Pour moi, « ne contient qu'un bloc \score » se lisait plutôt « est constitué d'un simple bloc \score
(donc pas de \bookpart
).
Dans l'exemple précédent les \bookpart n'appartiennent en réalité à aucun \book, puisque je ne peux mettre l'instruction \book sans changer le résultat.
Si, je vous assure, le book existe bel et bien !
Prenons une analogie, par exemple en Python, puisque vous dites que vous écrivez des scripts dans ce langage. Imaginons une seconde, de manière fantaisiste, que la syntaxe de LilyPond soit celle de Python. Les choses (de manière simplifiée) se passent comme s'il y avait le code suivant inséré automatiquement par LilyPond :
implicit_book = Book()
explicit_books = []
def add_bookpart(bookpart: Bookpart) -> None:
implicit_book.append(bookpart)
def add_book(book: Book) -> None:
explicit_books.append(book)
def all_books() -> list[Book]:
if implicit_book:
explicit_books.append(implicit_book)
return explicit_books
et que vous aviez donc les deux syntaxes suivantes à votre disposition :
add_bookpart(Bookpart(...))
...
add_bookpart(Bookpart(...))
ou
add_book(Book(Bookpart(...), Bookpart(...)))
Vous pouvez alors faire
add_bookpart(Bookpart(Markup("")))
var = Music(relative(c, [c, d, e]))
add_bookpart(Bookpart(Score(Sequential(var, var))))
mais vous ne pouvez pas faire
add_book(Book(
Bookpart(Markup("")),
var = Music(relative(c, [c, d, e])) # ??
Bookpart(Score(Sequential(var, var)))
))
car une affectation est une instruction, qui ne peut pas se mettre à l'intérieur d'une _expression_. Par contre, vous pouvez faire
var = Music(relative(c, [c, d, e]))
add_book(Book(Bookpart(Markup("")), Bookpart(Score(Sequential(var, var)))))
ou bien encore
var = Music(relative(c, [c, d, e]))
second_bookpart = Bookpart(Score(Sequential(var, var)))
add_book(Book(Bookpart(Markup("")), second_bookpart))
Avec LilyPond, la syntaxe est évidemment très différente, mais le principe est exactement le même. Le \book
autour de deux \bookpart
existe, implicitement (c'est le implicit_book
). Vous pouvez aussi créer un \book
de manière explicite. Si vous ne pouvez pas mettre d'affectations à l'intérieur du \book
, c'est juste pour une question de syntaxe, cela mélange les expressions et les instructions.
Je vais essayer:
*) Soit 3 chants, Chant1.ly, Chant2.ly, Chant3.ly, etc. avec tous la même structure:
Chant1.ly
\version "2.25.1"
Deroulement = << \new Staff << \relative c { c d e } >> >>
\include "Modele.ily"*) Soit le fichier Modele.ily avec la structure suivante:
Modele.ily
\bookpart { \score { \Deroulement } }*) Je peux donc travailler chaque chant de manière indépendante et si je veux un recueil de tous les chants, il suffit de faire cela:
Recueil.ly
\version "2.25.1"
\include "chant1.ly"
\include "chant2.ly"
\include "chant3.ly"=> grâce au \bookpart, chaque chant s'intègre directement au recueil.
Mais là de nouveau, l'instruction \book ne peut être placée nulle part, alors que de facto, Recueil.ly est un book.
Effectivement, c'est plus clair pour moi, merci. À mon avis, plutôt qu'un \include "modèle.ily"
qui ajoute un \bookpart
, il vaut mieux faire une fonction qui prend les paramètres que vous voulez. Exemple :
% Modele.ily
myBookpart =
#(define-scheme-function (deroulement) (ly:music?)
#{ \bookpart { \score { \deroulement } } #})
% chant1.ly
% \include "Modele.ily"
deroulement = { c' }
bookpartI = \myBookpart \deroulement
% chant2.ly
% \include "Modele.ily"
deroulement = { d' }
bookpartII = \myBookpart \deroulement
% Recueil.ly
% \include "chant1.ly"
% \include "chant2.ly"
\book { \bookpart { \bookpartI } \bookpart { \bookpartII } }
Voire, si vous voulez vraiment conserver l'approche à base de variables plutôt que de fonctions :
% Modele.ily
% bookparts.\nomBookpart = \bookpart { \score { \deroulement } }
% chant1.ly
deroulement = { c' }
nomBookpart = bookpartI
% \include "Modele.ily"
bookparts.\nomBookpart = \bookpart { \score { \deroulement } }
% chant2.ly
deroulement = { d' }
nomBookpart = bookpartII
% \include "Modele.ily"
bookparts.\nomBookpart = \bookpart { \score { \deroulement } }
% Recueil.ly
% \include "chant1.ly"
% \include "chant2.ly"
\book {
\bookpart { $(assq-ref bookparts 'bookpartI) }
\bookpart { $(assq-ref bookparts 'bookpartII) }
}
Cordialement,
Jean
signature.asc
Description: This is a digitally signed message part
[Prev in Thread] | Current Thread | [Next in Thread] |