Affichage conditionnel (if / else)

11 messages Options
Embed this post
Permalink
Phil-9

Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink
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)


_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Nicolas Sceaux

Re: Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink

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

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



_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Phil-9

Re: Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink
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 ;-)

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



_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Nicolas Sceaux

Re: Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink

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
>

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

_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Valentin Villenave

Re: Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink
2009/9/23 Nicolas Sceaux <[hidden email]>:
>     stringTunings = #(if (eqv? (ly:get-option 'open-tuning) #t)
>                          '(+2 -3 -6 -10 -15 -22)
>                          '(+4 -1 -5 -10 -15 -20))
>   }
> }

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



_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Phil-9

Re: Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink
In reply to this post by Nicolas Sceaux
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 ;-) ) : 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 :
 >
 > 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
 >>
 >
 > 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





_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Phil-9

Re: Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink
In reply to this post by Valentin Villenave
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
 >





_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Valentin Villenave

Re: Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink
2009/9/24 Phil <[hidden email]>:
> 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.

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.



_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Gilles THIBAULT

Re: Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink
In reply to this post by Phil-9


>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





_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Gilles THIBAULT

Re: Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink

> Je peux pas te répondre sur ma "pureté" du scheme
Euh, il fallait lire sur LA pureté du Scheme ...
Désolé ...

Gilles







_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Phil-9

Re: Affichage conditionnel (if / else)

Reply Threaded More More options
Print post
Permalink
In reply to this post by Gilles THIBAULT
Bonjour Gilles,

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

Voilà, je suis comblé ;-)

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



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