Another option for the line breading is to give the target final note
for a system, hide it (basically the last note in your example). then
in the next system. do the same with the starting note on the left
side and hide it. Kind of a hack, but could actually look nice because
you would see the full extent of the gradient on both the end of one
system and the beginning of the next. See below a quick mockup.
I am now curious what you are thinking about the line breaking. Maybe
I am out to lunch here and you have a much better idea. I will wait to
hear from you before I do any heavy lifting.
Best,
Michael
--------------------------
\version "2.18"
\paper { ragged-right = ##f }
\layout {
\context {
\Staff
\override StaffSymbol.line-count = #1
\remove "Clef_engraver"
\remove "Time_signature_engraver"
}
\context {
\Voice
\override Glissando.minimum-length = #0
%% n.b. line-breaks are TODO
\override Glissando.breakable = ##t
\override Glissando.after-line-breaking = ##t
\override Glissando.bound-details =
#'((right
(attach-dir . 0)
(end-on-accidental . #f)
(padding . 0.))
(left
(attach-dir . 0)
(padding . 0.)))
}
}
#(define (make-grey-filled-box-stencil-list x-coords color-steps
half-thick rl)
(if (null? (cdr x-coords))
rl
(make-grey-filled-box-stencil-list
(cdr x-coords)
(cdr color-steps)
half-thick
(cons
(stencil-with-color
(make-filled-box-stencil
(interval-widen (cons (car x-coords) (cadr x-coords)) 0.1)
(cons (- half-thick) half-thick))
(x11-color
(string->symbol (format #f "grey~a" (car color-steps)))))
rl))))
#(define my-gliss
(lambda (grob)
(if (ly:stencil? (ly:line-spanner::print grob))
(let* ((stencil (ly:line-spanner::print grob))
(X-ext (ly:stencil-extent stencil X))
(left-bound-info (ly:grob-property grob 'left-bound-info))
(left-Y (assoc-get 'Y left-bound-info))
(left-X (interval-start X-ext))
(right-bound-info (ly:grob-property grob
'right-bound-info))
(right-X (interval-length X-ext))
(thick (ly:grob-property grob 'thickness 0.5))
(delta-X (- right-X left-X))
(steps
(assoc-get 'color-steps (ly:grob-property grob
'details) 100))
(raw-color-steps
(iota (abs steps) 0 (round (/ 100 (min 100 (abs
steps))))))
(color-steps
(if (negative? steps)
(reverse raw-color-steps)
raw-color-steps))
(x-coords (iota (1+ (abs steps)) 0 (/ delta-X (abs
steps)))))
;; create a flat glissando
(ly:grob-set-nested-property! grob '(right-bound-info Y)
left-Y)
;; return the stencil of added boxes
(ly:stencil-translate-axis
(apply
ly:stencil-add
(make-grey-filled-box-stencil-list
x-coords
color-steps
thick
'()))
;; the actual offset is TODO, hardcoded here
-8
Y))
#f)))
#(define (add-gliss m)
(case (ly:music-property m 'name)
((NoteEvent)
(set! (ly:music-property m 'articulations)
(append
(ly:music-property m 'articulations)
(list (make-music 'GlissandoEvent))))
m)
(else #f)))
addGliss =
#(define-music-function (parser location music)
(ly:music?)
(map-some-music add-gliss music))
%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%%%%%
mus =
{
\addGliss {
\override Glissando.stencil = #my-gliss
b'16 b'16 b'8 b'4
\override Staff.Beam.color = #(x11-color 'grey60)
b'8 b'16 b'16 ~
}
%% n.b. If glissando-skip is #t \addGliss needs to be interrupted
%% otherwise a programming error occurs
\once \override NoteColumn.glissando-skip = ##t
b'16
\addGliss {
b'16 b'8
}
%% a final target for the last glissando needs to be present,
otherwise
%% lily complains about unterminated glissando
\time 1/8 \stopStaff \hide Stem \hide b'8 \break
\addGliss {
\override Glissando.stencil = #my-gliss
\hide Stem \hide b'8 \startStaff \time 4/4
b'16 b'16 b'8 b'4
\override Staff.Beam.color = #(x11-color 'grey60)
b'8 b'16 b'16 ~
}
%% n.b. If glissando-skip is #t \addGliss needs to be interrupted
%% otherwise a programming error occurs
\once \override NoteColumn.glissando-skip = ##t
b'16
\addGliss {
b'16 b'8
}
%% a final target for the last glissando needs to be present,
otherwise
%% lily complains about unterminated glissando
\time 1/8 \stopStaff \hide Stem \hide b'8 \break
\addGliss {
\override Glissando.stencil = #my-gliss
\hide Stem \hide b'8 \startStaff \time 4/4
b'16 b'16 b'8 b'4
\override Staff.Beam.color = #(x11-color 'grey60)
b'8 b'16 b'16 ~
}
%% n.b. If glissando-skip is #t \addGliss needs to be interrupted
%% otherwise a programming error occurs
\once \override NoteColumn.glissando-skip = ##t
b'16
\addGliss {
b'16 b'8
}
%% a final target for the last glissando needs to be present,
otherwise
%% lily complains about unterminated glissando
\time 1/8 \stopStaff \hide Stem \hide b'8 \break
}
\new Staff \mus
On 01/31/2018 11:37 AM, Michael Winter wrote:
Hmmm... I made the change to use the stencil extent and that seems to
be fine. I am not sure what you are saying about the visibility of
the final stencil.
As for linebreaking. That is indeed a showstopper at the moment. Is
that because you are using filled box stencil? When I was using a
path directive with a line, the breaking seemed to work / break fine.
I will see if I can make the switch unless you have another idea.
Best,
Michael
On 01/31/2018 03:41 AM, Thomas Morley wrote:
2018-01-31 3:46 GMT+01:00 Michael Winter <address@hidden>:
On first glance. This looks ideal. THANK YOU
I am a bit brain dead at the moment, so will dig in tomorrow and
let you
know if I have any further questions / thoughts / ideas.
Glad you like it.
I've found a weakness, though: the stencils overlap. Visible, if you
apply box-stencil to the final stencil.
Probably one should go for stencil-extent to get the extension in
X-axis and not for 'X from left/right-bound-info.
Will have a look in the evening.
Also, linebreaks are not yet working.
Cheers,
Harm