lilypond-user
[Top][All Lists]
Advanced

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

Re: arpeggioArrowUp


From: Thomas Morley
Subject: Re: arpeggioArrowUp
Date: Sat, 17 Jan 2015 01:59:47 +0100

2015-01-16 1:42 GMT+01:00 Thomas Morley <address@hidden>:
> 2015-01-16 0:26 GMT+01:00 Thomas Morley <address@hidden>:
>> 2015-01-15 15:02 GMT+01:00 tisimst <address@hidden>:
>>> On Wed, Jan 14, 2015 at 11:47 PM, Schneidy [via Lilypond] <[hidden email]>
>>> wrote:
>>>
>>> Hi Harm,
>>>
>>> 2015-01-15 3:22 GMT+01:00 Thomas Morley <[hidden email]>:
>>>
>>>>
>>>> foo =
>>>> #(define-music-function (parser location mus)(ly:music?)
>>>>   (music-map
>>>>     (lambda (m)
>>>>       (if (music-is-of-type? m 'arpeggio-event)
>>>>           (make-music
>>>>              'ArpeggioEvent
>>>>              'tweaks
>>>>              (list
>>>>                (cons 'arpeggio-direction
>>>>                      (ly:music-property m 'direction))))
>>>>           m))
>>>>     mus))
>>>>
>>>>
>>>> \foo
>>>> \relative c'' {
>>>>   \mark "sort of post-processing"
>>>>   <g b d g>4\arpeggio
>>>>   <g b d g>4^\arpeggio
>>>>   <g b d g>4_\arpeggio
>>>> }
>>>
>>>
>>> I like this one.
>>> Cheers,
>>> Pierre
>>>
>>>
>>> +1!
>>>
>>> However, I'd rather not have to use another function (\foo) to do this.
>>> Otherwise, I don't think there's any benefit over what is currently required
>>> with \arpeggioArrowUp. Can't it be put directly into a command that supports
>>> the direction indicators? I can't seem to find in the documentation where
>>> the post-fix syntax is described.
>>>
>>> -Abraham
>>
>>
>>
>> The direction indicators _ and ^ are setting the 'direction, as their
>> name suggests ;).
>> Though the arpeggio-arrow is printed, if the _'arpeggio-direction_ is set!
>> Currently those are two different things. It may be discussable, if it
>> _should_ be this way, but it has some logic, if you think about it.
>> Nevertheless my 'foo'-function iterated through the music, setting
>> 'arpeggio-direction to the value of 'direction.
>> This is not very cheap, maybe better to use an engraver for this duty:
>>
>> \version "2.19.15"
>>
>> direction-to-arpeggio-direction-engraver =
>> #(lambda (context)
>>  (let ((dir '()))
>>   `((listeners
>>      (arpeggio-event
>>        .
>>        ,(lambda (engraver event)
>>          ;; Not sure about following 'set!'
>>          ;; Is it save?
>>          (set! dir (ly:event-property event 'direction)))))
>>     (acknowledgers
>>      (arpeggio-interface
>>        .
>>        ,(lambda (engraver grob source-engraver)
>>           (set! (ly:grob-property grob 'arpeggio-direction) dir)
>>           (set! dir '())))))))
>>
>
>
>
> %% c/p error, here the whole example:
>
> %%%%%%%%%%%%%%%%%%%%
> %% EXAMPLE
> %%%%%%%%%%%%%%%%%%%%
>
> \layout {
>   \context {
>     \Score
>     \consists #direction-to-arpeggio-direction-engraver
>   }
> }
>
> \relative c'' {
>   <g b d g>4\arpeggio
>   <g b d g>4^\arpeggio
>   <g b d g>4_\arpeggio
> }

Here an improved version, works cross-context as well:

\version "2.19.15"

\paper { indent = 0 }

direction-to-arpeggio-direction-engraver =
#(lambda (context)
 (let ((dir '()))
  `((listeners
     (arpeggio-event
       .
       ,(lambda (engraver event)
         ;; Not sure about following 'set!'
         ;; Is it save?
         (set! dir (ly:event-property event 'direction))
         ;; Is this needed?
         ;(ly:event-set-property! event 'direction '())
         )))
    (acknowledgers
     (arpeggio-interface
       .
       ,(lambda (engraver grob source-engraver)
          (set! (ly:grob-property grob 'arpeggio-direction) dir)))))))

%%%%%%%%%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%%%%%%%%%

\new Staff \with { \consists #direction-to-arpeggio-direction-engraver }
\relative c'' {
  <g b d g>4\arpeggio
  <g b d g>4^\arpeggio
  <g b d g>4_\arpeggio
}

%% Note:
%% If used cross-context, only the last direction-indicator
%% for each time-step counts
\new Staff
  \with {
    \consists "Span_arpeggio_engraver"
    \consists #direction-to-arpeggio-direction-engraver
  }
  \relative c' {
    \set Staff.connectArpeggios = ##t
    <<
      \new Voice { \voiceOne <e' g>4\arpeggio <d f> <d f>2\arpeggio }
      \new Voice { \voiceTwo <d, f>2^\arpeggio <g b>2_\arpeggio }
    >>
  }

\new PianoStaff
\with {
    \consists #direction-to-arpeggio-direction-engraver
  }
  <<
    \set PianoStaff.connectArpeggios = ##t
    \new Staff {
      \relative c' {
        \key b \major
        \time 6/8
        b8-.(^\arpeggio fis'-.\> cis-. e-. gis-. b-.)\!\fermata^\laissezVibrer
        \bar "||"
      }
    }
    \new Staff {
      \relative c' {
        \clef bass
        \key b \major
        <<
          {
            <a e cis>2\arpeggio
          }
          \\
          {
            <a, e a,>2.^\arpeggio
          }
        >>
      }
    }
  >>

\score {
  \relative c'' {
    \markLengthOn

    <>^"default"
    <g b d g>4\arpeggio

    <>^"^ indicator"
    <g b d g>4^\arpeggio

    <>^"direction-tweak"
    <g b d g>4-\tweak #'direction #RIGHT \arpeggio

    <>^"direction-override"
    \once \override Arpeggio.direction = #RIGHT
    <g b d g>4\arpeggio
  }
  \layout {
    ragged-right = ##f
  }
}


Cheers,
  Harm



reply via email to

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