2012/12/18 Gagi Petrovic <[email protected]>: > Hi David, yes indeed. A zigzag or a trillspan-kind-of line would also > suffice. > > Thank you for your tip, seems like it's time for me to dive more deeply into > this matter. When i look at the code i understand it only roughly, i will > need some time for this. So if anyone has any tips for reading material / > code about creating StaffSymbols, please share them. > > Thanks and all the best, Gagi > > > On 18 December 2012 14:40, David Nalesnik <[email protected]> wrote: >> >> Gagi, >> >> >> > On 15 December 2012 10:39, Gagi Petrovic <[email protected]> wrote: >> >> >> >> Dear Ponders, i'm working on a composition where i'm in need of a >> >> custom >> >> 3-lined-staff with a zigzagged (like the glissando style, see >> >> attachment) >> >> middle line. Is it possible to make a small adjustement to the code >> >> below, >> >> or should i start doing some serious tweaking? >> >> So the middle line of the 3-line staff will actually be replaced with >> a zigzag line? I'm not aware of doing something like that with a >> simple override. I would imagine that you'd have to build up a new >> StaffSymbol from the ground up. There's a snippet in the LSR which >> colors individual lines, and that might be something to look at and >> adapt to your needs. Unfortunately, I don't have time right now to >> work on it. >> >> http://lsr.dsi.unimi.it/LSR/Item?id=700 >> >> HTH, >> David
Hi Gagi,
the code below constructs a new StaffSymbol with zigzag-lines at to be
specified positions.
It is not widely tested, please shout if sth goes wrong.
Several explaining comments are added.
Use it like
\zigzagStaffSymbolLines #'(#f #t #f)
#f will _not_ print a zigzag, but a normal line.
#t will print the zigzag
Or use it like
\zigzagStaffSymbolLines #'(1 . -0.1) #'(#f #t #f)
#'(1 . -0.1) will alter the width/heigth of the squiggles.
%%%% start snippet %%%%%%%%%%%%%%%%%%
\version "2.16.1"
zigzagStaffSymbolLines =
#(define-music-function (parser location width-height bool-list)
((number-pair? '(0 . 0)) list?)
"
Replaces specified lines of a StaffSymbol with zigzag-lines.
The lines to be changed should be given as a list containing booleans, with
the meaning:
#f - no zigzag, print a normal line
#t - print a zigzag-line
The order of the bool-list corresponds with the order of the given list of
'line-positions or if not specified, with the default.
If the length of the bool-list and the 'line-positions doesn't fit a warning
is printed.
The width and height of the zigzags could be altered by adding a pair
as first argument while calling the function:
\\zigzagStaffSymbolLines #'(1 . 1) #'(#f #t #f)
"
#{
\override Staff.StaffSymbol #'after-line-breaking =
#(lambda (grob)
(let* ((staff-stencil (ly:grob-property grob 'stencil))
(staff-line-positions (ly:grob-property grob 'line-positions))
(staff-width
(interval-length
(ly:stencil-extent staff-stencil X)))
(staff-space (ly:staff-symbol-staff-space grob))
(staff-line-thickness (ly:staff-symbol-line-thickness grob))
;; Partly hardcoded!!
;; x-width and y-width should not(!) be scaled with different fontSize.
;; width of the first half-squiggle
(x-part (+ (car width-height) (/ 2 3)))
;; height of the squiggle
(y-part (+ (cdr width-height) (/ 1 3)))
;; Construct the first squiggle
(sample-path `((moveto 0 0)
(lineto ,x-part ,y-part)
(lineto ,(* 2 x-part) 0)))
;; Make a stencil of the first squiggle
(zigzag-stencil
(grob-interpret-markup
grob
(markup
#:path staff-line-thickness sample-path)))
(zigzag-width
(interval-length
(ly:stencil-extent zigzag-stencil X)))
;; Make a guess how many squiggles are needed.
(count-zigzags
(inexact->exact
(round
(/ staff-width
(- zigzag-width
staff-line-thickness)))))
;; Construct a stencil of squiggles with the guessed count
(squiggle-stil
(ly:stencil-aligned-to
(apply ly:stencil-add
(map
(lambda (x)
(ly:stencil-translate-axis
zigzag-stencil
(* (- zigzag-width staff-line-thickness) x)
X))
(iota count-zigzags)))
Y
CENTER))
;; Get the the length of that squiggle-stencil
(stil-x-length
(interval-length
(ly:stencil-extent squiggle-stil X)))
;; Construct a line-stencil to replace the staff-lines.
(line-stil
(make-line-stencil staff-line-thickness 0 0 staff-width 0))
;; Calculate the factor to scale the squiggle-stil to fit
;; the width of the original staff-symbol-stencil
(corr-factor
(/ staff-width (- stil-x-length staff-line-thickness)))
;; Construct the new staff-symbol
(new-stil
(apply
ly:stencil-add
(map
(lambda (x y)
(ly:stencil-translate
(if (eq? y #f)
line-stil
(ly:stencil-scale
squiggle-stil
corr-factor 1))
(cons (/ staff-line-thickness 2)
(* (/ x 2) staff-space))))
staff-line-positions bool-list))))
(if (= (length bool-list)(length staff-line-positions))
(ly:grob-set-property! grob 'stencil new-stil)
(ly:warning
"length of bool-list doesn't fit the line-positions - ignoring"))))
#})
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TEST
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paper {
indent = 10
ragged-right = ##f
line-width = 84.34
}
mus =
\relative c' {
\repeat unfold 5 {
\autoBeamOff
d8 e f g a b c16 d e f \break
}
}
<<
\new Staff \with {
fontSize = #-6
\override StaffSymbol #'staff-space = #(magstep -6)
\override StaffSymbol #'thickness = #(magstep -6)
}
\mus
\new Staff \with {
fontSize = #-3
\override StaffSymbol #'staff-space = #(magstep -3)
\override StaffSymbol #'thickness = #(magstep -3)
}
\mus
\new Staff
\mus
>>
\layout {
%% Construction-helper:
% \context {
% \Score
% \override SystemStartBar #'transparent = ##t
% }
\context {
\Staff
%% Construction-helper:
%\override BarLine #'transparent = ##t
%\override BarLine #'layer = #-20
%\override BarLine #'color = #green
\override StaffSymbol #'line-positions = #'(-4 0 4)
\zigzagStaffSymbolLines #'(#f #t #f)
%\zigzagStaffSymbolLines #'(1 . -0.1) #'(#f #t #f)
}
}
%%%% end snippet %%%%%%%%%%%%%%%%%%
HTH,
Harm
<<attachment: zig-zag-middle-line-03.preview.png>>
_______________________________________________ lilypond-user mailing list [email protected] https://lists.gnu.org/mailman/listinfo/lilypond-user
