lilypond-user
[Top][All Lists]
Advanced

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

"Controlled aleatorism" notation


From: Andrzej Kopec
Subject: "Controlled aleatorism" notation
Date: Wed, 14 Dec 2005 23:43:03 +0100

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
    }
  >>
}






reply via email to

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