Auto_change_iterator ();
protected:
- virtual void do_quit ();
virtual void construct_children ();
virtual void process (Moment);
- vector<Pitch> pending_pitch (Moment) const;
private:
SCM split_list_;
Direction where_dir_;
-
- Context_handle up_;
- Context_handle down_;
};
void
Auto_change_iterator::process (Moment m)
{
+ // TODO: It seems strange that this occurs before consulting the split list.
Music_wrapper_iterator::process (m);
Moment *splitm = 0;
if (d && d != where_dir_)
{
+ // TODO: The function of where_dir_ in choosing the direction should
+ // be built into split-list generation so that this iterator merely
+ // effects a sequence of context changes.
where_dir_ = d;
string to_id = (d >= 0) ? "up" : "down";
// N.B. change_to() returns an error message. Silence is the legacy
{
split_list_ = get_music ()->get_property ("split-list");
- SCM props = get_outlet ()->get_property ("trebleStaffProperties");
- Context *up = get_outlet ()->find_create_context (ly_symbol2scm ("Staff"),
- "up", props);
-
- props = get_outlet ()->get_property ("bassStaffProperties");
- Context *down = get_outlet ()->find_create_context (ly_symbol2scm ("Staff"),
- "down", props);
-
- up_.set_context (up);
- down_.set_context (down);
-
- Context *voice = up->find_create_context (ly_symbol2scm ("Voice"),
- "", SCM_EOL);
+ Context *voice = get_outlet()->find_create_context (ly_symbol2scm ("Voice"),
+ "", SCM_EOL);
set_context (voice);
Music_wrapper_iterator::construct_children ();
}
-void
-Auto_change_iterator::do_quit ()
-{
- up_.set_context (0);
- down_.set_context (0);
-}
-
IMPLEMENT_CTOR_CALLBACK (Auto_change_iterator);
chordNameExceptionsPartial = #partialJazzExceptions
noChordSymbol = #(make-simple-markup "N.C.")
- bassStaffProperties = #'((assign clefGlyph "clefs.F")
- (assign clefPosition 2)
- (assign middleCPosition 6)
- (assign middleCClefPosition 6))
%% tablature:
stringOneTopmost = ##t
highStringOne = ##t
autochange =
#(define-music-function (music) (ly:music?)
(_i "Make voices that switch between staves automatically")
- (make-autochange-music music))
-
-
+ (let ;; keep the contexts alive for the full duration
+ ((skip (make-skip-music (make-duration-of-length
+ (ly:music-length music)))))
+ #{
+ <<
+ \context Staff = "up" <<
+ #(make-autochange-music music)
+ \new Voice { #skip }
+ >>
+ \context Staff = "down" \with {
+ clefGlyph = "clefs.F"
+ clefPosition = 2
+ middleCPosition = 6
+ middleCClefPosition = 6
+ } {
+ \new Voice { #skip }
+ }
+ >>
+ #} ))
balloonGrobText =
#(define-music-function (grob-name offset text)
called to produce the formatting for a @code{BassFigure} grob. It
takes a list of @code{BassFigureEvent}s, a context, and the grob to
format.")
- (bassStaffProperties ,list? "An alist of property settings to
-apply for the down staff of @code{PianoStaff}. Used by
-@code{\\autochange}.")
(beamExceptions ,list? "An alist of exceptions to autobeam rules
that normally end on beats.")
(beamHalfMeasure ,boolean? "Whether to allow a beam to begin
(topLevelAlignment ,boolean? "If true, the @var{Vertical_align_engraver}
will create a @var{VerticalAlignment}; otherwise, it will create a
@var{StaffGrouper}")
- (trebleStaffProperties ,list? "An alist of property settings to
-apply for the up staff of @code{PianoStaff}. Used by
-@code{\\autochange}.")
(tupletFullLength ,boolean? "If set, the tuplet is printed up to
the start of the next note.")
(tupletFullLengthNote ,boolean? "If set, end at the next note,
(*omit-duration* #t))
(music->lily-string (ly:music-property expr 'element)))))
+;; \autochange
+(define-extra-display-method SimultaneousMusic (expr)
+ (with-music-match (expr (music 'SimultaneousMusic
+ elements ((music 'ContextSpeccedMusic
+ context-id "up"
+ context-type 'Staff
+ element (music 'SimultaneousMusic elements (?ac-music)))
+ (music 'ContextSpeccedMusic
+ context-id "down"
+ context-type 'Staff))))
+ (with-music-match (?ac-music (music 'AutoChangeMusic))
+ (format #f "~a"
+ (music->lily-string ?ac-music)))))
+
;; \addlyrics
(define-extra-display-method SimultaneousMusic (expr)
(with-music-match (expr (music 'SimultaneousMusic