lilypond-user
[Top][All Lists]
Advanced

[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

reply via email to

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