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 09:20:36 +0100

On Dec 20, 2011, at 8:56 AM, address@hidden wrote:

> 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>
> }
> 

Et ben voilà je viens de me planter sur deux listes LilyPond (je n'ai pas 
encore fini mon café matinal...ça va...).  J'aurais dû préciser que j'ai 
utilisé la version de développement pour compiler le fichier - la fonction 
ly:stem::calc-stem-begin-position n'existe pas dans la version 2.14.2.  Tu peux 
grosso modo obtenir la même chose en utilisant (interval-center (ly:grob-extent 
nh (ly:grob-parent grob Y) Y)) où grob est la hampe et nh est la tête de note.

~Mike


reply via email to

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