lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Description erronée de la commande book


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

Attachment: signature.asc
Description: This is a digitally signed message part


reply via email to

[Prev in Thread] Current Thread [Next in Thread]