On 24 April 2010 14:30, Neil Puttock <n.putt...@gmail.com> wrote:

> It's currently impossible to do \new Bottom since
> Context::create_new_context () doesn't check whether the context-type
> = 'Bottom, unlike Context::find_create_context ().

Oops, I meant Context::create_unique_context ().

I think I see what's happening in the snippet above:
get_default_interpreter () will only create a new bottom-level context
if it's called via a parent context which has a \defaultchild (i.e., a
Staff-level context).  So we can get round this limitation by wrapping
the bottom-level context creation in another context-spec-music block:

\new Voice {
  \override NoteHead #'color = #red
  c4 d e f
  \context Staff
  \context Bottom = foo {
    \override NoteHead #'color = #green
    c4 d e f
  }
  \context Staff
  \context Bottom = bar {
    c4 d e f
  }
}

I've attached a revised copy of `chord-glissando.ly' which forces each
hidden voice to be a unique bottom-level context.

Cheers,
Neil
\version "2.13.3"

chordGlissando =
#(define-music-function (parser location mus1 mus2) (ly:music? ly:music?)
   "Make a glissando between the notes of triads @code{mus1} and @code{mus2}."

   (define (add-glissando musChord)
     (let ((els (ly:music-property musChord 'elements)))
       (ly:music-set-property! musChord 'elements (append els (list (make-music 'GlissandoEvent))))
       musChord))

   (define (get-notes musicChord)
     (filter (lambda(x) (eq? (ly:music-property x 'name) 'NoteEvent))
             (ly:music-property musicChord 'elements)))

   (define (select-note musChord index)
     (let* ((notes (get-notes musChord))
            (non-notes (filter (lambda (x)
                                 (not (eq? (ly:music-property x 'name)
                                           'NoteEvent)))
                               (ly:music-property musChord 'elements)))
            (selected-note (list-ref notes index))
            (new-els (cons selected-note non-notes))
            (new-mus (ly:music-deep-copy musChord)))
       (ly:music-set-property! new-mus 'elements new-els)
       new-mus))

   (define (add-glissando-line mus1 mus2 index)          
     (context-spec-music
      (context-spec-music
       (make-sequential-music
        (list
         hideNotes
         (make-grob-property-set 'NoteColumn 'ignore-collision #t)
         ;; obviously, this isn't equivalent to \once,
         ;; so could be changed if required
         (make-grob-property-set 'Glissando 'thickness 2)
         (add-glissando (select-note mus1 (1- index)))
         (select-note mus2 (1- index))))
       'Bottom (symbol->string (gensym)))
      'Staff))

   (let* ((notes1 (get-notes mus1))
          (notes2 (get-notes mus2))
          (note-count (min (length notes1) (length notes2))))

    #{
       \once \override Glissando #'minimum-length = #5
       \once \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods
       \once \override Glissando #'thickness = #2
     <<
       \override NoteColumn #'ignore-collision = ##t
       {
         $(add-glissando mus1)
         $mus2
       }
       $(add-glissando-line mus1 mus2 1)
       $(if (> note-count 1) (add-glissando-line mus1 mus2 2))
       $(if (> note-count 2) (add-glissando-line mus1 mus2 3))
       $(if (> note-count 3) (add-glissando-line mus1 mus2 4))
       $(if (> note-count 4) (add-glissando-line mus1 mus2 5))
       $(if (> note-count 5) (add-glissando-line mus1 mus2 6))
       $(if (> note-count 6) (add-glissando-line mus1 mus2 7))
       $(if (> note-count 7) (add-glissando-line mus1 mus2 8))
    >>
    \revert NoteColumn #'ignore-collision
  #}))
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to