Subject: Génération conditionnelle...

From: Olivier Chamley <[email-masked]>
Date: Sat, 01 May 2010 21:58:36 +0200

Bonjour,

Je suis en train d'essayer de mettre en place un canevas de partitions, 
pour générer différents morceaux en différents formats (A4, petit 
carnet, ...)

En d'autres termes, j'ai un premier fichier dans lequel je définis des 
variables (Musique, Titre, Tempo, ...) et qui se termine par un \include 
"Canevas.ly".

Dans ce Canevas.ly, je voudrais effectuer des générations en fonction de 
la définition ou non de certaines variables. Par exemple, je peux avoir 
deux voix, auquel cas je générerai deux partitions (book). Mais si je 
n'ai qu'une voix, je voudrais supprimer un des deux \book.

J'ai bien identifié la façon de faire le test en scheme _#(if (defined? 
Musiqueb) (...))_, mais ensuite, je voudrais exprimer ma partition 
conditionnelle en syntaxe lilypond, pas scheme ! En gros, j'aimerais 
bien avoir l'équivalent d'un #ifdef du langage C.

Est-ce possible ?

Merci d'avance,

Olivier

---

From: "Gilles THIBAULT" <[email-masked]>
Date: Sun, 2 May 2010 01:04:36 +0200

>>bien avoir l'équivalent d'un #ifdef du langage C.

Tu peux mettre du Lilypond à l'intérieur du scheme en l'entourant par
#{         #} mais ça ne marche pas pour \score, avec lequel il faut 
utiliser entre autre, ly:make-score .

%%%%%%%%%%%%%%%%%%

musica = c'1
%musicb = d'1     % a décommenter

myBook = #(define-music-function (parser location)()
(let ((a (ly:make-score #{  \musica  #} ))
      (b (and (defined? 'musicb)
              (ly:make-score #{  \musicb  #} ))))
  (collect-scores-for-book parser a)
  (if b (collect-scores-for-book parser b))
  (make-music 'Music 'void #t)))

\myBook

%%%%%%%%%%%%%%%%%%

A l'intérieur de chaque #{    #} , tu peux mettre tout le code Lilypond que 
tu veux (sauf \score ...).

---

From: Olivier Chamley <[email-masked]>
Date: Sun, 02 May 2010 16:48:16 +0200

> utiliser entre autre, ly:make-score .
Merci... Ca marche bien unitairement, mais quand j'essaye de faire 
plusieurs 'book' (je veux générer les partitions à différents formats), 
ça ne marche plus...

%%%%%%%%%%%%%%
musica = c'1
musicb = d'1     % a décommenter

\book
{
     \paper { #(set-paper-size "a4") }
     \myBook
}

\book
{
     \paper { #(set-paper-size "a5") }
     \myBook
}

\version "2.12.0"
%%%%%%%%%%%%%%%

---

From: "Gilles THIBAULT" <[email-masked]>
Date: Mon, 3 May 2010 00:21:31 +0200

> plusieurs 'book' (je veux générer les partitions à différents formats), ça 
> ne marche plus...
> \book
> {

Je n'avais pas compris que tu voulais plusieurs \book.
En modifiant légérement le code de Nicolas Sceaux qui est ici :
http://lsr.dsi.unimi.it/LSR/Item?id=630
tu peux avoir ceci :

%%%%%%%%%%%%%%%%%%%%
musica = c'1

#(define-public (toplevel-book-handler parser book)
(let* ((a (ly:make-score #{  \musica  #} ))
        (b (and (defined? 'musicb)
                   (ly:make-score
                          #{  \musicb  #} ))))
(collect-scores-for-book parser a)
(if b (collect-scores-for-book parser b))
(map (lambda (score)
        (ly:book-add-score! book score))
    (ly:parser-lookup parser 'toplevel-scores))
(ly:parser-define! parser 'toplevel-scores (list))
(print-book-with-defaults parser book)))

\book
{

\book
{

%%%%%%%%%%%%%%%%%%%%
Je ne sais pas si c'est exactement ça que tu voulais et il faudra sûrement 
que tu l'adaptes à tes besoins.
Bonne semaine.

Gilles

---

From: "Gilles THIBAULT" <[email-masked]>
Date: Mon, 3 May 2010 11:45:08 +0200

> http://lsr.dsi.unimi.it/LSR/Item?id=630

Oups j'ai oublié un (reverse! ..
(Les \score seront dans l'ordre inverse)

%%%%%%%%%%%%%%%%%%%%
musica = c'1
%musicb = d'1     % à décommenter

        (reverse! (ly:parser-lookup parser 'toplevel-scores)))

\book
{

\book
{

%%%%%%%%%%%%%%%%%%%%
liste de diffusion lilypond-user-fr
[email-masked]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr