[Top][All Lists]
[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