? .sconf_temp
? build-stamp
? context-unique.diff
? def-rel-music-funciton.diff
? delay-music-functions.diff
? exjobb.diff3
? fonts
? lib
? lilypond.kdevelop
? lilypond.kdevelop.pcs
? lilypond.kdevses
? optimized
? os
? ref1.diff
? ref2.diff
? repeat.diff
? scons.cache
? Documentation/out
? Documentation/out-www
? Documentation/bibliography/out
? Documentation/misc/out
? Documentation/pictures/out
? Documentation/topdocs/out
? Documentation/user/out
? Documentation/user/out-www
? buildscripts/out
? buildscripts/out-www
? cygwin/out
? cygwin/out-www
? debian/out
? elisp/out
? elisp/out-www
? flower/out
? flower/out-scons
? flower/out-www
? flower/include/.sconsign
? flower/include/out
? flower/include/out-www
? input/Diagram1.dia.autosave
? input/les-nereides.pdf
? input/les-nereides.ps
? input/out
? input/out-www
? input/mutopia/out
? input/mutopia/out-www
? input/mutopia/E.Satie/out
? input/mutopia/E.Satie/out-www
? input/mutopia/F.Schubert/out
? input/mutopia/F.Schubert/out-www
? input/mutopia/J.S.Bach/out
? input/mutopia/J.S.Bach/out-www
? input/mutopia/R.Schumann/out
? input/mutopia/R.Schumann/out-www
? input/mutopia/W.A.Mozart/out
? input/mutopia/W.A.Mozart/out-www
? input/no-notation/out
? input/no-notation/out-www
? input/no-notation/to-xml.pdf
? input/no-notation/to-xml.ps
? input/regression/chord-tremolo.pdf
? input/regression/chord-tremolo.ps
? input/regression/out
? input/regression/out-www
? input/template/out
? input/test/out
? input/test/out-www
? input/tutorial/out
? input/tutorial/out-www
? kpath-guile/out
? kpath-guile/out-scons
? lily/On
? lily/busy-playing-listener.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/out
? lily/include/out-www
? ly/out
? ly/out-www
? make/out
? make/out-www
? mf/feta-alphabet11.600pk
? mf/feta-alphabet13.600pk
? mf/feta-alphabet14.600pk
? mf/feta-alphabet16.600pk
? mf/feta-alphabet18.600pk
? mf/feta-alphabet20.600pk
? mf/feta-alphabet23.600pk
? mf/feta-alphabet26.600pk
? mf/feta-braces-a.600pk
? mf/feta-braces-b.600pk
? mf/feta-braces-c.600pk
? mf/feta-braces-d.600pk
? mf/feta-braces-e.600pk
? mf/feta-braces-f.600pk
? mf/feta-braces-g.600pk
? mf/feta-braces-h.600pk
? mf/feta-braces-i.600pk
? mf/feta11.600pk
? mf/feta13.600pk
? mf/feta14.600pk
? mf/feta16.600pk
? mf/feta18.600pk
? mf/feta20.600pk
? mf/feta23.600pk
? mf/feta26.600pk
? mf/out
? mf/out-scons
? mf/out-www
? mf/parmesan11.600pk
? mf/parmesan13.600pk
? mf/parmesan14.600pk
? mf/parmesan16.600pk
? mf/parmesan18.600pk
? mf/parmesan20.600pk
? mf/parmesan23.600pk
? mf/parmesan26.600pk
? po/out
? po/out-www
? ps/out
? ps/out-www
? python/convertrules.pyc
? python/fontextract.pyc
? python/lilylib.pyc
? python/out
? python/out-www
? scm/out
? scm/out-www
? scripts/lilypond-book-36.py
? scripts/lilypond-book.py.new
? scripts/out
? scripts/out-www
? scripts/stat
? stepmake/out
? stepmake/out-www
? stepmake/bin/out
? stepmake/bin/out-www
? stepmake/bin/packagepython.pyc
? stepmake/stepmake/out
? stepmake/stepmake/out-www
? tex/out
? tex/out-www
? ttftool/out
? ttftool/out-scons
? ttftool/include/.sconsign
? ttftool/include/out
? vim/out
? vim/out-www
Index: ChangeLog
===================================================================
RCS file: /sources/lilypond/lilypond/ChangeLog,v
retrieving revision 1.4988
diff -u -r1.4988 ChangeLog
--- ChangeLog 21 May 2006 23:56:13 -0000 1.4988
+++ ChangeLog 22 May 2006 05:45:00 -0000
@@ -140,6 +140,9 @@
* lily/time-scaled-music-iterator.cc, lily/tuplet-engraver.cc:
rework tuplets: send start/stop events to engraver
+ * lily/context.cc, lily/music.cc, lily/context-scheme.cc: Add
+ dispatchers event-source and events-below to Context
+
2006-05-15 Graham Percival
* Documentation/user/README.txt: update info for doc writers.
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 22 May 2006 05:45:00 -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_beaming_;
+ // current direction of beam (first RIGHT, then LEFT)
+ Direction 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_beaming_ = 0;
+ 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 dir = to_dir (m->get_property ("span-direction"));
+ if (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_beaming_ = scm_to_int (m->get_property ("expected-beaming"));
+ dir_ = RIGHT;
+ }
+ if (dir == STOP)
+ {
+ repeat_ = 0;
+ beam_ = 0;
+ expected_beaming_ = 0;
+ 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_, 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_beaming_));
+
+ if (dir_ == RIGHT)
+ 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 22 May 2006 05:45:00 -0000
@@ -4,82 +4,86 @@
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;
+ child_list_ = SCM_EOL;
}
void
-Chord_tremolo_iterator::do_quit ()
-{
- if (child_iter_)
- child_iter_->quit ();
-}
-
-void
-Chord_tremolo_iterator::derived_mark () const
+Chord_tremolo_iterator::construct_children ()
{
- if (child_iter_)
- scm_gc_mark (child_iter_->self_scm ());
-}
+ 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_substitute (Context *f, Context *t)
-{
- if (child_iter_)
- child_iter_->substitute_outlet (f, t);
-}
+ SCM tremolo_type = scm_int2num (note_dur.den ());
+ int expected_beaming_ = max (0, (intlog2 (total_dur.den ()) - 2));
-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);
+ SCM sev = scm_call_1 (ly_lily_module_constant ("chordify-event"), ev->unprotect ());
+ child_list_ = scm_list_2 (sev, body->self_scm ());
}
-
- child_iter_->process (factor_ * m);
-}
-
-Moment
-Chord_tremolo_iterator::pending_moment () const
-{
- return child_iter_->pending_moment () / factor_;
+ 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-beaming", scm_int2num (expected_beaming_));
+
+ SCM start_chord = scm_call_1 (ly_lily_module_constant ("chordify-event"), start_event_scm);
+ SCM stop_chord = scm_call_1 (ly_lily_module_constant ("chordify-event"), stop_event_scm);
+
+ child_list_ = scm_list_3 (start_chord, body->self_scm (), stop_chord);
+ }
+
+ Sequential_iterator::construct_children ();
}
-bool
-Chord_tremolo_iterator::ok () const
+SCM
+Chord_tremolo_iterator::get_music_list () const
{
- return child_iter_ && child_iter_->ok ();
+ return child_list_;
}
-Music_iterator *
-Chord_tremolo_iterator::try_music_in_children (Music *m) const
+void
+Chord_tremolo_iterator::derived_mark () const
{
- return child_iter_->try_music (m);
+ scm_gc_mark (child_list_);
+ Sequential_iterator::derived_mark ();
}
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 22 May 2006 05:45:00 -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/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 22 May 2006 05:45:00 -0000
@@ -7,9 +7,11 @@
*/
#include "context.hh"
+#include "dispatcher.hh"
#include "grob.hh"
#include "input.hh"
#include "international.hh"
+#include "listener.hh"
#include "music-iterator.hh"
#include "music.hh"
@@ -29,9 +31,14 @@
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 ();
+ 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,46 @@
lyric_iter_ = 0;
music_context_ = 0;
lyrics_context_ = 0;
+ listening_ = false;
+}
- /*
- Ugh. out of place here.
- */
- if (!busy_ev)
- {
- 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"));
- }
+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"));
+ music_context_ = to;
+ if (to)
+ to->event_source()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("MusicEvent"));
}
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 +147,7 @@
if (lyrics_context_ && lyrics_context_ == f)
lyrics_context_ = t;
if (music_context_ && music_context_ == f)
- music_context_ = t;
+ set_music_context (t);
}
void
@@ -159,6 +171,21 @@
*/
}
+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;
+
+ find_voice ();
+}
+
+/*
+This method looks for the voice to align lyrics to.
+If none is found, a listener is registered which retries whenever new contexts are created.
+from_listener is true when called from this listener.
+*/
void
Lyric_combine_music_iterator::find_voice ()
{
@@ -189,7 +216,21 @@
Context *voice = find_context_below (t, ly_symbol2scm ("Voice"), name);
if (voice)
- music_context_ = voice;
+ {
+ set_music_context (voice);
+ if (listening_)
+ {
+ // we're pleased now.
+ t->events_below ()->remove_listener (GET_LISTENER (check_new_context), ly_symbol2scm ("CreateContext"));
+ listening_ = false;
+ }
+ }
+ else if (!listening_)
+ {
+ // Wait for a Create_context event, to catch implicitly created voices before it's too late.
+ t->events_below ()->add_listener (GET_LISTENER (check_new_context), ly_symbol2scm ("CreateContext"));
+ listening_ = true;
+ }
}
if (lyrics_context_ && music_context_)
@@ -204,9 +245,8 @@
}
void
-Lyric_combine_music_iterator::process (Moment mom)
+Lyric_combine_music_iterator::process (Moment)
{
- (void) mom;
find_voice ();
if (!music_context_)
return;
@@ -220,7 +260,7 @@
if (lyrics_context_)
lyrics_context_->unset_property (ly_symbol2scm ("associatedVoiceContext"));
lyric_iter_ = 0;
- music_context_ = 0;
+ set_music_context (0);
}
if (music_context_
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 22 May 2006 05:45:00 -0000
@@ -153,6 +153,7 @@
Music_iterator *
Music_iterator::try_music (Music *m) const
{
+#if 0
bool b = get_outlet ()->try_music ((Music *)m); // ugh
Music_iterator *it = b ? (Music_iterator *) this : 0; // ugh
if (!it)
@@ -164,6 +165,9 @@
The function should also be renamed, and it should not return a value. */
m->send_to_context (get_outlet ());
return it;
+#endif
+ m->send_to_context (get_outlet ());
+ return (Music_iterator *)this;
}
Music_iterator *
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 22 May 2006 05:45:00 -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 ()->context_name_symbol () == m->get_property ("context-type"))
+ {
+ props_.push_back (m);
+ return true;
+ }
}
return false;
}
Index: lily/output-property-music-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/output-property-music-iterator.cc,v
retrieving revision 1.22
diff -u -r1.22 output-property-music-iterator.cc
--- lily/output-property-music-iterator.cc 26 Jan 2006 11:16:52 -0000 1.22
+++ lily/output-property-music-iterator.cc 22 May 2006 05:45:00 -0000
@@ -8,6 +8,8 @@
#include "simple-music-iterator.hh"
+#include "context.hh"
+#include "dispatcher.hh"
#include "input.hh"
#include "international.hh"
#include "music.hh"
@@ -26,10 +28,11 @@
{
if (last_processed_mom_ < Moment (0))
{
- bool accepted = try_music (get_music ());
- if (!accepted)
- get_music ()->origin ()->warning (_f ("junking event: `%s'",
- get_music ()->class_name ()));
+ // Send the event to a bottom context. The context-type property
+ // will later be used to apply the event in this context
+ get_music ()->set_property ("context-type",
+ get_outlet ()->context_name_symbol ());
+ get_music ()->send_to_context (get_outlet ());
}
Simple_music_iterator::process (m);
}
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 22 May 2006 05:45:00 -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
{
@@ -34,6 +36,12 @@
virtual bool ok () const;
private:
+ /* used by try_process */
+ DECLARE_LISTENER (set_busy);
+ bool busy_;
+
+ bool try_process (Music_iterator *i, Moment m);
+
Music_iterator *first_iter_;
Music_iterator *second_iter_;
Moment start_moment_;
@@ -77,8 +85,6 @@
void unisono (bool silent);
};
-static Music *busy_playing_event;
-
void
Part_combine_iterator::do_quit ()
{
@@ -101,12 +107,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 +169,7 @@
mmrest->set_property ("duration", SCM_EOL);
}
- tg->try_music (mmrest);
+ mmrest->send_to_context (tg);
}
void
@@ -192,7 +192,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 +255,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 +281,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;
}
}
@@ -380,12 +381,45 @@
}
}
+IMPLEMENT_LISTENER (Part_combine_iterator, set_busy);
+void
+Part_combine_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;
+}
+
+/*
+* 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)
+{
+ Dispatcher *disp = i->get_outlet ()->event_source ();
+
+ disp->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("MusicEvent"));
+ busy_ = false;
+
+ i->process (m);
+
+ disp->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("MusicEvent"));
+ 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,15 +452,13 @@
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;
}
}
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 22 May 2006 05:45:00 -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,16 @@
}
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"));
+// c->event_source ()->add_listener (GET_LISTENER (create_child), ly_symbol2scm ("CreateContext"));
+}
+
+void
Translator_group::finalize ()
{
}
@@ -67,6 +80,20 @@
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);
+/*
+ if (!try_music (m))
+ // TODO: this is for testing and will be removed
+ m->origin ()->warning ("Music not swallowed by engraver");
+*/
+}
+
bool
Translator_group::try_music (Music *m)
{
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 22 May 2006 05:45:00 -0000
@@ -9,8 +9,24 @@
#ifndef CHORD_TREMOLO_ITERATOR_HH
#define CHORD_TREMOLO_ITERATOR_HH
-#include "music-iterator.hh"
+#include "sequential-iterator.hh"
+class Chord_tremolo_iterator : public Sequential_iterator
+{
+public:
+ DECLARE_SCHEME_CALLBACK (constructor, ());
+ /* construction */
+ DECLARE_CLASSNAME(Chord_tremolo_iterator);
+ Chord_tremolo_iterator ();
+protected:
+ virtual SCM get_music_list () const;
+ virtual void derived_mark () const;
+ virtual void construct_children ();
+private:
+ SCM child_list_;
+};
+
+#if 0
class Chord_tremolo_iterator : public Music_iterator
{
public:
@@ -32,6 +48,7 @@
Moment factor_;
Music_iterator *child_iter_;
};
+#endif
#endif /* CHORD_TREMOLO_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 22 May 2006 05:45:00 -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 22 May 2006 05:45:00 -0000
@@ -140,8 +140,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 22 May 2006 05:45:00 -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-beaming ,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 22 May 2006 05:45:00 -0000
@@ -37,7 +37,7 @@
")
(iterator-ctor . ,ly:output-property-music-iterator::constructor)
- (types . (general-music layout-instruction))
+ (types . (general-music event layout-instruction))
))
(ArpeggioEvent
. (
@@ -340,7 +340,7 @@
= @var{val}}.")
(iterator-ctor . ,ly:output-property-music-iterator::constructor)
- (types . (general-music layout-instruction))
+ (types . (general-music event layout-instruction))
))
(OverrideProperty
@@ -674,6 +674,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.
Index: scm/music-functions.scm
===================================================================
RCS file: /sources/lilypond/lilypond/scm/music-functions.scm,v
retrieving revision 1.169
diff -u -r1.169 music-functions.scm
--- scm/music-functions.scm 16 May 2006 11:19:50 -0000 1.169
+++ scm/music-functions.scm 22 May 2006 05:45:00 -0000
@@ -374,6 +374,12 @@
(make-music 'EventChord
'elements elts))
+(define-safe-public (chordify-event . ev)
+ "Wraps music events inside an EventChord"
+ (make-music 'EventChord
+ 'elements ev
+ 'origin (ly:music-property (car ev) 'origin)))
+
(define-public (make-skip-music dur)
(make-music 'SkipMusic
'duration dur))