Génération conditionnelle...

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

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.

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

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

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

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

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

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

···

Le 02/05/2010 01:04, Gilles THIBAULT a écrit :

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.

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 .

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...
\book
{
    \paper { #(set-paper-size "a4") }
    \myBook
}

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

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
%musicb = d'1 % a décommenter

#(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
{
     \paper { #(set-paper-size "a4") }
}

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

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

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 :

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

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

#(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))
        (reverse! (ly:parser-lookup parser 'toplevel-scores)))
(ly:parser-define! parser 'toplevel-scores (list))
(print-book-with-defaults parser book)))

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

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

%%%%%%%%%%%%%%%%%%%%
liste de diffusion lilypond-user-fr
lilypond-user-fr@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr