"\repeat unfold" dans define-music-function

classic Classique list Liste threaded Arborescence
2 messages Options
Répondre | Arborescence
Ouvrir ce message en vue arborescente
|

"\repeat unfold" dans define-music-function

Rémy

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

 


_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
https://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Répondre | Arborescence
Ouvrir ce message en vue arborescente
|

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

gillesth
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
>
> (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"|."
>
> }
>
> }
>

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

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