2017-01-10 13:40 GMT+01:00 <cla...@mailbox.org>: > 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 > lilypond-user@gnu.org > https://lists.gnu.org/mailman/listinfo/lilypond-user _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user