[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.
fancy-gliss-02-intended.png
Description: PNG image
fancy-gliss-02-strange.png
Description: PNG image
- segmented glissando lines, Orm Finnendahl, 2015/01/10
- Re: segmented glissando lines, Urs Liska, 2015/01/10
- Re: segmented glissando lines, Pierre Perol-Schneider, 2015/01/10
- Re: segmented glissando lines, Orm Finnendahl, 2015/01/11
- Re: segmented glissando lines,
Thomas Morley <=
- Re: segmented glissando lines, Urs Liska, 2015/01/11
- Re: segmented glissando lines, Thomas Morley, 2015/01/11
- Re: segmented glissando lines, Urs Liska, 2015/01/11
- Re: segmented glissando lines, Pierre Perol-Schneider, 2015/01/12
- Re: segmented glissando lines, Thomas Morley, 2015/01/13