From 747bac91c575bbe4652c91262ee3d9dc0fa34436 Mon Sep 17 00:00:00 2001 From: hanwen Date: Mon, 19 Jan 2004 14:55:18 +0000 Subject: [PATCH] * lily/include/music-iterator.hh (class Music_iterator): add substitute_outlet() to iterator API. * lily/new-part-combine-iterator.cc (construct_children): New_pc_iterator: new class, better part combining. * lily/tie-column.cc (werner_directions): new function * lily/parser.yy: plug many memory leaks. We're down to 4 for each parser run. --- ChangeLog | 6 + input/regression/pc-new.ly | 24 ++ lily/chord-tremolo-iterator.cc | 7 + lily/folded-repeat-iterator.cc | 10 + lily/include/chord-tremolo-iterator.hh | 2 + lily/include/folded-repeat-iterator.hh | 3 + lily/include/music-iterator.hh | 5 +- lily/include/music-wrapper-iterator.hh | 2 + lily/include/part-combine-music-iterator.hh | 47 ---- lily/include/percent-repeat-iterator.hh | 2 + lily/include/sequential-iterator.hh | 2 + lily/include/simultaneous-music-iterator.hh | 1 + lily/lyric-combine-music-iterator.cc | 10 + lily/music-iterator.cc | 12 + lily/music-wrapper-iterator.cc | 7 + lily/my-lily-lexer.cc | 1 + lily/new-lyric-combine-music-iterator.cc | 12 + lily/new-part-combine-iterator.cc | 237 ++++++++++++++++++++ lily/parser.yy | 11 +- lily/part-combine-music-iterator.cc | 45 ++++ lily/percent-repeat-iterator.cc | 7 + lily/sequential-iterator.cc | 8 + lily/simultaneous-music-iterator.cc | 7 + lily/tie-column.cc | 8 +- scm/define-music-types.scm | 9 + 25 files changed, 430 insertions(+), 55 deletions(-) create mode 100644 input/regression/pc-new.ly create mode 100644 lily/new-part-combine-iterator.cc diff --git a/ChangeLog b/ChangeLog index 0d6fdd2e16..2021565fd6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2004-01-19 Han-Wen Nienhuys + * lily/include/music-iterator.hh (class Music_iterator): add + substitute_outlet() to iterator API. + + * lily/new-part-combine-iterator.cc (construct_children): + New_pc_iterator: new class, better part combining. + * lily/tie-column.cc (werner_directions): new function * lily/tie.cc (set_direction): call Tie_column::set_direction () diff --git a/input/regression/pc-new.ly b/input/regression/pc-new.ly new file mode 100644 index 0000000000..b0536363b5 --- /dev/null +++ b/input/regression/pc-new.ly @@ -0,0 +1,24 @@ +\score { + \notes \relative c'' { + + \newpartcombine + #(list + (cons (ly:make-moment 2 4) 'together) + (cons (ly:make-moment 4 4) 'apart) + + ) { + g2 g g + } + { f f f } + } + + \paper { + \translator { \VoiceContext + \denies Thread + \consists Note_heads_engraver + \consists Rest_engraver + } + + + } +} diff --git a/lily/chord-tremolo-iterator.cc b/lily/chord-tremolo-iterator.cc index a8d6ade083..ae9a17eb46 100644 --- a/lily/chord-tremolo-iterator.cc +++ b/lily/chord-tremolo-iterator.cc @@ -57,6 +57,13 @@ Chord_tremolo_iterator::derived_mark () const scm_gc_mark (child_iter_->self_scm()); } +void +Chord_tremolo_iterator::derived_substitute (Translator_group*f, Translator_group*t) +{ + if (child_iter_) + child_iter_->substitute_outlet (f,t); +} + void Chord_tremolo_iterator::process (Moment m) { diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc index c5dfb5d45d..40f4680326 100644 --- a/lily/folded-repeat-iterator.cc +++ b/lily/folded-repeat-iterator.cc @@ -161,4 +161,14 @@ Folded_repeat_iterator::derived_mark()const if (alternative_iter_) scm_gc_mark (alternative_iter_->self_scm()); } + +void +Folded_repeat_iterator::derived_substitute (Translator_group*f, Translator_group*t) +{ + if (main_iter_) + main_iter_->substitute_outlet (f,t); + if (alternative_iter_) + alternative_iter_->substitute_outlet (f,t); +} + IMPLEMENT_CTOR_CALLBACK (Folded_repeat_iterator); diff --git a/lily/include/chord-tremolo-iterator.hh b/lily/include/chord-tremolo-iterator.hh index b4d18836f1..17ebc1be82 100644 --- a/lily/include/chord-tremolo-iterator.hh +++ b/lily/include/chord-tremolo-iterator.hh @@ -20,6 +20,8 @@ public: Chord_tremolo_iterator (); Chord_tremolo_iterator (Chord_tremolo_iterator const & ); protected: + virtual void derived_substitute (Translator_group*f, Translator_group*t) ; + virtual void derived_mark () const; virtual Moment pending_moment () const; virtual void do_quit(); diff --git a/lily/include/folded-repeat-iterator.hh b/lily/include/folded-repeat-iterator.hh index 8312a04e38..662243802b 100644 --- a/lily/include/folded-repeat-iterator.hh +++ b/lily/include/folded-repeat-iterator.hh @@ -25,6 +25,9 @@ public: Folded_repeat_iterator (Folded_repeat_iterator const &src); Folded_repeat_iterator (); virtual void derived_mark () const; + virtual void derived_substitute (Translator_group*f, Translator_group*t) ; + + virtual void construct_children (); virtual Moment pending_moment () const; virtual void do_quit(); diff --git a/lily/include/music-iterator.hh b/lily/include/music-iterator.hh index 98010ea9d0..0831317f38 100644 --- a/lily/include/music-iterator.hh +++ b/lily/include/music-iterator.hh @@ -91,8 +91,8 @@ public: static SCM get_static_get_iterator (Music * mus); void init_translator (Music *, Translator_group *); void quit (); - - + void substitute_outlet (Translator_group* from, Translator_group *to); + virtual void derived_substitute (Translator_group*, Translator_group*); virtual Moment pending_moment () const; virtual bool ok () const; @@ -100,6 +100,7 @@ public: virtual SCM get_pending_events (Moment until)const; virtual void process (Moment until); virtual void skip (Moment until); + virtual void derived_mark ()const; virtual void construct_children (); diff --git a/lily/include/music-wrapper-iterator.hh b/lily/include/music-wrapper-iterator.hh index 7207cfd38f..4bd32a93d1 100644 --- a/lily/include/music-wrapper-iterator.hh +++ b/lily/include/music-wrapper-iterator.hh @@ -26,6 +26,8 @@ public: Music_wrapper_iterator (); Music_wrapper_iterator (Music_wrapper_iterator const&); + virtual void derived_substitute (Translator_group*f, Translator_group*t) ; + virtual void derived_mark () const; virtual void construct_children () ; virtual Moment pending_moment () const; diff --git a/lily/include/part-combine-music-iterator.hh b/lily/include/part-combine-music-iterator.hh index 8d6d6a18d9..e69de29bb2 100644 --- a/lily/include/part-combine-music-iterator.hh +++ b/lily/include/part-combine-music-iterator.hh @@ -1,47 +0,0 @@ -/* - part-combine-music-iterator.hh -- declare Part_combine_music_iterator - - source file of the GNU LilyPond music typesetter - - (c) 2000--2003 Jan Nieuwenhuizen - - */ - -#ifndef PART_COMBINE_MUSIC_ITERATOR_HH -#define PART_COMBINE_MUSIC_ITERATOR_HH - -#include "music-iterator.hh" - -class Part_combine_music_iterator : public Music_iterator -{ -public: - VIRTUAL_COPY_CONS (Music_iterator); - Part_combine_music_iterator (); - - enum State { UNKNOWN, UNRELATED=1, SOLO1=2, SOLO2=4, UNIRHYTHM=8, UNISON=16, UNISILENCE=32, SPLIT_INTERVAL=64 }; - DECLARE_SCHEME_CALLBACK(constructor, ()); -protected: - virtual void derived_mark () const; - Part_combine_music_iterator (Part_combine_music_iterator const &); - virtual void construct_children (); - virtual Moment pending_moment () const; - virtual void do_quit(); - virtual void process (Moment); - virtual SCM get_pending_events (Moment)const; - virtual Music_iterator *try_music_in_children (Music *) const; - virtual bool ok () const; - -private: - void change_to (Music_iterator*, SCM, String); - int get_state (Moment m); - - Music_iterator * first_iter_; - Music_iterator * second_iter_; - Moment first_until_; - Moment second_until_; - int state_; - String suffix_; -}; - -#endif /* PART_COMBINE_MUSIC_ITERATOR_HH */ - diff --git a/lily/include/percent-repeat-iterator.hh b/lily/include/percent-repeat-iterator.hh index 325c1ed1b0..b7699ec816 100644 --- a/lily/include/percent-repeat-iterator.hh +++ b/lily/include/percent-repeat-iterator.hh @@ -20,6 +20,8 @@ public: Percent_repeat_iterator (); Percent_repeat_iterator (Percent_repeat_iterator const & ); protected: + virtual void derived_substitute (Translator_group*f, Translator_group*t) ; + virtual void derived_mark () const; virtual Moment pending_moment () const; virtual void do_quit(); diff --git a/lily/include/sequential-iterator.hh b/lily/include/sequential-iterator.hh index 382a3211fe..1ab1d00c5d 100644 --- a/lily/include/sequential-iterator.hh +++ b/lily/include/sequential-iterator.hh @@ -57,6 +57,8 @@ public: DECLARE_SCHEME_CALLBACK(constructor, ()); Sequential_iterator (); Sequential_iterator (Sequential_iterator const&); + virtual void derived_substitute (Translator_group*f, Translator_group*t) ; + virtual void derived_mark () const; virtual void construct_children (); diff --git a/lily/include/simultaneous-music-iterator.hh b/lily/include/simultaneous-music-iterator.hh index 3689b1348c..446e3ae1e5 100644 --- a/lily/include/simultaneous-music-iterator.hh +++ b/lily/include/simultaneous-music-iterator.hh @@ -18,6 +18,7 @@ public: VIRTUAL_COPY_CONS (Music_iterator); Simultaneous_music_iterator (); Simultaneous_music_iterator (Simultaneous_music_iterator const&); + virtual void derived_substitute (Translator_group*f, Translator_group*t) ; virtual void derived_mark () const; DECLARE_SCHEME_CALLBACK(constructor, ()); diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc index 138a4ddcf1..3b3e19ec78 100644 --- a/lily/lyric-combine-music-iterator.cc +++ b/lily/lyric-combine-music-iterator.cc @@ -30,6 +30,7 @@ protected: virtual bool ok () const; virtual void derived_mark () const; + virtual void derived_substitute (Translator_group*,Translator_group*) ; private: bool get_busy_status ()const ; bool melisma_busy (); @@ -96,6 +97,15 @@ Lyric_combine_music_iterator::derived_mark()const scm_gc_mark (lyric_iter_->self_scm()); } +void +Lyric_combine_music_iterator::derived_substitute (Translator_group*f,Translator_group* t) +{ + if (music_iter_) + music_iter_->substitute_outlet (f,t); + if (lyric_iter_) + lyric_iter_->substitute_outlet (f,t); +} + void Lyric_combine_music_iterator::construct_children () { diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc index d70fec3d2b..7d53a9c702 100644 --- a/lily/music-iterator.cc +++ b/lily/music-iterator.cc @@ -136,6 +136,18 @@ Music_iterator::init_translator (Music *m, Translator_group *report) set_translator (report); } +void +Music_iterator::substitute_outlet (Translator_group*f, Translator_group *t) +{ + if (report_to () == f) + set_translator (t); + derived_substitute (f,t); +} + +void +Music_iterator::derived_substitute (Translator_group*,Translator_group*) +{ +} SCM Music_iterator::get_iterator (Music *m) const diff --git a/lily/music-wrapper-iterator.cc b/lily/music-wrapper-iterator.cc index ee19b425e7..be56471ad8 100644 --- a/lily/music-wrapper-iterator.cc +++ b/lily/music-wrapper-iterator.cc @@ -39,6 +39,13 @@ Music_wrapper_iterator::derived_mark () const scm_gc_mark (child_iter_->self_scm()); } +void +Music_wrapper_iterator::derived_substitute (Translator_group*f,Translator_group*t) +{ + + if (child_iter_) + child_iter_->substitute_outlet (f,t); +} void Music_wrapper_iterator::construct_children () diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc index 9608e94ea1..2a8d3e8cb5 100644 --- a/lily/my-lily-lexer.cc +++ b/lily/my-lily-lexer.cc @@ -60,6 +60,7 @@ static Keyword_ent the_key_tab[]={ {"midi", MIDI}, {"name", NAME}, {"new", NEWCONTEXT}, + {"newpartcombine", NEWPARTCOMBINE}, {"notes", NOTES}, {"octave", OCTAVE}, {"once", ONCE}, diff --git a/lily/new-lyric-combine-music-iterator.cc b/lily/new-lyric-combine-music-iterator.cc index 7fcc47401a..f2eff8b6f3 100644 --- a/lily/new-lyric-combine-music-iterator.cc +++ b/lily/new-lyric-combine-music-iterator.cc @@ -30,6 +30,7 @@ protected: virtual bool run_always ()const; virtual bool ok () const; virtual void derived_mark () const; + virtual void derived_substitute (Translator_group*,Translator_group*); private: bool start_new_syllable () ; void find_thread (); @@ -113,6 +114,17 @@ New_lyric_combine_music_iterator::derived_mark()const scm_gc_mark (music_context_->self_scm ()); } +void +New_lyric_combine_music_iterator::derived_substitute (Translator_group*f, Translator_group*t) +{ + if (lyric_iter_) + lyric_iter_->substitute_outlet (f,t); + if (lyrics_context_ && lyrics_context_==f) + lyrics_context_ = t; + if (music_context_ && music_context_ == f) + music_context_ = t; +} + /* ID == "" means accept any ID. */ diff --git a/lily/new-part-combine-iterator.cc b/lily/new-part-combine-iterator.cc new file mode 100644 index 0000000000..79595925f3 --- /dev/null +++ b/lily/new-part-combine-iterator.cc @@ -0,0 +1,237 @@ +/* + part-combine-music-iterator.cc -- implement New_pc_iterator + + source file of the GNU LilyPond music typesetter + + (c) 2000--2003 Jan Nieuwenhuizen + */ + +#include "part-combine-music-iterator.hh" +#include "translator-group.hh" +#include "event.hh" +#include "music-sequence.hh" +#include "lily-guile.hh" +#include "warn.hh" +#include "music-iterator.hh" +#include "interpretation-context-handle.hh" + +class New_pc_iterator : public Music_iterator +{ +public: + VIRTUAL_COPY_CONS (Music_iterator); + New_pc_iterator (); + + DECLARE_SCHEME_CALLBACK(constructor, ()); +protected: + virtual void derived_substitute (Translator_group*f, Translator_group*t) ; + virtual void derived_mark () const; + New_pc_iterator (New_pc_iterator const &); + + virtual void construct_children (); + virtual Moment pending_moment () const; + virtual void do_quit(); + virtual void process (Moment); + + virtual SCM get_pending_events (Moment)const; + virtual Music_iterator *try_music_in_children (Music *) const; + + virtual bool ok () const; + +private: + Music_iterator * first_iter_; + Music_iterator * second_iter_; + bool is_shared_ ; + SCM split_list_; + + Interpretation_context_handle one_; + Interpretation_context_handle two_; + Interpretation_context_handle shared_; + + void together (); + void apart (); +}; + + +New_pc_iterator::New_pc_iterator () +{ + is_shared_ =false; + first_iter_ = 0; + second_iter_ = 0; + split_list_ = SCM_EOL; +} + +void +New_pc_iterator::derived_mark () const +{ + if (first_iter_) + scm_gc_mark (first_iter_->self_scm()); + if (second_iter_) + scm_gc_mark(second_iter_->self_scm()); +} + +void +New_pc_iterator::derived_substitute (Translator_group*f, + Translator_group*t) +{ + if (first_iter_) + first_iter_->substitute_outlet (f,t); + if (second_iter_) + second_iter_->substitute_outlet (f,t); +} + +void +New_pc_iterator::do_quit () +{ + if (first_iter_) + first_iter_->quit(); + if (second_iter_) + second_iter_->quit(); + + one_ .set_translator (0); + two_.set_translator (0); + shared_.set_translator (0); +} + +New_pc_iterator::New_pc_iterator (New_pc_iterator const &src) + : Music_iterator (src) +{ + first_iter_ = 0; + second_iter_ = 0; + + if(src.first_iter_) + first_iter_ = src.first_iter_->clone (); + if (src.second_iter_) + second_iter_ = src.second_iter_->clone (); + + split_list_ = src.split_list_; + + if (first_iter_) + scm_gc_unprotect_object (first_iter_->self_scm()); + if (second_iter_) + scm_gc_unprotect_object (second_iter_->self_scm()); +} + +Moment +New_pc_iterator::pending_moment () const +{ + Moment p; + p.set_infinite (1); + if (first_iter_->ok ()) + p = p pending_moment (); + + if (second_iter_->ok ()) + p = p pending_moment (); + return p; +} + +bool +New_pc_iterator::ok () const +{ + return first_iter_->ok () || second_iter_->ok (); +} + +void +New_pc_iterator::together () +{ + first_iter_->substitute_outlet (one_.report_to (), shared_.report_to ()); + second_iter_->substitute_outlet (two_.report_to (), shared_.report_to ()); +} + +void +New_pc_iterator::apart () +{ + first_iter_->substitute_outlet (shared_.report_to (),one_.report_to ()); + second_iter_->substitute_outlet (shared_.report_to (), two_.report_to ()); +} + + +void +New_pc_iterator::construct_children () +{ + split_list_ = get_music ()->get_mus_property ("split-list"); + SCM lst = get_music ()->get_mus_property ("elements"); + + Translator_group *tr + = report_to ()->find_create_translator (ly_symbol2scm ("Voice"), + "shared", SCM_EOL); + + tr->execute_pushpop_property (ly_symbol2scm ("NoteHead"), + ly_symbol2scm ("font-size"), gh_int2scm (3)); + + + shared_ .set_translator (tr); + set_translator (tr); + + Translator_group *one = tr->find_create_translator (ly_symbol2scm ("Voice"), + "one", SCM_EOL); + + one_.set_translator (one); + one->execute_pushpop_property (ly_symbol2scm ("Stem"), + ly_symbol2scm ("direction"), gh_int2scm (1)); + + set_translator (one); + first_iter_ = unsmob_iterator (get_iterator (unsmob_music (gh_car (lst)))); + + + Translator_group *two = tr->find_create_translator (ly_symbol2scm ("Voice"), + "two", SCM_EOL); + two_.set_translator (two); + two_.report_to ()->execute_pushpop_property (ly_symbol2scm ("Stem"), + ly_symbol2scm ("direction"), gh_int2scm (-1)); + set_translator (two); + second_iter_ = unsmob_iterator (get_iterator (unsmob_music (gh_cadr (lst)))); + + + set_translator (tr); +} + +void +New_pc_iterator::process (Moment m) +{ + Moment now = report_to ()->now_mom (); + Moment *splitm = 0; + + for (; gh_pair_p (split_list_); split_list_ = gh_cdr (split_list_)) + { + splitm = unsmob_moment (gh_caar (split_list_)); + if (*splitm > now) + break ; + + if (gh_cdar (split_list_) == ly_symbol2scm ("together")) + together (); + else if (gh_cdar (split_list_) == ly_symbol2scm ("apart")) + apart (); + else + programming_error ("Unknown split directive."); + } + + if (first_iter_->ok ()) + first_iter_->process (m); + + if (second_iter_->ok ()) + second_iter_->process (m); +} + +Music_iterator* +New_pc_iterator::try_music_in_children (Music *m) const +{ + Music_iterator * i = first_iter_->try_music (m); + if (i) + return i; + else + return second_iter_->try_music (m); +} + + +SCM +New_pc_iterator::get_pending_events (Moment m)const +{ + SCM s = SCM_EOL; + if (first_iter_) + s = gh_append2 (s,first_iter_->get_pending_events (m)); + if (second_iter_) + s = gh_append2 (second_iter_->get_pending_events (m),s); + return s; +} + +IMPLEMENT_CTOR_CALLBACK (New_pc_iterator); diff --git a/lily/parser.yy b/lily/parser.yy index a2da89103c..fad5e954b7 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -283,6 +283,7 @@ yylex (YYSTYPE *s, void * v) %token OVERRIDE SET REVERT %token PAPER %token PARTCOMBINE +%token NEWPARTCOMBINE %token PARTIAL %token PITCHNAMES %token PROPERTY @@ -551,7 +552,6 @@ all objects can be unprotected as soon as they're here. ; - identifier_init: score_block { $$ = $1->self_scm (); @@ -1125,6 +1125,15 @@ part_combined_music: $$ = p; } + | NEWPARTCOMBINE embedded_scm Music Music { + Music * p= MY_MAKE_MUSIC("NewPartCombineMusic"); + p->set_mus_property ("elements", gh_list ($3->self_scm (),$4->self_scm (), SCM_UNDEFINED)); + p->set_mus_property ("split-list", $2); + scm_gc_unprotect_object ($3->self_scm ()); + scm_gc_unprotect_object ($4->self_scm ()); + + $$ = p; + } ; context_change: diff --git a/lily/part-combine-music-iterator.cc b/lily/part-combine-music-iterator.cc index 2445ab315d..6ce902c4c8 100644 --- a/lily/part-combine-music-iterator.cc +++ b/lily/part-combine-music-iterator.cc @@ -12,6 +12,41 @@ #include "music-sequence.hh" #include "lily-guile.hh" #include "warn.hh" +#include "music-iterator.hh" + +class Part_combine_music_iterator : public Music_iterator +{ +public: + VIRTUAL_COPY_CONS (Music_iterator); + Part_combine_music_iterator (); + + enum State { UNKNOWN, UNRELATED=1, SOLO1=2, SOLO2=4, UNIRHYTHM=8, UNISON=16, UNISILENCE=32, SPLIT_INTERVAL=64 }; + DECLARE_SCHEME_CALLBACK(constructor, ()); +protected: + virtual void derived_substitute (Translator_group*f, Translator_group*t) ; + + virtual void derived_mark () const; + Part_combine_music_iterator (Part_combine_music_iterator const &); + virtual void construct_children (); + virtual Moment pending_moment () const; + virtual void do_quit(); + virtual void process (Moment); + virtual SCM get_pending_events (Moment)const; + virtual Music_iterator *try_music_in_children (Music *) const; + virtual bool ok () const; + +private: + void change_to (Music_iterator*, SCM, String); + int get_state (Moment m); + + Music_iterator * first_iter_; + Music_iterator * second_iter_; + Moment first_until_; + Moment second_until_; + int state_; + String suffix_; +}; + Part_combine_music_iterator::Part_combine_music_iterator () { @@ -31,6 +66,16 @@ Part_combine_music_iterator::derived_mark () const scm_gc_mark(second_iter_->self_scm()); } +void +Part_combine_music_iterator::derived_substitute (Translator_group*f, + Translator_group*t) +{ + if (first_iter_) + first_iter_->substitute_outlet (f,t); + if (second_iter_) + second_iter_->substitute_outlet (f,t); +} + void Part_combine_music_iterator::do_quit () { diff --git a/lily/percent-repeat-iterator.cc b/lily/percent-repeat-iterator.cc index 0f40fba6d2..2329daff5a 100644 --- a/lily/percent-repeat-iterator.cc +++ b/lily/percent-repeat-iterator.cc @@ -96,3 +96,10 @@ Percent_repeat_iterator::derived_mark()const if (child_iter_) scm_gc_mark (child_iter_->self_scm()); } + +void +Percent_repeat_iterator::derived_substitute(Translator_group*f,Translator_group*t ) +{ + if (child_iter_) + child_iter_->substitute_outlet (f,t); +} diff --git a/lily/sequential-iterator.cc b/lily/sequential-iterator.cc index b2c3126977..d60ca429f8 100644 --- a/lily/sequential-iterator.cc +++ b/lily/sequential-iterator.cc @@ -85,6 +85,14 @@ Sequential_iterator::derived_mark ()const } +void +Sequential_iterator::derived_substitute (Translator_group*f,Translator_group*t) +{ + if (iter_) + iter_->substitute_outlet (f,t); + +} + Grace_fixup * get_grace_fixups (SCM cursor) { diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index 8e9eea1e94..a222cf0856 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -47,6 +47,13 @@ Simultaneous_music_iterator::derived_mark()const scm_gc_mark (children_list_); } +void +Simultaneous_music_iterator::derived_substitute(Translator_group*f,Translator_group*t) +{ + for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s)) + unsmob_iterator (gh_car (s))-> substitute_outlet (f,t); +} + SCM Simultaneous_music_iterator::get_pending_events (Moment m)const { diff --git a/lily/tie-column.cc b/lily/tie-column.cc index 0b76bbb362..a9eddaebe9 100644 --- a/lily/tie-column.cc +++ b/lily/tie-column.cc @@ -22,7 +22,9 @@ /* tie dir depends on what Tie_column does. */ - +/* + TODO: this doesn't follow standard pattern. Regularize. + */ void Tie_column::add_tie (Grob*me,Grob *s) { @@ -46,8 +48,6 @@ Tie_column::set_directions (Grob*me) { werner_directions (me); } - - int tie_compare (Grob* const & s1, @@ -74,11 +74,9 @@ Tie_column::old_directions (Grob*me) for (int i = ties.size (); i--;) if (get_grob_direction (ties[i])) ties.del (i); - if (!ties.size ()) return ; - Direction d = get_grob_direction (me); if (d) diff --git a/scm/define-music-types.scm b/scm/define-music-types.scm index 2a2bd790dd..acdceff211 100644 --- a/scm/define-music-types.scm +++ b/scm/define-music-types.scm @@ -311,6 +311,15 @@ as separate voices.") (types . (general-music part-combine-music)) (iterator-ctor . ,Part_combine_music_iterator::constructor) )) + (NewPartCombineMusic + . ( + (description . "Combine two parts on a staff, either merged or +as separate voices.") + + (internal-class-name . "Simultaneous_music") + (types . (general-music part-combine-music)) + (iterator-ctor . ,New_pc_iterator::constructor) + )) (PhrasingSlurEvent . ( -- 2.39.5