lilypond-user
[Top][All Lists]
Advanced

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

Re: Ambitus


From: Neil Puttock
Subject: Re: Ambitus
Date: Fri, 26 Feb 2010 21:05:36 +0000

On 5 February 2010 00:18, Neil Puttock <address@hidden> wrote:

> Yes (see attached file).  I had to move the markup outside the
> 'finalize method though, since it wouldn't evaluate it directly.

I've come to the conclusion using an engraver is a waste of time; its
only benefit is that the storage of the pitches/key signature is
simpler.  I think combining my original approach of a music function
with some extra listener code is better, since it allows scores in a
book to have separate ambitus.

\version "2.13.14"

\header {  }

ambitus =
#(define-music-function (parser location music) (ly:music?)

   (define (add-stream-listener global listener . types)
     (apply ly:add-listener
            (cons* listener (ly:context-events-below global) types))
     global)

   (define (process-event event)
     (case (ly:event-property event 'class)
       ((note-event)
        (set! pitches (cons (ly:event-property event 'pitch) pitches)))
       ((key-change-event)
        (and (null? key-list)
             (set! key-list (ly:event-property event 'pitch-alist))))
       ((Finish)
        (set! pitches (stable-sort pitches ly:pitch<?))
        (if $defaultheader
            (module-define! $defaultheader 'ambitus
                            (ambitus-markup key-list pitches))))))

   (define (ambitus-markup key pitches)
     (let* ((music (make-sequential-music
                    (list (make-time-signature-set 2 4)
                          (make-grob-property-set 'TimeSignature
                                                  'stencil #f)
                          (make-music
                           'KeyChangeEvent
                           'pitch-alist key)
                          (make-event-chord
                           (list (make-music
                                  'NoteEvent
                                  'duration (ly:make-duration 2 0 1 1)
                                  'pitch (first pitches))))
                          (make-event-chord
                           (list (make-music
                                  'NoteEvent
                                  'duration (ly:make-duration 2 0 1 1)
                                  'pitch (last pitches)))))))
            (score (ly:make-score music))
            (layout (ly:output-def-clone $defaultlayout)))

       (ly:output-def-set-variable! layout 'indent 0)
       (ly:score-add-output-def! score layout)
       (make-score-markup score)))

   (ly:parser-define! parser 'pitches '())
   (ly:parser-define! parser 'key-list '())
   (let* ((global (ly:make-global-context $defaultlayout))
          (listener (ly:make-listener process-event))
          (global-disp (ly:context-events-below global)))

     (ly:connect-dispatchers (ly:make-dispatcher) global-disp)
     (add-stream-listener global listener 'note-event 'key-change-event 'Finish)
     (ly:interpret-music-expression music global)
     music))

\new Staff \ambitus \relative c'' {
  \key g \major
  g8 a b c d e fis g
  a1
}

Cheers,
Neil




reply via email to

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