Hello, I want to ask if there is (better) method of utilizing Lilypond to typeset aleatoric music. For these not familiar with subject: http://en.wikipedia.org/wiki/Aleatoric_music
I would like to typeset kind of such music in manner used mostly by Lutoslawski, i.e. some pattern is repeted asynchronously over and over during some given time in a few instruments/voices ("senza misura"). pattern \stopStaff \startStaff within with wavy or again normal repetition-like straight line notation symbols // \\ ----||--|-------|| |----- ----||.-|---|--.|| |----- ----||.-|---|--.||~~~~~~~~~~~~~~~~~~~~|----- ----||--o---|---|| |----- ----||------o---|| |----- \\ // This notation was broadly used by Witold Lutosławski and Kazimierz Serocki (the greatest XX-cent. polish composers), and I suppose, that it isn't something strange to many other western Europe composers) To achieve that I've prepared stencils (as callbacks for print function, BTW method seen on this list) repOn-callback and repOff-callback. And then I insert them to Rest's print-function. Why rest? maybe because I couldn't find any better object. But rest isn't perfect frame for such things. Nevertheless this works in limited range, but works. Difficulties start if there is more than one voice/instrument. Also wavy line made with TrillSpanner, and it is very hard to exactly determine start and stop points, and exact vertical positioning in consecutive systems. So I have some questions: 1. is there any more suitable grob for this purpose? this means: some object which don't take place in "musical time" but can be ideally vertically and horizontally (in latter rests used to have obstacles) positioned to staff. This is similar to BarLine, and in past I had used BarLines (ie. |: and :|, with Timing_engraver in Staff context) for that, but if I put patterns with a little shift in subsequent staves I get lots of empty spaces on each staff (place for barlines in other staffs). Ideal would be some object with no X-extent. Any ideas? 2. Is there any way to typeset spanner exactly from one place to another, in manner that it starts at \stopStaff and stops at \startStaff ? Do you have some ideas/experiences about this topic? Any suggestions Very appreciated! Best regards, /ak/ And here goes my hitherto code: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \version "2.6.4" #(define (repOn-callback callback) (define (repOn-stencil grob) (let* ((dot (ly:font-get-glyph (ly:get-default-font grob) "dots.dot")) (s (callback grob)) (sx (cons 0 0)) (sy (cons 0 0)) (dotx (ly:stencil-extent dot 0)) (doty (ly:stencil-extent dot 1)) (yadj (/ (interval-length doty) 2)) (xadj (/ (interval-length dotx) 2))) (set! s (ly:stencil-add (ly:stencil-translate dot (cons (- 0 xadj) 0.5)) (ly:stencil-translate dot (cons (- 0 xadj) -0.5)) (ly:make-stencil (list 'draw-line 0.12 -0.5 2 -0.5 -2) '(-0.55 . 0.45) '(2 . -2)) (ly:make-stencil (list 'draw-line 0.12 -0.5 2 0 3) '(-0.55 . 0.45) '(2 . -2)) (ly:make-stencil (list 'draw-line 0.12 -0.5 -2 0 -3) '(-0.55 . 0.45) '(2 . -2)) (ly:make-stencil (list 'draw-line 0.24 -0.88 2 -0.38 3) '(-0.55 . 0.45) '(2 . -2)) (ly:make-stencil (list 'draw-line 0.24 -0.88 -2 -0.38 -3) '(-0.55 . 0.45) '(2 . -2)) (ly:make-stencil (list 'round-filled-box 1 -0.76 2 2 0) '(-1 . -1.1) '(2 . -2)) )) (ly:make-stencil (ly:stencil-expr (ly:stencil-translate s (cons 1 0)) ) sx sy) )) repOn-stencil) #(define (repOff-callback callback) (define (repOff-stencil grob) (let* ((dot (ly:font-get-glyph (ly:get-default-font grob) "dots.dot")) (s (callback grob)) (sx (cons 0 0)) (sy (cons 0 0)) (dotx (ly:stencil-extent dot 0)) (doty (ly:stencil-extent dot 1)) (yadj (/ (interval-length doty) 2)) (xadj (/ (interval-length dotx) 2))) (set! s (ly:stencil-add (ly:stencil-translate dot (cons (- 0 xadj) 0.5)) (ly:stencil-translate dot (cons (- 0 xadj) -0.5)) (ly:make-stencil (list 'draw-line 0.12 0.5 2 0.5 -2) '(-0.55 . 0.45) '(2 . -2)) (ly:make-stencil (list 'draw-line 0.12 0.5 2 0 3) '(-0.55 . 0.45) '(2 . -2)) (ly:make-stencil (list 'draw-line 0.12 0.5 -2 0 -3) '(-0.55 . 0.45) '(2 . -2)) (ly:make-stencil (list 'draw-line 0.24 0.88 2 0.38 3) '(-0.55 . 0.45) '(2 . -2)) (ly:make-stencil (list 'draw-line 0.24 0.88 -2 0.38 -3) '(-0.55 . 0.45) '(2 . -2)) (ly:make-stencil (list 'round-filled-box -1 0.76 2 2 0) '(-1 . -1.1) '(2 . -2)) )) (ly:make-stencil (ly:stencil-expr (ly:stencil-translate s (cons -1 0)) ) sx sy) )) repOff-stencil) %%% and how I use this: { \time 4/4 c'4 d'4 \cadenzaOn e'4 \once \override Rest #'print-function = #(repOn-callback Rest::print) r16 %% -> "|:" g'16[ c'' b' gis' a ais' e' eis' fis'] %% the pattern s4_"s4" %% this will destroy multi-staff construction %%% we prepare TrillSpanner for beeing ordinary wavy line \once \override TrillSpanner #'edge-text = #(cons "" " ") \once \override TrillSpanner #'font-size = #3 \once \override TrillSpanner #'bound-padding = #0 \once \override TrillSpanner #'Y-offset-callbacks = #(list Self_alignment_interface::centered_on_other_axis_parent Staff_symbol_referencer::callback) \once \override TrillSpanner #'padding = #0 \once \override TrillSpanner #'staff-padding =#0 %% \once \override TrillSpanner #'extra-offset = #'(-0.35 . 0) \once \override TrillSpanner #'staff-position = #-5 \override Staff.Clef #'transparent = ##t \override Staff.TimeSignature #'transparent = ##t \override Staff.KeySignature #'transparent = ##t \stopStaff \once \override Rest #'print-function = #(repOff-callback Rest::print) r8 %% -> ":|" \startTrillSpan %% wavy line %%% here we produce empty space empty space \hideNotes \repeat "unfold" 23 g'16 \unHideNotes %%% and again noral music: s16\stopTrillSpan \cadenzaOff \revert Staff.Clef #'transparent \revert Staff.TimeSignature #'transparent \revert Staff.KeySignature #'transparent \startStaff \bar "|" r4 c''4 d'' e'' | c''2 b'2 \break %%% --------------------------------- %%% and the same in a few staffs: %%% --------------------------------- << { c'4 d'4 \cadenzaOn e'4 \once \override Rest #'print-function = #(repOn-callback Rest::print) r16 %% -> "|:" g'16[ c'' b' gis' a ais' e' eis' fis'] %% the pattern s4_"s4" %% s %%% correction \once \override TrillSpanner #'edge-text = #(cons "" " ") \once \override TrillSpanner #'font-size = #3 \once \override TrillSpanner #'bound-padding = #0 \once \override TrillSpanner #'Y-offset-callbacks = #(list Self_alignment_interface::centered_on_other_axis_parent Staff_symbol_referencer::callback) \once \override TrillSpanner #'padding = #0 \once \override TrillSpanner #'staff-padding =#0 %% \once \override TrillSpanner #'extra-offset = #'(-0.35 . 0) \once \override TrillSpanner #'staff-position = #-5 \override Staff.Clef #'transparent = ##t \override Staff.TimeSignature #'transparent = ##t \override Staff.KeySignature #'transparent = ##t \stopStaff \once \override Rest #'print-function = #(repOff-callback Rest::print) \once \override TextScript #'self-alignment-X = #0 r8_"bad spacing" %% -> ":|" \startTrillSpan %% wavy line \hideNotes \repeat "unfold" 23 g'16 \unHideNotes s16\stopTrillSpan \cadenzaOff \revert Staff.Clef #'transparent \revert Staff.TimeSignature #'transparent \revert Staff.KeySignature #'transparent \startStaff \bar "|" r4 c''4 d'' e'' c'' b'2 } \new Staff \with { \remove Time_signature_engraver } { c'4 d'4 \cadenzaOn e'8[ g' f'] \once \override Rest #'print-function = #(repOn-callback Rest::print) r16 %% -> "|:" g'16[ c'' b' gis' a ais' e' eis' fis'] %% the pattern s4_"s4" %% s %%% correction \once \override TrillSpanner #'edge-text = #(cons "" " ") \once \override TrillSpanner #'font-size = #3 \once \override TrillSpanner #'bound-padding = #0 \once \override TrillSpanner #'Y-offset-callbacks = #(list Self_alignment_interface::centered_on_other_axis_parent Staff_symbol_referencer::callback) \once \override TrillSpanner #'padding = #0 \once \override TrillSpanner #'staff-padding =#0 %% \once \override TrillSpanner #'extra-offset = #'(-0.35 . 0) \once \override TrillSpanner #'staff-position = #-5 \override Staff.Clef #'transparent = ##t \override Staff.TimeSignature #'transparent = ##t \override Staff.KeySignature #'transparent = ##t \stopStaff \once \override Rest #'print-function = #(repOff-callback Rest::print) r8 %% -> ":|" \startTrillSpan %% wavy line \hideNotes \repeat "unfold" 21 g'16 \unHideNotes s16\stopTrillSpan \cadenzaOff \revert Staff.Clef #'transparent \revert Staff.TimeSignature #'transparent \revert Staff.KeySignature #'transparent \startStaff \bar "|" r4 c''4 d'' e'' c'' b'2 } \new Staff \with { \remove Time_signature_engraver } { c'4 d'4 \cadenzaOn e'8[ g' f' a' bes'] \once \override Rest #'print-function = #(repOn-callback Rest::print) r16 %% -> "|:" g'16[ c'' b' gis' a ais' e' eis' fis'] %% the pattern s4_"s4"%% s %%% correction \once \override TrillSpanner #'edge-text = #(cons "" " ") \once \override TrillSpanner #'font-size = #3 \once \override TrillSpanner #'bound-padding = #0 \once \override TrillSpanner #'Y-offset-callbacks = #(list Self_alignment_interface::centered_on_other_axis_parent Staff_symbol_referencer::callback) \once \override TrillSpanner #'padding = #0 \once \override TrillSpanner #'staff-padding =#0 %% \once \override TrillSpanner #'extra-offset = #'(-0.35 . 0) \once \override TrillSpanner #'staff-position = #-5 \override Staff.Clef #'transparent = ##t \override Staff.TimeSignature #'transparent = ##t \override Staff.KeySignature #'transparent = ##t \stopStaff \once \override Rest #'print-function = #(repOff-callback Rest::print) r8 %% -> ":|" \startTrillSpan %% wavy line \hideNotes \repeat "unfold" 17 g'16 \unHideNotes s16\stopTrillSpan \cadenzaOff \revert Staff.Clef #'transparent \revert Staff.TimeSignature #'transparent \revert Staff.KeySignature #'transparent \startStaff \bar "|" r4 c''4 d'' e'' c'' b'2 } >> } _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org http://lists.gnu.org/mailman/listinfo/lilypond-user