Affichage conditionnel (if / else)

Bonjour à tous,

Après deux heures de recherche sur les archives et le net, je dois m'en remettre à vous.

Je cherche à insérer des conditions dans un fichier Lilypond (me permettant entre autres choses de sortir plusieurs versions d'une même partition en changeant simplement une variable).

J'ai déjà découvert qu'on pouvait utiliser la syntaxe :

#(if (.... (p.e. "#(if (< MaVariable 4) (define AutreChose '(4 5 9))" )

Mais j'aimerais trouver une explication complète de la syntaxe à utiliser pour ces blocs conditionnels (else if, else, etc.). Quelqu'un aurait-il une idée ? Dois-je simplement chercher du côté de Scheme ?

Un grand merci à vous pour votre aide, quelle qu'elle soit

Phil
(à votre disposition pour toute question purement musicale)

Il vaudrait mieux commencer par donner exemple concret de ce que tu
veux obtenir. Par exemple :

   Dans le cas un, je voudrais que ça fasse [telle choseee exprimée en code LilyPond]
   Dans le cas deux, je voudrais que ça fasse [telle autre chose exprimée en code LilyPond]

et alors il sera plus facile de te conseiller.
Très probablement cela nécessitera de recourir à du code Scheme.

Nicolas

···

Le 22 sept. 09 à 11:41, Phil a écrit :

Bonjour à tous,

Après deux heures de recherche sur les archives et le net, je dois m'en remettre à vous.

Je cherche à insérer des conditions dans un fichier Lilypond (me permettant entre autres choses de sortir plusieurs versions d'une même partition en changeant simplement une variable).

J'ai déjà découvert qu'on pouvait utiliser la syntaxe :

#(if (.... (p.e. "#(if (< MaVariable 4) (define AutreChose '(4 5 9))" )

Mais j'aimerais trouver une explication complète de la syntaxe à utiliser pour ces blocs conditionnels (else if, else, etc.). Quelqu'un aurait-il une idée ? Dois-je simplement chercher du côté de Scheme ?

Un grand merci à vous pour votre aide, quelle qu'elle soit

Bonjour Nicolas,

Merci pour ta réponse.

Désolé de ne pas avoir été très précis, mais ce que je cherche n'est pas précis, je veux dire : ne se limite pas à un cas unique. C'est une information générale sur les ressources et la syntaxe de Scheme adaptée à Lilypond.

Je vais prendre un exemple extrêmement précis (donc limitatif par rapport à l'aide que je cherche) :

Je crée des tablatures pour la guitare pour des chansons de Ane Brun.
Dans son interprétation de plusieurs chansons, elle utilise un open-tuning (accord ouvert) de ré (c'est-à-dire un accordage non conventionnel de la guitare).

Or, il se trouve que certains de ses morceaux ne nécessitent pas vraiment cet accordage, peuvent être joués avec un accordage traditionnel (e b g d a e).

Donc, je voudrais à partir d'un seul fichier lilypond pouvoir sortir les deux versions de la tablature des-dits morceaux.
Version 1 : la tablature du morceau en accordage normal
Version 2 : la tablature du morceau en open-tuning

(Note : merci de ne pas m'interroger sur la pertinence de ces deux versions. À l'usage, elles sont intéressantes : la première pour celui qui n'a pas envie ou ne peut pas ré-accorder sa guitare, la seconde pour celui qui cherche le morceau exact)

Pour ce faire, je voudrais utiliser une seule variable (ci-dessous NONOPENTUNING) qui me permettrait, en étant modifiée avant compilation, de sortir très facilement ces deux versions :
NONOPENTUNING est true => la tablature est compilée en accordage normal
NONOPENTUNING est false => la tablature est compilée en open-tuning

Actuellement, j'utilise par exemple :

*** début de code ***

NOTOPENTUNING = 0

#(if (> NOTOPENTUNING 0)
(define SetOpenTuning '(+4 -1 -5 -10 -15 -20) )
(define SetOpenTuning '(+2 -3 -6 -10 -15 -22) )
)

*** fin de code ***

Puis j'utilise la variable SetOpenTuning dans le contexte de la TabStaff

*** début de code ***

\set TabStaff.stringTunings = \SetOpenTuning

*** fin de code ***

En mettant NOTOPENTUNING à 1, j'obtiens la version en accordage normal.

Si je n'avais qu'à modifier le `TabStaff.stringTunings`, je pourrais me contenter d'un :

*** début de code ***

\set TabStaff.stringTunings = (+4 -1 -5 -10 -15 -20)
% \set TabStaff.stringTunings = (+2 -3 -6 -10 -15 -22)

*** fin de code ***

… en décommentant l'une ou l'autre des deux lignes suivant ce que je veux obtenir.

Seulement, de nombreuses choses doivent être changées d'une version à l'autre : l'explication sur la version de la tablature visée, l'explication de l'accordage à utiliser (quand open-tuning), le pied de page, le contenu de l'entête, etc.

Je n'ai pas envie de décommenter/commenter chaque ligne concernée à la main.

Je voudrais n'utiliser que la définition de la variable NOTOPENTUNING pour modifier tout ça.

Mais vois-tu, je n'arrive même pas à faire le test tout bête pour savoir NOTOPENTUNING est #t ou #f, je n'ai pas trouvé la syntaxe qui fonctionne et je dois me contenter pour le moment de mettre cette valeur à 0 ou 1 et de faire un malheureux test avec ">" comme ci-dessus.

Voilà, désolé d'avoir été un peu long, mais puisqu'il fallait être précis :wink:

Merci pour toute aide qu'on pourra m'apporter (qui, pour faire court, se résume à m'indiquer où je serais susceptible de trouver de la document sur l'utilisation de Scheme avec Lilypond).

Bien à toi,

Bien à vous tous,

Phil

Nicolas Sceaux a écrit :

···

Il vaudrait mieux commencer par donner exemple concret de ce que tu
veux obtenir. Par exemple :

Dans le cas un, je voudrais que ça fasse [telle choseee exprimée en code LilyPond]
Dans le cas deux, je voudrais que ça fasse [telle autre chose exprimée en code LilyPond]

et alors il sera plus facile de te conseiller.
Très probablement cela nécessitera de recourir à du code Scheme.

Nicolas

Selon les cas, la technique pourra être assez différente, et c'est
toujours plus facile de partir d'un exemple concret.

Dans le cas que tu décris, voici comment on peut faire les choses.

%%%%%%%%%%%%%% open-tuning-test.ly %%%%%%%%%%%%%%
\version "2.13.4"

%% To switch to open tuning, either compile the file with
%% -dopen-tuning option, or uncomment the following line:
%%#(ly:set-option 'open-tuning #t)

\layout {
    \context {
      \TabStaff
      stringTunings = #(if (eqv? (ly:get-option 'open-tuning) #t)
                           '(+2 -3 -6 -10 -15 -22)
                           '(+4 -1 -5 -10 -15 -20))
    }
}

\new TabStaff { c' d' e' f' }
%%%%%%%%%%%%%% open-tuning-test.ly %%%%%%%%%%%%%%

Les deux cas sont atteints de la manière suivante :

   lilypond open-tuning-test.ly
   ==> tablatures avec accordage normal

   lilypond -dopen-tuning open-tuning-test.ly
   ==> tablatures avec accordage open tuning

Nicolas

···

Le 23 sept. 09 à 02:27, Phil a écrit :

Bonjour Nicolas,

Merci pour ta réponse.

Désolé de ne pas avoir été très précis, mais ce que je cherche n'est pas précis, je veux dire : ne se limite pas à un cas unique. C'est une information générale sur les ressources et la syntaxe de Scheme adaptée à Lilypond.

Je vais prendre un exemple extrêmement précis (donc limitatif par rapport à l'aide que je cherche) :

Je crée des tablatures pour la guitare pour des chansons de Ane Brun.
Dans son interprétation de plusieurs chansons, elle utilise un open-tuning (accord ouvert) de ré (c'est-à-dire un accordage non conventionnel de la guitare).

Or, il se trouve que certains de ses morceaux ne nécessitent pas vraiment cet accordage, peuvent être joués avec un accordage traditionnel (e b g d a e).

Donc, je voudrais à partir d'un seul fichier lilypond pouvoir sortir les deux versions de la tablature des-dits morceaux.
Version 1 : la tablature du morceau en accordage normal
Version 2 : la tablature du morceau en open-tuning

Et un petit bonus pour Phil (si je puis me permettre) : si de telles
fonctions vous semblent intéressantes, n'hésitez pas à en faire
bénéficier toute la communauté en les ajoutant sur le LilyPond Snippet
Repository !
http://lsr.dsi.unimi.it/

Cordialement,
Valentin

···

2009/9/23 Nicolas Sceaux <****@****>:

stringTunings = \#\(if \(eqv? \(ly:get\-option &#39;open\-tuning\) \#t\)
                     &#39;\(\+2 \-3 \-6 \-10 \-15 \-22\)
                     &#39;\(\+4 \-1 \-5 \-10 \-15 \-20\)\)

}
}

Hello Nicolas,

Merci pour ta réponse et l'élégance de ta solution.

Cela étant j'en reviens à ma question de départ, car ta solution (pour laquelle je te remercie encore) ne répond qu'à ces questions :
- 'eqv' est l'opération à utiliser pour comparer deux expressions
- on peut utiliser du code Scheme (?) à l'intérieur d'un contexte de lilypond (layout, score, TabStaff, etc.)
- true s'écrit #t et non pas ##t dans ce contexte-là
- et en bonus (ça c'est du grand art pédagogique de ta part :wink: ) : on peut utiliser une option de compilation dans le code lilypond pour faciliter les choses.

C'est déjà énorme, mais pour être tout à fait comblé, voilà ce que j'aimerais savoir (désolé pour la sémantique, je ne suis pas un "pur" informaticien) :

1/ Est-ce du "pur" Scheme qui est utilisé dans Lilypond ? ou est-ce un langage dérivé (de la même manière que Scheme est un langage dérivé de Lisp — du peu que j'en sache)

2/ Peut-on utiliser toutes les ressources (I mean : boucles, opérateurs, fonctions, etc. etc.) de Scheme dans le code Lilypond ? Ou y a-t-il d'importantes restrictions.

3/ Quelles sont les meilleures adresses pour apprendre les bases de ce langage ? (seulement si vous avez ces adresses sous la main bien entendu, sinon je demanderai à google)

Merci pour toute aide que vous pourriez m'apporter.

Bien à vous tous,

Phil

Nicolas Sceaux a écrit :
>
>> Bonjour Nicolas,
>>
>> Merci pour ta réponse.
>>
>> Désolé de ne pas avoir été très précis, mais ce que je cherche n'est pas précis, je veux dire : ne se limite pas à un cas unique. C'est une information générale sur les ressources et la syntaxe de Scheme adaptée à Lilypond.
>
>>
>> Je vais prendre un exemple extrêmement précis (donc limitatif par rapport à l'aide que je cherche) :
>>
>> Je crée des tablatures pour la guitare pour des chansons de Ane Brun.
>> Dans son interprétation de plusieurs chansons, elle utilise un open-tuning (accord ouvert) de ré (c'est-à-dire un accordage non conventionnel de la guitare).
>>
>> Or, il se trouve que certains de ses morceaux ne nécessitent pas vraiment cet accordage, peuvent être joués avec un accordage traditionnel (e b g d a e).
>>
>> Donc, je voudrais à partir d'un seul fichier lilypond pouvoir sortir les deux versions de la tablature des-dits morceaux.

···

Le 23 sept. 09 à 02:27, Phil a écrit :

>> Version 1 : la tablature du morceau en accordage normal
>> Version 2 : la tablature du morceau en open-tuning
>>
>
> Selon les cas, la technique pourra être assez différente, et c'est
> toujours plus facile de partir d'un exemple concret.
>
> Dans le cas que tu décris, voici comment on peut faire les choses.
>
> %%%%%%%%%%%%%% open-tuning-test.ly %%%%%%%%%%%%%%
> \version "2.13.4"
>
> %% To switch to open tuning, either compile the file with
> %% -dopen-tuning option, or uncomment the following line:
> %%#(ly:set-option 'open-tuning #t)
>
> \layout {
> \context {
> \TabStaff
> stringTunings = #(if (eqv? (ly:get-option 'open-tuning) #t)
> '(+2 -3 -6 -10 -15 -22)
> '(+4 -1 -5 -10 -15 -20))
> }
>
> \new TabStaff { c' d' e' f' }
> %%%%%%%%%%%%%% open-tuning-test.ly %%%%%%%%%%%%%%
>
> Les deux cas sont atteints de la manière suivante :
>
> lilypond open-tuning-test.ly
> ==> tablatures avec accordage normal
>
> lilypond -dopen-tuning open-tuning-test.ly
> ==> tablatures avec accordage open tuning
>
> Nicolas

Bonjour Valentin,

> en faire
> bénéficier toute la communauté en les ajoutant sur le LilyPond Snippet
> Repository !

Le problème est que je suis tout nouveau sur votre site, je n'en connais pas encore la déontologie et la philosophie, ni les besoins propres, et il m'est donc très difficile d'estimer la pertinence de ce type de fonction… J'ai l'impression qu'elle reste par trop particulière, et je ne voudrais pas polluer.

J'irai jeter un œil aux codes concernant déjà les open-tunings.

Bien à vous,

Phil

Valentin Villenave a écrit :

···

Et un petit bonus pour Phil (si je puis me permettre) : si de telles

> fonctions vous semblent intéressantes, n'hésitez pas à en faire
> bénéficier toute la communauté en les ajoutant sur le LilyPond Snippet
> Repository !
> http://lsr.dsi.unimi.it/
>
> Cordialement,
> Valentin
>

Bien au contraire, sans quoi je ne vous l'aurais pas suggéré.

La première étape est de vous créer un compte sur
https://lsr.dsi.unimi.it/list.php?type=usr

Puis d'aller sur https://lsr.dsi.unimi.it/list.php?type=snippet et de
créer votre "snippet" : un exemple minimum (comme celui de Nicolas),
un titre et une brève description.
Il y a également des "tags" que vous pouvez choisir dans la liste : en
l'occurence le tag "fretted strings" serait tout indiqué.

De toute façon, tous les snippets postés ainsi doivent être validés et
corrigés si nécessaire par le responsable du LSR (en l'occurrence
votre serviteur), donc n'hésitez pas à prendre de telles initiatives.

Cordialement,
Valentin Villenave.

···

2009/9/24 Phil <****@****>:

Le problème est que je suis tout nouveau sur votre site, je n'en connais pas
encore la déontologie et la philosophie, ni les besoins propres, et il m'est
donc très difficile d'estimer la pertinence de ce type de fonction… J'ai
l'impression qu'elle reste par trop particulière, et je ne voudrais pas
polluer.

1/ Est-ce du "pur" Scheme qui est utilisé dans Lilypond ? ou est-ce un
langage dérivé (de la même manière que Scheme est un langage dérivé de
Lisp — du peu que j'en sache)

Je peux pas te répondre sur ma "pureté" du scheme, mais simplement que
Lilypond utilise Guile dont
le manuel d'utilisation est ici :
http://www.gnu.org/software/guile/manual/guile.html
et en prticulier le chapitre 5 :
http://www.gnu.org/software/guile/manual/guile.html#API-Reference

2/ Peut-on utiliser toutes les ressources (I mean : boucles, opérateurs,
fonctions, etc. etc.) de Scheme dans le code Lilypond ?

A chaque fois que j'ai voulu utiliser les fonctions décrites dans le lien
ci-dessus, ça a marché ! ( euh enfin si, parfois ça plante, mais c'est
toujours une erreur de programation de ma part et non celle d'un non-support
d'une fonction Guile dans Lilypond)

- 'eqv' est l'opération à utiliser pour comparer deux expressions

Si tu veux en savoir plus sur les égalités, rendez-vous à
http://www.gnu.org/software/guile/manual/guile.html#Equality
< - true s'écrit #t et non pas ##t dans ce contexte-là
Dans Lilypond, on introduit du code Scheme (donc interprété par Guile) a
l'aide du caractère #.
Comme en Scheme, true et false se code #t et #f on peut se retrouver avec 2
# dans du code Lilypond :
Par exemple :
\override NoteHead.stencil = ##f
mais on aura
#(define une-variable #f)

Petite indication, théoriquement on peut taper du code Scheme sans passer
par Lilypond, en tapant :
                guile
en ligne de commande, mais ça ne marche pas directement sous Windows :
(pas chez moi en tout cas :
ERROR: In procedure primitive-load-path:
ERROR: Unable to find file "ice-9/boot-9.scm" in load path).
Une astuce consiste a créer un script (lanceGuile.bat par exemple) avec la
commande start qui permet de spécifier un répertoire de démarrage :
            start "" /B /D c:\Lilypond\usr guile
(modifier le chemin de Lilypond\usr selon sa config.)

Pour lancer un fichier *.scm, il faut rajouter l'option -l
            start "" /B /D c:\Lilypond\usr guile -l %1

Gilles

Je peux pas te répondre sur ma "pureté" du scheme

Euh, il fallait lire sur LA pureté du Scheme ...
Désolé ...

Gilles

Bonjour Gilles,

Un grand merci à toi, ce sont exactement les informations et renseignements que je cherchais !

Voilà, je suis comblé :wink:

Phil

Gilles THIBAULT a écrit :

···

1/ Est-ce du "pur" Scheme qui est utilisé dans Lilypond ? ou est-ce un
langage dérivé (de la même manière que Scheme est un langage dérivé de
Lisp — du peu que j'en sache)

Je peux pas te répondre sur ma "pureté" du scheme, mais simplement que
Lilypond utilise Guile dont
le manuel d'utilisation est ici :
Guile Reference Manual
et en prticulier le chapitre 5 :
Guile Reference Manual

2/ Peut-on utiliser toutes les ressources (I mean : boucles, opérateurs,
fonctions, etc. etc.) de Scheme dans le code Lilypond ?

A chaque fois que j'ai voulu utiliser les fonctions décrites dans le lien
ci-dessus, ça a marché ! ( euh enfin si, parfois ça plante, mais c'est
toujours une erreur de programation de ma part et non celle d'un non-support
d'une fonction Guile dans Lilypond)

- 'eqv' est l'opération à utiliser pour comparer deux expressions

Si tu veux en savoir plus sur les égalités, rendez-vous à
http://www.gnu.org/software/guile/manual/guile.html#Equality
< - true s'écrit #t et non pas ##t dans ce contexte-là
Dans Lilypond, on introduit du code Scheme (donc interprété par Guile) a
l'aide du caractère #.
Comme en Scheme, true et false se code #t et #f on peut se retrouver avec 2
# dans du code Lilypond :
Par exemple :
\override NoteHead.stencil = ##f
mais on aura
#(define une-variable #f)

Petite indication, théoriquement on peut taper du code Scheme sans passer
par Lilypond, en tapant :
               guile
en ligne de commande, mais ça ne marche pas directement sous Windows :
(pas chez moi en tout cas :
ERROR: In procedure primitive-load-path:
ERROR: Unable to find file "ice-9/boot-9.scm" in load path).
Une astuce consiste a créer un script (lanceGuile.bat par exemple) avec la
commande start qui permet de spécifier un répertoire de démarrage :
           start "" /B /D c:\Lilypond\usr guile
(modifier le chemin de Lilypond\usr selon sa config.)

Pour lancer un fichier *.scm, il faut rajouter l'option -l
           start "" /B /D c:\Lilypond\usr guile -l %1

Gilles