Subject: repeat en scheme ne marche pas comme je veux

From: Daniel Cartron <[email-masked]>
Date: Mon, 16 Mar 2015 12:39:39 +0100

Bonjour,

J'ai une fonction qui calcule des expressions musicales en fonction de 
certains paramètres, et j'injecte le résultat dans mon score avec un truc 
comme ça :
                #{ 
                  \repeat unfold $nb_trucs { $truc1 $truc2 } 
                #}
et ça fonctionne très bien. Mais comme truc2 ne doit pas toujours être écrit, 
un coup oui un coup non en fonction d'une condition écrite plus haut dans le 
code, j'ai imaginé d'écrire
                #{ 
                  \repeat unfold $nb_trucs { 
                        $truc1 
                        \repeat unfold $nb-truc2 [ $truc2 }
                    }
                #}
et si je met nb-truc2 = 0 ça s'affiche pas. Je trouve ça assez élégant et 
simple. Or si un repeat 0 donne le bon résultat directement dans une 
expression musicale, à savoir ne pas écrire la note, en scheme ça l'écrit qd 
mm...

Est-ce normal, ou un bug ? Ai-je un moyen de forcer ce comportement ?

J'avais au préalable essayé de mettre des if dans ces quelques lignes mais je 
me suis perdu dans les # et $ et ça plantait tout le temps. Et en plus je 
pense que ça compliquerait sacrément l'écriture.

Autre piste, est-il possible de créer un événement "null" qui remplacerait 
truc2 dans le code ci-dessus ?

Merci d'avance.

-- 
Cordialement, Daniel Cartron
«  Un homme qui parle trois langues est trilingue. Un homme qui parle deux 
langues est bilingue. Un homme qui ne parle qu'une langue est anglais. »
Claude Gagnière

---

From: Gilles THIBAULT <[email-masked]>
Date: Mon, 16 Mar 2015 23:42:07 +0100

> Est-ce normal, ou un bug ? Ai-je un moyen de forcer ce comportement ?
Bonjour Daniel.
Pour moi c'est un bug au niveau du parser

%%%%%%%%
%% Ici un  e'4 est affiché : le count 0 est transformé en count 1 !
{ 
  c'1 
   \repeat unfold 0 e'4    
}

%% Avec la version scheme de \repeat, 
%% e'4 n'ai pas affiché : c'est le résultat attendu
{ 
  c'1
  $(make-music 'UnfoldedRepeatedMusic
     'repeat-count 0 
     'element #{ e'4 #})
}

%%%%%%%%%%%

Il ne te reste plus qu'à faire ta propre fonction \repeat unfold, qui prendra 
elle aussi un paramètre "count" et un paramètre "music", mais qui sera batie 
avec la fonction scheme ci-dessus.

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Tue, 17 Mar 2015 07:03:05 +0100

> Bonjour Daniel.

Salut Gilles

> Pour moi c'est un bug au niveau du parser

C'était mon impression mais je préfère l'avis de "spécialistes" :-D

> Il ne te reste plus qu'à faire ta propre fonction \repeat unfold, qui
> prendra  elle aussi un paramètre "count" et un paramètre "music", mais qui
> sera batie avec la fonction scheme ci-dessus.

Ouah merci, je me voyais déjà obligè de tout repenser mon algo...

Le ${} ça sert à réinjecter du scheme dans du code lily ? Parce que si je 
pouvais dans 
>                         \repeat unfold $nb-truc2 [ $truc2 }
mettre un ou deux if ou autre ça serait encore plus pratique. Mais j'ai jamais 
trouvé comment faire...

En tout cas merci pour ça déjà.

-- 
Cordialement, Daniel Cartron
« Le chien est l'animal le plus vigilant; pourtant il dort toute la journée. »
Georg Christoph Lichtenberg

---

From: Daniel Cartron <[email-masked]>
Date: Tue, 17 Mar 2015 07:37:07 +0100

>   $(make-music 'UnfoldedRepeatedMusic

Bon je sens que je vais m'amuser... Parce qu'en réalité c'est plus complexe 
que l'exemple que j'avais donné :

  #{ 
    \repeat unfold $( * patn-rpt patn-dbl) { 
      \repeat unfold $bs-ptn {
        $bs	
        \repeat unfold $bs-rst { $rst }
      }	
      \repeat unfold $ch-ptn {
        $ch	
        \repeat unfold $ch-rst { $rst }
      }	
    }
  #}

et ça plante si j'essaye d'imbriquer des make-music 'UnfoldedRepeatedMusic les 
uns dans les autres, très certainement ces histoires de $ et # dans lesquels 
je me perds...

-- 
Cordialement, Daniel Cartron
« Pour être heureux avec les êtres, il ne faut leur demander que ce qu'ils 
peuvent donner. »
Tristan Bernard

---

From: Daniel Cartron <[email-masked]>
Date: Tue, 17 Mar 2015 08:02:40 +0100

> sera batie avec la fonction scheme ci-dessus.

Autre pb : si je met nb-truc2 à la place du 0 (parce que ça peut être 0 1 ou 
2) et truc2 à la place de e'4 ça marche pas, apparemment ce code ne récupère 
pas la valeur de mes variables...

-- 
Cordialement, Daniel Cartron
« Un idiot pauvre est un idiot. Un idiot riche est un riche. »
Lafitte

---

From: Christophe Pochon <[email-masked]>
Date: Tue, 17 Mar 2015 08:16:45 +0100

Bonjour,

Et ainsi ?

%------------------------

\version "2.19.15"

truc = #(define-music-function (parser location nb1 truc1 nb2 truc2)
(number? ly:music? number? ly:music? )

(if (> nb2 0)

#{ \repeat unfold $nb1 $truc1

\repeat unfold $nb2 $truc2 #}

 #{ \repeat unfold $nb1 $truc1

#}

)

)

\relative c' {

\truc #3 {c8 d} #4 {e8 f}

r4

\break

\truc #3 {c8 d} #0 {e8 f}

r4

}

%----------------------

Bonne journée,

Christophe

Christophe Pochon
http://www.christophe-pochon.com

Le 17 mars 2015 07:37, Daniel Cartron <[email-masked]> a écrit :

> _______________________________________________
> liste de diffusion lilypond-user-fr
> [email-masked]
> https://lists.gnu.org/mailman/listinfo/lilypond-user-fr
>

---

From: Gilles THIBAULT <[email-masked]>
Date: Tue, 17 Mar 2015 10:26:51 +0100

> > sera batie avec la fonction scheme ci-dessus.
Je pensais à un truc comme ça.

%%%%
myRepeat = #(define-music-function (parser location count music)(integer? 
ly:music?)
(make-music 'UnfoldedRepeatedMusic
     'repeat-count count 
     'element music))

{
  c'1 
  \myRepeat 4 e'4
}
{
  c'1 
  \myRepeat 0 e'4
}
%%%

NB
1- C'est bien maintenant, on a même plus besoin de mettre des # devant les 
nombres :-)
2- A la place de integer?, il faudrait positive?, mais positive? ne permet pas 
le cas count=0

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Tue, 17 Mar 2015 10:53:44 +0100

> Je pensais à un truc comme ça.

C'est tout simplement nickel !

Immense merci !

-- 
Cordialement, Daniel Cartron
« Si, ayant frappé ton prochain sur une joue, il te tend l'autre, frappe-le 
sur la même, ça lui apprendra à faire le malin. »
François Cavanna - Le saviez-vous ?

---

From: Gilles THIBAULT <[email-masked]>
Date: Tue, 17 Mar 2015 13:38:54 +0100

> prendra  elle aussi un paramètre "count" et un paramètre "music", mais
> qui sera batie avec la fonction scheme [..].
J'ai regardé dans les entrailles de Lilypond, où était la ligne de code qui 
transformait le count=0 en count=1.
Ce n'est pas au niveau du parser.
Dans le fichier music-functions.scm, il y a la fonction suivante (ligne 252 
chez moi) :

  (define-public (make-repeat name times main alts)
(ici le paramètre count s'appelle times)

et dans cette fonction, il y a la ligne 278 :

  (set! (ly:music-property r 'repeat-count) (max times 1))

C'est à dire que toute valeur inférieure à 1 est ramenée à 1.

Il faudrait, pour que count=0 soit accepté :

  (set! (ly:music-property r 'repeat-count) (max times 0))

Mais ça mettrait peut-être le bazar pour les \repeat tremolo ou autre. C'est à 
voir avec les développeurs (développeurs bien occupés par ailleurs...).

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Tue, 17 Mar 2015 14:52:34 +0100

Le mardi 17 mars 2015, 13:38:54 Gilles THIBAULT a écrit :
> Mais ça mettrait peut-être le bazar pour les \repeat tremolo ou autre. C'est
> à  voir avec les développeurs (développeurs bien occupés par ailleurs...).

Donc ta solution est la bonne, elle fonctionne je ne cherche pas plus loin, 
j'ai trop vu ce que ça donne d'aller essayer de trafiquer le" moteur" !

-- 
Cordialement, Daniel Cartron
« La ville d'Antibes et la ville de Biot vont fusionner. Leurs habitants 
s'appelleront désormais les Antibiotiques. »
Francis Blanche