Subject: erreur dans fonction scheme

From: Daniel Cartron <[email-masked]>
Date: Mon, 27 May 2013 09:37:48 +0200

Bonjour, 

Comme ça fait un bon moment que je patauge, je me permet de vous solliciter.

dans une fonction j'ai écrit 

			#(cond 
				((and #upperline #lowerline)
					#{ #(color-staff-lines white black black white) #})
				(else #{ #(color-staff-lines white black white) #})
			)

et ça marche.

maintenant je veux agrandir ma condition et ajouter deux choses dans le 
(and...)

#(define upperline #f)
#(define lowerline #f)

			#(cond 
				(
					(and (member kbd threerows) (string=? syst "corg") #upperline 
(not #lowerline) )
					#{ #(color-staff-lines white black black white) #}
				)
				(else #{ #(color-staff-lines white black white) #})
			)

et là ça plante, il y a une ( de trop qq part... Idem si je n'ajoute que le 
#upperline.

J'ai mis un tas de retour ligne pour essayer d'y voir clair, je ne vois 
toujours pas...

Merci

-- 
Cordialement, Daniel Cartron
« Comme l'a dit Saint Jérôme, qu'importent les chemins par lesquels on vient à 
la Vérité, pourvu qu'on donne à la quête. »
François Cavanna - 4 rue Choron

---

From: Gilles <[email-masked]>
Date: Mon, 27 May 2013 10:35:59 +0200

Le Mon, 27 May 2013 09:37:48 +0200, Daniel Cartron <[email-masked]> a  

> 				(else #{ #(color-staff-lines white black white) #})

Je crois qu'il y a un peu trop de #
# sert à utiliser une expression scheme à l'intérieur d'une expression  
Lilypond. Comme l'expression commence par #(cond, tu es à l'intérieur  
d'une expression scheme. Je suis même étonné que #upperline soit compris  
par le parser scheme.
Pour color-staff-lines, je suppose que c'est une fonction scheme, vu les  
tirets dans le nom ( ça serait colorStaffLines pour être valide en  
Lilypond). En gros avec
   #{ #color-staff-lines  ..., tu demandes d'importer du Lilypond dans du  
scheme, puis du scheme dans du lilypond. C'est un peu lourd, mais  
effectivement ça devrait marcher. Par contre, apparemment cette fonction  
prend un nombre aléatoire d'arguments (ici 4 ou 3). C'est possible, mais  
est-ce bien le cas ?
Cette version devrait être déjà plus allégée :

#(cond
   ((and upperline lowerline)
      (color-staff-lines white black black white) ; 4 arguments
   (else
      (color-staff-lines white black white)))     % 3 arguments

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Mon, 27 May 2013 11:47:32 +0200

> d'une expression scheme. Je suis même étonné que #upperline soit compris  

C'était bien ça, fallait pas de #devant upperline. L'exemple qui marchait 
soit-disant n'était pas le bon, erreur de copier coller...

> effectivement ça devrait marcher. 

j'ai déjà dit hier que je fais certainement du code bourrin, mais je suis 
total newbie, alors....

> Par contre, apparemment cette fonction  

oui

>       (color-staff-lines white black white)))     % 3 arguments

ben ça non ça marche pas.

Et en plus mon code est vraiment plus complecxe, j'ai allégé pour poser la 
question (d'où l'erreur de copie).

Mais bon maintenant ça marche alors je ne cherche pas plus loin, un jour je 
soumettrai tout ça à votre sagacité si qqun a envie de me corriger.

-- 
Cordialement, Daniel Cartron
« La première chose qui frappe l'odorat du voyageur arrivant à Venise, c'est 
l'absence totale de parfum de crottin de cheval. »
Alphonse Allais

---

From: Daniel Cartron <[email-masked]>
Date: Mon, 27 May 2013 12:07:27 +0200

Le lundi 27 mai 2013 10:35:59 Gilles a écrit :
> tu demandes d'importer du Lilypond dans du  
> scheme, puis du scheme dans du lilypond.

Je reviens là-dessus car ce n'est pas tout à fait comme ça que je vois les 
choses et si je suis plus clair sans doute l'aide sera plus efficace.

Je suis dans du lilypond, à savoir
nomStaffSetup = \with {....

et comme j'ai besoin de moduler un override en fonction de plusieurs variables 
scheme, là je rentre dans du scheme, qui analyse les variables, et qui exporte 
du lilypond en fonction de l'analyse.

Je ne vois pas bien comment faire autrement, mais si ça peut se faire plus 
simplement, je suis preneur. Je peux aussi envoyer le code complet si c'est 
nécessaire.

-- 
Cordialement, Daniel Cartron
« On ne voit bien qu'avec le coeur. L'essentiel est invisible pour les yeux. »
Antoine de Saint-Exupéry - Le petit prince

---

From: Gilles <[email-masked]>
Date: Mon, 27 May 2013 16:07:35 +0200

>>       (color-staff-lines white black white)))     % 3 arguments
Ah, j'ai trouvé le color-staff-lines auquel tu faisais référence :
http://lsr.dsi.unimi.it/LSR/Item?id=700

En principe quand on veut changer de fonction pour un stencil elle doit  
être de la forme
   #(lambda(grob) ...
Dans le snippet,
  ... #'stencil = #(color-staff-lines ....) est équivalent à
  ... #'stencil = #(lambda(grob)((color-staff-lines ...) grob)))
Apparemment, Lilypond ne comprend plus quand il y a une instruction (cond

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

#(define upperline #f)
#(define lowerline #f)

\relative c' {
   \override Staff.StaffSymbol #'stencil = #(cond
     ((and upperline lowerline)
        (lambda(grob)((color-staff-lines white black red white) grob))) ;  
en rouge
      (else
        (lambda(grob)((color-staff-lines white green white) grob)))) % en  
vert
   c1   %% en vert
}

#(define upperline #t)
#(define lowerline #t)

\relative c' {
   \override Staff.StaffSymbol #'stencil = #(cond
     ((and upperline lowerline)
        (lambda(grob)((color-staff-lines white black red white) grob))) ;  
en rouge
      (else
        (lambda(grob)((color-staff-lines white green white) grob)))) % en  
vert
   c1   %% en rouge
}

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

Il faut réécrire 2 fois la fonction, car sinon upperline et lowerline ne  
sont pas réévaluées.
En particulier avec un \with ça ne marche pas :

%%%%%%%%%%%%%%%%%%%%%%%%%%% avec \with
#(define upperline #f)
#(define lowerline #f)
staffSet = \with { \override StaffSymbol #'stencil = #(cond
     ((and upperline lowerline)
        (lambda(grob)((color-staff-lines white black red white) grob))) ;  
en rouge
      (else
        (lambda(grob)((color-staff-lines white green white) grob)))) % en  
vert
     }

\new Staff \with { \staffSet } \relative c' {
   c1   % en vert : OK
}

#(define upperline #t)
#(define lowerline #t)

\new Staff \with { \staffSet } \relative c' {
   c1   % en vert : pas OK :-(
}

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

Ça doit marcher (non testé) si on met les réglages dans un \include, après  
les variables

% morceau 1
#(define upperline #f)
#(define lowerline #f)
\include "mesreglages.ly"

% morceau 2
#(define upperline #t)
#(define lowerline #t)
\include "mesreglages.ly"

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Mon, 27 May 2013 16:35:55 +0200

> En particulier avec un \with ça ne marche pas :

j'ai pas encore pris le tps de comprendre tout ce que tu as écrit mais ça 
marche avec ce code :

#(define syst "cadb")
#(define upperline #t)
#(define lowerline #t)	

les lignes précédentes sont à adapter à ce qu'on veut, puis :

diatoTab = \with {
	\override StaffSymbol #'line-count = 
			#(if (and (member kbd threerows) (string=? syst "corg"))
				#{ #3 #}
				#{ #2 #}
			)
	\override StaffSymbol #'line-positions = 
			#(if (and (member kbd threerows) (string=? syst "corg"))
				#{ #'(-12 -5.8 0.4 6.6) #}
				#{ #'(-12 -5.8 0.4) #}
			)
	\override StaffSymbol #'stencil = 
			 #(cond 
				((and (member kbd threerows) (string=? syst "corg") (not 
upperline) (not lowerline))
					#{ #(color-staff-lines white black black white) #})
				((and (member kbd threerows) (string=? syst "corg") upperline 
(not lowerline))
					#{ #(color-staff-lines white black black black) #})
				((and (member kbd threerows) (string=? syst "corg") (not 
upperline) lowerline)
					#{ #(color-staff-lines black black black white) #})
				((and (member kbd threerows) (string=? syst "corg") upperline 
lowerline)
					#{ #(color-staff-lines black black black black) #})
				((and (or (not (member kbd threerows)) (string=? syst "cadb")) 
(not upperline) (not lowerline))
					#{ #(color-staff-lines white black white) #})
				((and (or (not (member kbd threerows)) (string=? syst "cadb")) 
upperline (not lowerline))
					#{ #(color-staff-lines white black black) #})
				((and (or (not (member kbd threerows)) (string=? syst "cadb")) 
(not upperline) lowerline)
					#{ #(color-staff-lines black black white) #})
				(else #{ #(color-staff-lines black black black) #})
			)
}

il y a des tas d'autres override en plus mais hors sujet
et ensuite 

\new Staff \with { \diatoTab }

affiche ce que je veux avec le nombre de lignes visibles ou non, dès que je 
change une des lignes du début et que je recompile j'ai la nouvelle version.

-- 
Cordialement, Daniel Cartron
« Le rire n'est jamais gratuit : l'homme donne à pleurer mais prête à rire. 
»
Pierre Desproges - Fonds de tiroir

---

From: Gilles <[email-masked]>
Date: Mon, 27 May 2013 17:10:22 +0200

> change une des lignes du début et que je recompile j'ai la nouvelle  
Si tu compiles séparément chaque morceaux, ok pas de problèmes. As tu  
essayé de mettre plusieurs morceaux à la suite, dans le même fichier (pour  
faire un \book par exemple) ? Bon ça devrait marcher dans la mesure où tu  
redéclares à chaque fois diatoTab, et ceci après tes variables.

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Mon, 27 May 2013 17:18:33 +0200

> redéclares à chaque fois diatoTab, et ceci après tes variables.

Non je n'ai pas essayé ça, ce n'est tout simplement pas dans mon projet actuel 
mais je te remercie d'attirer mon attention sur ce point. Mais comme j'ai 
jamais utilisé \book c'est encore une chose qui devra attendre...

-- 
Cordialement, Daniel Cartron
« Rien ne contribue davantage à la sérénité de l'âme que de n'avoir aucune 
opinion. »
Georg Christoph Lichtenberg