Subject: Affichage conditionnel (if / else)

From: Phil <[email-masked]>
Date: Tue, 22 Sep 2009 11:41:00 +0200

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)

---

From: Nicolas Sceaux <[email-masked]>
Date: Tue, 22 Sep 2009 22:02:13 +0200

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.
>
> permettant entre autres choses de sortir plusieurs versions d'une  
> même partition en changeant simplement une variable).
>
> 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 ?
>

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

---

From: Phil <[email-masked]>
Date: Wed, 23 Sep 2009 02:27:20 +0200

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

---

From: Nicolas Sceaux <[email-masked]>
Date: Wed, 23 Sep 2009 21:07:41 +0200

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.

> Dans son interprétation de plusieurs chansons, elle utilise un open- 
> tuning (accord ouvert) de ré (c'est-à-dire un accordage non  
> Donc, je voudrais à partir d'un seul fichier lilypond pouvoir sortir  
> les deux versions de la tablature des-dits morceaux.

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

---

From: Valentin Villenave <[email-masked]>
Date: Wed, 23 Sep 2009 21:45:49 +0200

>     stringTunings = #(if (eqv? (ly:get-option 'open-tuning) #t)

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

---

From: Phil <[email-masked]>
Date: Thu, 24 Sep 2009 10:38:16 +0200

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

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

---

From: Phil <[email-masked]>
Date: Thu, 24 Sep 2009 10:43:02 +0200

Bonjour Valentin,

 > en faire

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

---

From: Valentin Villenave <[email-masked]>
Date: Thu, 24 Sep 2009 12:51:52 +0200

2009/9/24 Phil <[email-masked]>:
> 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.

---

From: "Gilles THIBAULT" <[email-masked]>
Date: Thu, 24 Sep 2009 15:46:43 +0200

>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

>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

---

From: "Gilles THIBAULT" <[email-masked]>
Date: Thu, 24 Sep 2009 16:04:21 +0200

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

Gilles

---

From: Phil <[email-masked]>
Date: Thu, 24 Sep 2009 16:09:29 +0200

Bonjour Gilles,

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

Voilà, je suis comblé ;-)

Phil