[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
group music per measure
From: |
Nicolas Sceaux |
Subject: |
group music per measure |
Date: |
Tue, 16 Nov 2004 21:23:52 +0100 |
User-agent: |
Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux) |
This is absolutely useless, however, here is little music function
that allows to group music per measure, instead of per voice:
\splitMusic #2 {
e' f' g' a' | \clef bass c d e f | % this is the two staves of bar 1
e' f' g' a' | c d e f | % and this is bar 2
}
<==>
<< \new Staff { e' f' g' a' | e' f' g' a' | }
\new Staff { \clef bass c d e f | c d e f | } >>
#(use-modules (ice-9 optargs))
#(define (unique-scheme-context)
"Return a (hopefully) unique context name."
'())
#(let ((count 0))
(set! unique-scheme-context
(lambda ()
(set! count (1+ count))
(format #f "uniqueSchemeContext~a" count))))
#(define (bar-check? expr)
(eqv? (ly:music-property expr 'name) 'BarCheck))
#(define* (split-sequential-music number seq #:key (test bar-check?))
(let ((results (make-vector number (list)))
(current 0))
(define (push expr)
(vector-set! results current (cons expr
(vector-ref results current))))
(define (inc)
(set! current (modulo (1+ current) number)))
(for-each (lambda (e)
(push e)
(if (test e)
(inc)))
(ly:music-property seq 'elements))
(map-in-order reverse! (vector->list results))))
splitMusic = #(def-music-function (location number sequential-music) (number?
ly:music?)
(make-music 'SequentialMusic
'elements (list (make-music 'SimultaneousMusic
'elements (map-in-order (lambda (seq)
(make-music
'ContextSpeccedMusic
'context-id
(unique-scheme-context)
'property-operations
(list)
'context-type 'Staff
'element (make-music
'SequentialMusic
'elements
seq)))
(split-sequential-music number
sequential-music))))))
\layout { raggedright = ##t }
\new StaffGroup \splitMusic #3 {
g' a' b' c'' | e' f' g' a' | \clef bass c d e f |
g' a' b' c'' | e' f' g' a' | c d e f |
g' a' b' c'' | e' f' g' a' | c d e f |
}
nicolas
- group music per measure,
Nicolas Sceaux <=