Subject: scheme extract-named-music

From: Daniel Cartron <[email-masked]>
Date: Sat, 25 Apr 2015 13:40:53 +0200

Bonjour,

J'utilise (il me semble que c'est du code que m'a donné Gilles) la fonction 
suivante :

makeTab = #(define-music-function (parser location mus) (ly:music?)
  (let ((notes (extract-named-music mus 'NoteEvent)))
    (for-each parse-music notes)
    mus
  )
)

Depuis bientôt deux semaines que je m'amuse avec ça j'arrive enfin à ce que je 
veux mais à un détail près : je veux pouvoir traiter aussi les grace notes, 
pas de pbs elles sont bien traitées par la fonction mais je ne récupère pas 
l'information que c'est une grace note, et j'en ai besoin.

Pire, je ne récupère pas du tout les accords.

Je suppose qu'il faut remplacer le terme NoteEvent par autre chose, mais quoi 
? 

Voici ce que je veux pouvoir faire :
- si c'est un NoteEvent :  (for-each parse-music notes), pas de changement ;
- si c'est un GraceMusic idem avec en plus (set! graceflag #t)
- si c'est EventChord idem aussi mais pour toutes les notes de l'accord, et un 
flag également.

Et de plus pour la suite j'aurai aussi besoin de pouvoir récupérer la 
métrique, et pouvoir ne traiter que la première note de l'accord, pas les 
autres.

De toute évidence il me faut mettre en place un (cond ... pur gérer tout ça 
mais comment ?

Merci d'avance pour vos conseils.

-- 
Cordialement, Daniel Cartron
« Quand on plante un oignon sous un saule, on n'obtient pas forcément un saule 
pleureur. »
François Cavanna - Le saviez-vous ?

---

From: Gilles THIBAULT <[email-masked]>
Date: Sun, 26 Apr 2015 22:41:08 +0200

>     (for-each parse-music notes)

extract-named-music accepte aussi une liste de symboles

%%%%%%%%%%%%%%
#(define (parse-music mus)
; traitement commun
(display "-----------\n")
(display-scheme-music mus)

; traitement particulier
(let((name (ly:music-property mus 'name)))
  (cond 
   ((eq? name 'NoteEvent)
    ; (....)
    )
     ((eq? name 'EventChord)
    ; (....)
    )
     ((eq? name 'GraceMusic)
    ; (....)
    ))  
))

makeTab = #(define-music-function (parser location mus) (ly:music?)
  (let ((notes (extract-named-music mus '(NoteEvent EventChord GraceMusic))))
    (for-each parse-music notes)
    mus
  )
)

music = \relative c' { <c e>4 d \grace dis8 e2 }

{ \makeTab \music }

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

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Mon, 27 Apr 2015 09:55:34 +0200

Le dimanche 26 avril 2015 22:41:08, vous avez écrit :
>   (let ((notes (extract-named-music mus '(NoteEvent EventChord
> GraceMusic)))) (for-each parse-music notes)
>     mus
>   )
> )
> 

Juste une question : il n'y a pas de traitement commun ou plus exactement 
c'est le  mm traitement à chaque fois :
- noteevent j'applique  la fonction parse-music
- grace note je met le drapeau graceflag à #t et j'applique la fonction parse-
music
- chordevent j'applique la fonction à chaque note de l'accord

Donc je me demande si on ne pourrait pas mettre le code conditionnel dans 
makeTab. Ou me faut-il une fonction intermédiaire pour ça ?

-- 
Cordialement, Daniel Cartron
« Cent mille âmes, combien cela peut-il faire d'hommes ? »
Jules Renard

---

From: Gilles THIBAULT <[email-masked]>
Date: Mon, 27 Apr 2015 11:38:23 +0200

L
> makeTab. Ou me faut-il une fonction intermédiaire pour ça ?
En fait, si on traite différemment chaque événement il vaut mieux utiliser 
directement music-map (mais ça marcherait aussi avec extract-named-music).

%%%%%%%%%%%%%%%
#(define (parse-note note)
(display "------ NOTE -----\n")
(display-scheme-music note))

#(define (parse-chord chord)
(display "**** CHORD ***\n")
(map 
  parse-note
  (extract-named-music chord  'NoteEvent))
(display "**** FIN CHORD ***\n\n"))

#(define (parse-grace grace)
(display "------ GRACE -----\n")
(display-scheme-music grace))

makeTab = #(define-music-function (parser location mus) (ly:music?)
(music-map
 (lambda(evt)
  (let((name (ly:music-property evt 'name)))
   (cond 
    ((eq? name 'NoteEvent)
      (parse-note evt))
    ((eq? name 'EventChord)
      (parse-chord evt))
    ((eq? name 'GraceMusic)
      (parse-grace evt)))
   evt))
 mus))  

{ \makeTab \music }

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

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Mon, 27 Apr 2015 12:15:45 +0200

> (display-scheme-music grace))

ok comme ça j'aime bien. Reste à vois si le code de christophe pour la 
métrique rentrera là-dedans aussi, mais si c'est le cas ce sera cool, 
j'arriverai bientôt au bout de mes peines. Pour la première partie en tout cas 
:-) J'ai pas fini de vous solliciter...

Et donc pour la fonction ci-dessus je suppose que j'écris juste

(set! graceflag #t)
(parse-note grace))

Pour les accords ce sera un peu plus complexe en fait, il va falloir que je 
réfléchisse à comment scinder ma grosse fonction en  plusieurs modules, ce sera 
plus facile à lire et plus souple.

Et encore un grand merci à tous !

-- 
Cordialement, Daniel Cartron
Dans un village, un barbier rase les gens qui ne se rasent pas eux-mêmes et 
seulement ceux-là. 
Question : le barbier se rase-t-il lui-même ?
Bertrand Russell

---

From: Christophe Pochon <[email-masked]>
Date: Mon, 27 Apr 2015 12:40:31 +0200

Et voilà une version avec la métrique :

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

#(define beatLen 0)

#(define beatStr 0)

#(define beatNum 0)

(map

parse-note

#(define (parse-timsig timsig)

(display "----- TIME SIGNATURE -----\n")

(set! beatLen(ly:music-property timsig 'denominator #f))

(set! beatStr (ly:music-property timsig 'beat-structure #f))

(set! beatNum (ly:music-property timsig 'numerator #f)))

(music-map

(lambda(evt)

(cond

((eq? name 'NoteEvent)

(parse-note evt))

((eq? name 'EventChord)

(parse-chord evt))

((eq? name 'GraceMusic)

(parse-grace evt))

((eq? name 'TimeSignatureMusic)

(parse-timsig evt)))

evt))

mus))

music = \relative c' { \time 4/4 <c e>4 d \grace dis8 e2 \time 7/4 c4 d e
e2 c }

{ \makeTab \music }

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

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

Le 27 avril 2015 12:15, Daniel Cartron <[email-masked]> a écrit :

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