summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog19
-rw-r--r--flower/include/international.hh4
-rw-r--r--flower/international.cc8
-rw-r--r--lily/accidental-engraver.cc26
-rw-r--r--lily/ambitus-engraver.cc5
-rw-r--r--lily/arpeggio-engraver.cc2
-rw-r--r--lily/auto-beam-engraver.cc2
-rw-r--r--lily/beam-engraver.cc4
-rw-r--r--lily/beam-performer.cc1
-rw-r--r--lily/breathing-sign-engraver.cc4
-rw-r--r--lily/chord-tremolo-engraver.cc22
-rw-r--r--lily/coherent-ligature-engraver.cc9
-rw-r--r--lily/completion-note-heads-engraver.cc1
-rw-r--r--lily/constrained-breaking.cc4
-rw-r--r--lily/context-handle.cc6
-rw-r--r--lily/context.cc14
-rw-r--r--lily/custos-engraver.cc9
-rw-r--r--lily/drum-note-performer.cc11
-rw-r--r--lily/dynamic-engraver.cc13
-rw-r--r--lily/event-chord-iterator.cc8
-rw-r--r--lily/fall-engraver.cc3
-rw-r--r--lily/figured-bass-engraver.cc7
-rw-r--r--lily/figured-bass-position-engraver.cc1
-rw-r--r--lily/grace-spacing-engraver.cc3
-rw-r--r--lily/gregorian-ligature-engraver.cc5
-rw-r--r--lily/grob-info.cc40
-rw-r--r--lily/grob-pq-engraver.cc6
-rw-r--r--lily/include/context-handle.hh1
-rw-r--r--lily/include/context.hh1
-rw-r--r--lily/include/engraver.hh1
-rw-r--r--lily/include/grob-info.hh2
-rw-r--r--lily/include/paper-column-engraver.hh1
-rw-r--r--lily/include/stream-event.hh3
-rw-r--r--lily/include/translator-group.hh3
-rw-r--r--lily/include/translator.hh1
-rw-r--r--lily/ligature-engraver.cc2
-rw-r--r--lily/lily-parser-scheme.cc4
-rw-r--r--lily/lyric-combine-music-iterator.cc9
-rw-r--r--lily/mark-engraver.cc2
-rw-r--r--lily/melisma-translator.cc1
-rw-r--r--lily/mensural-ligature-engraver.cc8
-rw-r--r--lily/metronome-engraver.cc9
-rw-r--r--lily/multi-measure-rest-engraver.cc6
-rw-r--r--lily/music-iterator.cc2
-rw-r--r--lily/music.cc24
-rw-r--r--lily/new-fingering-engraver.cc48
-rw-r--r--lily/note-heads-engraver.cc1
-rw-r--r--lily/note-name-engraver.cc1
-rw-r--r--lily/note-performer.cc11
-rw-r--r--lily/parenthesis-engraver.cc10
-rw-r--r--lily/part-combine-engraver.cc2
-rw-r--r--lily/part-combine-iterator.cc176
-rw-r--r--lily/percent-repeat-engraver.cc35
-rw-r--r--lily/phrasing-slur-engraver.cc4
-rw-r--r--lily/piano-pedal-engraver.cc18
-rw-r--r--lily/pitched-trill-engraver.cc33
-rw-r--r--lily/recording-group-engraver.cc5
-rw-r--r--lily/relocate.cc2
-rw-r--r--lily/repeat-tie-engraver.cc2
-rw-r--r--lily/rest-engraver.cc1
-rw-r--r--lily/slash-repeat-engraver.cc5
-rw-r--r--lily/slur-engraver.cc5
-rw-r--r--lily/spacing-engraver.cc3
-rw-r--r--lily/staff-symbol-engraver.cc2
-rw-r--r--lily/stem-engraver.cc2
-rw-r--r--lily/stream-event-scheme.cc22
-rw-r--r--lily/stream-event.cc6
-rw-r--r--lily/tab-note-heads-engraver.cc10
-rw-r--r--lily/text-spanner-engraver.cc4
-rw-r--r--lily/tie-engraver.cc14
-rw-r--r--lily/translator-group.cc85
-rw-r--r--lily/translator.cc36
-rw-r--r--lily/trill-spanner-engraver.cc4
-rw-r--r--lily/tuplet-engraver.cc10
-rw-r--r--lily/tweak-engraver.cc8
-rw-r--r--scm/define-event-classes.scm6
-rw-r--r--scm/define-music-types.scm3
-rw-r--r--scm/translation-functions.scm11
78 files changed, 398 insertions, 504 deletions
diff --git a/ChangeLog b/ChangeLog
index bf5710c049..f0d3b2a493 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -20,6 +20,25 @@
hidden_state. Works around a problem when parser fetches
MUSIC_FUNCTION token but not the following EXPECT_* token.
+ * lily/translator.cc, lily/context.cc:, lily/translator-group.cc:
+ remove try_music
+
+ * lily/*-engraver.cc, lily/*-performer.cc: Remove all remaining
+ references to Music; use ASSIGN_EVENT_ONCE everywhere
+
+ * lily/grob-info.cc: junk *music_cause
+
+ * lily/music.cc: copy eventified articulations to stream event
+
+ * lily/part-combine-iterator.cc: Cleanup using enums
+
+ * lily/translator-group.cc: Junk OldMusicEvent, and associated
+ methods
+
+ * lily/include/engraver.hh: Junk music.hh include
+
+ * lily/stream-event.cc: Changed constructors
+
2006-09-21 Graham Percival <gpermus@gmail.com>
* Documentation/user/tweaks.itely (Fitting music onto fewer
diff --git a/flower/include/international.hh b/flower/include/international.hh
index d1c71ed08b..162e7ee38d 100644
--- a/flower/include/international.hh
+++ b/flower/include/international.hh
@@ -31,6 +31,10 @@ string _ (char const *ch);
string _f (char const *format, ...)
__attribute__ ((format (printf, 1, 2)));
string _f (char const *format, string s, string s2 = "", string s3 = "");
+/**
+ va_list version of _f
+ */
+string v_f (char const *format, va_list args);
#endif // INTERNATIONAL_HH
diff --git a/flower/international.cc b/flower/international.cc
index 7bb4130856..ef1ebfbc89 100644
--- a/flower/international.cc
+++ b/flower/international.cc
@@ -32,12 +32,18 @@ _f (char const *format, ...)
{
va_list args;
va_start (args, format);
- string str = String_convert::vform_string (gettext (format), args);
+ string str = v_f (format, args);
va_end (args);
return str;
}
string
+v_f (char const *format, va_list args)
+{
+ return String_convert::vform_string (gettext (format), args);
+}
+
+string
_f (char const *format, string s, string s2, string s3)
{
return String_convert::form_string (gettext (format), s.c_str (), s2.c_str (),
diff --git a/lily/accidental-engraver.cc b/lily/accidental-engraver.cc
index 39a66ba953..f6ea8e0e18 100644
--- a/lily/accidental-engraver.cc
+++ b/lily/accidental-engraver.cc
@@ -12,11 +12,11 @@
#include "context.hh"
#include "engraver.hh"
#include "international.hh"
-#include "music.hh"
#include "pitch.hh"
#include "protected-scm.hh"
#include "rhythmic-head.hh"
#include "side-position-interface.hh"
+#include "stream-event.hh"
#include "tie.hh"
#include "warn.hh"
@@ -26,7 +26,7 @@ class Accidental_entry
{
public:
bool done_;
- Music *melodic_;
+ Stream_event *melodic_;
Grob *accidental_;
Context *origin_;
Engraver *origin_engraver_;
@@ -51,8 +51,8 @@ class Accidental_engraver : public Engraver
int get_bar_number ();
void update_local_key_signature ();
void create_accidental (Accidental_entry *entry, bool, bool);
- Grob *make_standard_accidental (Music *note, Grob *note_head, Engraver *trans);
- Grob *make_suggested_accidental (Music *note, Grob *note_head, Engraver *trans);
+ Grob *make_standard_accidental (Stream_event *note, Grob *note_head, Engraver *trans);
+ Grob *make_suggested_accidental (Stream_event *note, Grob *note_head, Engraver *trans);
protected:
TRANSLATOR_DECLARATIONS (Accidental_engraver);
@@ -316,7 +316,7 @@ Accidental_engraver::process_acknowledged ()
continue;
accidentals_[i].done_ = true;
- Music *note = accidentals_[i].melodic_;
+ Stream_event *note = accidentals_[i].melodic_;
Context *origin = accidentals_[i].origin_;
Pitch *pitch = unsmob_pitch (note->get_property ("pitch"));
@@ -348,7 +348,7 @@ Accidental_engraver::process_acknowledged ()
/* Cannot look for ties: it's not guaranteed that they reach
us before the notes. */
if (num
- && !note->is_mus_type ("trill-span-event"))
+ && !note->in_event_class ("trill-span-event"))
create_accidental (&accidentals_[i], num > 1, cautionary);
}
}
@@ -359,7 +359,7 @@ Accidental_engraver::create_accidental (Accidental_entry *entry,
bool restore_natural,
bool cautionary)
{
- Music *note = entry->melodic_;
+ Stream_event *note = entry->melodic_;
Grob *support = entry->head_;
Pitch *pitch = unsmob_pitch (note->get_property ("pitch"));
@@ -387,7 +387,7 @@ Accidental_engraver::create_accidental (Accidental_entry *entry,
}
Grob *
-Accidental_engraver::make_standard_accidental (Music *note,
+Accidental_engraver::make_standard_accidental (Stream_event *note,
Grob *note_head,
Engraver *trans)
{
@@ -433,7 +433,7 @@ Accidental_engraver::make_standard_accidental (Music *note,
}
Grob *
-Accidental_engraver::make_suggested_accidental (Music *note,
+Accidental_engraver::make_suggested_accidental (Stream_event *note,
Grob *note_head,
Engraver *trans)
{
@@ -481,7 +481,7 @@ Accidental_engraver::stop_translation_timestep ()
{
int barnum = get_bar_number ();
- Music *note = accidentals_[i].melodic_;
+ Stream_event *note = accidentals_[i].melodic_;
Context *origin = accidentals_[i].origin_;
Pitch *pitch = unsmob_pitch (note->get_property ("pitch"));
@@ -537,10 +537,10 @@ Accidental_engraver::stop_translation_timestep ()
void
Accidental_engraver::acknowledge_rhythmic_head (Grob_info info)
{
- Music *note = info.music_cause ();
+ Stream_event *note = info.event_cause ();
if (note
- && (note->is_mus_type ("note-event")
- || note->is_mus_type ("trill-span-event")))
+ && (note->in_event_class ("note-event")
+ || note->in_event_class ("trill-span-event")))
{
/*
string harmonics usually don't have accidentals.
diff --git a/lily/ambitus-engraver.cc b/lily/ambitus-engraver.cc
index f71c33b49c..1321c5bf6e 100644
--- a/lily/ambitus-engraver.cc
+++ b/lily/ambitus-engraver.cc
@@ -17,6 +17,7 @@
#include "protected-scm.hh"
#include "side-position-interface.hh"
#include "staff-symbol-referencer.hh"
+#include "stream-event.hh"
#include "translator.icc"
@@ -117,8 +118,8 @@ Ambitus_engraver::stop_translation_timestep ()
void
Ambitus_engraver::acknowledge_note_head (Grob_info info)
{
- Music *nr = info.music_cause ();
- if (nr && nr->is_mus_type ("note-event"))
+ Stream_event *nr = info.event_cause ();
+ if (nr && nr->in_event_class ("note-event"))
{
Pitch pitch = *unsmob_pitch (nr->get_property ("pitch"));
pitch_interval_.add_point (pitch);
diff --git a/lily/arpeggio-engraver.cc b/lily/arpeggio-engraver.cc
index 1cc143dbd7..633d924e5a 100644
--- a/lily/arpeggio-engraver.cc
+++ b/lily/arpeggio-engraver.cc
@@ -44,7 +44,7 @@ Arpeggio_engraver::Arpeggio_engraver ()
IMPLEMENT_TRANSLATOR_LISTENER (Arpeggio_engraver, arpeggio);
void Arpeggio_engraver::listen_arpeggio (Stream_event *ev)
{
- arpeggio_event_ = ev;
+ ASSIGN_EVENT_ONCE (arpeggio_event_, ev);
}
void
diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc
index 26aef17543..0472c4cdec 100644
--- a/lily/auto-beam-engraver.cc
+++ b/lily/auto-beam-engraver.cc
@@ -133,7 +133,7 @@ IMPLEMENT_TRANSLATOR_LISTENER (Auto_beam_engraver, beam_forbid);
void
Auto_beam_engraver::listen_beam_forbid (Stream_event *ev)
{
- forbid_ = ev;
+ ASSIGN_EVENT_ONCE (forbid_, ev);
}
bool
diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc
index 42d0a8db41..46d932e2f7 100644
--- a/lily/beam-engraver.cc
+++ b/lily/beam-engraver.cc
@@ -102,9 +102,9 @@ Beam_engraver::listen_beam (Stream_event *ev)
Direction d = to_dir (ev->get_property ("span-direction"));
if (d == START && valid_start_point ())
- start_ev_ = ev;
+ ASSIGN_EVENT_ONCE (start_ev_, ev);
else if (d == STOP && valid_end_point ())
- now_stop_ev_ = ev;
+ ASSIGN_EVENT_ONCE (now_stop_ev_, ev);
}
void
diff --git a/lily/beam-performer.cc b/lily/beam-performer.cc
index 6d36c78381..ba0135f1d0 100644
--- a/lily/beam-performer.cc
+++ b/lily/beam-performer.cc
@@ -12,7 +12,6 @@
#include "global-context.hh"
#include "stream-event.hh"
#include "warn.hh"
-#include "music.hh"
#include "translator.icc"
diff --git a/lily/breathing-sign-engraver.cc b/lily/breathing-sign-engraver.cc
index 5b2ddaff47..126110e07e 100644
--- a/lily/breathing-sign-engraver.cc
+++ b/lily/breathing-sign-engraver.cc
@@ -42,9 +42,9 @@ Breathing_sign_engraver::Breathing_sign_engraver ()
IMPLEMENT_TRANSLATOR_LISTENER (Breathing_sign_engraver, breathing);
void
-Breathing_sign_engraver::listen_breathing (Stream_event *r)
+Breathing_sign_engraver::listen_breathing (Stream_event *ev)
{
- breathing_sign_event_ = r;
+ ASSIGN_EVENT_ONCE (breathing_sign_event_, ev);
}
void
diff --git a/lily/chord-tremolo-engraver.cc b/lily/chord-tremolo-engraver.cc
index b0f17352ba..f07e984626 100644
--- a/lily/chord-tremolo-engraver.cc
+++ b/lily/chord-tremolo-engraver.cc
@@ -73,15 +73,19 @@ Chord_tremolo_engraver::listen_tremolo_span (Stream_event *ev)
Direction span_dir = to_dir (ev->get_property ("span-direction"));
if (span_dir == START)
{
- repeat_ = ev;
- int type = scm_to_int (ev->get_property ("tremolo-type"));
- /* e.g. 1 for type 8, 2 for type 16 */
- flags_ = intlog2 (type) - 2;
- expected_beam_count_ = scm_to_int (ev->get_property ("expected-beam-count"));
- beam_dir_ = RIGHT;
+ if (ASSIGN_EVENT_ONCE (repeat_, ev))
+ {
+ int type = scm_to_int (ev->get_property ("tremolo-type"));
+ /* e.g. 1 for type 8, 2 for type 16 */
+ flags_ = intlog2 (type) - 2;
+ expected_beam_count_ = scm_to_int (ev->get_property ("expected-beam-count"));
+ beam_dir_ = RIGHT;
+ }
}
else if (span_dir == STOP)
{
+ if (!repeat_)
+ ev->origin ()->warning (_ ("No tremolo to end"));
repeat_ = 0;
beam_ = 0;
expected_beam_count_ = 0;
@@ -123,13 +127,13 @@ Chord_tremolo_engraver::acknowledge_stem (Grob_info info)
if (beam_dir_ == RIGHT)
beam_dir_ = LEFT;
- if (info.ultimate_music_cause ()->is_mus_type ("rhythmic-event"))
+ if (info.ultimate_event_cause ()->in_event_class ("rhythmic-event"))
Beam::add_stem (beam_, s);
else
{
string s = _ ("stem must have Rhythmic structure");
- if (info.music_cause ())
- info.music_cause ()->origin ()->warning (s);
+ if (info.event_cause ())
+ info.event_cause ()->origin ()->warning (s);
else
::warning (s);
}
diff --git a/lily/coherent-ligature-engraver.cc b/lily/coherent-ligature-engraver.cc
index a4815f0b8a..96ff842d0c 100644
--- a/lily/coherent-ligature-engraver.cc
+++ b/lily/coherent-ligature-engraver.cc
@@ -9,11 +9,12 @@
#include "coherent-ligature-engraver.hh"
#include "warn.hh"
-#include "staff-symbol-referencer.hh"
-#include "spanner.hh"
#include "paper-column.hh"
#include "pitch.hh"
#include "pointer-group-interface.hh"
+#include "spanner.hh"
+#include "staff-symbol-referencer.hh"
+#include "stream-event.hh"
/*
* This abstract class serves as common superclass for all ligature
@@ -142,9 +143,9 @@ compute_delta_pitches (vector<Grob_info> primitives)
for (vsize i = 0; i < primitives.size (); i++)
{
primitive = dynamic_cast<Item *> (primitives[i].grob ());
- Music *music_cause = primitives[i].music_cause ();
+ Stream_event *cause = primitives[i].event_cause ();
int pitch
- = unsmob_pitch (music_cause->get_property ("pitch"))->steps ();
+ = unsmob_pitch (cause->get_property ("pitch"))->steps ();
if (prev_primitive)
{
delta_pitch = pitch - prev_pitch;
diff --git a/lily/completion-note-heads-engraver.cc b/lily/completion-note-heads-engraver.cc
index 3e5056619d..69cd4b0785 100644
--- a/lily/completion-note-heads-engraver.cc
+++ b/lily/completion-note-heads-engraver.cc
@@ -12,7 +12,6 @@ using namespace std;
#include "duration.hh"
#include "global-context.hh"
#include "item.hh"
-#include "music.hh"
#include "output-def.hh"
#include "pitch.hh"
#include "rhythmic-head.hh"
diff --git a/lily/constrained-breaking.cc b/lily/constrained-breaking.cc
index 4d9c5795ee..4e5de38254 100644
--- a/lily/constrained-breaking.cc
+++ b/lily/constrained-breaking.cc
@@ -238,7 +238,7 @@ Constrained_breaking::get_solution (vsize start, vsize end, vsize sys_count)
{
if (brk != end_brk)
{
- warning ( _("couldn't find line breaking that satisfies constraints" ));
+ warning (_ ("couldn't find line breaking that satisfies constraints" ));
ret.push_back (space_line (brk, end_brk));
}
/* build up the good solution */
@@ -255,7 +255,7 @@ Constrained_breaking::get_solution (vsize start, vsize end, vsize sys_count)
}
}
/* if we get to here, just put everything on one line */
- warning ( _("couldn't find line breaking that satisfies constraints" ));
+ warning (_ ("couldn't find line breaking that satisfies constraints" ));
ret.push_back (space_line (0, end_brk));
return ret;
}
diff --git a/lily/context-handle.cc b/lily/context-handle.cc
index b9c8692ff0..80aa6a1a2f 100644
--- a/lily/context-handle.cc
+++ b/lily/context-handle.cc
@@ -47,12 +47,6 @@ Context_handle::down ()
outlet_ = 0;
}
-bool
-Context_handle::try_music (Music *m)
-{
- return outlet_->try_music (m);
-}
-
void
Context_handle::operator = (Context_handle const &s)
{
diff --git a/lily/context.cc b/lily/context.cc
index 5211cbb3f0..d9c5f88129 100644
--- a/lily/context.cc
+++ b/lily/context.cc
@@ -655,20 +655,6 @@ IMPLEMENT_SMOBS (Context);
IMPLEMENT_DEFAULT_EQUAL_P (Context);
IMPLEMENT_TYPE_P (Context, "ly:context?");
-bool
-Context::try_music (Music *m)
-{
- Translator_group *t = implementation ();
- if (!t)
- return false;
-
- bool b = t->try_music (m);
- if (!b && daddy_context_)
- b = daddy_context_->try_music (m);
-
- return b;
-}
-
Global_context *
Context::get_global_context () const
{
diff --git a/lily/custos-engraver.cc b/lily/custos-engraver.cc
index 3b3f7610e0..82381b764c 100644
--- a/lily/custos-engraver.cc
+++ b/lily/custos-engraver.cc
@@ -11,9 +11,10 @@
#include "bar-line.hh"
#include "item.hh"
#include "note-head.hh"
+#include "pitch.hh"
#include "staff-symbol-referencer.hh"
+#include "stream-event.hh"
#include "warn.hh"
-#include "pitch.hh"
#include "translator.icc"
@@ -73,8 +74,8 @@ Custos_engraver::acknowledge_bar (Grob_info info)
void
Custos_engraver::acknowledge_note_head (Grob_info info)
{
- Music *m = info.music_cause ();
- if (m && m->is_mus_type ("note-event"))
+ Stream_event *ev = info.event_cause ();
+ if (ev && ev->in_event_class ("note-event"))
{
/*
@@ -85,7 +86,7 @@ Custos_engraver::acknowledge_note_head (Grob_info info)
don't look at the staff-position, since we can't be sure
whether Clef_engraver already applied a vertical shift.
*/
- pitches_.push_back (*unsmob_pitch (m->get_property ("pitch")));
+ pitches_.push_back (*unsmob_pitch (ev->get_property ("pitch")));
}
}
diff --git a/lily/drum-note-performer.cc b/lily/drum-note-performer.cc
index 2926fb8961..a4e0ff2f7f 100644
--- a/lily/drum-note-performer.cc
+++ b/lily/drum-note-performer.cc
@@ -10,7 +10,6 @@
#include "audio-item.hh"
#include "audio-column.hh"
#include "global-context.hh"
-#include "music.hh"
#include "pitch.hh"
#include "stream-event.hh"
#include "translator.icc"
@@ -53,17 +52,17 @@ Drum_note_performer::process_music ()
if (Pitch *pit = unsmob_pitch (defn))
{
SCM articulations = n->get_property ("articulations");
- Music *tie_event = 0;
+ Stream_event *tie_event = 0;
for (SCM s = articulations;
!tie_event && scm_is_pair (s);
s = scm_cdr (s))
{
- Music *m = unsmob_music (scm_car (s));
- if (!m)
+ Stream_event *ev = unsmob_stream_event (scm_car (s));
+ if (!ev)
continue;
- if (m->is_mus_type ("tie-event"))
- tie_event = m;
+ if (ev->in_event_class ("tie-event"))
+ tie_event = ev;
}
Audio_note *p = new Audio_note (*pit, get_event_length (n),
diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc
index 09a7e39305..d8795f0bdc 100644
--- a/lily/dynamic-engraver.cc
+++ b/lily/dynamic-engraver.cc
@@ -97,7 +97,7 @@ Dynamic_engraver::listen_absolute_dynamic (Stream_event *ev)
/*
TODO: probably broken.
*/
- script_ev_ = ev;
+ ASSIGN_EVENT_ONCE (script_ev_, ev);
}
IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, span_dynamic);
@@ -106,9 +106,14 @@ Dynamic_engraver::listen_span_dynamic (Stream_event *ev)
{
Direction d = to_dir (ev->get_property ("span-direction"));
- accepted_spanevents_drul_[d] = ev;
- if (current_cresc_ev_ && d == START)
- accepted_spanevents_drul_[STOP] = ev;
+ if (d == START)
+ ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[START], ev);
+
+ /* Cancel any ongoing crescendo, either explicitly by \! or
+ implicitly by a new crescendo. Also avoid warning if cresc is
+ cancelled both implicitly and explicitly. */
+ if ((d == STOP || current_cresc_ev_) && !accepted_spanevents_drul_[STOP])
+ ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[STOP], ev);
}
void
diff --git a/lily/event-chord-iterator.cc b/lily/event-chord-iterator.cc
index 60e7e3081a..89a0f383a9 100644
--- a/lily/event-chord-iterator.cc
+++ b/lily/event-chord-iterator.cc
@@ -9,11 +9,13 @@
#include "event-chord-iterator.hh"
#include "context.hh"
+#include "dispatcher.hh"
#include "duration.hh"
#include "input.hh"
#include "international.hh"
#include "music.hh"
#include "pitch.hh"
+#include "stream-event.hh"
#include "warn.hh"
Event_chord_iterator::Event_chord_iterator ()
@@ -38,6 +40,12 @@ Event_chord_iterator::process (Moment m)
Music *mus = unsmob_music (scm_car (s));
report_event (mus);
}
+ for (SCM s = get_music ()->get_property ("events");
+ scm_is_pair (s); s = scm_cdr (s))
+ {
+ Stream_event *ev = unsmob_stream_event (scm_car (s));
+ get_outlet ()->event_source ()->broadcast (ev);
+ }
}
Simple_music_iterator::process (m);
}
diff --git a/lily/fall-engraver.cc b/lily/fall-engraver.cc
index 5df614bb41..b0751a31d5 100644
--- a/lily/fall-engraver.cc
+++ b/lily/fall-engraver.cc
@@ -8,6 +8,7 @@
#include "engraver.hh"
#include "item.hh"
+#include "moment.hh"
#include "spanner.hh"
#include "stream-event.hh"
@@ -92,7 +93,7 @@ IMPLEMENT_TRANSLATOR_LISTENER (Bend_after_engraver, bend_after);
void
Bend_after_engraver::listen_bend_after (Stream_event *ev)
{
- fall_event_ = ev;
+ ASSIGN_EVENT_ONCE (fall_event_, ev);
}
void
diff --git a/lily/figured-bass-engraver.cc b/lily/figured-bass-engraver.cc
index 9e0bf61786..a300df86d4 100644
--- a/lily/figured-bass-engraver.cc
+++ b/lily/figured-bass-engraver.cc
@@ -137,7 +137,7 @@ void
Figured_bass_engraver::listen_rest (Stream_event *ev)
{
new_event_found_ = true;
- rest_event_ = ev;
+ ASSIGN_EVENT_ONCE (rest_event_, ev);
}
IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, bass_figure);
@@ -145,8 +145,9 @@ void
Figured_bass_engraver::listen_bass_figure (Stream_event *ev)
{
new_event_found_ = true;
- stop_moment_ = now_mom () + get_event_length (ev);
-
+ Moment stop = now_mom () + get_event_length (ev);
+ stop_moment_ = max (stop_moment_, stop);
+
SCM fig = ev->get_property ("figure");
for (vsize i = 0; i < groups_.size (); i++)
{
diff --git a/lily/figured-bass-position-engraver.cc b/lily/figured-bass-position-engraver.cc
index 8b4e7462c7..2286fe6b52 100644
--- a/lily/figured-bass-position-engraver.cc
+++ b/lily/figured-bass-position-engraver.cc
@@ -10,7 +10,6 @@
#include "engraver.hh"
#include "context.hh"
-#include "music.hh"
#include "spanner.hh"
#include "side-position-interface.hh"
#include "translator.icc"
diff --git a/lily/grace-spacing-engraver.cc b/lily/grace-spacing-engraver.cc
index b784358a2c..f86b12ef22 100644
--- a/lily/grace-spacing-engraver.cc
+++ b/lily/grace-spacing-engraver.cc
@@ -8,8 +8,9 @@
*/
#include "engraver.hh"
-#include "spanner.hh"
+#include "moment.hh"
#include "pointer-group-interface.hh"
+#include "spanner.hh"
#include "translator.icc"
diff --git a/lily/gregorian-ligature-engraver.cc b/lily/gregorian-ligature-engraver.cc
index 6a99e3946e..e6b3c9b534 100644
--- a/lily/gregorian-ligature-engraver.cc
+++ b/lily/gregorian-ligature-engraver.cc
@@ -17,6 +17,9 @@
#include "stream-event.hh"
#include "warn.hh"
+/* ASSIGN_EVENT_ONCE */
+#include "translator.icc"
+
/*
* This abstract class is the common superclass for all ligature
* engravers for Gregorian chant notation. It cares for the musical
@@ -36,7 +39,7 @@ Gregorian_ligature_engraver::Gregorian_ligature_engraver ()
void
Gregorian_ligature_engraver::listen_pes_or_flexa (Stream_event *ev)
{
- pes_or_flexa_req_ = ev;
+ ASSIGN_EVENT_ONCE (pes_or_flexa_req_, ev);
}
void fix_prefix (char *name, int mask,
diff --git a/lily/grob-info.cc b/lily/grob-info.cc
index 5ad3d5701e..23ff736d95 100644
--- a/lily/grob-info.cc
+++ b/lily/grob-info.cc
@@ -29,24 +29,6 @@ Grob_info::Grob_info ()
origin_trans_ = 0;
}
-/* ES TODO: Junk this when no more engravers use try_music */
-Music *
-Grob_info::music_cause () const
-{
- SCM cause = grob_->get_property ("cause");
-
- Music *ret = unsmob_music (cause);
- if (ret)
- return ret;
- else
- {
- Stream_event *ev = unsmob_stream_event (cause);
- if (!ev)
- return 0;
- return unsmob_music (ev->get_property ("music-cause"));
- }
-}
-
Stream_event *
Grob_info::event_cause () const
{
@@ -97,25 +79,3 @@ Grob_info::ultimate_event_cause () const
}
return unsmob_stream_event (cause);
}
-
-/*
-ES TODO: Junk this when no more engraver uses try_music
-*/
-Music *
-Grob_info::ultimate_music_cause () const
-{
- SCM cause = grob_->self_scm ();
- while (unsmob_grob (cause))
- {
- cause = unsmob_grob (cause)->get_property ("cause");
- }
-
- Music *ret = unsmob_music (cause);
- if (ret)
- return ret;
- else
- {
- Stream_event *ev = unsmob_stream_event (cause);
- return unsmob_music (ev->get_property ("music-cause"));
- }
-}
diff --git a/lily/grob-pq-engraver.cc b/lily/grob-pq-engraver.cc
index 80d072b404..6f6ee8faab 100644
--- a/lily/grob-pq-engraver.cc
+++ b/lily/grob-pq-engraver.cc
@@ -60,13 +60,13 @@ LY_DEFINE (ly_grob_pq_less_p, "ly:grob-pq-less?",
void
Grob_pq_engraver::acknowledge_grob (Grob_info gi)
{
- Music *m = gi.music_cause ();
+ Stream_event *ev = gi.event_cause ();
- if (m
+ if (ev
&& !gi.grob ()->internal_has_interface (ly_symbol2scm ("multi-measure-interface")))
{
Moment n = now_mom ();
- Moment l = m->get_length ();
+ Moment l = get_event_length (ev);
if (!l.to_bool ())
return;
diff --git a/lily/include/context-handle.hh b/lily/include/context-handle.hh
index ea7e255809..e32bc29cb7 100644
--- a/lily/include/context-handle.hh
+++ b/lily/include/context-handle.hh
@@ -21,7 +21,6 @@ public:
Context_handle ();
void set_context (Context *);
- bool try_music (Music *);
void operator = (Context_handle const &);
Context_handle (Context_handle const &);
Context *get_outlet () const;
diff --git a/lily/include/context.hh b/lily/include/context.hh
index 1a9c0c2567..6be715ce3d 100644
--- a/lily/include/context.hh
+++ b/lily/include/context.hh
@@ -112,7 +112,6 @@ public:
void add_context (Context *trans);
bool is_bottom_context () const;
bool is_removable () const;
- bool try_music (Music *);
Context *find_create_context (SCM context_name,
string id, SCM ops);
diff --git a/lily/include/engraver.hh b/lily/include/engraver.hh
index 04a7623e3f..abbeb2eec9 100644
--- a/lily/include/engraver.hh
+++ b/lily/include/engraver.hh
@@ -9,7 +9,6 @@
#ifndef ENGRAVER_HH
#define ENGRAVER_HH
-#include "music.hh"
#include "grob-info.hh"
#include "translator.hh"
diff --git a/lily/include/grob-info.hh b/lily/include/grob-info.hh
index ebd860ef3a..b92f033718 100644
--- a/lily/include/grob-info.hh
+++ b/lily/include/grob-info.hh
@@ -30,9 +30,7 @@ public:
Context *context () const;
Stream_event *event_cause () const;
- Music *music_cause () const;
Stream_event *ultimate_event_cause () const;
- Music *ultimate_music_cause () const;
vector<Context*> origin_contexts (Translator *) const;
Grob_info (Translator *, Grob *);
Grob_info ();
diff --git a/lily/include/paper-column-engraver.hh b/lily/include/paper-column-engraver.hh
index 5f3131ccb0..1dd227e209 100644
--- a/lily/include/paper-column-engraver.hh
+++ b/lily/include/paper-column-engraver.hh
@@ -11,6 +11,7 @@
#include "engraver.hh"
#include "listener.hh"
+#include "moment.hh"
#include "stream-event.hh"
class Paper_column_engraver : public Engraver
diff --git a/lily/include/stream-event.hh b/lily/include/stream-event.hh
index 991e672309..4e1688f6f4 100644
--- a/lily/include/stream-event.hh
+++ b/lily/include/stream-event.hh
@@ -19,8 +19,7 @@ public:
Stream_event ();
VIRTUAL_COPY_CONSTRUCTOR (Stream_event, Stream_event);
// todo: remove unneeded constructors
- Stream_event (SCM event_class, SCM mutable_props);
- Stream_event (SCM property_alist);
+ Stream_event (SCM event_class, SCM mutable_props=SCM_EOL);
Stream_event (SCM class_name, Input *);
Stream_event (Stream_event *ev);
diff --git a/lily/include/translator-group.hh b/lily/include/translator-group.hh
index 2552fb4186..45a7c77030 100644
--- a/lily/include/translator-group.hh
+++ b/lily/include/translator-group.hh
@@ -50,7 +50,6 @@ private:
SCM protected_events_;
DECLARE_LISTENER (create_child_translator);
- DECLARE_LISTENER (eat_event);
public:
VIRTUAL_COPY_CONSTRUCTOR (Translator_group, Translator_group);
@@ -61,7 +60,6 @@ public:
virtual void disconnect_from_context ();
virtual Translator_group *get_daddy_translator ()const;
virtual SCM get_simple_trans_list ();
- virtual bool try_music (Music *req);
virtual void initialize ();
virtual void finalize ();
@@ -80,7 +78,6 @@ public:
Context *context () const { return context_; }
protected:
SCM simple_trans_list_;
- SCM accept_hash_table_;
Context *context_;
friend class Context_def;
diff --git a/lily/include/translator.hh b/lily/include/translator.hh
index 871b87a95d..eea779085a 100644
--- a/lily/include/translator.hh
+++ b/lily/include/translator.hh
@@ -108,7 +108,6 @@ public:
virtual Translator_group *get_daddy_translator ()const;
virtual Moment now_mom () const;
- virtual bool try_music (Music *req);
virtual void initialize ();
virtual void finalize ();
diff --git a/lily/ligature-engraver.cc b/lily/ligature-engraver.cc
index 81523a0109..9922ca1c48 100644
--- a/lily/ligature-engraver.cc
+++ b/lily/ligature-engraver.cc
@@ -82,7 +82,7 @@ void
Ligature_engraver::listen_ligature (Stream_event *ev)
{
Direction d = to_dir (ev->get_property ("span-direction"));
- events_drul_[d] = ev;
+ ASSIGN_EVENT_ONCE (events_drul_[d], ev);
}
void
diff --git a/lily/lily-parser-scheme.cc b/lily/lily-parser-scheme.cc
index 30062e14ff..90d9a60366 100644
--- a/lily/lily-parser-scheme.cc
+++ b/lily/lily-parser-scheme.cc
@@ -110,9 +110,9 @@ LY_DEFINE (ly_parse_file, "ly:parse-file",
exit (2);
}
- if ((file_name != "-") && global_path.find (file_name).empty ())
+ if ((file_name != "-") && file_name.empty ())
{
- warning (_f ("can't find file: `%s'", file_name));
+ warning (_f ("can't find file: `%s'", file));
scm_throw (ly_symbol2scm ("ly-file-failed"),
scm_list_1 (scm_makfrom0str (file_name.c_str ())));
}
diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc
index aaccf2e210..dafed1d3c8 100644
--- a/lily/lyric-combine-music-iterator.cc
+++ b/lily/lyric-combine-music-iterator.cc
@@ -63,11 +63,8 @@ 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"))
+ if (e->in_event_class ("note-event") || e->in_event_class ("cluster-note-event"))
busy_ = true;
}
@@ -76,13 +73,13 @@ Lyric_combine_music_iterator::set_music_context (Context *to)
{
if (music_context_)
{
- music_context_->event_source()->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("OldMusicEvent"));
+ music_context_->event_source()->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event"));
lyrics_context_->unset_property (ly_symbol2scm ("associatedVoiceContext"));
}
music_context_ = to;
if (to)
{
- to->event_source()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("OldMusicEvent"));
+ to->event_source()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event"));
lyrics_context_->set_property ("associatedVoiceContext", to->self_scm ());
}
}
diff --git a/lily/mark-engraver.cc b/lily/mark-engraver.cc
index b236779ac1..70115d62fd 100644
--- a/lily/mark-engraver.cc
+++ b/lily/mark-engraver.cc
@@ -113,7 +113,7 @@ IMPLEMENT_TRANSLATOR_LISTENER (Mark_engraver, mark);
void
Mark_engraver::listen_mark (Stream_event *ev)
{
- mark_ev_ = ev;
+ ASSIGN_EVENT_ONCE (mark_ev_, ev);
}
/*
diff --git a/lily/melisma-translator.cc b/lily/melisma-translator.cc
index 69f9f7f53a..adc873d4dc 100644
--- a/lily/melisma-translator.cc
+++ b/lily/melisma-translator.cc
@@ -9,6 +9,7 @@
#include "engraver.hh"
#include "grob.hh"
#include "context.hh"
+#include "music.hh"
#include "translator.icc"
/* Remove this translator. */
diff --git a/lily/mensural-ligature-engraver.cc b/lily/mensural-ligature-engraver.cc
index c1c5bcad6d..f40ce004b0 100644
--- a/lily/mensural-ligature-engraver.cc
+++ b/lily/mensural-ligature-engraver.cc
@@ -11,11 +11,11 @@
#include "font-interface.hh"
#include "international.hh"
#include "mensural-ligature.hh"
-#include "music.hh"
#include "note-column.hh"
#include "note-head.hh"
#include "output-def.hh"
#include "paper-column.hh"
+#include "pitch.hh"
#include "rhythmic-head.hh"
#include "spanner.hh"
#include "staff-symbol-referencer.hh"
@@ -104,12 +104,12 @@ Mensural_ligature_engraver::transform_heads (vector<Grob_info> primitives)
Item *primitive = dynamic_cast<Item *> (info.grob ());
int duration_log = Note_head::get_balltype (primitive);
- Music *nr = info.music_cause ();
+ Stream_event *nr = info.event_cause ();
/*
ugh. why not simply check for pitch?
*/
- if (!nr->is_mus_type ("note-event"))
+ if (!nr->in_event_class ("note-event"))
{
nr->origin ()->warning
(_f ("cannot determine pitch of ligature primitive -> skipping"));
@@ -174,7 +174,7 @@ Mensural_ligature_engraver::transform_heads (vector<Grob_info> primitives)
}
// b. descendens longa or brevis
else if (i < s - 1
- && (unsmob_pitch (primitives[i + 1].music_cause ()
+ && (unsmob_pitch (primitives[i + 1].event_cause ()
->get_property ("pitch"))->steps () < pitch)
&& duration_log > -3)
{
diff --git a/lily/metronome-engraver.cc b/lily/metronome-engraver.cc
index cfae9a5ee8..5e5986d2ea 100644
--- a/lily/metronome-engraver.cc
+++ b/lily/metronome-engraver.cc
@@ -11,10 +11,13 @@ using namespace std;
#include "engraver.hh"
-#include "item.hh"
#include "context.hh"
-#include "grob-array.hh"
#include "duration.hh"
+#include "grob-array.hh"
+#include "item.hh"
+#include "stream-event.hh"
+
+#include "translator.icc"
/**
put stuff over or next to bars. Examples: bar numbers, marginal notes,
@@ -91,8 +94,6 @@ Metronome_mark_engraver::process_music ()
last_count_ = count;
}
-#include "translator.icc"
-
ADD_TRANSLATOR (Metronome_mark_engraver,
/* doc */ "Engrave metro nome marking. This delegates the formatting work "
"to the function in the metronomeMarkFormatter property. "
diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc
index ff073601e9..2019959399 100644
--- a/lily/multi-measure-rest-engraver.cc
+++ b/lily/multi-measure-rest-engraver.cc
@@ -65,8 +65,14 @@ IMPLEMENT_TRANSLATOR_LISTENER (Multi_measure_rest_engraver, multi_measure_rest);
void
Multi_measure_rest_engraver::listen_multi_measure_rest (Stream_event *ev)
{
+ /* FIXME: Should use ASSIGN_EVENT_ONCE. Can't do that yet because of
+ the kill-mm-rests hack in part-combine-iterator. */
rest_ev_ = ev;
stop_moment_ = now_mom () + get_event_length (rest_ev_);
+ /*
+ if (ASSIGN_EVENT_ONCE (rest_ev_, ev))
+ stop_moment_ = now_mom () + get_event_length (rest_ev_);
+ */
}
IMPLEMENT_TRANSLATOR_LISTENER (Multi_measure_rest_engraver, multi_measure_text);
diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc
index ce824968a9..036a0c3249 100644
--- a/lily/music-iterator.cc
+++ b/lily/music-iterator.cc
@@ -169,7 +169,7 @@ Music_iterator::report_event (Music *m)
FIXME: then don't do it.
*/
if (!m->is_mus_type ("event"))
- m->origin ()->programming_error (_f ("Sending non-event to context"));
+ m->origin ()->programming_error (_ ("Sending non-event to context"));
m->send_to_context (get_outlet ());
}
diff --git a/lily/music.cc b/lily/music.cc
index 4d71d99d98..b938c86e22 100644
--- a/lily/music.cc
+++ b/lily/music.cc
@@ -269,7 +269,7 @@ Music::to_event () const
out[outpos] = 0;
SCM class_name = ly_symbol2scm (out);
- // catch mistakes.
+ // catch programming mistakes.
if (!internal_is_music_type (class_name))
{
programming_error ("Not a music type");
@@ -280,24 +280,32 @@ Music::to_event () const
if (length.to_bool ())
e->set_property ("length", length.smobbed_copy ());
+ // articulations as events.
+ SCM art_mus = e->get_property ("articulations");
+ if (scm_is_pair (art_mus))
+ {
+ SCM art_ev = SCM_EOL;
+ for (; scm_is_pair (art_mus); art_mus = scm_cdr (art_mus))
+ {
+ Music *m = unsmob_music (scm_car (art_mus));
+ SCM ev = m ? m->to_event ()->unprotect () : scm_car (art_mus);
+ art_ev = scm_cons (ev, art_ev);
+ }
+ e->set_property ("articulations", scm_reverse_x (art_ev, SCM_EOL));
+ }
+
/*
ES TODO: This is a temporary fix. Stream_events should not be
aware of music.
*/
e->set_property ("music-cause", self_scm ());
+
return e;
}
void
Music::send_to_context (Context *c)
{
- /*
- TODO: This is a work-in-progress solution. Send the event so it
- can be read both by old-style translators and the new ones.
- */
- send_stream_event (c, "OldMusicEvent", origin (),
- ly_symbol2scm("music"), self_scm (), 0);
-
Stream_event *ev = to_event ();
c->event_source ()->broadcast (ev);
ev->unprotect ();
diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc
index 75e893c351..2e8c94399c 100644
--- a/lily/new-fingering-engraver.cc
+++ b/lily/new-fingering-engraver.cc
@@ -14,7 +14,7 @@
#include "self-alignment-interface.hh"
#include "side-position-interface.hh"
#include "stem.hh"
-#include "stem.hh"
+#include "stream-event.hh"
#include "warn.hh"
#include "translator.icc"
@@ -23,8 +23,8 @@ struct Finger_tuple
{
Grob *head_;
Grob *script_;
- Music *note_event_;
- Music *finger_event_;
+ Stream_event *note_event_;
+ Stream_event *finger_event_;
bool follow_into_staff_;
int position_;
@@ -58,16 +58,16 @@ protected:
void stop_translation_timestep ();
DECLARE_ACKNOWLEDGER (rhythmic_head);
DECLARE_ACKNOWLEDGER (stem);
- void add_fingering (Grob *, Music *, Music *);
- void add_script (Grob *, Music *, Music *);
- void add_string (Grob *, Music *, Music *);
+ void add_fingering (Grob *, Stream_event *, Stream_event *);
+ void add_script (Grob *, Stream_event *, Stream_event *);
+ void add_string (Grob *, Stream_event *, Stream_event *);
void position_scripts (SCM orientations, vector<Finger_tuple> *);
};
void
New_fingering_engraver::acknowledge_rhythmic_head (Grob_info inf)
{
- Music *note_ev = inf.music_cause ();
+ Stream_event *note_ev = inf.event_cause ();
if (!note_ev)
return;
@@ -75,20 +75,20 @@ New_fingering_engraver::acknowledge_rhythmic_head (Grob_info inf)
for (SCM s = arts; scm_is_pair (s); s = scm_cdr (s))
{
- Music *m = unsmob_music (scm_car (s));
+ Stream_event *ev = unsmob_stream_event (scm_car (s));
- if (!m)
+ if (!ev)
continue;
- if (m->is_mus_type ("fingering-event"))
- add_fingering (inf.grob (), m, note_ev);
- else if (m->is_mus_type ("text-script-event"))
- m->origin ()->warning (_ ("can't add text scripts to individual note heads"));
- else if (m->is_mus_type ("script-event"))
- add_script (inf.grob (), m, note_ev);
- else if (m->is_mus_type ("string-number-event"))
- add_string (inf.grob (), m, note_ev);
- else if (m->is_mus_type ("harmonic-event"))
+ if (ev->in_event_class ("fingering-event"))
+ add_fingering (inf.grob (), ev, note_ev);
+ else if (ev->in_event_class ("text-script-event"))
+ ev->origin ()->warning (_ ("can't add text scripts to individual note heads"));
+ else if (ev->in_event_class ("script-event"))
+ add_script (inf.grob (), ev, note_ev);
+ else if (ev->in_event_class ("string-number-event"))
+ add_string (inf.grob (), ev, note_ev);
+ else if (ev->in_event_class ("harmonic-event"))
{
inf.grob ()->set_property ("style", ly_symbol2scm ("harmonic"));
Grob *d = unsmob_grob (inf.grob ()->get_object ("dot"));
@@ -108,8 +108,8 @@ New_fingering_engraver::acknowledge_stem (Grob_info inf)
void
New_fingering_engraver::add_script (Grob *head,
- Music *event,
- Music *note)
+ Stream_event *event,
+ Stream_event *note)
{
(void) note;
@@ -129,8 +129,8 @@ New_fingering_engraver::add_script (Grob *head,
void
New_fingering_engraver::add_fingering (Grob *head,
- Music *event,
- Music *hevent)
+ Stream_event *event,
+ Stream_event *hevent)
{
Finger_tuple ft;
@@ -166,8 +166,8 @@ New_fingering_engraver::add_fingering (Grob *head,
void
New_fingering_engraver::add_string (Grob *head,
- Music *event,
- Music *hevent)
+ Stream_event *event,
+ Stream_event *hevent)
{
Finger_tuple ft;
diff --git a/lily/note-heads-engraver.cc b/lily/note-heads-engraver.cc
index 93fb8feb4d..1d2f32418a 100644
--- a/lily/note-heads-engraver.cc
+++ b/lily/note-heads-engraver.cc
@@ -14,6 +14,7 @@ using namespace std;
#include "duration.hh"
#include "item.hh"
#include "output-def.hh"
+#include "pitch.hh"
#include "rhythmic-head.hh"
#include "staff-symbol-referencer.hh"
#include "stream-event.hh"
diff --git a/lily/note-name-engraver.cc b/lily/note-name-engraver.cc
index 1222654dab..32253cb2bc 100644
--- a/lily/note-name-engraver.cc
+++ b/lily/note-name-engraver.cc
@@ -8,6 +8,7 @@
#include "engraver.hh"
#include "item.hh"
+#include "pitch.hh"
#include "stream-event.hh"
#include "translator.icc"
diff --git a/lily/note-performer.cc b/lily/note-performer.cc
index 8a39546b41..4aecc39606 100644
--- a/lily/note-performer.cc
+++ b/lily/note-performer.cc
@@ -10,7 +10,6 @@
#include "audio-item.hh"
#include "audio-column.hh"
#include "global-context.hh"
-#include "music.hh"
#include "stream-event.hh"
#include "warn.hh"
@@ -54,17 +53,17 @@ Note_performer::process_music ()
if (Pitch *pitp = unsmob_pitch (pit))
{
SCM articulations = n->get_property ("articulations");
- Music *tie_event = 0;
+ Stream_event *tie_event = 0;
for (SCM s = articulations;
!tie_event && scm_is_pair (s);
s = scm_cdr (s))
{
- Music *m = unsmob_music (scm_car (s));
- if (!m)
+ Stream_event *ev = unsmob_stream_event (scm_car (s));
+ if (!ev)
continue;
- if (m->is_mus_type ("tie-event"))
- tie_event = m;
+ if (ev->in_event_class ("tie-event"))
+ tie_event = ev;
}
Audio_note *p = new Audio_note (*pitp, get_event_length (n),
diff --git a/lily/parenthesis-engraver.cc b/lily/parenthesis-engraver.cc
index 01ea191cb3..53d332427e 100644
--- a/lily/parenthesis-engraver.cc
+++ b/lily/parenthesis-engraver.cc
@@ -9,12 +9,12 @@
#include "engraver.hh"
-#include "warn.hh"
-#include "simple-closure.hh"
-#include "music.hh"
#include "grob.hh"
#include "item.hh"
#include "pointer-group-interface.hh"
+#include "simple-closure.hh"
+#include "stream-event.hh"
+#include "warn.hh"
#include "translator.icc"
@@ -33,9 +33,9 @@ Parenthesis_engraver::Parenthesis_engraver()
void
Parenthesis_engraver::acknowledge_grob (Grob_info info)
{
- if (Music *music = info.music_cause ())
+ if (Stream_event *ev = info.event_cause ())
{
- if (to_boolean (music->get_property ("parenthesize")))
+ if (to_boolean (ev->get_property ("parenthesize")))
{
if (Item *victim = dynamic_cast<Item*> (info.grob ()))
{
diff --git a/lily/part-combine-engraver.cc b/lily/part-combine-engraver.cc
index d1bd10cc51..284f7616c7 100644
--- a/lily/part-combine-engraver.cc
+++ b/lily/part-combine-engraver.cc
@@ -38,7 +38,7 @@ IMPLEMENT_TRANSLATOR_LISTENER (Part_combine_engraver, part_combine);
void
Part_combine_engraver::listen_part_combine (Stream_event *ev)
{
- event_ = ev;
+ ASSIGN_EVENT_ONCE (event_, ev);
}
Part_combine_engraver::Part_combine_engraver ()
diff --git a/lily/part-combine-iterator.cc b/lily/part-combine-iterator.cc
index 99f36b2b74..2a85da8037 100644
--- a/lily/part-combine-iterator.cc
+++ b/lily/part-combine-iterator.cc
@@ -15,6 +15,14 @@
#include "music-sequence.hh"
#include "warn.hh"
+typedef enum Outlet_type
+ {
+ CONTEXT_ONE, CONTEXT_TWO, CONTEXT_SHARED, CONTEXT_SOLO, CONTEXT_NULL, NUM_OUTLETS
+ };
+
+static const char *outlet_names_[NUM_OUTLETS] =
+ {"one", "two", "shared", "solo", "null"};
+
class Part_combine_iterator : public Music_iterator
{
public:
@@ -67,16 +75,13 @@ private:
/*
TODO: this is getting of hand...
*/
- Context_handle one_;
- Context_handle two_;
- Context_handle null_;
- Context_handle shared_;
- Context_handle solo_;
+ Context_handle handles_[NUM_OUTLETS];
- void substitute_both (Context *to1,
- Context *to2);
+ void substitute_both (Outlet_type to1,
+ Outlet_type to2);
- void kill_mmrest (Context *);
+ /* parameter is really Outlet_type */
+ void kill_mmrest (int in);
void chords_together ();
void solo1 ();
void solo2 ();
@@ -92,11 +97,14 @@ Part_combine_iterator::do_quit ()
if (second_iter_)
second_iter_->quit ();
- null_.set_context (0);
- one_.set_context (0);
- two_.set_context (0);
- shared_.set_context (0);
- solo_.set_context (0);
+ // Add listeners to all contexts except Devnull.
+ for (int i = 0; i < NUM_OUTLETS; i++)
+ {
+ Context *c = handles_[i].get_outlet ();
+ if (c->is_alias (ly_symbol2scm ("Voice")))
+ c->event_source ()->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event"));
+ handles_[i].set_context (0);
+ }
}
Part_combine_iterator::Part_combine_iterator ()
@@ -154,21 +162,21 @@ Part_combine_iterator::chords_together ()
playing_state_ = TOGETHER;
state_ = TOGETHER;
- substitute_both (shared_.get_outlet (), shared_.get_outlet ());
+ substitute_both (CONTEXT_SHARED, CONTEXT_SHARED);
}
}
void
-Part_combine_iterator::kill_mmrest (Context *tg)
+Part_combine_iterator::kill_mmrest (int in)
{
- static Music *mmrest;
+ static Stream_event *mmrest;
if (!mmrest)
{
- mmrest = make_music_by_name (ly_symbol2scm ("MultiMeasureRestEvent"));
+ mmrest = new Stream_event (ly_symbol2scm ("multi-measure-rest-event"));
mmrest->set_property ("duration", SCM_EOL);
}
- mmrest->send_to_context (tg);
+ handles_[in].get_outlet ()->event_source ()->broadcast (mmrest);
}
void
@@ -179,50 +187,42 @@ Part_combine_iterator::solo1 ()
else
{
state_ = SOLO1;
- substitute_both (solo_.get_outlet (),
- null_.get_outlet ());
+ substitute_both (CONTEXT_SOLO, CONTEXT_NULL);
- kill_mmrest (two_.get_outlet ());
- kill_mmrest (shared_.get_outlet ());
+ kill_mmrest (CONTEXT_TWO);
+ kill_mmrest (CONTEXT_SHARED);
if (playing_state_ != SOLO1)
{
- static Music *event;
+ static Stream_event *event;
if (!event)
- event = make_music_by_name (ly_symbol2scm ("SoloOneEvent"));
+ event = new Stream_event (ly_symbol2scm ("solo1-event"));
- event->send_to_context (first_iter_->get_outlet ());
+ first_iter_->get_outlet ()->event_source ()->broadcast (event);
}
playing_state_ = SOLO1;
}
}
void
-Part_combine_iterator::substitute_both (Context *to1,
- Context *to2)
+Part_combine_iterator::substitute_both (Outlet_type to1,
+ Outlet_type to2)
{
- Context *tos[] = {to1, to2};
+ Outlet_type tos[] = {to1, to2};
+
Music_iterator *mis[] = {first_iter_, second_iter_};
- Context_handle *hs[]
- = {
- &null_,
- &one_, &two_,
- &shared_, &solo_,
- 0
- };
for (int i = 0; i < 2; i++)
{
- for (int j = 0; hs[j]; j++)
- if (hs[j]->get_outlet () != tos[i])
- mis[i]->substitute_outlet (hs[j]->get_outlet (), tos[i]);
+ for (int j = 0; j < NUM_OUTLETS; j++)
+ if (j != tos[i])
+ mis[i]->substitute_outlet (handles_[j].get_outlet (), handles_[tos[i]].get_outlet ());
}
- for (int j = 0; hs[j]; j++)
+ for (int j = 0; j < NUM_OUTLETS; j++)
{
- Context *t = hs[j]->get_outlet ();
- if (t != to1 && t != to2)
- kill_mmrest (t);
+ if (j != to1 && j != to2)
+ kill_mmrest (j);
}
}
@@ -240,23 +240,24 @@ Part_combine_iterator::unisono (bool silent)
in the 1st voice, so in that case, we use the second voice
as a basis for events.
*/
- Context *c1 = (last_playing_ == SOLO2) ? null_.get_outlet () : shared_.get_outlet ();
- Context *c2 = (last_playing_ == SOLO2) ? shared_.get_outlet () : null_.get_outlet ();
+ Outlet_type c1 = (last_playing_ == SOLO2) ? CONTEXT_NULL : CONTEXT_SHARED;
+ Outlet_type c2 = (last_playing_ == SOLO2) ? CONTEXT_SHARED : CONTEXT_NULL;
substitute_both (c1, c2);
kill_mmrest ((last_playing_ == SOLO2)
- ? one_.get_outlet () : two_.get_outlet ());
- kill_mmrest (shared_.get_outlet ());
+ ? CONTEXT_ONE : CONTEXT_TWO);
+ kill_mmrest (CONTEXT_SHARED);
if (playing_state_ != UNISONO
&& newstate == UNISONO)
{
- static Music *event;
+ static Stream_event *event;
if (!event)
- event = make_music_by_name (ly_symbol2scm ("UnisonoEvent"));
+ event = new Stream_event (ly_symbol2scm ("unisono-event"));
+
Context *out = (last_playing_ == SOLO2 ? second_iter_ : first_iter_)
->get_outlet ();
- event->send_to_context (out);
+ out->event_source ()->broadcast (event);
playing_state_ = UNISONO;
}
state_ = newstate;
@@ -272,15 +273,15 @@ Part_combine_iterator::solo2 ()
{
state_ = SOLO2;
- substitute_both (null_.get_outlet (), solo_.get_outlet ());
+ substitute_both (CONTEXT_NULL, CONTEXT_SOLO);
if (playing_state_ != SOLO2)
{
- static Music *event;
+ static Stream_event *event;
if (!event)
- event = make_music_by_name (ly_symbol2scm ("SoloTwoEvent"));
+ event = new Stream_event (ly_symbol2scm ("solo2-event"));
- event->send_to_context (second_iter_->get_outlet ());
+ second_iter_->get_outlet ()->event_source ()->broadcast (event);
playing_state_ = SOLO2;
}
}
@@ -297,7 +298,7 @@ Part_combine_iterator::apart (bool silent)
else
{
state_ = APART;
- substitute_both (one_.get_outlet (), two_.get_outlet ());
+ substitute_both (CONTEXT_ONE, CONTEXT_TWO);
}
}
@@ -306,56 +307,27 @@ Part_combine_iterator::construct_children ()
{
start_moment_ = get_outlet ()->now_mom ();
split_list_ = get_music ()->get_property ("split-list");
- SCM lst = get_music ()->get_property ("elements");
-
- SCM props = scm_list_n (/*
- used to have tweaks here.
- */
- SCM_UNDEFINED);
+ Context *c = get_outlet ();
- Context *tr
- = get_outlet ()->find_create_context (ly_symbol2scm ("Voice"),
- "shared", props);
-
- shared_.set_context (tr);
-
- /*
- If we don't, we get a new staff for every Voice.
- */
- set_context (tr);
-
- Context *solo_tr
- = get_outlet ()->find_create_context (ly_symbol2scm ("Voice"),
- "solo", props);
-
- solo_.set_context (solo_tr);
-
- Context *null
- = get_outlet ()->find_create_context (ly_symbol2scm ("Devnull"),
- "", SCM_EOL);
-
- if (!null)
- programming_error ("no Devnull found");
-
- null_.set_context (null);
-
- Context *one = tr->find_create_context (ly_symbol2scm ("Voice"),
- "one", props);
-
- one_.set_context (one);
+ for (int i = 0; i < NUM_OUTLETS; i++)
+ {
+ SCM type = (i == CONTEXT_NULL) ? ly_symbol2scm ("Devnull") : ly_symbol2scm ("Voice");
+ /* find context below c: otherwise we may create new staff for each voice */
+ c = c->find_create_context (type, outlet_names_[i], SCM_EOL);
+ handles_[i].set_context (c);
+ if (c->is_alias (ly_symbol2scm ("Voice")))
+ c->event_source ()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event"));
+ }
+ SCM lst = get_music ()->get_property ("elements");
+ Context *one = handles_[CONTEXT_ONE].get_outlet ();
set_context (one);
first_iter_ = unsmob_iterator (get_iterator (unsmob_music (scm_car (lst))));
-
- Context *two = tr->find_create_context (ly_symbol2scm ("Voice"),
- "two", props);
- two_.set_context (two);
+ Context *two = handles_[CONTEXT_TWO].get_outlet ();
set_context (two);
second_iter_ = unsmob_iterator (get_iterator (unsmob_music (scm_cadr (lst))));
- set_context (tr);
-
char const *syms[]
= {
"Stem",
@@ -369,13 +341,6 @@ Part_combine_iterator::construct_children ()
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 ("OldMusicEvent"));
- }
-
for (char const **p = syms; *p; p++)
{
SCM sym = ly_symbol2scm (*p);
@@ -395,11 +360,8 @@ Part_combine_iterator::set_busy (SCM se)
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"))
+ if (e->in_event_class ("note-event") || e->in_event_class ("cluster-note-event"))
busy_ = true;
}
diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc
index a27eef826b..57357cb559 100644
--- a/lily/percent-repeat-engraver.cc
+++ b/lily/percent-repeat-engraver.cc
@@ -78,26 +78,31 @@ Percent_repeat_engraver::listen_percent (Stream_event *ev)
Moment body_length = get_event_length (ev);
Moment meas_len (robust_scm2moment (get_property ("measureLength"),
Moment (1)));
-
if (meas_len == body_length)
- {
- repeat_sign_type_ = MEASURE;
- start_mom_ = now_mom ();
- stop_mom_ = now_mom () + body_length;
- get_global_context ()->add_moment_to_process (stop_mom_);
- }
+ {
+ repeat_sign_type_ = MEASURE;
+ start_mom_ = now_mom ();
+ stop_mom_ = now_mom () + body_length;
+ get_global_context ()->add_moment_to_process (stop_mom_);
+ }
else if (Moment (2) * meas_len == body_length)
- {
- repeat_sign_type_ = DOUBLE_MEASURE;
- start_mom_ = now_mom () + meas_len;
- stop_mom_ = now_mom () + body_length; /* never used */
- get_global_context ()->add_moment_to_process (start_mom_);
- }
+ {
+ repeat_sign_type_ = DOUBLE_MEASURE;
+ start_mom_ = now_mom () + meas_len;
+ stop_mom_ = now_mom () + body_length; /* never used */
+ get_global_context ()->add_moment_to_process (start_mom_);
+ }
else
- return;
-
+ {
+ ev->origin ()->warning (_ ("Junking percent repeat event: Duration must be exactly one or two measures"));
+ return;
+ }
percent_event_ = ev;
}
+ else
+ /* print a warning: no assignment happens because
+ percent_event_ != 0 */
+ ASSIGN_EVENT_ONCE (percent_event_, ev);
}
void
diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc
index d9c6e3e039..bb93668ca9 100644
--- a/lily/phrasing-slur-engraver.cc
+++ b/lily/phrasing-slur-engraver.cc
@@ -66,9 +66,9 @@ Phrasing_slur_engraver::listen_phrasing_slur (Stream_event *ev)
*/
Direction d = to_dir (ev->get_property ("span-direction"));
if (d == START)
- events_[START] = ev;
+ ASSIGN_EVENT_ONCE (events_[START], ev);
else if (d == STOP && !slurs_.empty ())
- events_[STOP] = ev;
+ ASSIGN_EVENT_ONCE (events_[STOP], ev);
}
void
diff --git a/lily/piano-pedal-engraver.cc b/lily/piano-pedal-engraver.cc
index 90844c6d24..c8a44bd4e4 100644
--- a/lily/piano-pedal-engraver.cc
+++ b/lily/piano-pedal-engraver.cc
@@ -225,26 +225,26 @@ Piano_pedal_engraver::acknowledge_note_column (Grob_info info)
IMPLEMENT_TRANSLATOR_LISTENER (Piano_pedal_engraver, sostenuto);
void
-Piano_pedal_engraver::listen_sostenuto (Stream_event *r)
+Piano_pedal_engraver::listen_sostenuto (Stream_event *ev)
{
- Direction d = to_dir (r->get_property ("span-direction"));
- info_list_[SOSTENUTO].event_drul_[d] = r;
+ Direction d = to_dir (ev->get_property ("span-direction"));
+ ASSIGN_EVENT_ONCE (info_list_[SOSTENUTO].event_drul_[d], ev);
}
IMPLEMENT_TRANSLATOR_LISTENER (Piano_pedal_engraver, sustain);
void
-Piano_pedal_engraver::listen_sustain (Stream_event *r)
+Piano_pedal_engraver::listen_sustain (Stream_event *ev)
{
- Direction d = to_dir (r->get_property ("span-direction"));
- info_list_[SUSTAIN].event_drul_[d] = r;
+ Direction d = to_dir (ev->get_property ("span-direction"));
+ ASSIGN_EVENT_ONCE (info_list_[SUSTAIN].event_drul_[d], ev);
}
IMPLEMENT_TRANSLATOR_LISTENER (Piano_pedal_engraver, una_corda);
void
-Piano_pedal_engraver::listen_una_corda (Stream_event *r)
+Piano_pedal_engraver::listen_una_corda (Stream_event *ev)
{
- Direction d = to_dir (r->get_property ("span-direction"));
- info_list_[UNA_CORDA].event_drul_[d] = r;
+ Direction d = to_dir (ev->get_property ("span-direction"));
+ ASSIGN_EVENT_ONCE (info_list_[UNA_CORDA].event_drul_[d], ev);
}
void
diff --git a/lily/pitched-trill-engraver.cc b/lily/pitched-trill-engraver.cc
index b514dfd101..5044552a52 100644
--- a/lily/pitched-trill-engraver.cc
+++ b/lily/pitched-trill-engraver.cc
@@ -8,14 +8,15 @@
#include "engraver.hh"
-#include "dots.hh"
-#include "pointer-group-interface.hh"
#include "axis-group-interface.hh"
#include "context.hh"
-#include "note-head.hh"
+#include "dots.hh"
#include "item.hh"
-#include "side-position-interface.hh"
+#include "note-head.hh"
#include "pitch.hh"
+#include "pointer-group-interface.hh"
+#include "side-position-interface.hh"
+#include "stream-event.hh"
#include "warn.hh"
class Pitched_trill_engraver : public Engraver
@@ -37,7 +38,7 @@ private:
vector<Grob*> heads_;
- void make_trill (Music *);
+ void make_trill (Stream_event *);
};
Pitched_trill_engraver::Pitched_trill_engraver ()
@@ -61,18 +62,18 @@ Pitched_trill_engraver::acknowledge_note_head (Grob_info info)
void
Pitched_trill_engraver::acknowledge_text_spanner (Grob_info info)
{
- Music *mus = info.music_cause ();
- if (mus
- && mus->is_mus_type ("trill-span-event")
- && to_dir (mus->get_property ("span-direction")) == START
- && unsmob_pitch (mus->get_property ("pitch")))
- make_trill (mus);
+ Stream_event *ev = info.event_cause ();
+ if (ev
+ && ev->in_event_class ("trill-span-event")
+ && to_dir (ev->get_property ("span-direction")) == START
+ && unsmob_pitch (ev->get_property ("pitch")))
+ make_trill (ev);
}
void
-Pitched_trill_engraver::make_trill (Music *mus)
+Pitched_trill_engraver::make_trill (Stream_event *ev)
{
- SCM scm_pitch = mus->get_property ("pitch");
+ SCM scm_pitch = ev->get_property ("pitch");
Pitch *p = unsmob_pitch (scm_pitch);
SCM keysig = get_property ("localKeySignature");
@@ -90,7 +91,7 @@ Pitched_trill_engraver::make_trill (Music *mus)
trill_head_ = 0;
}
- trill_head_ = make_item ("TrillPitchHead", mus->self_scm ());
+ trill_head_ = make_item ("TrillPitchHead", ev->self_scm ());
SCM c0scm = get_property ("middleCPosition");
int c0 = scm_is_number (c0scm) ? scm_to_int (c0scm) : 0;
@@ -99,14 +100,14 @@ Pitched_trill_engraver::make_trill (Music *mus)
scm_from_int (unsmob_pitch (scm_pitch)->steps ()
+ c0));
- trill_group_ = make_item ("TrillPitchGroup", mus->self_scm ());
+ trill_group_ = make_item ("TrillPitchGroup", ev->self_scm ());
trill_group_->set_parent (trill_head_, Y_AXIS);
Axis_group_interface::add_element (trill_group_, trill_head_);
if (print_acc)
{
- trill_accidental_ = make_item ("TrillPitchAccidental", mus->self_scm ());
+ trill_accidental_ = make_item ("TrillPitchAccidental", ev->self_scm ());
// fixme: naming -> alterations
trill_accidental_->set_property ("accidentals", scm_list_1 (scm_from_int (p->get_alteration ())));
diff --git a/lily/recording-group-engraver.cc b/lily/recording-group-engraver.cc
index e230316d8f..896ad6f694 100644
--- a/lily/recording-group-engraver.cc
+++ b/lily/recording-group-engraver.cc
@@ -4,10 +4,13 @@
source file of the GNU LilyPond music typesetter
(c) 2003--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+TODO: junk this file
*/
#include "recording-group-engraver.hh"
#include "context.hh"
+#include "music.hh"
/*
TODO: Junk this class, extract events directly instead.
@@ -54,7 +57,7 @@ Recording_group_engraver::finalize ()
bool
Recording_group_engraver::try_music (Music *m)
{
- bool retval = Translator_group::try_music (m);
+ bool retval = true;//Translator_group::try_music (m);
add_music (m->self_scm (), ly_bool2scm (retval));
return retval;
diff --git a/lily/relocate.cc b/lily/relocate.cc
index d7f7888c4a..ac4c31bac4 100644
--- a/lily/relocate.cc
+++ b/lily/relocate.cc
@@ -385,7 +385,7 @@ read_relocation_file (string filename)
else if (command == "prependdir")
prepend_env_path (variable.c_str (), value);
else
- error ( _f("Unknown relocation command %s", command));
+ error (_f ("Unknown relocation command %s", command));
}
fclose (f);
diff --git a/lily/repeat-tie-engraver.cc b/lily/repeat-tie-engraver.cc
index c9e8c9c208..c793449dda 100644
--- a/lily/repeat-tie-engraver.cc
+++ b/lily/repeat-tie-engraver.cc
@@ -47,7 +47,7 @@ IMPLEMENT_TRANSLATOR_LISTENER (Repeat_tie_engraver, repeat_tie);
void
Repeat_tie_engraver::listen_repeat_tie (Stream_event *ev)
{
- event_ = ev;
+ ASSIGN_EVENT_ONCE (event_, ev);
}
void
diff --git a/lily/rest-engraver.cc b/lily/rest-engraver.cc
index b59acf73f4..95a8d10126 100644
--- a/lily/rest-engraver.cc
+++ b/lily/rest-engraver.cc
@@ -11,6 +11,7 @@
#include "dots.hh"
#include "duration.hh"
#include "item.hh"
+#include "pitch.hh"
#include "rhythmic-head.hh"
#include "staff-symbol-referencer.hh"
#include "stream-event.hh"
diff --git a/lily/slash-repeat-engraver.cc b/lily/slash-repeat-engraver.cc
index 18d5312311..37595526c5 100644
--- a/lily/slash-repeat-engraver.cc
+++ b/lily/slash-repeat-engraver.cc
@@ -8,6 +8,7 @@
#include "bar-line.hh"
#include "global-context.hh"
+#include "international.hh"
#include "item.hh"
#include "misc.hh"
#include "percent-repeat-iterator.hh"
@@ -48,7 +49,9 @@ Slash_repeat_engraver::listen_percent (Stream_event *ev)
= robust_scm2moment (get_property ("measureLength"), Moment (0));
if (get_event_length (ev) < meas_length)
- slash_ = ev;
+ ASSIGN_EVENT_ONCE (slash_, ev);
+ else
+ ev->origin ()->warning (_ ("Slash repeat doesn't fit in one measure, junking"));
}
void
diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc
index fb7a9e67c6..3ee546c3bf 100644
--- a/lily/slur-engraver.cc
+++ b/lily/slur-engraver.cc
@@ -63,9 +63,10 @@ Slur_engraver::listen_slur (Stream_event *ev)
{
Direction d = to_dir (ev->get_property ("span-direction"));
if (d == START)
- events_[START] = ev;
+ ASSIGN_EVENT_ONCE (events_[START], ev);
else if (d == STOP)
- events_[STOP] = ev;
+ ASSIGN_EVENT_ONCE (events_[STOP], ev);
+ else ev->origin ()->warning (_ ("Invalid direction of slur-event"));
}
void
diff --git a/lily/spacing-engraver.cc b/lily/spacing-engraver.cc
index a77fb9b593..914c672ccd 100644
--- a/lily/spacing-engraver.cc
+++ b/lily/spacing-engraver.cc
@@ -7,6 +7,7 @@
*/
#include "engraver.hh"
+#include "moment.hh"
#include "note-spacing.hh"
#include "paper-column.hh"
#include "pointer-group-interface.hh"
@@ -89,7 +90,7 @@ IMPLEMENT_TRANSLATOR_LISTENER (Spacing_engraver, spacing_section);
void
Spacing_engraver::listen_spacing_section (Stream_event *ev)
{
- start_section_ = ev;
+ ASSIGN_EVENT_ONCE (start_section_, ev);
}
void
diff --git a/lily/staff-symbol-engraver.cc b/lily/staff-symbol-engraver.cc
index d4e57955fc..242e06e46a 100644
--- a/lily/staff-symbol-engraver.cc
+++ b/lily/staff-symbol-engraver.cc
@@ -57,7 +57,7 @@ Staff_symbol_engraver::listen_staff_span (Stream_event *ev)
{
Direction d = to_dir (ev->get_property ("span-direction"));
if (d)
- span_events_[d] = ev;
+ ASSIGN_EVENT_ONCE (span_events_[d], ev);
else
programming_error (_ ("staff-span event has no direction"));
}
diff --git a/lily/stem-engraver.cc b/lily/stem-engraver.cc
index 6a69aaa649..6ca9368d86 100644
--- a/lily/stem-engraver.cc
+++ b/lily/stem-engraver.cc
@@ -166,7 +166,7 @@ IMPLEMENT_TRANSLATOR_LISTENER (Stem_engraver, tremolo);
void
Stem_engraver::listen_tremolo (Stream_event *ev)
{
- tremolo_ev_ = ev;
+ ASSIGN_EVENT_ONCE (tremolo_ev_, ev);
}
ADD_ACKNOWLEDGER (Stem_engraver, rhythmic_head);
diff --git a/lily/stream-event-scheme.cc b/lily/stream-event-scheme.cc
index ce337d5472..ea93654961 100644
--- a/lily/stream-event-scheme.cc
+++ b/lily/stream-event-scheme.cc
@@ -9,11 +9,17 @@
#include "stream-event.hh"
LY_DEFINE (ly_make_stream_event, "ly:make-stream-event",
- 1, 0, 0, (SCM proplist),
- "Creates a stream event, with the given property list.\n" )
+ 1, 1, 0, (SCM cl, SCM proplist),
+ "Creates a stream event of class @var{cl} with the given mutable property list.\n" )
{
- SCM_ASSERT_TYPE (scm_list_p (proplist), proplist, SCM_ARG1, __FUNCTION__, "association list");
- Stream_event *e = new Stream_event (proplist);
+ SCM_ASSERT_TYPE (scm_is_symbol (cl), cl, SCM_ARG1, __FUNCTION__, "symbol");
+ if (proplist != SCM_UNDEFINED)
+ {
+ SCM_ASSERT_TYPE (scm_list_p (proplist), proplist, SCM_ARG2, __FUNCTION__, "association list");
+ }
+ else
+ proplist = SCM_EOL;
+ Stream_event *e = new Stream_event (cl, proplist);
return e->unprotect ();
}
@@ -28,3 +34,11 @@ LY_DEFINE (ly_event_property, "ly:event-property",
return e->internal_get_property (sym);
}
+
+LY_DEFINE (ly_event_set_property, "ly:event-set-property!",
+ 3, 0, 0, (SCM ev, SCM sym, SCM val),
+ "Set property @var{sym} in event @var{ev} to @var{val}."){
+ Stream_event *sc = unsmob_stream_event (ev);
+ SCM_ASSERT_TYPE (sc, ev, SCM_ARG1, __FUNCTION__, "event");
+ return ly_prob_set_property_x (ev, sym, val);
+}
diff --git a/lily/stream-event.cc b/lily/stream-event.cc
index 7a1118e65a..ff736d8832 100644
--- a/lily/stream-event.cc
+++ b/lily/stream-event.cc
@@ -27,12 +27,6 @@ Stream_event::Stream_event (SCM event_class, SCM mutable_props)
mutable_property_alist_ = mutable_props;
}
-Stream_event::Stream_event (SCM property_alist)
- : Prob (ly_symbol2scm ("Stream_event"), SCM_EOL)
-{
- mutable_property_alist_ = property_alist;
-}
-
Stream_event::Stream_event (SCM class_name, Input *origin)
: Prob (ly_symbol2scm ("Stream_event"),
scm_list_1 (scm_cons (ly_symbol2scm ("class"), class_name)))
diff --git a/lily/tab-note-heads-engraver.cc b/lily/tab-note-heads-engraver.cc
index 1ddabdd697..d30c2265c7 100644
--- a/lily/tab-note-heads-engraver.cc
+++ b/lily/tab-note-heads-engraver.cc
@@ -14,8 +14,8 @@ using namespace std;
#include "dots.hh"
#include "duration.hh"
#include "item.hh"
-#include "music.hh"
#include "output-def.hh"
+#include "pitch.hh"
#include "rhythmic-head.hh"
#include "score-engraver.hh"
#include "staff-symbol-referencer.hh"
@@ -81,10 +81,10 @@ Tab_note_heads_engraver::process_music ()
for (SCM s = event->get_property ("articulations");
!tabstring_event && scm_is_pair (s); s = scm_cdr (s))
{
- Music *art = unsmob_music (scm_car (s));
+ Stream_event *art = unsmob_stream_event (scm_car (s));
- if (art->is_mus_type ("string-number-event"))
- tabstring_event = art->to_event ();
+ if (art->in_event_class ("string-number-event"))
+ tabstring_event = art;
}
if (!tabstring_event && j < tabstring_events_.size ())
@@ -163,7 +163,7 @@ Tab_note_heads_engraver::stop_translation_timestep ()
}
ADD_TRANSLATOR (Tab_note_heads_engraver,
- /* doc */ "Generate one or more tablature noteheads from Music of type NoteEvent.",
+ /* doc */ "Generate one or more tablature noteheads from event of type NoteEvent.",
/* create */ "TabNoteHead Dots",
/* accept */ "note-event string-number-event",
/* read */ "middleCPosition stringTunings minimumFret tablatureFormat highStringOne stringOneTopmost",
diff --git a/lily/text-spanner-engraver.cc b/lily/text-spanner-engraver.cc
index b7628c325c..b10832f1b3 100644
--- a/lily/text-spanner-engraver.cc
+++ b/lily/text-spanner-engraver.cc
@@ -48,7 +48,7 @@ void
Text_spanner_engraver::listen_text_span (Stream_event *ev)
{
Direction d = to_dir (ev->get_property ("span-direction"));
- event_drul_[d] = ev;
+ ASSIGN_EVENT_ONCE (event_drul_[d], ev);
}
void
@@ -137,7 +137,7 @@ Text_spanner_engraver::finalize ()
ADD_ACKNOWLEDGER (Text_spanner_engraver, note_column);
ADD_TRANSLATOR (Text_spanner_engraver,
- /* doc */ "Create text spanner from a Music.",
+ /* doc */ "Create text spanner from an event.",
/* create */ "TextSpanner",
/* accept */ "text-span-event",
/* read */ "",
diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc
index 9547d14025..1dfb42fa52 100644
--- a/lily/tie-engraver.cc
+++ b/lily/tie-engraver.cc
@@ -38,7 +38,7 @@ struct Head_event_tuple
Moment end_moment_;
SCM tie_definition_;
Stream_event *tie_stream_event_;
- Music *tie_event_;
+ Stream_event *tie_event_;
Head_event_tuple ()
{
@@ -88,7 +88,7 @@ IMPLEMENT_TRANSLATOR_LISTENER (Tie_engraver, tie);
void
Tie_engraver::listen_tie (Stream_event *ev)
{
- event_ = ev;
+ ASSIGN_EVENT_ONCE (event_, ev);
}
void
@@ -198,18 +198,18 @@ Tie_engraver::stop_translation_timestep ()
SCM left_articulations = left_ev->get_property ("articulations");
- Music *tie_event = 0;
+ Stream_event *tie_event = 0;
Stream_event *tie_stream_event = event_;
for (SCM s = left_articulations;
!tie_event && !tie_stream_event && scm_is_pair (s);
s = scm_cdr (s))
{
- Music *m = unsmob_music (scm_car (s));
- if (!m)
+ Stream_event *ev = unsmob_stream_event (scm_car (s));
+ if (!ev)
continue;
- if (m->is_mus_type ("tie-event"))
- tie_event = m;
+ if (ev->in_event_class ("tie-event"))
+ tie_event = ev;
}
if (left_ev && (tie_event || tie_stream_event))
diff --git a/lily/translator-group.cc b/lily/translator-group.cc
index badd1b82e8..da3fda5ed5 100644
--- a/lily/translator-group.cc
+++ b/lily/translator-group.cc
@@ -51,8 +51,6 @@ Translator_group::connect_to_context (Context *c)
}
context_ = c;
- c->event_source ()->add_listener (GET_LISTENER (eat_event),
- ly_symbol2scm ("OldMusicEvent"));
c->event_source ()->add_listener (GET_LISTENER (create_child_translator),
ly_symbol2scm ("AnnounceNewContext"));
for (SCM tr_list = simple_trans_list_; scm_is_pair (tr_list); tr_list = scm_cdr (tr_list))
@@ -70,8 +68,6 @@ Translator_group::disconnect_from_context ()
Translator *tr = unsmob_translator (scm_car (tr_list));
tr->disconnect_from_context (context_);
}
- context_->event_source ()->remove_listener (GET_LISTENER (eat_event),
- ly_symbol2scm ("OldMusicEvent"));
context_->event_source ()->remove_listener (GET_LISTENER (create_child_translator),
ly_symbol2scm ("AnnounceNewContext"));
context_ = 0;
@@ -83,33 +79,6 @@ Translator_group::finalize ()
{
}
-bool
-translator_accepts_any_of (Translator *tr, SCM ifaces)
-{
- SCM ack_ifs = scm_assoc (ly_symbol2scm ("events-accepted"),
- tr->translator_description ());
- ack_ifs = scm_cdr (ack_ifs);
- for (SCM s = ifaces; scm_is_pair (s); s = scm_cdr (s))
- if (scm_c_memq (scm_car (s), ack_ifs) != SCM_BOOL_F)
- return true;
- return false;
-}
-
-SCM
-find_accept_translators (SCM gravlist, SCM ifaces)
-{
- SCM l = SCM_EOL;
- for (SCM s = gravlist; scm_is_pair (s); s = scm_cdr (s))
- {
- Translator *tr = unsmob_translator (scm_car (s));
- if (translator_accepts_any_of (tr, ifaces))
- l = scm_cons (tr->self_scm (), l);
- }
- l = scm_reverse_x (l, SCM_EOL);
-
- return l;
-}
-
SCM
filter_performers (SCM ell)
{
@@ -221,56 +190,6 @@ Translator_group::create_child_translator (SCM sev)
DOWN);
}
-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)
-{
- SCM name = scm_sloppy_assq (ly_symbol2scm ("name"),
- m->get_property_alist (false));
-
- if (!scm_is_pair (name))
- return false;
-
- name = scm_cdr (name);
- SCM accept_list = scm_hashq_ref (accept_hash_table_, name, SCM_UNDEFINED);
- if (accept_list == SCM_BOOL_F)
- {
- accept_list = find_accept_translators (get_simple_trans_list (),
- m->get_property ("types"));
- scm_hashq_set_x (accept_hash_table_, name, accept_list);
- }
-
- for (SCM p = accept_list; scm_is_pair (p); p = scm_cdr (p))
- {
- Translator *t = unsmob_translator (scm_car (p));
- if (t && t->try_music (m))
- return true;
- }
-
- // We couldn't swallow the event in this context. Try parent.
- Context *p = context ()->get_parent_context ();
- // Global context's translator group is a dummy, so don't try it.
- if (p->get_parent_context())
- // ES todo: Make Translators listeners directly instead.
- return p->implementation ()->try_music (m);
- // 'junking event' warning is temporarily disabled during translator cleanup
- /*
- else
- // We have tried all possible contexts. Give up.
- m->origin ()->warning (_f ("junking event: `%s'", m->name ()));
- */
- return false;
-}
-
SCM
Translator_group::get_simple_trans_list ()
{
@@ -328,12 +247,9 @@ recurse_over_translators (Context *c, Translator_method ptr, Translator_group_me
Translator_group::Translator_group ()
{
simple_trans_list_ = SCM_EOL;
- accept_hash_table_ = SCM_EOL;
protected_events_ = SCM_EOL;
context_ = 0;
smobify_self ();
-
- accept_hash_table_ = scm_c_make_hash_table (19);
}
void
@@ -410,7 +326,6 @@ Translator_group::mark_smob (SCM smob)
Translator_group *me = (Translator_group *)SCM_CELL_WORD_1 (smob);
me->derived_mark ();
- scm_gc_mark (me->accept_hash_table_);
scm_gc_mark (me->protected_events_);
return me->simple_trans_list_;
}
diff --git a/lily/translator.cc b/lily/translator.cc
index ec2b0f64a4..c9c8d874fb 100644
--- a/lily/translator.cc
+++ b/lily/translator.cc
@@ -52,12 +52,6 @@ Translator::Translator (Translator const &src)
must_be_last_ = src.must_be_last_;
}
-bool
-Translator::try_music (Music *)
-{
- return false;
-}
-
Moment
Translator::now_mom () const
{
@@ -94,12 +88,9 @@ Translator::stop_translation_timestep ()
}
/*
- this function has 2 properties
-
- - It is called before try_music ()
-
- - It is called before any user information enters the translators.
- (i.e. any \property or event is not processed yet.)
+ this function is called once each moment, before any user
+ information enters the translators. (i.e. no \property or event has
+ been processed yet.)
*/
void
Translator::start_translation_timestep ()
@@ -293,16 +284,17 @@ internal_event_assignment (Stream_event **old_ev, Stream_event *new_ev, const ch
{
/* extract event class from function name */
const char *prefix = "listen_";
- assert (!strncmp (function, "listen_", strlen (prefix)));
- function += strlen (prefix);
- char ev_class[strlen (function) + 1];
- strcpy (ev_class, function);
- for (char *c = ev_class; *c; c++)
- if (*c == '_')
- *c = '-';
-
- new_ev->origin ()->warning (_f ("Two simultaneous %s events, junking this one", ev_class));
- (*old_ev)->origin ()->warning (_f ("Previous %s event here", ev_class));
+ string ev_class = function;
+ /* This assertion fails if EVENT_ASSIGNMENT was called outside a
+ translator listener. Don't do that. */
+ assert (0 == ev_class.find (prefix));
+
+ /* "listen_foo_bar" -> "foo-bar" */
+ ev_class.erase (0, strlen(prefix));
+ replace_all (ev_class, '_', '-');
+
+ new_ev->origin ()->warning (_f ("Two simultaneous %s events, junking this one", ev_class.c_str ()));
+ (*old_ev)->origin ()->warning (_f ("Previous %s event here", ev_class.c_str ()));
return false;
}
else
diff --git a/lily/trill-spanner-engraver.cc b/lily/trill-spanner-engraver.cc
index 54d3daa96b..8770ab9cef 100644
--- a/lily/trill-spanner-engraver.cc
+++ b/lily/trill-spanner-engraver.cc
@@ -55,7 +55,7 @@ void
Trill_spanner_engraver::listen_trill_span (Stream_event *ev)
{
Direction d = to_dir (ev->get_property ("span-direction"));
- event_drul_[d] = ev;
+ ASSIGN_EVENT_ONCE (event_drul_[d], ev);
}
void
@@ -142,7 +142,7 @@ Trill_spanner_engraver::finalize ()
ADD_ACKNOWLEDGER (Trill_spanner_engraver, note_column);
ADD_TRANSLATOR (Trill_spanner_engraver,
- /* doc */ "Create trill spanner from a Music.",
+ /* doc */ "Create trill spanner from an event.",
/* create */ "TrillSpanner",
/* accept */ "trill-span-event",
/* read */ "",
diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc
index 3bd0948e48..7ac0e53322 100644
--- a/lily/tuplet-engraver.cc
+++ b/lily/tuplet-engraver.cc
@@ -6,12 +6,14 @@
(c) 1998--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
-#include "tuplet-bracket.hh"
-#include "note-column.hh"
#include "beam.hh"
#include "engraver.hh"
+#include "international.hh"
+#include "note-column.hh"
#include "spanner.hh"
#include "stream-event.hh"
+#include "tuplet-bracket.hh"
+#include "warn.hh"
#include "translator.icc"
@@ -61,11 +63,13 @@ Tuplet_engraver::listen_tuplet_span (Stream_event *ev)
d.event_ = ev;
tuplets_.push_back (d);
}
- if (dir == STOP && tuplets_.size ())
+ else if (dir == STOP && tuplets_.size ())
{
stopped_tuplets_.push_back (tuplets_.back ());
tuplets_.pop_back ();
}
+ else
+ programming_error (_ ("invalid direction of tuplet-span-event"));
}
void
diff --git a/lily/tweak-engraver.cc b/lily/tweak-engraver.cc
index 9843dce725..a851c5a8ef 100644
--- a/lily/tweak-engraver.cc
+++ b/lily/tweak-engraver.cc
@@ -9,8 +9,8 @@
#include "engraver.hh"
-#include "music.hh"
#include "grob.hh"
+#include "stream-event.hh"
#include "translator.icc"
class Tweak_engraver : public Engraver
@@ -28,9 +28,9 @@ Tweak_engraver::Tweak_engraver()
void
Tweak_engraver::acknowledge_grob (Grob_info info)
{
- if (Music *music = info.music_cause ())
+ if (Stream_event *ev = info.event_cause ())
{
- for (SCM s = music->get_property ("tweaks");
+ for (SCM s = ev->get_property ("tweaks");
scm_is_pair (s); s = scm_cdr (s))
{
info.grob ()->internal_set_property (scm_caar (s), scm_cdar (s));
@@ -40,7 +40,7 @@ Tweak_engraver::acknowledge_grob (Grob_info info)
ADD_ACKNOWLEDGER (Tweak_engraver, grob);
ADD_TRANSLATOR (Tweak_engraver,
- /* doc */ "Read the @code{tweaks} property from the originating Music event, and set properties." ,
+ /* doc */ "Read the @code{tweaks} property from the originating event, and set properties." ,
/* create */ "",
/* accept */ "",
diff --git a/scm/define-event-classes.scm b/scm/define-event-classes.scm
index 4050a388f7..808fcf716c 100644
--- a/scm/define-event-classes.scm
+++ b/scm/define-event-classes.scm
@@ -60,6 +60,10 @@
(define-public (ly:make-event-class leaf)
(hashq-ref ancestor-lookup leaf))
+(define-public (ly:in-event-class? ev cl)
+ "Does event @var{ev} belong to event class @var{cl}?"
+ (memq cl (ly:make-event-class (ly:event-property ev 'class))))
+
;; does this exist in guile already?
(define (map-tree f t)
(cond
@@ -128,7 +132,7 @@
((pair? e) (cons (simplify (car e))
(simplify (cdr e))))
((ly:stream-event? e)
- (list 'unquote `(make-stream-event ,(simplify (Stream_event::dump e)))))
+ (list 'unquote (list 'make-stream-event (simplify (Stream_event::dump e)))))
((ly:music? e)
(list 'unquote (music->make-music e)))
((ly:moment? e)
diff --git a/scm/define-music-types.scm b/scm/define-music-types.scm
index bfed38e04d..b3855c34db 100644
--- a/scm/define-music-types.scm
+++ b/scm/define-music-types.scm
@@ -8,8 +8,7 @@
;; TODO: should link back into user manual.
(define (mm-rest-child-list music)
- "Check if we have R1*4-\\markup { .. }, and if applicable convert to
-a property set for MultiMeasureRestNumber."
+ "Generate events for multimeasure rests, to be used by the sequential-iterator"
(let ((location (ly:music-property music 'origin))
(duration (ly:music-property music 'duration)))
(list (make-music 'BarCheck
diff --git a/scm/translation-functions.scm b/scm/translation-functions.scm
index 998d05e836..96a5c7ec27 100644
--- a/scm/translation-functions.scm
+++ b/scm/translation-functions.scm
@@ -60,9 +60,8 @@
;; Bass figures.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(define-public (format-bass-figure figure stream-event context)
- (let* ((event (ly:event-property stream-event 'music-cause ))
- (fig (ly:music-property event 'figure))
+(define-public (format-bass-figure figure event context)
+ (let* ((fig (ly:event-property event 'figure))
(fig-markup (if (number? figure)
;; this is not very elegant, but center-aligning all digits
@@ -73,12 +72,12 @@
(lambda (y) (make-translate-scaled-markup (cons -0.7 0) y))
identity)
- (if (eq? #t (ly:music-property event 'diminished))
+ (if (eq? #t (ly:event-property event 'diminished))
(markup #:slashed-digit figure)
(markup #:number (number->string figure 10))))
#f
))
- (alt (ly:music-property event 'alteration))
+ (alt (ly:event-property event 'alteration))
(alt-markup
(if (number? alt)
(markup
@@ -88,7 +87,7 @@
(alteration->text-accidental-markup alt))
#f))
- (plus-markup (if (eq? #t (ly:music-property event 'augmented))
+ (plus-markup (if (eq? #t (ly:event-property event 'augmented))
(markup #:number "+")
#f))