lilypond-user
[Top][All Lists]
Advanced

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

Re: segmented glissando lines


From: Thomas Morley
Subject: Re: segmented glissando lines
Date: Mon, 12 Jan 2015 00:00:02 +0100

2015-01-11 10:28 GMT+01:00 Orm Finnendahl
<address@hidden>:
> 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.

Attachment: fancy-gliss-02-intended.png
Description: PNG image

Attachment: fancy-gliss-02-strange.png
Description: PNG image


reply via email to

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