? lily/On ? lily/busy-playing-listener.cc ? lily/event-iterator.cc ? lily/foo.pdf ? lily/foo.ps ? lily/lilypond ? lily/lilypond.gdt ? lily/lilypond.gpr ? lily/out ? lily/out-scons ? lily/out-www ? lily/include/.sconsign ? lily/include/busy-playing-listener.hh ? lily/include/event-iterator.hh ? lily/include/out ? lily/include/out-www ? ly/out ? ly/out-www ? scm/out ? scm/out-www Index: lily/chord-tremolo-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/chord-tremolo-engraver.cc,v retrieving revision 1.99 diff -u -r1.99 chord-tremolo-engraver.cc --- lily/chord-tremolo-engraver.cc 7 May 2006 19:51:11 -0000 1.99 +++ lily/chord-tremolo-engraver.cc 23 May 2006 06:36:58 -0000 @@ -4,12 +4,12 @@ source file of the GNU LilyPond music typesetter (c) 2000--2006 Han-Wen Nienhuys + Erik Sandberg */ #include "math.h" // ceil #include "beam.hh" -#include "chord-tremolo-iterator.hh" #include "engraver-group.hh" #include "international.hh" #include "item.hh" @@ -39,92 +39,72 @@ */ class Chord_tremolo_engraver : public Engraver { - void typeset_beam (); TRANSLATOR_DECLARATIONS (Chord_tremolo_engraver); protected: Music *repeat_; - /// moment (global time) where beam started. - Moment start_mom_; - Moment stop_mom_; int flags_; - int total_duration_flags_; + // number of beams for short tremolos + int expected_beam_count_; + // current direction of beam (first RIGHT, then LEFT) + Direction beam_dir_; - /// location within measure where beam started. - Moment beam_start_location_; - - bool body_is_sequential_; Spanner *beam_; - Spanner *finished_beam_; - Item *stem_tremolo_; protected: virtual void finalize (); virtual bool try_music (Music *); - void stop_translation_timestep (); - void start_translation_timestep (); void process_music (); DECLARE_ACKNOWLEDGER (stem); }; Chord_tremolo_engraver::Chord_tremolo_engraver () { - beam_ = finished_beam_ = 0; + beam_ = 0; repeat_ = 0; flags_ = 0; - stem_tremolo_ = 0; - body_is_sequential_ = false; + expected_beam_count_ = 0; + beam_dir_ = CENTER; } bool Chord_tremolo_engraver::try_music (Music *m) { - if (m->is_mus_type ("repeated-music") - && m->get_property ("iterator-ctor") == Chord_tremolo_iterator::constructor_proc - && !repeat_) + if (m->is_mus_type ("tremolo-span-event")) { - Moment l = m->get_length (); - repeat_ = m; - start_mom_ = now_mom (); - stop_mom_ = start_mom_ + l; - - Music *body = Repeated_music::body (m); - body_is_sequential_ = body->is_mus_type ("sequential-music"); - - int elt_count = body_is_sequential_ ? scm_ilength (body->get_property ("elements")) : 1; - - if (body_is_sequential_ && elt_count != 2) - m->origin ()->warning (_f ("expect 2 elements for chord tremolo, found %d", elt_count)); - - if (elt_count <= 0) - elt_count = 1; - - Rational total_dur = l.main_part_; - Rational note_dur = total_dur / Rational (elt_count * Repeated_music::repeat_count (repeat_)); - - total_duration_flags_ = max (0, (intlog2 (total_dur.den ()) - 2)); - - flags_ = intlog2 (note_dur.den ()) -2; - + Direction span_dir = to_dir (m->get_property ("span-direction")); + if (span_dir == START) + { + repeat_ = m; + int type = scm_to_int (m->get_property ("tremolo-type")); + /* e.g. 1 for type 8, 2 for type 16 */ + flags_ = intlog2 (type) - 2; + expected_beam_count_ = scm_to_int (m->get_property ("expected-beam-count")); + beam_dir_ = RIGHT; + } + if (span_dir == STOP) + { + repeat_ = 0; + beam_ = 0; + expected_beam_count_ = 0; + beam_dir_ = CENTER; + } return true; } - return false; } void Chord_tremolo_engraver::process_music () { - if (repeat_ && body_is_sequential_ && !beam_) + if (repeat_ && !beam_) { beam_ = make_spanner ("Beam", repeat_->self_scm ()); - beam_start_location_ = robust_scm2moment (get_property ("measurePosition"), Moment (0)); } } void Chord_tremolo_engraver::finalize () { - typeset_beam (); if (beam_) { repeat_->origin ()->warning (_ ("unterminated chord tremolo")); @@ -133,25 +113,19 @@ } void -Chord_tremolo_engraver::typeset_beam () -{ - finished_beam_ = 0; -} - -void Chord_tremolo_engraver::acknowledge_stem (Grob_info info) { if (beam_) { Grob *s = info.grob (); - if (start_mom_ == now_mom ()) - Stem::set_beaming (s, flags_, RIGHT); - else - Stem::set_beaming (s, flags_, LEFT); + Stem::set_beaming (s, flags_, beam_dir_); if (Stem::duration_log (s) != 1) - beam_->set_property ("gap-count", scm_from_int (flags_ - total_duration_flags_)); + beam_->set_property ("gap-count", scm_from_int (flags_ - expected_beam_count_)); + + if (beam_dir_ == RIGHT) + beam_dir_ = LEFT; if (info.ultimate_music_cause ()->is_mus_type ("rhythmic-event")) Beam::add_stem (beam_, s); @@ -164,49 +138,12 @@ ::warning (s); } } - else if (repeat_ - && flags_ - && !body_is_sequential_) - { - stem_tremolo_ = make_item ("StemTremolo", repeat_->self_scm ()); - stem_tremolo_->set_property ("flag-count", - scm_from_int (flags_)); - stem_tremolo_->set_object ("stem", - info.grob ()->self_scm ()); - stem_tremolo_->set_parent (info.grob (), X_AXIS); - info.grob ()->set_object ("tremolo-flag", stem_tremolo_->self_scm ()); - } -} - -void -Chord_tremolo_engraver::start_translation_timestep () -{ - if (beam_ && stop_mom_ == now_mom ()) - { - finished_beam_ = beam_; - repeat_ = 0; - beam_ = 0; - } -} - -void -Chord_tremolo_engraver::stop_translation_timestep () -{ - if (stem_tremolo_) - { - repeat_ = 0; - if (beam_) - programming_error ("beam and stem tremolo?"); - stem_tremolo_ = 0; - } - - typeset_beam (); } ADD_ACKNOWLEDGER (Chord_tremolo_engraver, stem); ADD_TRANSLATOR (Chord_tremolo_engraver, - /* doc */ "Generates beams for tremolo repeats.", + /* doc */ "Generates beams for tremolo repeats.", /* create */ "Beam", - /* accept */ "repeated-music", + /* accept */ "tremolo-span-event", /* read */ "", /* write */ ""); Index: lily/chord-tremolo-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/chord-tremolo-iterator.cc,v retrieving revision 1.35 diff -u -r1.35 chord-tremolo-iterator.cc --- lily/chord-tremolo-iterator.cc 26 Jan 2006 11:17:08 -0000 1.35 +++ lily/chord-tremolo-iterator.cc 23 May 2006 06:36:58 -0000 @@ -4,82 +4,66 @@ source file of the GNU LilyPond music typesetter (c) 2000--2006 Han-Wen Nienhuys + Erik Sandberg */ #include "chord-tremolo-iterator.hh" #include "input.hh" #include "international.hh" +#include "misc.hh" #include "repeated-music.hh" -void -Chord_tremolo_iterator::construct_children () -{ - Music *m = get_music (); - - factor_ = Moment (Rational (1, 1)); - child_iter_ = unsmob_iterator (get_iterator (Repeated_music::body (m))); -} - Chord_tremolo_iterator::Chord_tremolo_iterator () { - factor_ = 1; - child_iter_ = 0; } -void -Chord_tremolo_iterator::do_quit () +SCM +Chord_tremolo_iterator::get_music_list () const { - if (child_iter_) - child_iter_->quit (); -} + Music *mus = get_music (); + Input *origin = mus->origin (); + Moment l = mus->get_length (); + Music *body = Repeated_music::body (mus); + bool body_is_sequential = body->is_mus_type ("sequential-music"); + + int elt_count = body_is_sequential ? scm_ilength (body->get_property ("elements")) : 1; + + if (body_is_sequential && elt_count != 2) + mus->origin ()->warning (_f ("expect 2 elements for chord tremolo, found %d", elt_count)); + + if (elt_count <= 0) + elt_count = 1; + + Rational total_dur = l.main_part_; + Rational note_dur = total_dur / Rational (elt_count * Repeated_music::repeat_count (mus)); -void -Chord_tremolo_iterator::derived_mark () const -{ - if (child_iter_) - scm_gc_mark (child_iter_->self_scm ()); -} + SCM tremolo_type = scm_int2num (note_dur.den ()); + int expected_beaming_ = max (0, (intlog2 (total_dur.den ()) - 2)); -void -Chord_tremolo_iterator::derived_substitute (Context *f, Context *t) -{ - if (child_iter_) - child_iter_->substitute_outlet (f, t); -} - -void -Chord_tremolo_iterator::process (Moment m) -{ - if (!m.to_bool ()) + if (elt_count == 1) { - Music_iterator *yeah = try_music (get_music ()); - if (yeah) - set_context (yeah->get_outlet ()); - else - get_music ()->origin ()->warning (_ ("no one to print a tremolos")); + Music *ev = make_music_by_name (ly_symbol2scm ("TremoloEvent")); + ev->set_spot (*origin); + ev->set_property ("tremolo-type", tremolo_type); + return scm_list_2 (ev->unprotect (), body->self_scm ()); } + else + { + SCM tremolo_symbol = ly_symbol2scm ("TremoloSpanEvent"); + SCM start_event_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), tremolo_symbol, scm_from_int (START)); + unsmob_music (start_event_scm)->set_spot (*origin); + SCM stop_event_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), tremolo_symbol, scm_from_int (STOP)); + + Music *start_event = unsmob_music (start_event_scm); + Music *stop_event = unsmob_music (stop_event_scm); + start_event->set_spot (*origin); + stop_event->set_spot (*origin); + start_event->set_property ("tremolo-type", tremolo_type); + start_event->set_property ("expected-beam-count", scm_int2num (expected_beaming_)); - child_iter_->process (factor_ * m); -} - -Moment -Chord_tremolo_iterator::pending_moment () const -{ - return child_iter_->pending_moment () / factor_; -} - -bool -Chord_tremolo_iterator::ok () const -{ - return child_iter_ && child_iter_->ok (); -} - -Music_iterator * -Chord_tremolo_iterator::try_music_in_children (Music *m) const -{ - return child_iter_->try_music (m); + return scm_list_3 (start_event_scm, body->self_scm (), stop_event_scm); + } } IMPLEMENT_CTOR_CALLBACK (Chord_tremolo_iterator); - Index: lily/context-def.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/context-def.cc,v retrieving revision 1.61 diff -u -r1.61 context-def.cc --- lily/context-def.cc 16 May 2006 11:30:54 -0000 1.61 +++ lily/context-def.cc 23 May 2006 06:36:58 -0000 @@ -344,9 +344,8 @@ else if (dynamic_cast (g)) g->simple_trans_list_ = filter_engravers (g->simple_trans_list_); - g->context_ = context; context->aliases_ = context_aliases_; - + g->connect_to_context (context); g->unprotect (); context->accepts_list_ = get_accepted (ops); Index: lily/context.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/context.cc,v retrieving revision 1.82 diff -u -r1.82 context.cc --- lily/context.cc 16 May 2006 16:13:52 -0000 1.82 +++ lily/context.cc 23 May 2006 06:36:58 -0000 @@ -660,3 +660,16 @@ set_context_property_on_children (trg, sym, ly_deep_copy (val)); } } + +bool +melisma_busy (Context *tr) +{ + SCM melisma_properties = tr->get_property ("melismaBusyProperties"); + bool busy = false; + + for (; scm_is_pair (melisma_properties); + melisma_properties = scm_cdr (melisma_properties)) + busy = busy || to_boolean (tr->internal_get_property (scm_car (melisma_properties))); + + return busy; +} Index: lily/event-chord-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/event-chord-iterator.cc,v retrieving revision 1.26 diff -u -r1.26 event-chord-iterator.cc --- lily/event-chord-iterator.cc 26 Jan 2006 11:17:01 -0000 1.26 +++ lily/event-chord-iterator.cc 23 May 2006 06:36:58 -0000 @@ -20,22 +20,11 @@ { } -Context * -Event_chord_iterator::get_bottom_context () -{ - assert (get_outlet ()); - if (get_outlet ()->is_bottom_context ()) - return get_outlet (); - - set_context (get_outlet ()->get_default_interpreter ()); - return get_outlet (); -} - void Event_chord_iterator::construct_children () { Simple_music_iterator::construct_children (); - get_bottom_context (); + descend_to_bottom_context (); } void @@ -47,10 +36,7 @@ scm_is_pair (s); s = scm_cdr (s)) { Music *mus = unsmob_music (scm_car (s)); - - bool gotcha = try_music (mus); - if (!gotcha) - mus->origin ()->warning (_f ("junking event: `%s'", mus->name ())); + report_music (mus); } } Simple_music_iterator::process (m); Index: lily/folded-repeat-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/folded-repeat-iterator.cc,v retrieving revision 1.43 diff -u -r1.43 folded-repeat-iterator.cc --- lily/folded-repeat-iterator.cc 16 May 2006 11:19:50 -0000 1.43 +++ lily/folded-repeat-iterator.cc 23 May 2006 06:36:58 -0000 @@ -107,15 +107,6 @@ } } -Music_iterator * -Folded_repeat_iterator::try_music_in_children (Music *m) const -{ - if (main_iter_) - return main_iter_->try_music (m); - if (alternative_iter_) - return alternative_iter_->try_music (m); - return 0; -} void Folded_repeat_iterator::derived_mark () const { Index: lily/lyric-combine-music-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/lyric-combine-music-iterator.cc,v retrieving revision 1.53 diff -u -r1.53 lyric-combine-music-iterator.cc --- lily/lyric-combine-music-iterator.cc 2 Mar 2006 00:39:54 -0000 1.53 +++ lily/lyric-combine-music-iterator.cc 23 May 2006 06:36:58 -0000 @@ -7,9 +7,12 @@ */ #include "context.hh" +#include "dispatcher.hh" +#include "global-context.hh" #include "grob.hh" #include "input.hh" #include "international.hh" +#include "listener.hh" #include "music-iterator.hh" #include "music.hh" @@ -24,14 +27,18 @@ virtual Moment pending_moment () const; virtual void do_quit (); virtual void process (Moment); - virtual Music_iterator *try_music_in_children (Music *) const; virtual bool run_always ()const; virtual bool ok () const; virtual void derived_mark () const; virtual void derived_substitute (Context *, Context *); + void set_music_context (Context *to); private: bool start_new_syllable (); - void find_voice (); + Context *find_voice (); + DECLARE_LISTENER (set_busy); + DECLARE_LISTENER (check_new_context); + /* true when check_new_context is listening */ + bool listening_; bool pending_grace_lyric_; bool music_found_; @@ -40,16 +47,10 @@ Context *music_context_; SCM lyricsto_voice_name_; + bool busy_; Music_iterator *lyric_iter_; }; -/* - Ugh; this is a hack, let's not export this hack, so static. -*/ -static Music *busy_ev; -static Music *start_ev; -static Music *melisma_playing_ev; - Lyric_combine_music_iterator::Lyric_combine_music_iterator () { music_found_ = false; @@ -58,35 +59,52 @@ lyric_iter_ = 0; music_context_ = 0; lyrics_context_ = 0; + listening_ = false; +} - /* - Ugh. out of place here. - */ - if (!busy_ev) +IMPLEMENT_LISTENER (Lyric_combine_music_iterator, set_busy) +void +Lyric_combine_music_iterator::set_busy (SCM se) +{ + Stream_event *e = unsmob_stream_event (se); + SCM mus = e->get_property ("music"); + Music *m = unsmob_music (mus); + assert (m); + + if (m->is_mus_type ("note-event") || m->is_mus_type ("cluster-note-event")) + busy_ = true; +} + +void +Lyric_combine_music_iterator::set_music_context (Context *to) +{ + if (music_context_) + { + music_context_->event_source()->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("MusicEvent")); + lyrics_context_->unset_property (ly_symbol2scm ("associatedVoiceContext")); + } + music_context_ = to; + if (to) { - busy_ev - = make_music_by_name (ly_symbol2scm ("BusyPlayingEvent")); - start_ev - = make_music_by_name (ly_symbol2scm ("StartPlayingEvent")); - melisma_playing_ev - = make_music_by_name (ly_symbol2scm ("MelismaPlayingEvent")); + to->event_source()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("MusicEvent")); + lyrics_context_->set_property ("associatedVoiceContext", to->self_scm ()); } } bool Lyric_combine_music_iterator::start_new_syllable () { - bool b = music_context_->try_music (busy_ev); - - if (!b) + if (!busy_) return false; + busy_ = false; + if (!lyrics_context_) return false; if (!to_boolean (lyrics_context_->get_property ("ignoreMelismata"))) { - bool m = music_context_->try_music (melisma_playing_ev); + bool m = melisma_busy (music_context_); if (m) return false; } @@ -135,7 +153,7 @@ if (lyrics_context_ && lyrics_context_ == f) lyrics_context_ = t; if (music_context_ && music_context_ == f) - music_context_ = t; + set_music_context (t); } void @@ -143,14 +161,25 @@ { Music *m = unsmob_music (get_music ()->get_property ("element")); lyric_iter_ = unsmob_iterator (get_iterator (m)); + if (!lyric_iter_) + return; + lyrics_context_ = find_context_below (lyric_iter_->get_outlet (), + ly_symbol2scm ("Lyrics"), ""); lyricsto_voice_name_ = get_music ()->get_property ("associated-context"); - find_voice (); - - if (lyric_iter_) - lyrics_context_ = find_context_below (lyric_iter_->get_outlet (), - ly_symbol2scm ("Lyrics"), ""); + Context *voice = find_voice (); + if (voice) + set_music_context (voice); + else + { + /* + Wait for a Create_context event. If this isn't done, lyrics can be + delayed when voices are created implicitly. + */ + Global_context *g = lyrics_context_->get_global_context (); + g->events_below ()->add_listener (GET_LISTENER (check_new_context), ly_symbol2scm ("CreateContext")); + } /* We do not create a Lyrics context, because the user might @@ -159,7 +188,27 @@ */ } +IMPLEMENT_LISTENER (Lyric_combine_music_iterator, check_new_context) void +Lyric_combine_music_iterator::check_new_context (SCM sev) +{ + // TODO: Check first if type=Voice and if id matches + (void)sev; + + Context *voice = find_voice (); + if (voice) + { + set_music_context (voice); + + Global_context *g = voice->get_global_context (); + g->events_below ()->remove_listener (GET_LISTENER (check_new_context), ly_symbol2scm ("CreateContext")); + } +} + +/* +Look for a suitable voice to align lyrics to. +*/ +Context * Lyric_combine_music_iterator::find_voice () { SCM voice_name = lyricsto_voice_name_; @@ -173,40 +222,20 @@ if (scm_is_string (voice_name) && (!music_context_ || ly_scm2string (voice_name) != music_context_->id_string ())) { - /* - (spaghettini). - - Need to set associatedVoiceContext again - */ - if (music_context_) - made_association_ = false; - Context *t = get_outlet (); while (t && t->get_parent_context ()) t = t->get_parent_context (); string name = ly_scm2string (voice_name); - Context *voice = find_context_below (t, ly_symbol2scm ("Voice"), name); - - if (voice) - music_context_ = voice; + return find_context_below (t, ly_symbol2scm ("Voice"), name); } - if (lyrics_context_ && music_context_) - { - if (!made_association_) - { - made_association_ = true; - lyrics_context_->set_property ("associatedVoiceContext", - music_context_->self_scm ()); - } - } + return 0; } void -Lyric_combine_music_iterator::process (Moment mom) +Lyric_combine_music_iterator::process (Moment) { - (void) mom; find_voice (); if (!music_context_) return; @@ -220,7 +249,7 @@ if (lyrics_context_) lyrics_context_->unset_property (ly_symbol2scm ("associatedVoiceContext")); lyric_iter_ = 0; - music_context_ = 0; + set_music_context (0); } if (music_context_ @@ -261,10 +290,4 @@ lyric_iter_->quit (); } -Music_iterator * -Lyric_combine_music_iterator::try_music_in_children (Music *m) const -{ - return lyric_iter_->try_music (m); -} - IMPLEMENT_CTOR_CALLBACK (Lyric_combine_music_iterator); Index: lily/music-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/music-iterator.cc,v retrieving revision 1.108 diff -u -r1.108 music-iterator.cc --- lily/music-iterator.cc 16 May 2006 11:30:54 -0000 1.108 +++ lily/music-iterator.cc 23 May 2006 06:36:58 -0000 @@ -14,6 +14,9 @@ #include "warn.hh" #include "context.hh" +#include "event-iterator.hh" +#include "input.hh" +#include "international.hh" #include "music-wrapper.hh" #include "music-wrapper-iterator.hh" #include "simple-music-iterator.hh" @@ -85,6 +88,8 @@ { if (dynamic_cast (m)) p = new Music_wrapper_iterator; + else if (m->is_mus_type ("event")) + p = new Event_iterator; else p = new Simple_music_iterator; @@ -146,30 +151,24 @@ return ip; } -/* - TODO: rename to prevent confusion between Context::try_music and - Iterator::try_music -*/ -Music_iterator * -Music_iterator::try_music (Music *m) const +/* Descend to a bottom context; implicitly create a new one if necessary */ +void +Music_iterator::descend_to_bottom_context () { - bool b = get_outlet ()->try_music ((Music *)m); // ugh - Music_iterator *it = b ? (Music_iterator *) this : 0; // ugh - if (!it) - it = try_music_in_children (m); - else - /* TODO: try_music should only do the following: - - descend iterator to bottom context - - send music to a bottom context. - The function should also be renamed, and it should not return a value. */ - m->send_to_context (get_outlet ()); - return it; + assert (get_outlet ()); + if (!get_outlet ()->is_bottom_context ()) + set_context (get_outlet ()->get_default_interpreter ()); } -Music_iterator * -Music_iterator::try_music_in_children (Music *) const +void +Music_iterator::report_music (Music *m) { - return 0; + descend_to_bottom_context (); + + if (!m->is_mus_type ("event")) + m->origin ()->warning (_f ("Sending non-event to context")); + + m->send_to_context (get_outlet ()); } IMPLEMENT_CTOR_CALLBACK (Music_iterator); Index: lily/music-wrapper-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/music-wrapper-iterator.cc,v retrieving revision 1.43 diff -u -r1.43 music-wrapper-iterator.cc --- lily/music-wrapper-iterator.cc 6 Jan 2006 09:13:26 -0000 1.43 +++ lily/music-wrapper-iterator.cc 23 May 2006 06:36:58 -0000 @@ -60,12 +60,6 @@ return child_iter_->pending_moment (); } -Music_iterator * -Music_wrapper_iterator::try_music_in_children (Music *m) const -{ - return child_iter_->try_music (m); -} - IMPLEMENT_CTOR_CALLBACK (Music_wrapper_iterator); bool Index: lily/output-property-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/output-property-engraver.cc,v retrieving revision 1.53 diff -u -r1.53 output-property-engraver.cc --- lily/output-property-engraver.cc 11 Feb 2006 11:35:17 -0000 1.53 +++ lily/output-property-engraver.cc 23 May 2006 06:36:58 -0000 @@ -31,8 +31,13 @@ { if (m->is_mus_type ("layout-instruction")) { - props_.push_back (m); - return true; + // UGH. Only swallow the output property event in the context + // it was intended for. This is inelegant but not inefficient. + if (context ()->is_alias (m->get_property ("context-type"))) + { + props_.push_back (m); + return true; + } } return false; } Index: lily/part-combine-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/part-combine-iterator.cc,v retrieving revision 1.30 diff -u -r1.30 part-combine-iterator.cc --- lily/part-combine-iterator.cc 11 Feb 2006 11:35:17 -0000 1.30 +++ lily/part-combine-iterator.cc 23 May 2006 06:36:58 -0000 @@ -7,11 +7,13 @@ */ #include "context.hh" +#include "dispatcher.hh" +#include "lily-guile.hh" +#include "listener.hh" #include "music.hh" +#include "music-iterator.hh" #include "music-sequence.hh" -#include "lily-guile.hh" #include "warn.hh" -#include "music-iterator.hh" class Part_combine_iterator : public Music_iterator { @@ -29,11 +31,16 @@ virtual void do_quit (); virtual void process (Moment); - virtual Music_iterator *try_music_in_children (Music *) const; - virtual bool ok () const; private: + /* used by try_process */ + DECLARE_LISTENER (set_busy); + bool busy_; + bool notice_busy_; + + bool try_process (Music_iterator *i, Moment m); + Music_iterator *first_iter_; Music_iterator *second_iter_; Moment start_moment_; @@ -77,8 +84,6 @@ void unisono (bool silent); }; -static Music *busy_playing_event; - void Part_combine_iterator::do_quit () { @@ -101,12 +106,6 @@ split_list_ = SCM_EOL; state_ = APART; playing_state_ = APART; - - if (!busy_playing_event) - { - busy_playing_event - = make_music_by_name (ly_symbol2scm ("BusyPlayingEvent")); - } } void @@ -169,7 +168,7 @@ mmrest->set_property ("duration", SCM_EOL); } - tg->try_music (mmrest); + mmrest->send_to_context (tg); } void @@ -192,7 +191,7 @@ if (!event) event = make_music_by_name (ly_symbol2scm ("SoloOneEvent")); - first_iter_->try_music_in_children (event); + event->send_to_context (first_iter_->get_outlet ()); } playing_state_ = SOLO1; } @@ -255,8 +254,9 @@ if (!event) event = make_music_by_name (ly_symbol2scm ("UnisonoEvent")); - (last_playing_ == SOLO2 ? second_iter_ : first_iter_) - ->try_music_in_children (event); + Context *out = (last_playing_ == SOLO2 ? second_iter_ : first_iter_) + ->get_outlet (); + event->send_to_context (out); playing_state_ = UNISONO; } state_ = newstate; @@ -280,7 +280,7 @@ if (!event) event = make_music_by_name (ly_symbol2scm ("SoloTwoEvent")); - second_iter_->try_music_in_children (event); + event->send_to_context (second_iter_->get_outlet ()); playing_state_ = SOLO2; } } @@ -369,6 +369,13 @@ 0 }; + // Add listeners to all contexts except Devnull. + Context *contexts[] = {one, two, solo_tr, tr, 0}; + for (int i = 0; contexts[i]; i++) + { + contexts[i]->event_source ()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("MusicEvent")); + } + for (char const **p = syms; *p; p++) { SCM sym = ly_symbol2scm (*p); @@ -380,12 +387,46 @@ } } +IMPLEMENT_LISTENER (Part_combine_iterator, set_busy); +void +Part_combine_iterator::set_busy (SCM se) +{ + if (!notice_busy_) + return; + + Stream_event *e = unsmob_stream_event (se); + SCM mus = e->get_property ("music"); + Music *m = unsmob_music (mus); + assert (m); + + if (m->is_mus_type ("note-event") || m->is_mus_type ("cluster-note-event")) + busy_ = true; +} + +/* +* Processes a moment in an iterator, and returns whether any new music was reported. +*/ +bool +Part_combine_iterator::try_process (Music_iterator *i, Moment m) +{ + busy_ = false; + notice_busy_ = true; + + i->process (m); + + notice_busy_ = false; + return busy_; +} + void Part_combine_iterator::process (Moment m) { Moment now = get_outlet ()->now_mom (); Moment *splitm = 0; + if (start_moment_.main_part_.is_infinity () && start_moment_ < 0) + start_moment_ = now; + for (; scm_is_pair (split_list_); split_list_ = scm_cdr (split_list_)) { splitm = unsmob_moment (scm_caar (split_list_)); @@ -418,27 +459,15 @@ if (first_iter_->ok ()) { - first_iter_->process (m); - if (first_iter_->try_music_in_children (busy_playing_event)) - last_playing_ = SOLO1; + if (try_process (first_iter_, m)) + last_playing_ = SOLO1; } if (second_iter_->ok ()) { - second_iter_->process (m); - if (second_iter_->try_music_in_children (busy_playing_event)) + if (try_process (second_iter_, m)) last_playing_ = SOLO2; } } -Music_iterator * -Part_combine_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); -} - IMPLEMENT_CTOR_CALLBACK (Part_combine_iterator); Index: lily/percent-repeat-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/percent-repeat-iterator.cc,v retrieving revision 1.27 diff -u -r1.27 percent-repeat-iterator.cc --- lily/percent-repeat-iterator.cc 16 May 2006 11:19:50 -0000 1.27 +++ lily/percent-repeat-iterator.cc 23 May 2006 06:36:58 -0000 @@ -3,13 +3,12 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys , Erik Sandberg + (c) 2001--2006 Han-Wen Nienhuys + Erik Sandberg */ #include "percent-repeat-iterator.hh" - #include "input.hh" -#include "international.hh" #include "music.hh" #include "repeated-music.hh" @@ -17,17 +16,16 @@ Percent_repeat_iterator::Percent_repeat_iterator () { - child_list_ = SCM_EOL; } -void -Percent_repeat_iterator::construct_children () +SCM +Percent_repeat_iterator::get_music_list () const { - /* TODO: Distinction between percent and slash */ + /* TODO: Distinction between percent, double-percent and slash */ Music *mus = get_music (); Music *child = Repeated_music::body (mus); SCM length = child->get_length ().smobbed_copy (); - child_list_ = SCM_EOL; + SCM child_list = SCM_EOL; int repeats = scm_to_int (mus->get_property ("repeat-count")); for (int i = repeats; i > 1; i--) @@ -37,27 +35,9 @@ percent->set_property ("length", length); if (repeats > 1) percent->set_property ("repeat-count", scm_int2num (i - 1)); - Music *percent_chord = make_music_by_name (ly_symbol2scm ("EventChord")); - percent_chord->set_spot (*mus->origin ()); - percent_chord->set_property ("elements", scm_list_1 (percent->self_scm ())); - child_list_ = scm_cons (percent_chord->self_scm (), child_list_); - percent->unprotect (); - percent_chord->unprotect (); + child_list = scm_cons (percent->unprotect (), child_list); } - child_list_ = scm_cons (child->self_scm (), child_list_); - - Sequential_iterator::construct_children (); -} - -SCM -Percent_repeat_iterator::get_music_list () const -{ - return child_list_; -} + child_list = scm_cons (child->self_scm (), child_list); -void -Percent_repeat_iterator::derived_mark () const -{ - scm_gc_mark (child_list_); - Sequential_iterator::derived_mark (); + return child_list; } Index: lily/quote-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/quote-iterator.cc,v retrieving revision 1.44 diff -u -r1.44 quote-iterator.cc --- lily/quote-iterator.cc 17 May 2006 15:21:49 -0000 1.44 +++ lily/quote-iterator.cc 23 May 2006 06:36:58 -0000 @@ -252,10 +252,7 @@ mus->transpose (diff); } - bool b = quote_outlet_.get_outlet ()->try_music (mus); - if (!b) - mus->origin ()->warning (_f ("in quotation: junking event %s", - mus->name ())); + quote_outlet_.get_outlet ()->try_music (mus); } } Index: lily/sequential-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/sequential-iterator.cc,v retrieving revision 1.40 diff -u -r1.40 sequential-iterator.cc --- lily/sequential-iterator.cc 6 Jan 2006 09:13:25 -0000 1.40 +++ lily/sequential-iterator.cc 23 May 2006 06:36:58 -0000 @@ -244,12 +244,6 @@ return iter_; } -Music_iterator * -Sequential_iterator::try_music_in_children (Music *m) const -{ - return iter_ ? iter_->try_music (m) : 0; -} - IMPLEMENT_CTOR_CALLBACK (Sequential_iterator); bool Index: lily/simple-music-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/simple-music-iterator.cc,v retrieving revision 1.23 diff -u -r1.23 simple-music-iterator.cc --- lily/simple-music-iterator.cc 6 Jan 2006 09:13:25 -0000 1.23 +++ lily/simple-music-iterator.cc 23 May 2006 06:36:58 -0000 @@ -43,7 +43,7 @@ Simple_music_iterator::process (Moment m) { /* - don't do try_music (), since it would make the function useless for + don't do report_music (), since it would make the function useless for base classes */ Index: lily/simultaneous-music-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/simultaneous-music-iterator.cc,v retrieving revision 1.69 diff -u -r1.69 simultaneous-music-iterator.cc --- lily/simultaneous-music-iterator.cc 24 Jan 2006 01:42:14 -0000 1.69 +++ lily/simultaneous-music-iterator.cc 23 May 2006 06:36:58 -0000 @@ -133,15 +133,6 @@ return false; } -Music_iterator * -Simultaneous_music_iterator::try_music_in_children (Music *m) const -{ - Music_iterator *b = 0; - for (SCM s = children_list_; !b && scm_is_pair (s); s = scm_cdr (s)) - b = unsmob_iterator (scm_car (s))->try_music (m); - return b; -} - void Simultaneous_music_iterator::do_quit () { Index: lily/time-scaled-music-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/time-scaled-music-iterator.cc,v retrieving revision 1.29 diff -u -r1.29 time-scaled-music-iterator.cc --- lily/time-scaled-music-iterator.cc 16 May 2006 11:19:50 -0000 1.29 +++ lily/time-scaled-music-iterator.cc 23 May 2006 06:36:58 -0000 @@ -16,11 +16,10 @@ Time_scaled_music_iterator::Time_scaled_music_iterator () { - child_list_ = SCM_EOL; } -void -Time_scaled_music_iterator::construct_children () +SCM +Time_scaled_music_iterator::get_music_list () const { Music *mus = get_music (); Input *origin = mus->origin (); @@ -41,22 +40,7 @@ stop_event = scm_call_1 (ly_lily_module_constant ("make-event-chord"), scm_list_1 (stop_event)); unsmob_music (stop_event)->set_spot (*origin); - child_list_ = scm_list_3 (start_event, child->self_scm (), stop_event); - - Sequential_iterator::construct_children (); -} - -SCM -Time_scaled_music_iterator::get_music_list () const -{ - return child_list_; -} - -void -Time_scaled_music_iterator::derived_mark () const -{ - scm_gc_mark (child_list_); - Sequential_iterator::derived_mark (); + return scm_list_3 (start_event, child->self_scm (), stop_event); } IMPLEMENT_CTOR_CALLBACK (Time_scaled_music_iterator); Index: lily/translator-group.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/translator-group.cc,v retrieving revision 1.152 diff -u -r1.152 translator-group.cc --- lily/translator-group.cc 11 Feb 2006 11:35:17 -0000 1.152 +++ lily/translator-group.cc 23 May 2006 06:36:58 -0000 @@ -3,18 +3,21 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys , + Erik Sandberg */ #include "translator-group.hh" -#include "output-def.hh" -#include "warn.hh" -#include "scm-hash.hh" #include "context-def.hh" #include "context.hh" +#include "dispatcher.hh" #include "main.hh" #include "music.hh" +#include "output-def.hh" +#include "scm-hash.hh" +#include "stream-event.hh" +#include "warn.hh" Translator_group * Translator_group::get_daddy_translator () const @@ -36,6 +39,15 @@ } void +Translator_group::connect_to_context (Context *c) +{ + if (context_) + programming_error ("already connected to a context"); + context_ = c; + c->event_source ()->add_listener (GET_LISTENER (eat_event), ly_symbol2scm ("MusicEvent")); +} + +void Translator_group::finalize () { } @@ -67,6 +79,16 @@ return l; } +IMPLEMENT_LISTENER (Translator_group, eat_event); +void +Translator_group::eat_event (SCM sev) +{ + Stream_event *ev = unsmob_stream_event (sev); + SCM sm = ev->get_property ("music"); + Music *m = unsmob_music (sm); + try_music (m); +} + bool Translator_group::try_music (Music *m) { @@ -235,4 +257,3 @@ scm_gc_mark (me->accept_hash_table_); return me->simple_trans_list_; } - Index: lily/include/chord-tremolo-iterator.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/chord-tremolo-iterator.hh,v retrieving revision 1.20 diff -u -r1.20 chord-tremolo-iterator.hh --- lily/include/chord-tremolo-iterator.hh 6 Jan 2006 09:13:24 -0000 1.20 +++ lily/include/chord-tremolo-iterator.hh 23 May 2006 06:36:58 -0000 @@ -9,28 +9,18 @@ #ifndef CHORD_TREMOLO_ITERATOR_HH #define CHORD_TREMOLO_ITERATOR_HH -#include "music-iterator.hh" +#include "sequential-iterator.hh" -class Chord_tremolo_iterator : public Music_iterator +class Chord_tremolo_iterator : public Sequential_iterator { public: - DECLARE_CLASSNAME(Chord_tremolo_iterator); DECLARE_SCHEME_CALLBACK (constructor, ()); + /* construction */ + DECLARE_CLASSNAME(Chord_tremolo_iterator); Chord_tremolo_iterator (); - Chord_tremolo_iterator (Chord_tremolo_iterator const &); protected: - virtual void derived_substitute (Context *f, Context *t); - - virtual void derived_mark () const; - virtual Moment pending_moment () const; - virtual void do_quit (); - virtual void construct_children (); - virtual bool ok () const; - virtual void process (Moment); - virtual Music_iterator *try_music_in_children (Music *) const; + virtual SCM get_music_list () const; private: - Moment factor_; - Music_iterator *child_iter_; }; #endif /* CHORD_TREMOLO_ITERATOR_HH */ Index: lily/include/event-chord-iterator.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/event-chord-iterator.hh,v retrieving revision 1.13 diff -u -r1.13 event-chord-iterator.hh --- lily/include/event-chord-iterator.hh 6 Jan 2006 09:13:24 -0000 1.13 +++ lily/include/event-chord-iterator.hh 23 May 2006 06:36:58 -0000 @@ -1,13 +1,13 @@ /* - event-iter.hh -- declare Event_chord_iterator + event-chord-iterator.hh -- declare Event_chord_iterator source file of the GNU LilyPond music typesetter (c) 1997--2006 Han-Wen Nienhuys */ -#ifndef EVENT_ITER_HH -#define EVENT_ITER_HH +#ifndef EVENT_CHORD_ITERATOR_HH +#define EVENT_CHORD_ITERATOR_HH #include "simple-music-iterator.hh" @@ -19,16 +19,8 @@ /** Find a bottom notation context to deliver events to. */ - virtual Context *get_bottom_context (); DECLARE_CLASSNAME(Event_chord_iterator); - /* - Since Event_chord_iterator has no list-cursor internally, we - must use a status variable to adminstrate where we are */ - - enum { NONE_DONE, START_DONE, END_DONE } - status_; - public: DECLARE_SCHEME_CALLBACK (constructor, ()); Event_chord_iterator (); @@ -39,4 +31,4 @@ virtual void construct_children (); }; -#endif // EVENT_ITER_HH +#endif // EVENT_CHORD_ITERATOR_HH Index: lily/include/folded-repeat-iterator.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/folded-repeat-iterator.hh,v retrieving revision 1.21 diff -u -r1.21 folded-repeat-iterator.hh --- lily/include/folded-repeat-iterator.hh 6 Jan 2006 09:13:24 -0000 1.21 +++ lily/include/folded-repeat-iterator.hh 23 May 2006 06:36:58 -0000 @@ -36,7 +36,6 @@ void leave_body (); virtual void process (Moment); - virtual Music_iterator *try_music_in_children (Music *) const; private: Music_iterator *main_iter_; Index: lily/include/lily-proto.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/lily-proto.hh,v retrieving revision 1.147 diff -u -r1.147 lily-proto.hh --- lily/include/lily-proto.hh 22 May 2006 17:45:40 -0000 1.147 +++ lily/include/lily-proto.hh 23 May 2006 06:36:58 -0000 @@ -51,6 +51,7 @@ class Event; class Event_chord; class Event_chord_iterator; +class Event_iterator; class Folded_repeat_iterator; class Font_metric; class Font_size_engraver; Index: lily/include/music-iterator.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/music-iterator.hh,v retrieving revision 1.74 diff -u -r1.74 music-iterator.hh --- lily/include/music-iterator.hh 11 Feb 2006 11:35:16 -0000 1.74 +++ lily/include/music-iterator.hh 23 May 2006 06:36:58 -0000 @@ -61,13 +61,14 @@ Moment music_get_length () const; Moment music_start_mom () const; Music_iterator (); - Music_iterator *try_music (Music *) const; + void report_music (Music *); Context *get_outlet () const; void set_context (Context *); static SCM get_static_get_iterator (Music *mus); void init_translator (Music *, Context *); void quit (); void substitute_outlet (Context *from, Context *to); + void descend_to_bottom_context (); virtual void derived_substitute (Context *, Context *); virtual Moment pending_moment () const; virtual bool ok () const; @@ -78,8 +79,6 @@ DECLARE_SCHEME_CALLBACK (constructor, ()); SCM get_iterator (Music *) const; - virtual Music_iterator *try_music_in_children (Music *) const; - Music *get_music () const; protected: virtual void do_quit (); Index: lily/include/music-wrapper-iterator.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/music-wrapper-iterator.hh,v retrieving revision 1.34 diff -u -r1.34 music-wrapper-iterator.hh --- lily/include/music-wrapper-iterator.hh 6 Jan 2006 09:13:24 -0000 1.34 +++ lily/include/music-wrapper-iterator.hh 23 May 2006 06:36:58 -0000 @@ -33,7 +33,6 @@ virtual bool run_always () const; protected: virtual void process (Moment); - virtual Music_iterator *try_music_in_children (Music *) const; Music_iterator *child_iter_; }; Index: lily/include/percent-repeat-iterator.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/percent-repeat-iterator.hh,v retrieving revision 1.14 diff -u -r1.14 percent-repeat-iterator.hh --- lily/include/percent-repeat-iterator.hh 16 May 2006 11:19:50 -0000 1.14 +++ lily/include/percent-repeat-iterator.hh 23 May 2006 06:36:58 -0000 @@ -19,10 +19,7 @@ Percent_repeat_iterator (); protected: virtual SCM get_music_list () const; - virtual void derived_mark () const; - virtual void construct_children (); private: - SCM child_list_; }; #endif /* PERCENT_REPEAT_ITERATOR_HH */ Index: lily/include/sequential-iterator.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/sequential-iterator.hh,v retrieving revision 1.21 diff -u -r1.21 sequential-iterator.hh --- lily/include/sequential-iterator.hh 6 Jan 2006 09:13:24 -0000 1.21 +++ lily/include/sequential-iterator.hh 23 May 2006 06:36:58 -0000 @@ -33,7 +33,6 @@ protected: virtual void process (Moment); - virtual Music_iterator *try_music_in_children (Music *) const; virtual bool run_always () const; protected: Index: lily/include/simultaneous-music-iterator.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/simultaneous-music-iterator.hh,v retrieving revision 1.29 diff -u -r1.29 simultaneous-music-iterator.hh --- lily/include/simultaneous-music-iterator.hh 6 Jan 2006 09:13:24 -0000 1.29 +++ lily/include/simultaneous-music-iterator.hh 23 May 2006 06:36:58 -0000 @@ -32,7 +32,6 @@ protected: virtual void process (Moment); - virtual Music_iterator *try_music_in_children (Music *) const; private: SCM children_list_; Index: lily/include/time-scaled-music-iterator.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/time-scaled-music-iterator.hh,v retrieving revision 1.16 diff -u -r1.16 time-scaled-music-iterator.hh --- lily/include/time-scaled-music-iterator.hh 16 May 2006 11:19:50 -0000 1.16 +++ lily/include/time-scaled-music-iterator.hh 23 May 2006 06:36:58 -0000 @@ -21,10 +21,7 @@ Time_scaled_music_iterator (); protected: virtual SCM get_music_list () const; - virtual void derived_mark () const; - virtual void construct_children (); private: - SCM child_list_; }; #endif /* TIME_SCALED_MUSIC_ITERATOR_HH */ Index: lily/include/translator-group.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/translator-group.hh,v retrieving revision 1.81 diff -u -r1.81 translator-group.hh --- lily/include/translator-group.hh 11 Feb 2006 11:35:16 -0000 1.81 +++ lily/include/translator-group.hh 23 May 2006 06:36:58 -0000 @@ -9,6 +9,7 @@ #ifndef TRANSLATOR_GROUP_HH #define TRANSLATOR_GROUP_HH +#include "listener.hh" #include "translator.hh" #include "std-vector.hh" @@ -46,11 +47,14 @@ Translator_group_void_method precomputed_self_method_bindings_[TRANSLATOR_METHOD_PRECOMPUTE_COUNT]; + DECLARE_LISTENER (eat_event); + public: VIRTUAL_COPY_CONSTRUCTOR (Translator_group, Translator_group); DECLARE_SMOBS (Translator_group, dummy); public: + void connect_to_context (Context *c); virtual Translator_group *get_daddy_translator ()const; virtual SCM get_simple_trans_list (); virtual bool try_music (Music *req); Index: ly/music-functions-init.ly =================================================================== RCS file: /sources/lilypond/lilypond/ly/music-functions-init.ly,v retrieving revision 1.58 diff -u -r1.58 music-functions-init.ly --- ly/music-functions-init.ly 17 May 2006 15:21:49 -0000 1.58 +++ ly/music-functions-init.ly 23 May 2006 06:36:58 -0000 @@ -107,10 +107,11 @@ music) applyOutput = -#(define-music-function (parser location proc) (procedure?) - (make-music 'ApplyOutputEvent +#(define-music-function (parser location ctx proc) (symbol? procedure?) + (make-music 'ApplyOutputEvent 'origin location - 'procedure proc)) + 'procedure proc + 'context-type ctx)) overrideProperty = #(define-music-function (parser location name property value) @@ -140,8 +141,7 @@ (if (equal? (cdr (assoc 'name (ly:grob-property grob 'meta))) grob-name) - (set! (ly:grob-property grob property) value) - ))) + (set! (ly:grob-property grob property) value)))) context-name))) Index: scm/define-music-properties.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-music-properties.scm,v retrieving revision 1.52 diff -u -r1.52 define-music-properties.scm --- scm/define-music-properties.scm 17 May 2006 15:21:49 -0000 1.52 +++ scm/define-music-properties.scm 23 May 2006 06:36:58 -0000 @@ -50,6 +50,7 @@ (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. ") + (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. ") (grob-property-path ,list? "A list of symbols, locating a nested grob property, e.g. (beamed-lengths details). ") @@ -100,7 +101,7 @@ (text ,markup? "markup expression to be printed") (tempo-unit ,ly:duration? "The unit for the metronome count.") (tonic ,ly:pitch? "Base of the scale") - (tremolo-type ,integer? "") + (tremolo-type ,integer? "speed of tremolo, e.g. 16 for c4:16") (trill-pitch ,ly:pitch? "Pitch of other note of the trill.") (type ,symbol? "The type of this music object. Determines iteration in some cases.") (types ,list? "The types of this music object; determines by what Index: scm/define-music-types.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-music-types.scm,v retrieving revision 1.79 diff -u -r1.79 define-music-types.scm --- scm/define-music-types.scm 16 May 2006 11:19:50 -0000 1.79 +++ scm/define-music-types.scm 23 May 2006 06:36:59 -0000 @@ -30,14 +30,13 @@ Syntax -\\applyoutput FUNC +\\applyoutput #'Context FUNC arguments to func are 1. the grob, 2. the originating context, 3. context where FUNC is called. ") - (iterator-ctor . ,ly:output-property-music-iterator::constructor) - (types . (general-music layout-instruction)) + (types . (general-music event layout-instruction)) )) (ArpeggioEvent . ( @@ -238,17 +237,6 @@ (description . "Allow, forbid or force a line break.") (types . (general-music break-event event)) )) - (OldLyricCombineMusic - . ( - (description . "Align lyrics to the start of notes. - -Syntax @var{\\oldaddlyrics address@hidden @var{lyrics}.") - - (types . (general-music lyric-combine-music)) - (length-callback . ,ly:lyric-combine-music::length-callback) - (start-callback . ,ly:music-sequence::first-start-callback) - (iterator-ctor . ,ly:old-lyric-combine-music-iterator::constructor) - )) (LyricCombineMusic . ( @@ -331,18 +319,6 @@ (types . (general-music event note-event rhythmic-event melodic-event)) )) - (OutputPropertySetMusic - . ( - (description . "Set grob properties in objects -individually. - -Syntax @code{\\outputproperty @var{predicate} @var{prop} -= @var{val}}.") - - (iterator-ctor . ,ly:output-property-music-iterator::constructor) - (types . (general-music layout-instruction)) - )) - (OverrideProperty . ( (description . "Extend the definition of a graphical object. @@ -674,6 +650,12 @@ (types . (general-music event tremolo-event)) )) + (TremoloSpanEvent + . ( + (description . "Tremolo over two stems") + (types . (general-music event span-event tremolo-span-event)) + )) + (VoiceSeparator . ( (description . "Separate polyphonic voices in simultaneous music.