[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Changing slur behavior
From: |
R. Padraic Springuel |
Subject: |
Re: Changing slur behavior |
Date: |
Thu, 26 Mar 2020 16:40:33 -0400 |
> On 26 Mar, 2020, at 9:54 AM, Aaron Hill <address@hidden> wrote:
>
> On 2020-03-26 2:24 am, Kevin Barry wrote:
>> I think the right way to do what you are trying is to write an
>> engraver that listens for slur events and alters the spacing of the
>> music. (I would write one if I could, but I'm not at that level yet.)
>
> Firstly, know that slurs are not the only way to define melismata. You can
> instruct LilyPond to have a single lyric syllable span multiple notes using
> \melisma and \melismaEnd:
>
> %%%%
> \version "2.20.0"
>
> \fixed c' { b4( g a2) | b4\melisma g a2\melismaEnd }
> \addlyrics { one two }
> %%%%
>
> This does not solve the spacing aspect of the original post, but it shows how
> you can avoid messing about with slurs.
I’ll have to play with this to see how I like it. The reason I initially
wanted to mess with slurs was on the off chance that I later wanted to take the
chant and turn it into a fully modern
> Assuming you really want to use slurs to adjust spacing, here might be one
> way to do it:
>
> …snip...
>
> The engraver listens for slur-events, injecting a spacing-section-event and
> adjusting some context properties as needed. The logic is very simple, and
> there are no safety checks. Be warned this likely could fail with more
> complicated music.
>
>
> -- Aaron Hill
Thanks for this Aaron. After some playing I’ve adapted this to the way I
usually encode chant (where all notes are basically quarters):
\version "2.19.84"
Slur_spacing_engraver =
#(lambda (context)
(let ((slur-event-dir #f))
(define (change-spacing dir)
(ly:broadcast
(ly:context-event-source context)
(ly:make-stream-event
(ly:make-event-class 'spacing-section-event)
'(())))
(let ((score-context (ly:context-find context 'Score)))
(for-each
(lambda (args)
(apply ly:context-pushpop-property
score-context 'SpacingSpanner
(if (< 0 dir) (drop-right args 1) args)))
`((base-shortest-duration ,(ly:make-moment -2))
(shortest-duration-space 2)
(spacing-increment 0)))))
(make-engraver
((start-translation-timestep engraver)
(set! slur-event-dir #f))
(listeners
((slur-event engraver event)
(let ((dir (ly:event-property event 'span-direction #f)))
(set! slur-event-dir dir))))
((process-music engraver)
(if (ly:dir? slur-event-dir)
(change-spacing slur-event-dir))))))
\layout {
\context {
\Score
\override SpacingSpanner.shortest-duration-space = 3
timing = ##f
}
\context {
\Staff
\consists \Slur_spacing_engraver
\remove Time_signature_engraver
\omit Stem
\omit Slur
}
}
music = {
a' g'
a'( g')
a'( ges')
a'( g')
a' g'
}
words = \lyricmode { Some words to go un -- der notes }
\new Staff
<<
\new Voice = "mel" { \music }
\new Lyrics \lyricsto "mel" { \words }
>>
I’ve found a problem: accidentals inside of slurs end up colliding with
preceding notes. Is it possible to modify the Slur_spacing_engraver so that it
doesn’t ignore accidentals and takes them into account when deciding the
spacing between the notes?
✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝✝
Fr. Samuel, OSB
(R. Padraic Springuel)
St. Anselm’s Abbey
4501 South Dakota Ave, NE
Washington, DC, 20017
202-269-2300
(c) 202-853-7036
PAX ☧ ΧΡΙΣΤΟΣ