Subject: "\repeat unfold" dans define-music-function

From: Remy CLAVERIE <[email-masked]>
Date: Tue, 10 Oct 2017 10:17:09 +0200 (CEST)

Bonjour à tous,

Je commence à apprendre à programmer mes propres functions musicales. J'y vais doucement car je ne connais pas Scheme.

Je souhaite écrire une fonction qui me permette d'intérer du texte au milieu d'une portée. Pour cela, je me suis inspiré du Snippet http://lsr.di.unimi.it/LSR/Item?id=198 .

Voici mon code :

\version "2.16.2"

InsertTextInOpenStaff =

#(define-music-function

(parser location text lspace rspace XYoff) (markup? number? number? number-pair?)

#{

\cadenzaOn

\stopStaff

\repeat unfold 1 { s4 \noBreak \bar "" }

\once \override TextScript #'extra-offset = #XYoff

<>^\markup #text

\repeat unfold 5 { s4 \noBreak \bar "" }

\cadenzaOff

\startStaff % Resume bar count and show staff lines again

\once \override Staff . KeySignature #'break-visibility = #all-visible

\once \override Staff . Clef #'break-visibility = #all-visible

#}

)

{

\clef treble

\key g \major

\time 4/4

\relative c'' {

\repeat unfold 9 { c4 c c c }

\InsertTextInOpenStaff \markup { \bold "toto et titi" } #1 #3 #'( 0 . -1.2 )

\repeat unfold 5 { c4 c c c }{ d d d e } { e e e f } { f f f g }

c,1

\bar"|."

}

}

La focntion InsertTextInOpenStaff possède 4 arguments. Le premier est le texte que je souhaite insérer, le deuxième est l'espace que je veux à gauche du texte (à droite pour l'argument 3) et le dernier, est une paire de nombres qui me permet de centrer le texte. L'exemple précédent, fonctionne car lspace et rspace ne sont pas utilisés ; à la place, j'ai mis des constantes (resp. 1 et 5).

Si je remplace "\repeat unfold 1" par "\repeat unfold #lspace", j'obtiens l'erreur :

> Erreur : syntax error, unexpected STRING, expecting UNSIGNED or NUMBER_IDENTIFIER

\repeat unfold 

#lspace { s4 \noBreak \bar "" }

Et je ne vois pas pourquoi, car j'utilise la même syntaxe que l'exemple 5.6.2 de la documentation. C'est peut être la fonction 'repeat' qui ne s'utilise pas comme cela dans une fonction.

Je n'ai rien trouvé grâce à google qui m'aide vraiment.

L'un de vous a t-il une idée ??

Merci de votre aide,

Rémy

---

From: Gilles Thibault <[email-masked]>
Date: Mon, 16 Oct 2017 23:47:11 +0200

Le 2017-10-10 10:17, Remy CLAVERIE a écrit :
> Bonjour à tous,
> 
> 
> 
> Je commence à apprendre à programmer mes propres functions musicales.
> J'y vais doucement car je ne connais pas Scheme.
> 
> Je souhaite écrire une fonction qui me permette d'intérer du texte au
> milieu d'une portée. Pour cela, je me suis inspiré du Snippet
> http://lsr.di.unimi.it/LSR/Item?id=198 .
> 
> Voici mon code :
> 
> 
> 
> \version "2.16.2"
> 
> InsertTextInOpenStaff =
> 
> #(define-music-function
> 

Bonjour Remy. Personne ne t'as répondu car beaucoup utilise la version 
2.19 et la syntaxe pour les fonctions a changé.
En l'adaptant en version 2.19, tout semble bien marcher ici, on n'a pas 
le message d'erreur

%%%%%%%%%%%%%%%%
\version "2.19.61"

InsertTextInOpenStaff = #(define-music-function (text lspace rspace 
XYoff) (markup? number? number? number-pair?)
#{
\cadenzaOn
\stopStaff
\repeat unfold #lspace { s4 \noBreak \bar "" }
\once \override TextScript #'extra-offset = #XYoff
<>^\markup #text
\repeat unfold #rspace { s4 \noBreak \bar "" }
\cadenzaOff
\startStaff % Resume bar count and show staff lines again
\once \override Staff.KeySignature #'break-visibility = #all-visible
\once \override Staff.Clef #'break-visibility = #all-visible
#})

\relative c'' {
\repeat unfold 2 { c'4 c' c' c' }
\InsertTextInOpenStaff \markup { \bold "toto et titi" } #5 #3 #'( 0 . 
-1.2 )
\repeat unfold 2 { c'4 c' c' c' }
c,1
\bar"|."

}

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

Pour les versions 2.16 et 2.18, il faut effectivement rajouter les 
paramètres parser et location
InsertTextInOpenStaff = #(define-music-function (parser location text 
lspace rspace XYoff) (markup? number? number? number-pair?)
Si ça ne marche pas pour la version 2.16, on peux créer sa propre 
fonction de répétitions

#(define (n-copy n music)
(cond
   ((> n 1)(ly:music-deep-copy (make-sequential-music (make-list n 
music))))
   ((= n 1) music)
   (else (make-music 'Music 'void #t))))

% version 2.16, 2.18
nCopy = #(define-music-function (parser location n music)(integer? 
ly:music?)
(n-copy n music))

% version 2.19
nCopy = #(define-music-function (n music)(integer? ly:music?)
(n-copy n music))

NB
Attention, nCopy utilisé à l'intérieur d'un mode \relative peut créer 
des choses bizarres.

-- 
Gilles