lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 2 questions pour la Berceuse de Chopin.


From: address@hidden
Subject: Re: 2 questions pour la Berceuse de Chopin.
Date: Tue, 20 Dec 2011 08:56:13 +0100

On Dec 19, 2011, at 10:45 PM, address@hidden wrote:

> On Dec 19, 2011, at 10:27 PM, Xavier Scheuer wrote:
> 
>> 2011/12/19 Phil Hézaine <address@hidden>:
>>> Bonsoir à tous,
>>> 
>>> Ci-joint 2 images et un fichier.ly qui montrent les problèmes.
>>> 
>>> 1. Est-il possible de séparer les 2 têtes de notes sol bemol-sol comme l'on
>>> peut voir sur Chopin-1.png ?
>> 
>> Je n'aurais pas trouvé si quelqu'un n'avait pas posé la même question
>> sur la liste internationale aujourd'hui aussi.  Tu peux te baser sur
>> le snippet suivant, bien que la solution ne soit pas élégante.
>> http://lsr.dsi.unimi.it/LSR/Item?id=505
> 
> C'est jouable - quelques pistes à explorer :
> 
> 1)    Il faut un \override pour le grob NoteCollision, propriété 
> positioning-done.  Il suffit d'écrire une fonction qui crée le bon écart 
> entre les têtes de notes (les têtes de notes sont stockées dans l'objet 
> "note-heads" du Stem (hampe) - utilise ly:grob-translate-axis! pour décaler 
> les notes).
> 2)    Ensuite, il faut un \override pour la propriété stencil qui cherche les 
> têtes de notes (encore une fois stockées dans l'objet note-heads) et qui 
> dessine des traits entre (+ (ly:grob-property stem 'stem-end-position) (* 
> (ly:grob-property stem 'direction) (ly:grob-property stem 'length))) et les 
> bords des notes.
> 
> Avec cette solution, LilyPond intègre les écarts entre les notes dans son 
> engin d'espacement horizontal - il ne faut plus bidouiller avec extra-offset 
> (qui, à mon avis, est à proscrire dans 99 % des cas).
> 
> Bonne schemage !
> 
> Bien à toi,
> ~Mike

Je me suis trompé de grob - il faut faire l'\override de positioning-done avec 
Stem.

Voici une esquisse du fonctionnement souhaité :

#(define note-head-shift 2)

#(define (positioning-done grob)
 (let ((nh (ly:grob-array->list (ly:grob-object grob 'note-heads))))
   (for-each
     (lambda (x y)
     (ly:grob-translate-axis! x (* note-head-shift y) X))
     nh (iota (length nh))))
 0.0)

#(define (stencil grob)
(let*
  ((pc (ly:grob-parent (ly:grob-parent grob X) X))
   (dir (ly:grob-property grob 'direction))
   (half-space (* 0.5 (ly:staff-symbol-staff-space grob)))
   (y1 (* half-space (ly:stem::calc-stem-begin-position grob)))
   (y2 (* half-space (ly:stem::calc-stem-end-position grob)))
   (nh (ly:grob-array->list (ly:grob-object grob 'note-heads)))
   (x (ly:grob-relative-coordinate (car nh) pc X))
   (thick (* (ly:grob-property grob 'thickness)
             (ly:staff-symbol-line-thickness grob))))
   (apply
     ly:stencil-add
     (map (lambda (nh)
            (let ((my-x (car (ly:grob-extent nh pc X))))
              (make-line-stencil thick x y2 my-x y1)))
          nh))))

\relative c' {
 \override Stem #'positioning-done = #positioning-done
 \override Stem #'stencil = #stencil
 <d d d> <d d d d d> <d d d> <d d d d d d d>
}

\relative c'' {
 \override Stem #'positioning-done = #positioning-done
 \override Stem #'stencil = #stencil
 <d d d> <d d d d d> <d d d> <d d d d d d d>
}

Cordialement,
~Mike


reply via email to

[Prev in Thread] Current Thread [Next in Thread]