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