lilypond-user
[Top][All Lists]
Advanced

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

Re: Changing orientation of noteheads in tuplets


From: Thomas Morley
Subject: Re: Changing orientation of noteheads in tuplets
Date: Tue, 10 Jan 2017 21:46:32 +0100

2017-01-10 13:40 GMT+01:00  <address@hidden>:
> Hello everybody,
>
> I'm having a problem with beams when using
>
> http://lsr.di.unimi.it/LSR/Item?id=861
>
> to change the direction of noteheads of chords that are part of a tuplet.
> The beams just disappear, and If the tuplet is more complex, like 14/8, it 
> gets really bad.
>
> Would anybody have an idea, how I could "fix" this?
> Here's my simplified example:
>
> %% BEGIN OF EXAMPLE
>
> #(define ((shift offsets) grob)
> "Defines how NoteHeads should be moved according to the given list of 
> offsets."
>  (let* (
>  ;; NoteHeads
>         ;; Get the NoteHeads of the NoteColumn
>         (note-heads (ly:grob-array->list (ly:grob-object grob 'note-heads)))
>         ;; Get their durations
>         (nh-duration-log
>           (map
>             (lambda (note-head-grobs)
>               (ly:grob-property note-head-grobs 'duration-log))
>             note-heads))
>         ;; Get the stencils of the NoteHeads
>         (nh-stencils
>           (map
>             (lambda (note-head-grobs)
>               (ly:grob-property note-head-grobs 'stencil))
>             note-heads))
>         ;; Get their length in X-axis-direction
>         (stencils-x-lengths
>           (map
>             (lambda (x)
>                 (let* ((stencil (ly:grob-property x 'stencil))
>                        (stencil-X-exts (ly:stencil-extent stencil X))
>                        (stencil-lengths (interval-length stencil-X-exts)))
>                 stencil-lengths))
>              note-heads))
>  ;; Stem
>         (stem (ly:grob-object grob 'stem))
>         (stem-thick (ly:grob-property stem 'thickness 1.3))
>         (stem-stil (ly:grob-property stem 'stencil))
>         (stem-x-width (if (ly:stencil? stem-stil)
>                          (interval-length (ly:stencil-extent stem-stil X))
>                          ;; if no stem-stencil use 'thickness-property
>                          (/ stem-thick 10)))
>         (stem-dir (ly:grob-property stem 'direction))
>         ;; Calculate a value to compensate the stem-extension
>         (stem-x-corr
>           (map
>             (lambda (q)
>                ;; TODO better coding if (<= log 0)
>                (cond ((and (= q 0) (= stem-dir 1))
>                       (* -1 (+ 2  (* -4 stem-x-width))))
>                      ((and (< q 0) (= stem-dir 1))
>                       (* -1 (+ 2  (* -1 stem-x-width))))
>                      ((< q 0)
>                       (* 2 stem-x-width))
>                      (else (/ stem-x-width 2))))
>              nh-duration-log)))
>  ;; Final Calculation for moving the NoteHeads
>    (for-each
>      (lambda (nh nh-x-length off x-corr)
>          (if (= off 0)
>            #f
>            (ly:grob-translate-axis! nh (* off (- nh-x-length x-corr)) X)))
>      note-heads stencils-x-lengths offsets stem-x-corr)))
>
> displaceHeads =
> #(define-music-function (parser location offsets) (list?)
> "
>  Moves the NoteHeads, using (shift offsets)
> "
>  #{
>    \once \override NoteColumn.before-line-breaking = #(shift offsets)

%% Try instead:
     \once \override NoteColumn.after-line-breaking = #(shift offsets)
%% Though, not sure it will always work,
%% Please report back.

%% Cheers,
%%   Harm

>  #})
>
> adjustStem =
> #(define-music-function (parser location val)(pair?)
> "
>  Adjust 'stem-attachment via
>  adding multiples of the stem-width to the x-default (car val)
>  and multiplying the y-default with (cdr val).
> "
> #{
>    \once \override NoteHead.before-line-breaking =
>    #(lambda (grob)
>      (let* ((stem-at (ly:grob-property grob 'stem-attachment))
>             (stem (ly:grob-object grob 'stem))
>             (stem-x-width (interval-length (ly:grob-property stem 
> 'X-extent))))
>      (ly:grob-set-property!
>        grob
>        'stem-attachment
>        (cons (+ (car stem-at) (* stem-x-width (car val))) (* (cdr val) (cdr 
> stem-at)))
>        )))
> #})
>
> setOtherScriptParent =
> #(define-music-function (parser location which-note-head)(integer?)
> "
>  If the parent-NoteHead of a Script is moved, another parent from the
>  NoteColumn could be chosen.
>  The NoteHeads are numbered 1 2 3 ...
>  not 0 1 2 ...
> "
> #{
>         %% Let "staccato" be centered on NoteHead, if Stem 'direction is 
> forced
>         %% with \stemUp, \stemDown, \voiceOne, \voiceTwo etc
>         \once \override Script.toward-stem-shift = #0
>
>         \once \override Script.after-line-breaking =
>           #(lambda (grob)
>              (let* ((note-head (ly:grob-parent grob X))
>                     (note-column (ly:grob-parent note-head X))
>                     (note-heads-list
>                       (ly:grob-array->list
>                         (ly:grob-object note-column 'note-heads)))
>                     (count-note-heads (length note-heads-list)))
>              (if (> which-note-head count-note-heads)
>                (ly:warning "Can't find specified note-head - ignoring")
>                (set! (ly:grob-parent grob X)
>                      (list-ref note-heads-list (- which-note-head 1))))))
> #})
>
>
> %%%%%%%% LSR EXAMPLE %%%%%%%%
>
> originalMusic = \relative c' {
>   e4
>   d'
>   <c, e>
>   <e'g>
>   <f, a c>
>   <c' e g>
>   <ees f a c>
>   <ees, f a c>---.-!
>   \tuplet 3/2 { <g ais cis e>8 q q }
> }
>
> alteredMusic = \relative c' {
>
>   \displaceHeads #'(1)
>   \adjustStem #'(0.75 . -1)
>   e4
>
>   \displaceHeads #'(-1)
>   \adjustStem #'(0.75 . -1)
>   d'
>
>    \displaceHeads #'(0 1)
>    <c, e>
>
>    \displaceHeads #'(-1 0)
>    <e' g>
>
>   \displaceHeads #'(1 0 0)
>   \adjustStem #'(0.75 . -1)
>   <f, a c>
>
>   \displaceHeads #'(-1 -1 0)
>   <c' e g>
>
>   \displaceHeads #'(1 -1 0 0)
>   <ees f a c>
>
>   \setOtherScriptParent #2
>   \adjustStem #'(0.75 . -1)
>   \displaceHeads #'(1 -1 0 0)
>   <ees, f a c>---.-!
>
>
>   \tuplet 3/2 { \displaceHeads #'(1 -1 0 0) <g ais cis e>8 \displaceHeads 
> #'(1 -1 0 0) <g ais cis e>8 \displaceHeads #'(1 -1 0 0) <g ais cis e>8  }
> }
>
> <<
>   \new Staff \with { instrumentName = "original " }{
>     \originalMusic
>   }
>   \new Staff \with { instrumentName = "altered " }{
>     \alteredMusic
>   }
>>>
>
> %% END OF EXAMPLE
>
> Thanks for any idea with this!
> Kind regards
>
> Orlando López
> Hamburg
>
> _______________________________________________
> lilypond-user mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/lilypond-user



reply via email to

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