[Top][All Lists]
[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