Hi Harm,

this is terrific!
I'm about to collect a number of examples why LilyPond rocks for engraving contemporary music, and this should definitely be part of it.

Best
Urs

Am 12.01.2015 um 00:00 schrieb Thomas Morley:
2015-01-11 10:28 GMT+01:00 Orm Finnendahl
<orm.finnend...@selma.hfmdk-frankfurt.de>:
Hi Pierre, Urs,

  that's excellent and very instructional, thanks!

--
Orm


Am Samstag, den 10. Januar 2015 um 23:56:03 Uhr (+0100) schrieb Pierre 
Perol-Schneider:
Hi Orm,

How about :

\version "2.19.15"

#(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 (quote GlissandoEvent)))))
                    m)
      (else #f)))

addGliss = #(define-music-function (parser location music)
                  (ly:music?)
            (map-some-music add-gliss music))

\relative c'' {
   \override Glissando.thickness = #2
   \override Glissando.bound-details =#'(
      (right (attach-dir . 1) (padding . 0))
      (left  (attach-dir . 1) (padding . 0)))
   \override NoteHead.no-ledgers = ##t
   \addGliss {
     d,2
     \omit Stem
     \override NoteHead.transparent = ##t
     f' d, f' e, g' d, f'
   }
}


Cheers,
Pierre


Below my own attempt.
It has some advantages and limitations compared with Pierre's coding.

There is one thing I have no clue about:
If the function is applied to a dotted whole note some very strange
things may happen and a warning is printed:
"Loose column does not have right side to attach to."

If someone has an idea how to fix, I'd love to hear it.
(Look out for
  %% !!!!!!!!!!!!!!!!!!!!!
if you want to test)




\version "2.19.15"

%#(use-modules (ice-9 pretty-print))

lengthen-gliss =
#(define-music-function (parser loation nmbr)(number?)
#{
   \once \override Glissando.springs-and-rods = #ly:spanner::set-spacing-rods
   \once \override Glissando.minimum-length = #nmbr
#})

fancy-gliss =
#(define-music-function (parser location pts-list)(list?)
#{
  \once \override Glissando.after-line-breaking =
   #(lambda (grob)
     (let ((stil (ly:line-spanner::print grob)))
      (if (ly:stencil? stil)
          (let*
            ((left-bound-info (ly:grob-property grob 'left-bound-info))
             (left-bound (ly:spanner-bound grob LEFT))
             (y-off (assoc-get 'Y left-bound-info))
             (padding (assoc-get 'padding left-bound-info))
             (note-column (ly:grob-parent left-bound X))
             (note-heads (ly:grob-object note-column 'note-heads))
             (ext-X
               (if (null? note-heads)
                   '(0 . 0)
                   (ly:relative-group-extent note-heads grob X)))
             (dot-column (ly:note-column-dot-column note-column))
             (dots
               (if (null? dot-column)
                   '()
                   (ly:grob-object dot-column 'dots)))
             (dots-ext-X
               (if (null? dots)
                   '(0 . 0)
                   (ly:relative-group-extent dots grob X)))
             (factor
               (/ (interval-length (ly:stencil-extent stil X))
                  (car (take-right (last pts-list) 2))))
             (new-stil
               (make-connected-path-stencil
                 (map
                   (lambda (e)
                     (cond ((= (length e) 2)
                            (cons (* (car e) factor) (cdr e)))
                           ((= (length e) 6)
                            (list
                              (* (car e) factor)
                              (cadr e)
                              (* (third e) factor)
                              (fourth e)
                              (* (fifth e) factor)
                              (sixth e)))
                           (else
                             (ly:error
                               "Some element(s) of the given list do
not fit"))))
                   pts-list)
                 (layout-line-thickness grob) ;line-width
                 1   ;scaling
                 1   ;scaling
                 #f
                 #f)))
          (ly:grob-set-property! grob 'stencil
            (ly:stencil-translate
             new-stil
             (cons (+ (interval-length ext-X)
                      (interval-length dots-ext-X)
                      padding)
                   y-off))))
        (begin
          (ly:warning
            "Cannot find stencil. Please set 'minimum-length accordingly")
          #f))))
#})

#(display "\n\tLimitations:
\t-Does not work with line-break
\t-dotted notes with glissando may return a warning for unknown reasons,
\t strange things may happen")

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\paper { indent = 28 }

\header { title = "Fancy Glissando" }

music = <<
   \new Staff \with { instrumentName = "fancy-gliss " }
     \relative c' {
       \set Score.defaultBarType = #""
       %% If spacing is very tight Glissando sometimes is omitted.
       %% Use 'lengthen-gliss' with an apropiate value in this case.
       %\lengthen-gliss #10
       \fancy-gliss
         #'(
          (1 3)
          (2 0)
          (3 3)
          (4 1)
          (5 3.5)
          (6 0)
          (7 0 8 5 12 0)
          )
       f1\glissando
       f1
     }

   \new Staff \with { instrumentName = "skipping a column" }
     \relative c' {
       %\lengthen-gliss #10
       \fancy-gliss
         #'(
          (1 3)
          (2 0)
          (3 3)
          (4 1)
          (5 3.5)
          (6 0)
          (7 0 8 5 12 0)
          )
       %% !!!!!!!!!!!!!!!!!!!!!
       f1 %% change to f1. to view some strange things happen
       \glissando
       s1
       f1
     }

   \new Staff \with { instrumentName = "control-staff " }
     \relative c' { a'1 a1 a1 }
\score {
   \transpose c b \music
%% uncomment to let happen very tight spacing happen, use 'lengthen-gliss' then.
% \layout {
%   line-width = 10
% }
}

\score {
   \music
   \layout {
     ragged-right = ##f
   }
}


Cheers,
   Harm

attached two pngs, one with the intended out put, the other while
using a dotted whole note.


_______________________________________________
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

Reply via email to