+2006-07-03 Erik Sandberg <mandolaerik@gmail.com>
+
+ * lily/sequential-iterator.cc: Change the default get_music_list
+ to read elements-callback music property
+
+ * scm/define-music-types.scm, scm/music-functions.scm: Cleaner
+ processing of multimeasure rests. Softcoded
+ sequential-music-iterator.
+
+ * lily/sequential-music-iterator.cc: Removed.
+
2006-06-28 Graham Percival <gpermus@gmail.com>
* Documentation/user/basic-notation.itely: clarify \repeatTie.
+++ /dev/null
-/*
- Sequential_music-iterator.hh -- declare Sequential_music_iterator
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
-*/
-
-#ifndef SEQUENTIAL_MUSIC_ITERATOR_HH
-#define SEQUENTIAL_MUSIC_ITERATOR_HH
-
-#include "sequential-iterator.hh"
-
-/** Sequential_music iteration: walk each element in turn, and
- construct an iterator for every element.
-*/
-class Sequential_music_iterator : public Sequential_iterator
-{
-public:
- DECLARE_SCHEME_CALLBACK (constructor, ());
- DECLARE_CLASSNAME(Sequential_music_iterator);
-private:
- virtual SCM get_music_list ()const;
-};
-
-#endif // SEQUENTIAL_MUSIC_ITERATOR_HH
SCM
Sequential_iterator::get_music_list () const
{
- return SCM_EOL;
+ Music *m = get_music ();
+ SCM proc = m->get_property ("elements-callback");
+ if (scm_procedure_p (proc))
+ return scm_call_1 (proc, m->self_scm ());
+ else
+ return SCM_EOL;
}
void
+++ /dev/null
-/*
- sequential-music-iterator.cc -- implement Sequential_music_iterator
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
-*/
-
-#include "context.hh"
-#include "sequential-music-iterator.hh"
-#include "music.hh"
-#include "warn.hh"
-
-IMPLEMENT_CTOR_CALLBACK (Sequential_music_iterator);
-
-SCM
-Sequential_music_iterator::get_music_list ()const
-{
- return get_music ()->get_property ("elements");
-}
;; command_element
(format #f "~{~a ~}" (map-in-order music->lily-string elements))))))))
-(define-display-method MultiMeasureRestMusicGroup (mmrest)
- (format #f "~{~a ~}"
- (map-in-order music->lily-string
- (remove (make-music-type-predicate 'BarCheck)
- (ly:music-property mmrest 'elements)))))
+(define-display-method MultiMeasureRest (mmrest)
+ (let* ((dur (ly:music-property mmrest 'duration))
+ (ly (format #f "R~a~{~a ~}"
+ (duration->lily-string dur)
+ (map-in-order music->lily-string
+ (ly:music-property mmrest 'articulations)))))
+ (*previous-duration* dur)
+ ly))
(define-display-method SkipMusic (skip)
(format #f "\\skip ~a" (duration->lily-string (ly:music-property skip 'duration) #:force-duration #t)))
(define-display-method MetronomeChangeEvent (tempo)
(format #f "\\tempo ~a = ~a"
- (duration->lily-string (ly:music-property tempo 'tempo-unit) #:force-duration #f #:prev-duration #f)
+ (duration->lily-string (ly:music-property tempo 'tempo-unit) #:force-duration #t #:prev-duration #f)
(ly:music-property tempo 'metronome-count)))
(define-display-method KeyChangeEvent (key)
(error-found ,boolean? "If true, a parsing error was found in this expression")
(element ,ly:music? "The single child of a Music_wrapper music object, or the body of a repeat.")
(elements ,ly:music-list? "A list of elements for sequential of simultaneous music, or the alternatives of repeated music. ")
+ (elements-callback ,procedure? "Return a list of children, for use by a sequential iterator. Takes a single Music parameter")
(expected-beam-count ,integer? "Expected number of non-tremolo beams in a tremolo repeat")
(force-accidental ,boolean? "If set, a cautionary accidental should always be printed on this note")
(grob-property ,symbol? "The symbol of the grob property to set. ")
;; TODO: should link back into user manual.
+(define (mm-rest-child-list music)
+ "Check if we have R1*4-\\markup { .. }, and if applicable convert to
+a property set for MultiMeasureRestNumber."
+ (let ((location (ly:music-property music 'origin))
+ (duration (ly:music-property music 'duration)))
+ (list (make-music 'BarCheck
+ 'origin location)
+ (make-event-chord (cons (make-music 'MultiMeasureRestEvent
+ 'origin location
+ 'duration duration)
+ (ly:music-property music 'articulations)))
+ (make-music 'BarCheck
+ 'origin location))))
+
(define-public music-descriptions
`(
(AbsoluteDynamicEvent
Syntax: @code{c4\\melisma d\\melismaEnd}.")
(types . (general-music melisma-span-event event))
))
-
- (MultiMeasureRestEvent
+
+ (MultiMeasureRest
. (
(description . "Rests that may be compressed into Multi rests.
Syntax
-@code{R2.*4} for 4 measures in 3/4 time. Note the capital R.")
- (types . (general-music event rhythmic-event multi-measure-rest-event))
+@code{R2.*4} for 4 measures in 3/4 time.")
+ (iterator-ctor . ,ly:sequential-iterator::constructor)
+ (elements-callback . ,mm-rest-child-list)
+ (types . (general-music multi-measure-rest))
))
-
- (MultiMeasureRestMusicGroup
- . (
- (description . "Like sequential-music, but specifically intended
-to group start-mmrest, skip, stop-mmrest sequence.
-Syntax @code{R2.*5} for 5 measures in 3/4 time.")
- (length-callback . ,ly:music-sequence::cumulative-length-callback)
- (start-callback . ,ly:music-sequence::first-start-callback)
- (iterator-ctor . ,ly:sequential-music-iterator::constructor)
- (types . (general-music sequential-music))
+ (MultiMeasureRestEvent
+ . (
+ (description . "Used internally by MultiMeasureRest to signal rests")
+ (types . (general-music event rhythmic-event multi-measure-rest-event))
))
(MultiMeasureTextEvent
(length-callback . ,ly:music-sequence::cumulative-length-callback)
(start-callback . ,ly:music-sequence::first-start-callback)
- (iterator-ctor . ,ly:sequential-music-iterator::constructor)
+ (elements-callback . ,(lambda (m) (ly:music-property m 'elements)))
+ (iterator-ctor . ,ly:sequential-iterator::constructor)
(types . (general-music sequential-music))
))
(define-ly-syntax-simple (repeat type num body alts)
(make-repeat type num body alts))
-;; UGH. TODO: represent mm rests in a decent way as music expressions.
-;; Also eliminate glue-mm-rests while we are at it.
+(define (script-to-mmrest-text music)
+ "Extract 'direction and 'text from SCRIPT-MUSIC, and transform MultiMeasureTextEvent"
+ (if (memq 'script-event (ly:music-property music 'types))
+
+ (let ((dir (ly:music-property music 'direction))
+ (p (make-music 'MultiMeasureTextEvent
+ 'text (ly:music-property music 'text))))
+ (if (ly:dir? dir)
+ (set! (ly:music-property p 'direction) dir))
+ p)
+ music))
+
(define-ly-syntax (multi-measure-rest parser location duration articulations)
- (let* ((mus (make-multi-measure-rest duration location))
- (elts (ly:music-property mus 'elements)))
- (set! (ly:music-property mus 'elements)
- (append elts articulations))
- mus))
+ (make-music 'MultiMeasureRest
+ 'articulations (map script-to-mmrest-text articulations)
+ 'duration duration
+ 'origin location))
(define-ly-syntax-simple (context-specification type id mus ops create-new)
(let* ((type-sym (if (symbol? type) type (string->symbol type)))
;; mmrest
(define-public (make-multi-measure-rest duration location)
- (make-music 'MultiMeasureRestMusicGroup
+ (make-music 'MultiMeasureRest
'origin location
- 'elements (list (make-music 'BarCheck
- 'origin location)
- (make-event-chord (list (make-music 'MultiMeasureRestEvent
- 'origin location
- 'duration duration)))
- (make-music 'BarCheck
- 'origin location))))
-
-(define-public (glue-mm-rest-texts music)
- "Check if we have R1*4-\\markup { .. }, and if applicable convert to
-a property set for MultiMeasureRestNumber."
- (define (script-to-mmrest-text script-music)
- "Extract 'direction and 'text from SCRIPT-MUSIC, and transform MultiMeasureTextEvent"
- (let ((dir (ly:music-property script-music 'direction))
- (p (make-music 'MultiMeasureTextEvent
- 'text (ly:music-property script-music 'text))))
- (if (ly:dir? dir)
- (set! (ly:music-property p 'direction) dir))
- p))
-
- (if (eq? (ly:music-property music 'name) 'MultiMeasureRestMusicGroup)
- (let* ((text? (lambda (x) (memq 'script-event (ly:music-property x 'types))))
- (event? (lambda (x) (memq 'event (ly:music-property x 'types))))
- (group-elts (ly:music-property music 'elements))
- (texts '())
- (events '())
- (others '()))
-
- (set! texts
- (map script-to-mmrest-text (filter text? group-elts)))
- (set! group-elts
- (remove text? group-elts))
-
- (set! events (filter event? group-elts))
- (set! others (remove event? group-elts))
-
- (if (or (pair? texts) (pair? events))
- (set! (ly:music-property music 'elements)
- (cons (make-event-chord
- (append texts events))
- others)))
-
- ))
-
- music)
-
+ 'duration duration))
(define-public (make-property-set sym val)
(make-music 'PropertySet
(define-public toplevel-music-functions
(list
(lambda (music parser) (voicify-music music))
- (lambda (x parser) (music-map glue-mm-rest-texts x))
(lambda (x parser) (music-map music-check-error x))
(lambda (x parser) (music-map precompute-music-length x))
(lambda (music parser)