lilypond-user
[Top][All Lists]
Advanced

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

Re: parallel versus series scoring


From: Nicolas Sceaux
Subject: Re: parallel versus series scoring
Date: Thu, 19 Jan 2006 21:36:47 +0100
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (darwin)

"-DeeT (sent by Nabble.com)" <address@hidden> writes:

> The Lilypond manual explains well how to code this way:
>
> staff1, all measures
> staff2, all measures
> staff3, all measures
>
> I'd prefer to have this organization in the source:
>
> staff1,measure-group1
> staff2,measure-group1
> staff3,measure-group1
> %
> staff1,measure-group2
> staff2,measure-group2
> staff3,measure-group2

The following function may enable the style you want. It uses the "|"
bar check sign to separate different voices:

staff1 measure-group1 | staff2 measure-group1 | staff3 measure-group1 |
staff1 measure-group2 | staff2 measure-group2 | staff3 measure-group2 |


------------------------------------------------------
parallelMusic = 
#(def-music-function (parser location voice-number music) (number? ly:music?)
  (let ((voices (make-vector voice-number (list)))
        (current 0))
    (define (push-music music index)
      (vector-set! voices index 
                  (cons music (vector-ref voices index))))
    (map-in-order (lambda (m)
                    (push-music m current)
                    (if (eq? (ly:music-property m 'name) 'BarCheck)
                        (set! current (modulo (1+ current) voice-number))))
                  (ly:music-property music 'elements))
    (make-music 'SimultaneousMusic 
      'elements (map-in-order (lambda (music-list)
                                #{ \new Staff $(make-music 'SequentialMusic 
                                               'elements (reverse! music-list)) 
#})
                              (vector->list voices)))))

\new StaffGroup \parallelMusic #'3 {
  \time 4/4 
  g' g' g' g' |
  e' e' e' e' |
  c' c' c' c' |
%%
  \time 3/4 a' a' a' | fis' fis' fis' |d' d' d' | 
%%
  \time 2/4 
  b'   b'   c'' c'' |
  gis' gis' a'  a' |
  e'   e'   f'  f' |
}
------------------------------------------------------

You can also define something similar for mixing a melody and lyrics,
but you'll have to use \lyricmode explicitly, which is not convenient
here.

------------------------------------------------------
songMusic = 
#(def-music-function (parser location music) (ly:music?)
  (let ((voices (make-vector 2 (list)))
        (current 0)
        (voice-number 2))
    (define (push-music music index)
      (vector-set! voices index 
                  (cons music (vector-ref voices index))))
    (map-in-order (lambda (m)
                    (push-music m current)
                    (if (eq? (ly:music-property m 'name) 'BarCheck)
                        (set! current (modulo (1+ current) voice-number))))
                  (ly:music-property music 'elements))
   (let ((voice (make-music 'SequentialMusic 
                 'elements (reverse! (vector-ref voices 0))))
         (lyrics  (make-music 'SequentialMusic 
                 'elements (reverse! (vector-ref voices 1)))))
    #{ \new Voice { $voice } \addlyrics { $lyrics } #})))

\new StaffGroup \songMusic {
  c'8 c' c' d' e'4 d' |
  \lyricmode { Au clair de la lu -- ne, } |
%%
  c'8 e'8 d' d' c'2 | 
  \lyricmode { mon a -- mi Pier -- rot } |
}
------------------------------------------------------

Note that these are just hacks.

nicolas




reply via email to

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