bug-lilypond
[Top][All Lists]
Advanced

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

Re: [LSR v2.18] "Ripped, torn staff-lines" does not compile


From: Thomas Morley
Subject: Re: [LSR v2.18] "Ripped, torn staff-lines" does not compile
Date: Sun, 16 Feb 2014 01:09:48 +0100

2014-02-16 0:12 GMT+01:00 Pierre Perol-Schneider
<address@hidden>:
> Dear Squad,
>
> The snippet hereunder :
> http://lsr.dsi.unimi.it/LSR/Item?id=668
> does not compile after v.2.18/v2.16 upgrades.
> It was made by Mark Polesky for version 2.12.0
[...]
>
> I didn't go deep into the code (it's pretty late now) but after a quick
> look I suppose it could be simplified by using \scale.
>
> Cheers,
> Pierre

Hi Pierre,
below a working version for 2.18.0
Please note, I cured the errors, but didn't try to do better coding. :)

%%%%%%%%%%%%%%
%% Start snippet
%%%%%%%%%%%%%%

\version "2.18.0"

%LSR This snippet was contributed by Mark Polesky for version 2.12.0

%% preferences %%

tearWidth = #1
tearXext = #'(0 . 0)

zigzagDefaultYext = #'(-4 . 4)
zigzagDefaultSerrationCount = #5
zigzagTearLineWidth = #0.1
zigzagTearAngle = #90
zigzagTearXext = #'(0 . 0)


%% start definitions %%

tearGeneric =
  #(define-music-function (parser location lengths) (list?)
  (let ((x-ext
          (lambda (n)
            (cons (* (list-ref lengths n) (/ tearWidth 4)) tearWidth)))
        (y-ext '(1.5 . 2.5)))

  #{
    \once \override Staff.BarLine #'stencil = #ly:text-interface::print
    \once \override Staff.BarLine #'text = \markup
      \override #'(baseline-skip . 0) \with-color #white
      \column {
        \filled-box #(x-ext 0) #y-ext #0
        \filled-box #(x-ext 1) #y-ext #0
        \filled-box #(x-ext 2) #y-ext #0
        \filled-box #(x-ext 3) #y-ext #0
        \filled-box #(x-ext 4) #y-ext #0
      }
    \once \override Staff.BarLine #'layer = #1
    \once \override Staff.BarLine #'X-extent =
      #`(,(car tearXext) . ,(- (+ (cdr tearXext) tearWidth) 0.1))
    \break
  #}))

tear =
  #(define-music-function (parser location) ()
  #{
    \tearGeneric
      #(let loop ((unused '(0 1 2 3 4))
                  (lengths '()))
        (if (= (length lengths) 5)
            lengths
            (let* ((x (random (length unused)))
                   (y (- (length unused) x))
                   (z (list-ref unused x)))
             (loop (append (list-tail unused (+ x 1))
                           (list-tail (reverse unused) y))
                   (append lengths `(,z))))))
  #})

tearCustom =
  #(define-music-function (parser location lengths) (list?)
  #{ \tearGeneric #lengths #})

zigzagTearCustom =
  #(define-music-function (parser location y-ext serrations)
    (pair? number?)
    (let* ((zigzagTearHeight (- (cdr y-ext) (car y-ext)))
           (deg2rad (lambda (x) (* x (/ (* (atan 1) 4) 180))))
           (zigzagTearWidth
              (/ zigzagTearHeight
                 serrations
                 (* (tan (/ (deg2rad zigzagTearAngle) 2)) 2))))
  #{
    \once \override Staff.BarLine #'stencil = #ly:text-interface::print
    \once \override Staff.BarLine #'text =
      \markup \with-dimensions
               #`(0 . ,zigzagTearWidth)
               #`(,(car y-ext) . ,(cdr y-ext))
        \postscript

#(string-append "
/linewidth " (number->string zigzagTearLineWidth) " def
/height " (number->string zigzagTearHeight) " def
/serrations " (number->string serrations) " def
/width " (number->string zigzagTearWidth) " def
/padding " (number->string (cdr zigzagTearXext)) " 2 width mul add def

/serrationHeight height serrations div def
/y0 " (number->string (cdr y-ext)) " def
/xn width def
/yn serrationHeight 2 div neg def

/plotAngle {
  xn yn rlineto
  xn neg yn rlineto
} def

/plotSerrations {
  serrations { plotAngle } repeat
} def

%% whiteout:
1 setgray
linewidth setlinewidth
0 y0 linewidth add moveto %% (whiteout staff-lines when y-exts are integers)
0 y0 lineto
plotSerrations
0 linewidth neg rlineto %% (whiteout staff-lines when y-exts are integers)
padding 0 rlineto
0 height linewidth 2 mul add rlineto %% (account for top and bottom linewidth)
padding neg 0 rlineto
fill stroke

%% draw serrations:
newpath
0 setgray
linewidth setlinewidth
0 y0 moveto
plotSerrations
stroke")

    \once \override Staff.BarLine #'layer = #1
    \once \override Staff.BarLine #'X-extent =
      #`(,(car zigzagTearXext) .
       ,(- (+ (cdr zigzagTearXext) zigzagTearWidth) 0.1))
    \break
  #}))

zigzagTear = \zigzagTearCustom #zigzagDefaultYext #zigzagDefaultSerrationCount

%% end definitions %%

%% example of a custom tear-pattern:
tearRagged = \tearCustom #'(3 1 3 1 3)

music = { g'4 d'' b' d'' }
\header { tagline=##f }
\score {
  {
    %% random line-lengths:
    \music \tear

    %% set line-lengths on-the-fly:
    \music \tearCustom #'(0 1 2 3 4)

    %% define a custom tear-pattern if you want consistency (see above):
    \music \tearRagged

    %% default zigzag tear:
    \music \zigzagTear

    %% set zigzag Y-extent and serration-count on-the-fly:
    \transpose c c' \music \zigzagTearCustom #'(-4 . 7) #4
  }
  \layout {
    indent = #0
    ragged-right = ##t
  }
}

%%%%%%%%%%%%%%
%% End snippet
%%%%%%%%%%%%%%

HTH,
  Harm



reply via email to

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