[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