Subject: scheme : type d' arguments pour \transpose

From: Gilles THIBAULT <[email-masked]>
Date: Fri, 30 Nov 2007 00:50:30 +0100

Bonjour tout le monde.
Qui pourrait me dire quel type je doit mettre à la place de (ly:music?) pour 
que la commande "\transpose c $note"  soit acceptée.
Pour le moment, on obtient le message :
"syntax error, unexpected MUSIC_IDENTIFIER, expecting NOTENAME_PITCH or 
TONICNAME_PITCH"

Merci

%%%%%%%%
\version "2.11.34"
A = { c2 e g }

accord = #(define-music-function (parser location note) (ly:music?)
#{
         \transpose c $note \relative { \A \A }
#})

\accord g,

%%%%%%%%%

---

From: Nicolas Sceaux <[email-masked]>
Date: Fri, 30 Nov 2007 23:18:48 +0100

Le 30 nov. 07 à 00:50, Gilles THIBAULT a écrit :

> Bonjour tout le monde.
> Qui pourrait me dire quel type je doit mettre à la place de  
> (ly:music?) pour que la commande "\transpose c $note"  soit acceptée.
> "syntax error, unexpected MUSIC_IDENTIFIER, expecting NOTENAME_PITCH  
> or TONICNAME_PITCH"
>
> Merci
>
> %%%%%%%%
> \version "2.11.34"
> A = { c2 e g }
>

Ce n'est pas malheureusement pas possible de faire ça de façon aussi  
simple.

Quand tu écris :

   \accord g,

LilyPondva évaluer l'expression entre #{ #} en remplaçant le $note
par un identifiant dont la valeur est celle passée en argument à ta
fonction, c'est-à-dire quelque chose d'équivalent à :

   tmpVariable = g,
   \transpose c \tmpVariable \relative { \A \A }

Or ceci n'est pas une expression LilyPond correcte, le message  
d'erreur que tu
obtiens signifie que à la place de l'identifant (MUSIC_IDENTIFIER), le  
parser
pensait trouver un nom de note (NOTENAME_PITCH or TONICNAME_PITCH).  
Ca, c'est
pour la mauvaise nouvelle.

Mais il y a tout de même une solution. Pour faire ce que tu souhaites,  
la
première étape consiste à écrire l'expression que tu veux construire  
avec
ta fonction, et voir à quoi elle ressemble en Scheme, en utilisant
\displayMusic:

   \displayMusic \transpose g, \relative { \A \A }

Ensuite, il s'agira de faire une fonction qui construit une expression  
de ce type,
en remplaçant la partie qui correspond au "g," par l'argument de ta  
fonction (la
variable note), et idem pour la variable A.

nicolas

---

From: Gilles THIBAULT <[email-masked]>
Date: Sat, 01 Dec 2007 00:20:25 +0100

Merci de ta réponse.
>Mais il y a tout de même une solution. Pour faire ce que tu souhaites,  la
>première étape consiste à écrire l'expression que tu veux construire  avec

C'est bien ce que j'avais essayé, mais voilà un extrait de ce que ça donne 
pour
        A = \relative { c'2 e g }
        \displayMusic \transpose c g, \A
=>
%%%%%%%%%%%%%%
(make-music
  'TransposedMusic
  'element
  (make-music
    'RelativeOctaveMusic
    'element
    (make-music
      'SequentialMusic
      'elements
      (list (make-music
              'EventChord
              'elements
              (list (make-music
                      'NoteEvent
                      'duration
                      (ly:make-duration 1 0 1 1)
                      'pitch
                      (ly:make-pitch 0 4 0))))
            (make-music .....
%%%%%%%%%%%%%

Comme on peut le voir, il n'y a aucune trace de g' dans la représentation 
donnée par \displayMusic. Le listing ci-dessus correspond à la liste déjà 
développée et transposée = {g'2 b' d''}:   (le  (ly:make-pitch 0 4 0) 
correspond à g'2). Le  * 'TransposedMusic* sert simplement à indiquer que la 
musique a été transposée mais aucune trace de combien elle l'a été ...
Je ne vois pas bien comment je pourrais me servir des renseignements fournis 
ici.

Gilles