+2005-07-19 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ * lily/include/translator.icc: new file.
+
+ * lily/paper-column-engraver.cc (process_music): new
+ file. Separate Paper_column factory from Score_engraver.
+
+ * lily/vertically-spaced-context-engraver.cc: administer
+ spaceable-staves property of System.
+
+ * lily/translator-group-ctors.cc: new file.
+
+ * lily/context-property.cc (make_grob_from_properties): construct
+ the right Grob class programmatically, looking at the class entry
+ for the meta property.
+
+ * lily/break-align-engraver.cc (stop_translation_timestep): call
+ Break_align_interface::add_element() directly.
+
+ * lily/context.cc (measure_position): measure_position() is now a
+ normal function.
+
+ * lily/include/translator.hh (class Translator): rename
+ process_acknowledged_grobs() to process_acknowledged() and move to
+ Translator.
+
+ * scm/define-grobs.scm (all-grob-descriptions): add a 'class meta
+ field for each grob description.
+
+ * lily/include/translator-group.hh (class Translator_group):
+ change to base class. Separate class from Translator. This gets
+ rid of virtual inheritance for Engravers/Performers.
+
+ * lily/staff-performer.cc (class Staff_performer): derive
+ Staff_performer from Performer, not Performer_group_performer
+
+ * Lily/translator-group.cc (precomputed_recurse_over_translators):
+ new function.
+ (precompute_method_bindings): new function. Precompute lists of
+ Translators, so we only call methods (process_music,
+ start_translation_timestep, etc.) for Translators needing
+ it. Also: dispose of pointer-to-member-function calls.
+
+ * lily/engraver-group-engraver.cc: remove engraver_each,
+ recurse_down_engravers ()
+
+ * lily/note-head.cc (internal_print): only call
+ glyph-name-procedure if style != default. 3 % speed increase (wtk2-fugue1).
+
2005-07-16 Graham Percival <gperlist@shaw.ca>
* ly/titling-init.ly: add printallheaders option.
@end lilypond
Each staff can also have its own time signature. This is done by
-moving the @internalsref{Timing_engraver} to the @internalsref{Staff}
+moving the @internalsref{Timing_translator} to the @internalsref{Staff}
context.
@example
\layout @{
- \context @{ \Score \remove "Timing_engraver" @}
- \context @{ \Staff \consists "Timing_engraver" @}
+ \context @{ \Score
+ \remove "Timing_translator"
+ \remove "Default_bar_line_engraver"
+ @}
+ \context @{
+ \Staff
+ \consists "Timing_translator"
+ \consists "Default_bar_line_engraver"
+ @}
+
@}
@end example
@lilypond[quote,raggedright]
\layout{
- \context{ \Score \remove "Timing_engraver" }
- \context{ \Staff \consists "Timing_engraver" }
+ \context{
+ \Score
+ \remove "Timing_translator"
+ \remove "Default_bar_line_engraver"
+ }
+ \context{ \Staff
+ \consists "Timing_translator"
+ \consist "Default_bar_line_engraver"
+ }
}
\relative c' <<
@seealso
-Program reference: @internalsref{TimeSignature}, and @internalsref{Timing_engraver}.
+Program reference: @internalsref{TimeSignature}, and @internalsref{Timing_translator}.
@refbugs
The next example shows a practical application. Bar lines and time
signatures are normally synchronized across the score. This is done
-by the @code{Timing_engraver}. This plug-in keeps an administration of
-time signature, location within the measure, etc. By moving the
-@code{Timing_engraver} engraver from @code{Score} to @code{Staff}
-context, we can have a score where each staff has its own time
-signature.
+by the @code{Timing_translator} and @code{Default_bar_line_engraver}.
+This plug-in keeps an administration of time signature, location
+within the measure, etc. By moving thes engraver from @code{Score} to
+@code{Staff} context, we can have a score where each staff has its own
+time signature.
@cindex polymetric scores
@cindex Time signatures, multiple
@lilypond[quote,relative=1,raggedright,verbatim,fragment]
\new Score \with {
- \remove "Timing_engraver"
+ \remove "Timing_translator"
+ \remove "Default_bar_line_engraver"
} <<
\new Staff \with {
- \consists "Timing_engraver"
+ \consists "Timing_translator"
+ \consists "Default_bar_line_engraver"
} {
\time 3/4
c4 c c c c c
}
\new Staff \with {
- \consists "Timing_engraver"
+ \consists "Timing_translator"
+ \consists "Default_bar_line_engraver"
} {
\time 2/4
c4 c c c c c
#include "music.hh"
#include "pitch.hh"
+#include "translator.icc"
+
class Accidental_entry
{
public:
protected:
TRANSLATOR_DECLARATIONS (Accidental_engraver);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void initialize ();
- virtual void process_acknowledged_grobs ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
virtual void finalize ();
virtual void derived_mark () const;
}
void
-Accidental_engraver::process_acknowledged_grobs ()
+Accidental_engraver::process_acknowledged ()
{
if (accidentals_.size () && !accidentals_.top ().done_)
{
#include "axis-group-interface.hh"
#include "side-position-interface.hh"
+#include "translator.icc"
+
class Ambitus_engraver : public Engraver
{
public:
TRANSLATOR_DECLARATIONS (Ambitus_engraver);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void finalize ();
virtual void derived_mark () const;
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Ambitus_engraver,
/* descr */ "",
/* creats*/ "Ambitus AmbitusLine AmbitusNoteHead AmbitusAccidental",
#include "side-position-interface.hh"
#include "note-column.hh"
+#include "translator.icc"
+
class Arpeggio_engraver : public Engraver
{
public:
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void process_music ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual bool try_music (Music *);
private:
Item *arpeggio_;
#include "context.hh"
#include "duration.hh"
+#include "translator.icc"
+
class Auto_beam_engraver : public Engraver
{
TRANSLATOR_DECLARATIONS (Auto_beam_engraver);
protected:
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual bool try_music (Music *);
virtual void finalize ();
virtual void acknowledge_grob (Grob_info);
- virtual void process_acknowledged_grobs ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
private:
bool test_moment (Direction, Moment);
}
void
-Auto_beam_engraver::process_acknowledged_grobs ()
+Auto_beam_engraver::process_acknowledged ()
{
if (extend_mom_ > now_mom ())
return ;
#include "axis-group-engraver.hh"
#include "spanner.hh"
-#include "paper-column.hh"
#include "axis-group-interface.hh"
-#include "engraver-group-engraver.hh"
#include "warn.hh"
#include "context.hh"
+#include "translator.icc"
+
Axis_group_engraver::Axis_group_engraver ()
{
must_be_last_ = true;
cyclic parent relationship if we have two Axis_group_engravers in
the context. */
void
-Axis_group_engraver::process_acknowledged_grobs ()
+Axis_group_engraver::process_acknowledged ()
{
if (!staffline_)
return;
#include "axis-group-interface.hh"
+#include "pointer-group-interface.hh"
#include "grob.hh"
#include "hara-kiri-group-spanner.hh"
#include "warn.hh"
#include "warn.hh"
#include "item.hh"
+#include "translator.icc"
+
/*
generate bars. Either user ("|:"), or default (new measure)
*/
protected:
virtual void finalize ();
- virtual void stop_translation_timestep ();
- virtual void process_acknowledged_grobs ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
private:
void typeset_bar ();
This is a little hairy : whichBar may be set by
Repeat_acknowledge_engraver::process_music, which is at score
context. This means that grobs could should be created after
- process_music. We do stuff process_acknowledged_grobs (), just to be
+ process_music. We do stuff process_acknowledged (), just to be
on the safe side.
*/
void
-Bar_engraver::process_acknowledged_grobs ()
+Bar_engraver::process_acknowledged ()
{
if (!bar_ && scm_is_string (get_property ("whichBar")))
create_bar ();
#include "context.hh"
#include "grob-array.hh"
+#include "translator.icc"
+
/*
TODO: detect the top staff (stavesFound), and acknowledge staff-group
system-start-delims. If we find these, and the top staff is in the
protected:
Item *text_;
protected:
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void acknowledge_grob (Grob_info);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
void create_items ();
TRANSLATOR_DECLARATIONS (Bar_number_engraver);
};
#include "context.hh"
#include "duration.hh"
+#include "translator.icc"
+
class Beam_engraver : public Engraver
{
protected:
void set_melisma (bool);
Moment last_stem_added_at_;
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
virtual void finalize ();
virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music *);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual bool valid_start_point ();
virtual bool valid_end_point ();
#include "warn.hh"
#include "music.hh"
+#include "translator.icc"
+
class Beam_performer : public Performer
{
public:
protected:
virtual bool try_music (Music *ev);
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
void set_melisma (bool);
private:
Music *start_ev_;
#include "context.hh"
#include "translator-group.hh"
+#include "translator.icc"
+
class Break_align_engraver : public Engraver
{
Item *align_;
void add_to_group (SCM, Item *);
protected:
virtual void acknowledge_grob (Grob_info i);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void derived_mark () const;
- void add_column (SCM);
-
public:
TRANSLATOR_DECLARATIONS (Break_align_engraver);
};
-void
-Break_align_engraver::add_column (SCM smob)
-{
- Grob *e = unsmob_grob (smob);
- Break_align_interface::add_element (align_, e);
-}
-
void
Break_align_engraver::stop_translation_timestep ()
{
- for (SCM p = column_alist_; scm_is_pair (p); p = scm_cdr (p))
- {
- SCM pair = scm_car (p);
- add_column (scm_cdr (pair));
- }
column_alist_ = SCM_EOL;
align_ = 0;
align_ = make_item ("BreakAlignment", SCM_EOL);
Context *origin = inf.origin_contexts (this)[0];
- left_edge_ = make_item_from_properties (dynamic_cast<Engraver *>
- (origin->implementation ()),
+
+ Translator_group *tg = origin ->implementation ();
+ Engraver *random_source = dynamic_cast<Engraver*> (unsmob_translator (scm_car (tg->get_simple_trans_list ())));
+
+ /*
+ Make left edge appear to come from same context as clef/bar-line etc.
+ */
+ left_edge_ = make_item_from_properties (random_source,
ly_symbol2scm ("LeftEdge"),
SCM_EOL,
"LeftEdge");
group->set_parent (align_, Y_AXIS);
column_alist_ = scm_assoc_set_x (column_alist_, align_name, group->self_scm ());
+
+ Break_align_interface::add_element (align_, group);
}
Axis_group_interface::add_element (group, item);
}
#include <math.h>
#include "break-align-interface.hh"
-#include "libc-extension.hh" // isinf
+#include "libc-extension.hh" // isinf
+#include "pointer-group-interface.hh"
#include "self-alignment-interface.hh"
#include "side-position-interface.hh"
#include "axis-group-interface.hh"
protected:
virtual bool try_music (Music *req);
- virtual void process_acknowledged_grobs ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
private:
Music *breathing_sign_req_;
}
void
-Breathing_sign_engraver::process_acknowledged_grobs ()
+Breathing_sign_engraver::process_acknowledged ()
{
if (breathing_sign_req_ && ! breathing_sign_)
{
breathing_sign_req_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Breathing_sign_engraver,
/* descr */ "",
/* creats*/ "BreathingSign",
{
TRANSLATOR_DECLARATIONS (Chord_name_engraver);
protected:
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual bool try_music (Music *);
virtual void finalize ();
virtual void derived_mark () const;
The READs description is not strictly accurate:
which properties are read depend on the chord naming function active.
*/
+#include "translator.icc"
+
ADD_TRANSLATOR (Chord_name_engraver,
/* descr */ "Catch note-events "
"and generate the appropriate chordname.",
virtual void finalize ();
virtual bool try_music (Music *);
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
Chord_tremolo_engraver::Chord_tremolo_engraver ()
typeset_beam ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Chord_tremolo_engraver,
/* descr */ "Generates beams for tremolo repeats.",
/* creats*/ "Beam",
Direction octave_dir_;
protected:
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void acknowledge_grob (Grob_info);
private:
Item *clef_;
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Clef_engraver,
/* descr */ "Determine and set reference point for pitches",
/* creats*/ "Clef OctavateEight",
protected:
TRANSLATOR_DECLARATIONS (Cluster_spanner_engraver);
virtual bool try_music (Music *);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void finalize ();
private:
Link_array<Music> cluster_notes_;
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Cluster_spanner_engraver,
/* descr */ "Engraves a cluster using Spanner notation ",
/* creats*/ "ClusterSpanner ClusterSpannerBeacon",
collect_accidentals (ligature, primitives);
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Coherent_ligature_engraver,
/* descr */ "This is an abstract class. Subclasses such as Gregorian_ligature_engraver handle ligatures by glueing special ligature heads together.",
/* creats*/ "",
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void process_acknowledged_grobs ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
public:
TRANSLATOR_DECLARATIONS (Collision_engraver);
};
void
-Collision_engraver::process_acknowledged_grobs ()
+Collision_engraver::process_acknowledged ()
{
if (col_ || note_columns_.size () < 2)
return;
col_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Collision_engraver,
/* descr */ "Collect NoteColumns, and as soon as there are two or more, put them in a NoteCollision object.",
/* creats*/ "NoteCollision",
protected:
virtual void initialize ();
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
virtual bool try_music (Music *req);
- virtual void process_music ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
void
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Completion_heads_engraver,
/* descr */ "This engraver replaces "
"@code{Note_heads_engraver}. It plays some trickery to "
Context *
Context_def::instantiate (SCM ops, Object_key const *key)
{
- Context *tg = 0;
+ Context *context = 0;
if (context_name_ == ly_symbol2scm ("Score"))
- tg = new Score_context (key);
+ context = new Score_context (key);
else
- tg = new Context (key);
+ context = new Context (key);
- tg->definition_ = self_scm ();
+ context->definition_ = self_scm ();
SCM trans_names = get_translator_names (ops);
- Translator_group *g = dynamic_cast<Translator_group *>
- (get_translator (translator_group_type_));
- g = dynamic_cast<Translator_group *> (g->clone ());
-
+ Translator_group *g = get_translator_group (translator_group_type_);
SCM trans_list = SCM_EOL;
for (SCM s = trans_names; scm_is_pair (s); s = scm_cdr (s))
trans_list = scm_cons (str, trans_list);
}
- tr->daddy_context_ = tg;
+ tr->daddy_context_ = context;
scm_gc_unprotect_object (str);
}
}
g->simple_trans_list_ = trans_list;
- tg->implementation_ = g->self_scm ();
+ context->implementation_ = g->self_scm ();
if (dynamic_cast<Engraver *> (g))
g->simple_trans_list_ = filter_performers (g->simple_trans_list_);
else if (dynamic_cast<Performer *> (g))
g->simple_trans_list_ = filter_engravers (g->simple_trans_list_);
- g->daddy_context_ = tg;
- tg->aliases_ = context_aliases_;
+ g->context_ = context;
+ context->aliases_ = context_aliases_;
scm_gc_unprotect_object (g->self_scm ());
- tg->accepts_list_ = get_accepted (ops);
+ context->accepts_list_ = get_accepted (ops);
- return tg;
+ return context;
}
SCM
#include "main.hh"
#include "spanner.hh"
#include "warn.hh"
+#include "paper-column.hh"
/*
Grob descriptions (ie. alists with layout properties) are
}
}
-Item *
-make_item_from_properties (Engraver *tr, SCM x, SCM cause, const char *name)
+Grob *
+make_grob_from_properties (Engraver *tr, SCM symbol, SCM cause, const char *name)
{
Context *context = tr->context ();
- SCM props = updated_grob_properties (context, x);
+ SCM props = updated_grob_properties (context, symbol);
Object_key const *key = context->get_grob_key (name);
- Item *it = new Item (props, key);
-
- dynamic_cast<Engraver *> (tr)->announce_grob (it, cause);
+ Grob *grob = 0;
+
+ SCM handle = scm_sloppy_assq (ly_symbol2scm ("meta"), props);
+ SCM klass = scm_cdr (scm_sloppy_assq (ly_symbol2scm ("class"), scm_cdr (handle)));
+
+ if (klass == ly_symbol2scm ("Item"))
+ grob = new Item (props, key);
+ else if (klass == ly_symbol2scm ("Spanner"))
+ grob = new Spanner (props, key);
+ else if (klass == ly_symbol2scm ("Paper_column"))
+ grob = new Paper_column (props, key);
+
+ assert (grob);
+ dynamic_cast<Engraver *> (tr)->announce_grob (grob, cause);
+
+ return grob;
+}
+Item *
+make_item_from_properties (Engraver *tr, SCM x, SCM cause, const char *name)
+{
+ Item *it = dynamic_cast<Item*> (make_grob_from_properties (tr, x, cause, name));
+ assert (it);
return it;
}
-Spanner *
-make_spanner_from_properties (Engraver *tr, SCM x, SCM cause, const char *name)
+Paper_column *
+make_paper_column_from_properties (Engraver *tr, SCM x, const char *name)
{
- Context *context = tr->context ();
-
- SCM props = updated_grob_properties (context, x);
- Spanner *it = new Spanner (props, context->get_grob_key (name));
+ return dynamic_cast<Paper_column*> (make_grob_from_properties (tr, x, SCM_EOL, name));
+}
- dynamic_cast<Engraver *> (tr)->announce_grob (it, cause);
- return it;
+Spanner *
+make_spanner_from_properties (Engraver *tr, SCM x, SCM cause, const char *name)
+{
+ Spanner* sp = dynamic_cast<Spanner*> (make_grob_from_properties (tr, x, cause, name));
+ assert (sp);
+ return sp;
}
trg->check_removal ();
if (trg->is_removable ())
{
- recurse_over_translators (trg, &Translator::finalize, UP);
+ recurse_over_translators (trg, &Translator::finalize,
+ &Translator_group::finalize,
+ UP);
remove_context (trg);
}
}
operations require that we are in the hierarchy. */
td->apply_default_property_operations (t);
- recurse_over_translators (t, &Translator::initialize, DOWN);
+ recurse_over_translators (t,
+ &Translator::initialize,
+ &Translator_group::initialize,
+ DOWN);
}
}
scm_display (d->get_context_name (), port);
}
- if (Context *td = dynamic_cast<Context *> (sc))
+ if (!sc->id_string_.is_empty ())
{
scm_puts ("=", port);
- scm_puts (td->id_string_.to_str0 (), port);
+ scm_puts (sc->id_string_.to_str0 (), port);
}
scm_puts (" ", port);
bool
Context::try_music (Music *m)
{
- Translator *t = implementation ();
+ Translator_group *t = implementation ();
if (!t)
return false;
Translator_group *
Context::implementation () const
{
- return dynamic_cast<Translator_group *> (unsmob_translator (implementation_));
+ return dynamic_cast<Translator_group *> (unsmob_translator_group (implementation_));
}
void
unsmob_context (scm_car (s))->clear_key_disambiguations ();
}
}
+
+
+/*
+ Ugh. Where to put this?
+*/
+Rational
+measure_length (Context const *context)
+{
+ SCM l = context->get_property ("measureLength");
+ Rational length (1);
+ if (unsmob_moment (l))
+ length = unsmob_moment (l)->main_part_;
+ return length;
+}
+
+Moment
+measure_position (Context const *context)
+{
+ SCM sm = context->get_property ("measurePosition");
+
+ Moment m = 0;
+ if (unsmob_moment (sm))
+ {
+ m = *unsmob_moment (sm);
+
+ if (m.main_part_ < Rational (0))
+ {
+ Rational length (measure_length (context));
+ while (m.main_part_ < Rational (0))
+ m.main_part_ += length;
+ }
+ }
+
+ return m;
+}
{
public:
TRANSLATOR_DECLARATIONS (Custos_engraver);
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
virtual void acknowledge_grob (Grob_info);
- virtual void process_acknowledged_grobs ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void finalize ();
private:
}
void
-Custos_engraver::process_acknowledged_grobs ()
+Custos_engraver::process_acknowledged ()
{
if (scm_is_string (get_property ("whichBar")))
custos_permitted = true;
custodes_.clear ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Custos_engraver,
/* descr */ "",
/* creats*/ "Custos",
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
Dot_column_engraver::Dot_column_engraver ()
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Dot_column_engraver,
/* descr */ "Engraves dots on dotted notes shifted to the right of the note.\n"
"If omitted, then dots appear on top of the notes.",
#include "side-position-interface.hh"
#include "axis-group-interface.hh"
#include "stem.hh"
+#include "pointer-group-interface.hh"
/*
TODO: let Dot_column communicate with stem via Note_column.
protected:
virtual bool try_music (Music *ev);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
Drum_notes_engraver::Drum_notes_engraver ()
events_.clear ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Drum_notes_engraver,
/* descr */ "Generate noteheads.",
/* creats*/ "NoteHead Dots Script",
protected:
virtual bool try_music (Music *ev);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void create_audio_elements ();
private:
Link_array<Audio_note> notes_;
};
+
+Drum_note_performer::Drum_note_performer ()
+{
+}
+
void
Drum_note_performer::create_audio_elements ()
{
return false;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Drum_note_performer,
"Play drum notes.", "",
"note-event busy-playing-event", "", "", "");
-
-Drum_note_performer::Drum_note_performer ()
-{
-}
#include "staff-symbol-referencer.hh"
#include "warn.hh"
#include "self-alignment-interface.hh"
+#include "pointer-group-interface.hh"
/*
TODO:
virtual void finalize ();
virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music *req);
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
Dynamic_engraver::Dynamic_engraver ()
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Dynamic_engraver,
/* descr */
"This engraver creates hairpins, dynamic texts, and their vertical\n"
TRANSLATOR_DECLARATIONS (Dynamic_performer);
protected:
virtual bool try_music (Music *req);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void create_audio_elements ();
private:
return false;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Dynamic_performer,
/*descr*/ "",
/* creats*/ "",
Engraver_group_engraver::announce_grob (Grob_info info)
{
announce_infos_.push (info);
- get_daddy_engraver ()->announce_grob (info);
+
+ Engraver_group_engraver * dad_eng =
+ context_->get_parent_context ()
+ ? dynamic_cast<Engraver_group_engraver*> (context_->get_parent_context ()->implementation ())
+ : 0;
+ if (dad_eng)
+ dad_eng->announce_grob (info);
}
SCM find_acknowledge_engravers (SCM gravlist, SCM meta);
if (!announce_infos_.size ())
return;
- SCM tab = get_property ("acknowledgeHashTable");
+ SCM tab = context_->get_property ("acknowledgeHashTable");
SCM name_sym = ly_symbol2scm ("name");
SCM meta_sym = ly_symbol2scm ("meta");
SCM acklist = scm_hashq_ref (tab, nm, SCM_UNDEFINED);
if (acklist == SCM_BOOL_F)
{
- acklist = find_acknowledge_engravers (scm_cons (self_scm (), get_simple_trans_list ()), meta);
+ acklist = find_acknowledge_engravers (get_simple_trans_list (), meta);
scm_hashq_set_x (tab, nm, acklist);
}
Engraver_group_engraver::pending_grob_count () const
{
int count = announce_infos_.size ();
- for (SCM s = context ()->children_contexts ();
+ for (SCM s = context_->children_contexts ();
scm_is_pair (s); s = scm_cdr (s))
{
Context *c = unsmob_context (scm_car (s));
while (1)
{
- engraver_each (get_simple_trans_list (),
- &Engraver::process_acknowledged_grobs);
-
+ precomputed_translator_foreach (PROCESS_ACKNOWLEDGED);
if (announce_infos_.size () == 0)
break;
Translator_group::initialize ();
}
-Engraver_group_engraver::Engraver_group_engraver () {}
+Engraver_group_engraver::Engraver_group_engraver ()
+{
+}
-ADD_TRANSLATOR (Engraver_group_engraver,
- /* descr */ "A group of engravers taken together",
- /* creats*/ "",
- /* accepts */ "",
- /* acks */ "",
- /* reads */ "",
- /* write */ "");
+#include "translator.icc"
+
+ADD_TRANSLATOR_GROUP (Engraver_group_engraver,
+ /* descr */ "A group of engravers taken together",
+ /* creats*/ "",
+ /* accepts */ "",
+ /* acks */ "",
+ /* reads */ "",
+ /* write */ "");
-/*****************/
bool
engraver_valid (Translator *tr, SCM ifaces)
return l;
}
-
-/* c&p engraver-group.cc */
-void
-recurse_down_engravers (Context *c, Engraver_method ptr, bool context_first)
-{
- Engraver_group_engraver *tg
- = dynamic_cast<Engraver_group_engraver *> (c->implementation ());
-
- if (!context_first)
- {
- engraver_each (tg->get_simple_trans_list (),
- ptr);
-
- (tg->*ptr) ();
- }
-
- for (SCM s = c->children_contexts (); scm_is_pair (s);
- s = scm_cdr (s))
- {
- recurse_down_engravers (unsmob_context (scm_car (s)), ptr, context_first);
- }
-
- if (context_first)
- {
- engraver_each (tg->get_simple_trans_list (),
- ptr);
- (tg->*ptr) ();
- }
-}
-
-void
-engraver_each (SCM list, Engraver_method method)
-{
- for (SCM p = list; scm_is_pair (p); p = scm_cdr (p))
- {
- Engraver *e = dynamic_cast<Engraver *> (unsmob_translator (scm_car (p)));
- if (e)
- (e->*method) ();
- }
-}
Grob_info i (this, e);
- Engraver *g = get_daddy_engraver ();
+ Engraver_group_engraver *g = get_daddy_engraver ();
if (g)
g->announce_grob (i);
}
return dynamic_cast<Score_engraver *> (get_score_context ()->implementation ());
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Engraver,
"", "",
"",
virtual void acknowledge_grob (Grob_info);
virtual void finalize ();
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
Extender_engraver::Extender_engraver ()
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Extender_engraver,
/* descr */ "Create lyric extenders",
/* creats*/ "LyricExtender",
Grob *figure_;
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
Figured_bass_engraver::Figured_bass_engraver ()
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Figured_bass_engraver,
/* descr */ "Make figured bass numbers.",
/* creats*/ "BassFigure",
TRANSLATOR_DECLARATIONS (Fingering_engraver);
protected:
virtual bool try_music (Music *m);
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void acknowledge_grob (Grob_info);
private:
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Fingering_engraver,
/* descr */ "Create fingering-scripts",
/* creats*/ "Fingering",
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Font_size_engraver,
/* descr */ "Puts fontSize into font-relative-size grob property.",
/* creats*/ "",
{
public:
TRANSLATOR_DECLARATIONS (Forbid_line_break_engraver);
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
};
Forbid_line_break_engraver::Forbid_line_break_engraver (){}
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Forbid_line_break_engraver,
/* descr */ "Forbid line breaks when note heads are still playing at some point.",
/* creats*/ "",
protected:
virtual void acknowledge_grob (Grob_info);
virtual void finalize ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual bool try_music (Music *);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
private:
Spanner *line_;
Spanner *last_line_;
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Glissando_engraver,
/* descr */ "Engrave a glissandi",
/* creats*/ "Glissando",
{
void consider_change_grace_settings ();
protected:
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
virtual void derived_mark () const;
virtual void initialize ();
consider_change_grace_settings ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Grace_engraver,
/* descr */ "Set font size and other properties for grace notes.",
/* creats*/ "",
pes_or_flexa_req_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Gregorian_ligature_engraver,
/* descr */ "This is an abstract class. Subclasses such as Vaticana_ligature_engraver handle ligatures by glueing special ligature heads together.",
/* creats*/ "",
TRANSLATOR_DECLARATIONS (Grid_line_span_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
Grid_line_span_engraver::Grid_line_span_engraver ()
lines_.set_size (0);
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Grid_line_span_engraver,
/* descr */ "This engraver makes cross-staff linelines: It catches all normal "
"line lines, and draws a single span-line across them.",
public:
TRANSLATOR_DECLARATIONS (Grid_point_engraver);
protected:
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
void
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Grid_point_engraver,
/* descr */ "generate grid points.",
/* creats*/ "GridPoint",
protected:
virtual void initialize ();
virtual void acknowledge_grob (Grob_info);
- virtual void start_translation_timestep ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
Grob_pq_engraver::Grob_pq_engraver ()
context ()->set_property ("busyGrobs", busy);
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Grob_pq_engraver,
/* descr */ "Administrate when certain grobs (eg. note heads) stop playing; this \
virtual Spanner *get_spanner ();
virtual void acknowledge_grob (Grob_info);
virtual void add_element (Grob *e);
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
SCM interesting_;
public:
interesting_ = SCM_EOL;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Hara_kiri_engraver,
/* descr */ "Like Axis_group_engraver, but make a hara-kiri spanner, and add "
"interesting items (ie. note heads, lyric syllables and normal rests) ",
#include "hara-kiri-group-spanner.hh"
+#include "pointer-group-interface.hh"
#include "axis-group-interface.hh"
#include "spanner.hh"
#include "warn.hh"
int push_count_;
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void acknowledge_grob (Grob_info);
};
+#include "translator.icc"
+
ADD_TRANSLATOR (Horizontal_bracket_engraver,
"Create horizontal brackets over notes for musical analysis purposes.",
"HorizontalBracket",
virtual void acknowledge_grob (Grob_info);
virtual void finalize ();
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
private:
};
ev_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Hyphen_engraver,
/* descr */ "Create lyric hyphens",
/* creats*/ "LyricHyphen",
static bool has_interface (Grob *);
static String get_fontcharname (String style, int alteration);
- static Array<Box> Accidental_interface::accurate_boxes (Grob *me, Grob **common);
+ static Array<Box> Accidental_interface::accurate_boxes (Grob *me,
+ Grob **common);
};
#endif
protected:
Spanner *staffline_;
Link_array<Grob> elts_;
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void finalize ();
virtual void acknowledge_grob (Grob_info);
- virtual void process_acknowledged_grobs ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
virtual Spanner *get_spanner ();
virtual void add_element (Grob *);
public:
#ifndef AXIS_GROUP_INTERFACE_HH
#define AXIS_GROUP_INTERFACE_HH
-#include "pointer-group-interface.hh"
+#include "lily-proto.hh"
+#include "lily-guile.hh"
/**
*/
Grob *get_current_rest (Context *voice);
DECLARE_UNSMOB (Context, context);
+Moment measure_position (Context const *context);
+Rational measure_length (Context const *context);
+
#endif /* CONTEXT_HH */
#include "engraver.hh"
#include "translator-group.hh"
-class Engraver_group_engraver : public virtual Engraver,
- public virtual Translator_group
+class Engraver_group_engraver : public virtual Translator_group
{
protected:
Array<Grob_info> announce_infos_;
public:
- TRANSLATOR_DECLARATIONS (Engraver_group_engraver);
+ VIRTUAL_COPY_CONSTRUCTOR ( Translator_group, Engraver_group_engraver);
+ Engraver_group_engraver ();
virtual void initialize ();
- virtual void do_announces ();
+ PRECOMPUTED_VIRTUAL void do_announces ();
virtual void announce_grob (Grob_info);
-
int pending_grob_count () const;
private:
virtual void acknowledge_grobs ();
a struct which processes events, and creates the #Grob#s.
It may use derived classes.
*/
-class Engraver : public virtual Translator
+class Engraver : public Translator
{
friend class Engraver_group_engraver;
Default: ignore the info
*/
virtual void acknowledge_grob (Grob_info) {}
-
- /** Do things with stuff found in acknowledge_grob. Ugh. Should
- be looped with acknowledge_grob.
-
- */
- virtual void process_acknowledged_grobs () {}
-
virtual void announce_grob (Grob_info);
Engraver_group_engraver *get_daddy_engraver () const;
#define make_item(x, cause) make_item_from_properties (this, ly_symbol2scm (x), cause, x)
#define make_spanner(x, cause) make_spanner_from_properties (this, ly_symbol2scm (x), cause, x)
+#define make_paper_column(x) make_paper_column_from_properties (this, ly_symbol2scm (x), x)
Item *make_item_from_properties (Engraver *tg, SCM x, SCM cause, const char *name);
Spanner *make_spanner_from_properties (Engraver *tg, SCM x, SCM cause, const char *name);
+Paper_column *make_paper_column_from_properties (Engraver *tg, SCM x, const char *name);
#endif // ENGRAVER_HH
virtual void build_ligature (Spanner *ligature, Array<Grob_info> primitives);
virtual void transform_heads (Spanner *ligature,
Array<Grob_info> primitives); /* abstract method */
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
#endif // GREGORIAN_LIGATURE_ENGRAVER_HH
class Ligature_engraver : public Engraver
{
protected:
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void finalize ();
virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music *);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual Spanner *create_ligature_spanner (); /* abstract method */
virtual void typeset_ligature (Spanner *ligature,
Array<Grob_info> primitives); /* abstract method */
--- /dev/null
+/*
+ paper-column-engraver.hh -- declare Paper_column_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#ifndef PAPER_COLUMN_ENGRAVER_HH
+#define PAPER_COLUMN_ENGRAVER_HH
+
+
+#include "engraver.hh"
+
+
+class Paper_column_engraver : public Engraver
+{
+ void make_columns ();
+ void set_columns (Paper_column*, Paper_column*);
+ TRANSLATOR_DECLARATIONS(Paper_column_engraver);
+
+protected:
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ virtual void initialize ();
+ virtual void finalize ();
+ virtual bool try_music (Music*);
+ virtual void acknowledge_grob (Grob_info);
+
+ System *system_;
+ Music *break_event_;
+ int breaks_; // used for stat printing
+ Paper_column *command_column_;
+ Paper_column *musical_column_;
+ Link_array<Item> items_;
+ bool first_;
+ Moment last_moment_;
+public:
+ // ug.h
+ void forbid_breaks ();
+
+};
+
+#endif /* PAPER_COLUMN_ENGRAVER_HH */
typedef void (Performer:: *Performer_method) (void);
-class Performer_group_performer : public Performer, public virtual Translator_group
+class Performer_group_performer : public virtual Translator_group
{
public:
- TRANSLATOR_DECLARATIONS (Performer_group_performer);
+ VIRTUAL_COPY_CONSTRUCTOR (Translator_group,Performer_group_performer);
- virtual void do_announces ();
+ PRECOMPUTED_VIRTUAL void do_announces ();
virtual void announce_element (Audio_element_info);
+ virtual void play_element (Audio_element *p);
+ virtual int get_tempo () const;
+
protected:
Array<Audio_element_info> announce_infos_;
/* Convert a music definition into a audio representation.
A baseclass. */
-class Performer : public virtual Translator
+class Performer : public Translator
{
public:
VIRTUAL_COPY_CONSTRUCTOR (Translator, Performer);
--- /dev/null
+/*
+ recording-group-engraver.hh -- declare
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#ifndef RECORDING_GROUP_ENGRAVER_HH
+#define RECORDING_GROUP_ENGRAVER_HH
+
+
+#include "engraver-group-engraver.hh"
+
+class Recording_group_engraver : public Engraver_group_engraver
+{
+public:
+ VIRTUAL_COPY_CONSTRUCTOR (Translator_group, Recording_group_engraver);
+ virtual bool try_music (Music *m);
+ void add_music (SCM, SCM);
+ Recording_group_engraver ();
+ virtual void stop_translation_timestep ();
+ virtual void finalize ();
+ virtual void derived_mark () const;
+ virtual void fetch_precomputable_methods (Translator_group_void_method ptrs[]);
+
+ SCM now_events_;
+ SCM accumulator_;
+};
+#endif /* RECORDING_GROUP_ENGRAVER_HH */
public virtual Engraver_group_engraver
{
System *system_;
- int breaks_; // used for stat printing
Link_array<Grob> elems_;
- Paper_column *command_column_;
- Paper_column *musical_column_;
Paper_score *pscore_;
- void make_columns ();
- void set_columns (Paper_column *, Paper_column *);
void typeset_all ();
+
protected:
/* Score_translator */
virtual void finish ();
/* Engraver_group_engraver interface */
- virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music *);
virtual void initialize ();
virtual void finalize ();
virtual void announce_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
/*
Translator interface
*/
virtual void derived_mark () const;
+
public:
- TRANSLATOR_DECLARATIONS (Score_engraver);
+ Score_engraver ();
void forbid_breaks ();
virtual SCM get_output ();
};
class Score_performer : public Score_translator, public virtual Performer_group_performer
{
public:
- TRANSLATOR_DECLARATIONS (Score_performer);
+ VIRTUAL_COPY_CONSTRUCTOR (Translator_group,Score_performer);
~Score_performer ();
Performance *performance_;
+ Score_performer ();
protected:
virtual void prepare (Moment mom);
virtual void finish ();
virtual void start_spanner ();
virtual void stop_spanner ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual bool try_music (Music *);
virtual ~Staff_symbol_engraver ();
virtual void acknowledge_grob (Grob_info);
virtual void finalize ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
#endif /* STAFF_SYMBOL_ENGRAVER_HH */
#include "parray.hh"
-class Timing_translator : public virtual Translator
+class Timing_translator : public Translator
{
public:
TRANSLATOR_DECLARATIONS (Timing_translator);
protected:
virtual void initialize ();
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
public:
- Moment measure_position () const;
Rational measure_length () const;
};
+
+
#endif // TIMING_TRANSLATOR_HH
#ifndef TRANSLATOR_GROUP_HH
#define TRANSLATOR_GROUP_HH
-
-
#include "translator.hh"
#include "parray.hh"
typedef void (Translator:: *Translator_method) (void);
+typedef void (Translator_group:: *Translator_group_method) (void);
+typedef void (*Translator_group_void_method)(Translator_group*);
-class Translator_group : public virtual Translator
+struct Translator_method_binding
{
+ Translator *translator_;
+ Translator_void_method_ptr method_;
+
+ Translator_method_binding()
+ {
+ }
+ Translator_method_binding (Translator*tr, Translator_void_method_ptr ptr)
+ {
+ translator_ = tr;
+ method_ = ptr;
+ }
+ void invoke ()
+ {
+ if (method_)
+ (*method_)(translator_);
+ }
+};
+
+
+class Translator_group
+{
+private:
+ void precompute_method_bindings ();
+ Array<Translator_method_binding>
+ precomputed_method_bindings_[TRANSLATOR_METHOD_PRECOMPUTE_COUNT];
+
+ Translator_group_void_method
+ precomputed_self_method_bindings_[TRANSLATOR_METHOD_PRECOMPUTE_COUNT];
+
+public:
+ VIRTUAL_COPY_CONSTRUCTOR (Translator_group, Translator_group);
+ DECLARE_SMOBS (Translator_group, dummy);
+
public:
- VIRTUAL_COPY_CONSTRUCTOR (Translator, Translator_group);
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 ();
+
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+
+ virtual void fetch_precomputable_methods (Translator_group_void_method[]);
+
Translator_group ();
+ void precomputed_translator_foreach (Translator_precompute_index);
+ void call_precomputed_self_method (Translator_precompute_index);
+
+
+ Context * context () const { return context_; }
protected:
SCM simple_trans_list_;
-
+ Context *context_;
+
friend class Context_def;
virtual void derived_mark () const;
};
SCM names_to_translators (SCM namelist, Context *tg);
-void recurse_over_translators (Context *c, Translator_method ptr, Direction);
-void translator_each (SCM list, Translator_method method);
+void recurse_over_translators (Context *c, Translator_method ptr,
+ Translator_group_method ptr2, Direction);
+void precomputed_recurse_over_translators (Context *c, Translator_precompute_index idx, Direction dir);
+Translator_group *get_translator_group (SCM sym);
+
+#define ADD_TRANSLATOR_GROUP(classname, desc, grobs, accepted, acked, read, write) \
+
+DECLARE_UNSMOB (Translator_group, translator_group);
#endif // TRANSLATOR_GROUP_HH
#include "input.hh"
#include "smobs.hh"
-/* copied from lily-guile.hh */
-#ifndef get_property
-#define get_property(x) internal_get_property (ly_symbol2scm (x))
-#endif
+
+typedef void (*Translator_void_method_ptr)(Translator*);
+
+#define DECLARE_STATIC_METHOD(x) static void x ## _static (Translator*)
#define TRANSLATOR_DECLARATIONS(NAME) \
public: \
+ DECLARE_STATIC_METHOD(start_translation_timestep); \
+ DECLARE_STATIC_METHOD(stop_translation_timestep); \
+ DECLARE_STATIC_METHOD(process_music); \
+ DECLARE_STATIC_METHOD(process_acknowledged); \
NAME (); \
VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \
static SCM static_description_; \
+ virtual void fetch_precomputable_methods (Translator_void_method_ptr methods[]);\
virtual SCM static_translator_description () const; \
virtual SCM translator_description () const;
+
+enum Translator_precompute_index {
+ START_TRANSLATION_TIMESTEP,
+ STOP_TRANSLATION_TIMESTEP,
+ PROCESS_MUSIC,
+ PROCESS_ACKNOWLEDGED,
+ TRANSLATOR_METHOD_PRECOMPUTE_COUNT,
+};
+
+/* nothing */
+#define PRECOMPUTED_VIRTUAL
+
+
/*
Translate music into grobs.
*/
virtual Output_def *get_output_def () const;
virtual Translator_group *get_daddy_translator ()const;
virtual Moment now_mom () const;
+
virtual bool try_music (Music *req);
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
virtual void initialize ();
- virtual void process_music ();
- virtual void do_announces ();
virtual void finalize ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
+
+
Score_context *get_score_context () const;
Global_context *get_global_context () const;
friend class Context_def;
friend class Context;
};
-
-/**
- A macro to automate administration of translators.
-*/
-#define ADD_THIS_TRANSLATOR(T) \
- SCM T::static_description_ = SCM_EOL; \
- static void _ ## T ## _adder () \
- { \
- T *t = new T; \
- T::static_description_ = t->static_translator_description (); \
- scm_permanent_object (T::static_description_); \
- add_translator (t); \
- } \
- SCM T::translator_description () const \
- { \
- return static_description_; \
- } \
- ADD_GLOBAL_CTOR (_ ## T ## _adder);
-
-#define ADD_TRANSLATOR(classname, desc, grobs, accepted, acked, read, write) \
- ADD_THIS_TRANSLATOR (classname); \
- SCM \
- classname::static_translator_description () const \
- { \
- SCM static_properties = SCM_EOL; \
- /* static_properties = acons (name , gh_str02scm (Translator::name (self_scm ())), \
- static_properties_); \
- */ \
- static_properties = scm_acons (ly_symbol2scm ("grobs-created"), \
- parse_symbol_list (grobs), static_properties); \
- \
- static_properties = scm_acons (ly_symbol2scm ("description"), \
- scm_makfrom0str (desc), static_properties); \
- \
- static_properties = scm_acons (ly_symbol2scm ("interfaces-acked"), \
- parse_symbol_list (acked), static_properties); \
- static_properties = scm_acons (ly_symbol2scm ("events-accepted"), \
- parse_symbol_list (accepted), static_properties); \
- \
- static_properties = scm_acons (ly_symbol2scm ("properties-read"), \
- parse_symbol_list (read), static_properties); \
- \
- static_properties = scm_acons (ly_symbol2scm ("properties-written"), \
- parse_symbol_list (write), static_properties); \
- \
- return static_properties; \
- }
-
void add_translator (Translator *trans);
Translator *get_translator (SCM s);
--- /dev/null
+/*
+ translator.icc -- declare Translator glue wiring.
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#ifndef TRANSLATOR_ICC
+#define TRANSLATOR_ICC
+
+/**
+ A macro to automate administration of translators.
+*/
+#define ADD_THIS_TRANSLATOR(T) \
+ SCM T::static_description_ = SCM_EOL; \
+ static void _ ## T ## _adder () \
+ { \
+ T *t = new T; \
+ T::static_description_ = t->static_translator_description (); \
+ scm_permanent_object (T::static_description_); \
+ add_translator (t); \
+ } \
+ SCM T::translator_description () const \
+ { \
+ return static_description_; \
+ } \
+ ADD_GLOBAL_CTOR (_ ## T ## _adder);
+
+#define ADD_TRANSLATOR(classname, desc, grobs, accepted, acked, read, write) \
+ DEFINE_STATIC_METHODS(classname);\
+ IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(classname); \
+ ADD_THIS_TRANSLATOR (classname); \
+ SCM \
+ classname::static_translator_description () const \
+ { \
+ SCM static_properties = SCM_EOL; \
+ /* static_properties = acons (name , gh_str02scm (Translator::name (self_scm ())), \
+ static_properties_); \
+ */ \
+ static_properties = scm_acons (ly_symbol2scm ("grobs-created"), \
+ parse_symbol_list (grobs), static_properties); \
+ \
+ static_properties = scm_acons (ly_symbol2scm ("description"), \
+ scm_makfrom0str (desc), static_properties); \
+ \
+ static_properties = scm_acons (ly_symbol2scm ("interfaces-acked"), \
+ parse_symbol_list (acked), static_properties); \
+ static_properties = scm_acons (ly_symbol2scm ("events-accepted"), \
+ parse_symbol_list (accepted), static_properties); \
+ \
+ static_properties = scm_acons (ly_symbol2scm ("properties-read"), \
+ parse_symbol_list (read), static_properties); \
+ \
+ static_properties = scm_acons (ly_symbol2scm ("properties-written"), \
+ parse_symbol_list (write), static_properties); \
+ \
+ return static_properties; \
+ }
+
+
+/*
+ FIXME: should be able to cast statically to (T*) -iow.- remove
+ Translator as a virtual base class.
+ */
+#define DEFINE_STATIC_METHOD(T, x) \
+void \
+T::x ## _static (Translator* tr) \
+{ \
+ T * t_ptr = (T*) (tr); \
+ t_ptr->x ();\
+}
+
+#define DEFINE_STATIC_METHODS(T) \
+ DEFINE_STATIC_METHOD(T,start_translation_timestep)\
+ DEFINE_STATIC_METHOD(T,stop_translation_timestep)\
+ DEFINE_STATIC_METHOD(T,process_music)\
+ DEFINE_STATIC_METHOD(T,process_acknowledged)
+
+#define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T) \
+void \
+T::fetch_precomputable_methods (Translator_void_method_ptr ptrs[])\
+{ \
+ ptrs[START_TRANSLATION_TIMESTEP] = \
+ ((Translator_void_method_ptr) &T::start_translation_timestep == \
+ (Translator_void_method_ptr) &Translator::start_translation_timestep) \
+ ? 0 \
+ : &T::start_translation_timestep_static; \
+ \
+ ptrs[STOP_TRANSLATION_TIMESTEP] = \
+ ((Translator_void_method_ptr) &T::stop_translation_timestep == (Translator_void_method_ptr) &Translator::stop_translation_timestep) \
+ ? 0 \
+ : &T::stop_translation_timestep_static; \
+ \
+ ptrs[PROCESS_MUSIC] = \
+ ((Translator_void_method_ptr) &T::process_music == (Translator_void_method_ptr) &Translator::process_music) \
+ ? 0 \
+ : &T::process_music_static; \
+ \
+ ptrs[PROCESS_ACKNOWLEDGED] = \
+ ((Translator_void_method_ptr) &T::process_acknowledged == (Translator_void_method_ptr) &Translator::process_acknowledged) \
+ ? 0 \
+ : &T::process_acknowledged_static; \
+}
+
+
+#endif /* TRANSLATOR_ICC */
+
/** eat a certain type of event
(Duh, it's good for your skin)
*/
-class Type_swallow_translator : public virtual Translator
+class Type_swallow_translator : public Translator
{
protected:
String swallow_string_;
virtual void create_text ();
virtual void initialize ();
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
create_text ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Instrument_name_engraver,
/* descr */ " Prints the name of the instrument (specified by "
" @code{Staff.instrument} and @code{Staff.instr}) "
text_->set_property ("text", txt);
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Vocal_name_engraver,
/* descr */ " Prints the name of the a lyric voice (specified by "
" @code{Staff.vocalName} and @code{Staff.vocNam}) "
: Grob (s, key)
{
broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0;
- interfaces_ = scm_cons (ly_symbol2scm ("item-interface"), interfaces_);
}
/**
virtual void initialize ();
virtual void finalize ();
virtual bool try_music (Music *ev);
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void acknowledge_grob (Grob_info);
};
context ()->set_property ("tonic", p.smobbed_copy ());
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Key_engraver,
/* descr */ "",
/* creats*/ "KeySignature",
protected:
virtual bool try_music (Music *ev);
virtual void create_audio_elements ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
private:
Music *key_ev_;
return true;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Key_performer,
"", "",
"key-change-event",
protected:
virtual void finalize ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void acknowledge_grob (Grob_info);
void start_spanner ();
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Ledger_line_engraver,
"Creates the spanner to draw ledger lines, and notices objects that need ledger lines",
/* creats*/ "LedgerLineSpanner",
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Ligature_bracket_engraver,
/* descr */ "Handles Ligature_events by engraving Ligature brackets.",
/* creats*/ "TupletBracket",
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Ligature_engraver,
/* descr */ "Abstract class; a concrete subclass handles Ligature_events by engraving Ligatures in a concrete style.",
/* creats */ "",
class Lyric_engraver : public Engraver
{
protected:
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual bool try_music (Music *);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
public:
TRANSLATOR_DECLARATIONS (Lyric_engraver);
event_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Lyric_engraver,
/* descr */ "",
/* creats*/ "LyricText",
protected:
virtual bool try_music (Music *req);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void create_audio_elements ();
private:
return false;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Lyric_performer, "", "", "lyric-event", "", "", "");
protected:
Item *text_;
protected:
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void acknowledge_grob (Grob_info);
void create_items (Music *);
virtual bool try_music (Music *ev);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
private:
Music *mark_ev_;
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Mark_engraver,
/* descr */ "This engraver will create RehearsalMark objects. "
"It puts them on top of all staves (which is taken from "
Spanner *grouping_;
Rational stop_grouping_mom_;
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void finalize ();
virtual void acknowledge_grob (Grob_info);
};
grouping_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Measure_grouping_engraver,
/* descr */ "Creates MeasureGrouping to indicate beat subdivision.",
/* creats*/ "MeasureGrouping",
TRANSLATOR_DECLARATIONS (Melisma_translator);
protected:
virtual bool try_music (Music *);
- virtual void process_music ();
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
Music *event_;
};
event_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Melisma_translator,
/* descr */ "This translator collects melisma information about ties, beams, and user settings (@code{melismaBusy}, and signals it to the @code{\addlyrics} code. ",
/* creats*/ "",
fold_up_primitives (primitives);
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Mensural_ligature_engraver,
/* descr */ "Handles Mensural_ligature_events by glueing special ligature heads together.",
/* creats*/ "MensuralLigature",
void create_items (Music *);
protected:
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual bool try_music (Music *ev);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
Metronome_mark_engraver::Metronome_mark_engraver ()
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Metronome_mark_engraver,
/* descr */ "Engrave metro nome marking. This delegates the formatting work "
"to the function in the metronomeMarkFormatter property. "
protected:
virtual bool try_music (Music *);
- virtual void process_music ();
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
virtual void finalize ();
private:
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Multi_measure_rest_engraver,
/* descr */
"Engraves multi-measure rests that are produced with @code{R}. Reads "
public:
TRANSLATOR_DECLARATIONS (New_fingering_engraver);
protected:
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void acknowledge_grob (Grob_info);
void add_fingering (Grob *, Music *, Music *);
void add_script (Grob *, Music *, Music *);
stem_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (New_fingering_engraver,
/* descr */ "Create fingering-scripts for notes in a new chord. "
"This engraver is ill-named, since it "
#include "stem.hh"
#include "side-position-interface.hh"
#include "dot-column.hh"
+#include "pointer-group-interface.hh"
MAKE_SCHEME_CALLBACK (Note_collision_interface, force_shift_callback, 2);
#include "rest.hh"
#include "note-head.hh"
#include "accidental-placement.hh"
+#include "pointer-group-interface.hh"
/*
TODO: figure out if we can prune this class. This is just an
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void process_acknowledged_grobs ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
private:
Spanner *line_;
}
void
-Note_head_line_engraver::process_acknowledged_grobs ()
+Note_head_line_engraver::process_acknowledged ()
{
if (!line_ && follow_ && last_head_ && head_)
{
head_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Note_head_line_engraver,
/* descr */ "Engrave a line between two note heads, for example a glissando. If "
" followVoice is set, staff switches also generate a line.",
SCM log = scm_int2num (Note_head::get_balltype (me));
SCM proc = me->get_property ("glyph-name-procedure");
- String suffix = to_string (robust_scm2int (me->get_property ("duration-log"), 2));
- if (ly_is_procedure (proc))
+ String suffix = to_string (min (robust_scm2int (me->get_property ("duration-log"), 2), 2));
+ if (style != ly_symbol2scm ("default")
+ && ly_is_procedure (proc))
suffix = ly_scm2string (scm_call_2 (proc, log, style));
Font_metric *fm = Font_interface::get_default_font (me);
protected:
virtual bool try_music (Music *ev);
- virtual void process_music ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
Note_heads_engraver::Note_heads_engraver ()
note_evs_.clear ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Note_heads_engraver,
/* descr */ "Generate noteheads.",
/* creats*/ "NoteHead Dots",
Link_array<Music> events_;
Link_array<Item> texts_;
virtual bool try_music (Music *m);
- virtual void process_music ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
bool
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Note_name_engraver,
/* descr */ "",
/* creats*/ "NoteName",
protected:
virtual bool try_music (Music *ev);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void create_audio_elements ();
private:
return false;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Note_performer, "", "",
"note-event busy-playing-event", "", "", "");
protected:
virtual void finalize ();
virtual void acknowledge_grob (Grob_info);
- virtual void process_music ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void derived_mark () const;
private:
Spanner *span_;
last_ottavation_ = SCM_EOL;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Ottava_spanner_engraver,
/* descr */ "Create a text spanner when the ottavation property changes..",
/* creats*/ "OttavaBracket",
protected:
Link_array<Music> props_;
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music*);
};
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Output_property_engraver,
/* descr */ "Interpret Music of Output_property type, and apply a function "
" to any Graphic objects that satisfies the predicate.",
--- /dev/null
+/*
+ paper-column-engraver.cc -- implement Paper_column_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#include "paper-column-engraver.hh"
+#include "system.hh"
+#include "item.hh"
+#include "paper-column.hh"
+#include "staff-spacing.hh"
+#include "note-spacing.hh"
+#include "pointer-group-interface.hh"
+#include "context.hh"
+#include "axis-group-interface.hh"
+#include "warn.hh"
+
+
+
+Paper_column_engraver::Paper_column_engraver ()
+{
+ command_column_ = 0;
+ musical_column_ = 0;
+ breaks_ = 0;
+ break_event_ = 0;
+ system_ = 0;
+ first_ = true;
+}
+
+void
+Paper_column_engraver::finalize ()
+{
+ if ((breaks_ % 8))
+ progress_indication ("[" + to_string (breaks_) + "]");
+
+ if (command_column_)
+ {
+ command_column_->set_property ("breakable", SCM_BOOL_T);
+ system_->set_bound (RIGHT, command_column_);
+ }
+}
+
+void
+Paper_column_engraver::make_columns ()
+{
+ /*
+ ugh.
+ */
+ Paper_column *p1 = make_paper_column ("NonMusicalPaperColumn");
+ Paper_column *p2 = make_paper_column ("PaperColumn");
+
+ SCM m = now_mom().smobbed_copy();
+ p1->set_property ("when", m);
+ p2->set_property ("when", m);
+
+ set_columns (p1, p2);
+}
+
+
+void
+Paper_column_engraver::initialize ()
+{
+ system_ = dynamic_cast<System*> (unsmob_grob (get_property ("rootSystem")));
+ make_columns ();
+
+
+ system_->set_bound (LEFT, command_column_);
+ command_column_->set_property ("breakable", SCM_BOOL_T);
+}
+
+void
+Paper_column_engraver::acknowledge_grob (Grob_info gi)
+{
+ Item *item = dynamic_cast<Item *> (gi.grob ());
+ if (!item)
+ {
+ programming_error ("Spanner found in Paper_column_engraver::acknowledge_grob()");
+ return;
+ }
+
+ items_.push (item);
+
+ if (Staff_spacing::has_interface (item))
+ {
+ Pointer_group_interface::add_grob (command_column_,
+ ly_symbol2scm ("spacing-wishes"),
+ gi.grob ());
+ }
+ if (Note_spacing::has_interface (item))
+ {
+ Pointer_group_interface::add_grob (musical_column_,
+ ly_symbol2scm ("spacing-wishes"),
+ gi.grob ());
+ }
+}
+
+void
+Paper_column_engraver::set_columns (Paper_column *new_command,
+ Paper_column *new_musical)
+{
+ command_column_ = new_command;
+ musical_column_ = new_musical;
+ if (new_command)
+ {
+ context ()->set_property ("currentCommandColumn", new_command->self_scm ());
+ }
+
+ if (new_musical)
+ {
+ context ()->set_property ("currentMusicalColumn", new_musical->self_scm ());
+ }
+
+ system_->add_column (command_column_);
+ system_->add_column (musical_column_);
+}
+
+
+void
+Paper_column_engraver::forbid_breaks ()
+{
+ if (command_column_ && !first_)
+ command_column_->set_property ("breakable", SCM_EOL);
+}
+
+
+bool
+Paper_column_engraver::try_music (Music *m)
+{
+ break_event_ = m;
+
+ return true;
+}
+
+void
+Paper_column_engraver::process_music ()
+{
+ if (break_event_)
+ {
+ SCM pen = command_column_->get_property ("penalty");
+ Real total_penalty = scm_is_number (pen) ? scm_to_double (pen) : 0.0;
+
+ SCM mpen = break_event_->get_property ("penalty");
+ if (scm_is_number (mpen))
+ total_penalty += scm_to_double (mpen);
+
+ command_column_->set_property ("penalty", scm_make_real (total_penalty));
+
+ /* ugh. arbitrary, hardcoded */
+ if (total_penalty > 10000.0)
+ forbid_breaks ();
+
+ SCM page_pen = command_column_->get_property ("page-penalty");
+ Real total_pp = scm_is_number (page_pen) ? scm_to_double (page_pen) : 0.0;
+ SCM mpage_pen = break_event_->get_property ("page-penalty");
+ if (scm_is_number (mpage_pen))
+ total_pp += scm_to_double (mpage_pen);
+
+ command_column_->set_property ("page-penalty", scm_make_real (total_pp));
+ }
+
+
+ bool start_of_measure = (last_moment_.main_part_ != now_mom ().main_part_
+ && !measure_position (context ()).main_part_);
+
+ /*
+ We can't do this in start_translation_timestep(), since time sig
+ changes won't have happened by then.
+ */
+ if (start_of_measure)
+ {
+ Moment mlen = Moment (measure_length (context ()));
+ Grob * column = unsmob_grob (get_property ("currentCommandColumn"));
+ if (column)
+ column->set_property ("measure-length", mlen.smobbed_copy ());
+ else
+ programming_error("No command column?");
+ }
+}
+
+void
+Paper_column_engraver::stop_translation_timestep ()
+{
+ for (int i = 0; i < items_.size (); i++)
+ {
+ Item *elem = items_[i];
+ if (!elem->get_parent (X_AXIS)
+ || !unsmob_grob (elem->get_object ("axis-group-parent-X")))
+ {
+ bool br = to_boolean (elem->get_property ("breakable"));
+ Axis_group_interface::add_element (br ? command_column_ : musical_column_, elem);
+ }
+ }
+ items_.clear ();
+
+ if (to_boolean (command_column_->get_property ("breakable")))
+ {
+ breaks_++;
+ if (! (breaks_%8))
+ progress_indication ("[" + to_string (breaks_) + "]");
+ }
+
+ first_ = false;
+}
+
+void
+Paper_column_engraver::start_translation_timestep ()
+{
+ /*
+ TODO: don't make columns when skipTypesetting is true.
+ */
+ if (!first_)
+ make_columns ();
+}
+
+
+
+#include "translator.icc"
+
+ADD_TRANSLATOR (Paper_column_engraver,
+ /* descr */ "Takes care of generating columns."
+ "\n\n "
+ "This engraver decides whether a column is breakable. The default is "
+ "that a column is always breakable. However, when every Bar_engraver "
+ "that does not have a barline at a certain point will call "
+ "Score_engraver::forbid_breaks to stop linebreaks. In practice, this "
+ "means that you can make a breakpoint by creating a barline (assuming "
+ "that there are no beams or notes that prevent a breakpoint.) ",
+ /* creats*/ "PaperColumn NonMusicalPaperColumn",
+ /* accepts */ "break-event",
+ /* acks */ "item-interface",
+ /* reads */ "",
+ /* write */ "currentCommandColumn currentMusicalColumn");
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void process_music ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual bool try_music (Music *);
private:
Item *text_;
event_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Part_combine_engraver,
/* descr */ "Part combine engraver for orchestral scores: "
"Print markings a2, Solo, Solo II, and unisono ",
protected:
virtual void finalize ();
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
Percent_repeat_engraver::Percent_repeat_engraver ()
typeset_perc ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Percent_repeat_engraver,
/* descr */ "Make whole bar and double bar repeats.",
/* creats*/ "PercentRepeat DoublePercentRepeat",
#include "audio-element.hh"
#include "warn.hh"
-ADD_TRANSLATOR (Performer_group_performer,
+#include "translator.icc"
+
+ADD_TRANSLATOR_GROUP (Performer_group_performer,
/* descr */ "",
/* creats*/ "",
/* accepts */ "",
Performer_group_performer::announce_element (Audio_element_info info)
{
announce_infos_.push (info);
- Translator *t
+ Translator_group *t
= context ()->get_parent_context ()->implementation ();
if (Performer_group_performer *eg = dynamic_cast<Performer_group_performer *> (t))
}
}
+void
+performer_each (SCM list, Performer_method method)
+{
+ for (SCM p = list; scm_is_pair (p); p = scm_cdr (p))
+ {
+ Performer *e = dynamic_cast<Performer *> (unsmob_translator (scm_car (p)));
+ if (e)
+ (e->*method) ();
+ }
+}
+
void
Performer_group_performer::do_announces ()
{
while (1)
{
- create_audio_elements ();
performer_each (get_simple_trans_list (),
&Performer::create_audio_elements);
}
}
-Performer_group_performer::Performer_group_performer ()
+
+void
+Performer_group_performer::play_element (Audio_element *e)
{
+ Context *c = context_->get_parent_context ();
+ if (c)
+ {
+ Performer_group_performer *pgp = dynamic_cast<Performer_group_performer*> (c->implementation ());
+ pgp->play_element (e);
+ }
}
-void
-performer_each (SCM list, Performer_method method)
+int
+Performer_group_performer::get_tempo () const
{
- for (SCM p = list; scm_is_pair (p); p = scm_cdr (p))
+ Context *c = context_->get_parent_context ();
+ if (c)
{
- Performer *e = dynamic_cast<Performer *> (unsmob_translator (scm_car (p)));
- if (e)
- (e->*method) ();
+ Performer_group_performer *pgp = dynamic_cast<Performer_group_performer*> (c->implementation ());
+ return pgp->get_tempo ();
}
+ return 60;
}
+
{
if (!i.origin_trans_)
i.origin_trans_ = this;
+
get_daddy_performer ()->announce_element (i);
}
protected:
virtual bool try_music (Music *);
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void finalize ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
public:
TRANSLATOR_DECLARATIONS (Phrasing_slur_engraver);
events_[START] = events_[STOP] = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Phrasing_slur_engraver,
/* descr */ "Print phrasing slurs. Similar to @ref{Slur_engraver}",
/* creats*/ "PhrasingSlur",
virtual void initialize ();
virtual void finalize ();
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void acknowledge_grob (Grob_info);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
private:
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Piano_pedal_engraver,
/* descr */ "Engrave piano pedal symbols and brackets.",
/* creats*/ "SostenutoPedal SustainPedal UnaCordaPedal SostenutoPedalLineSpanner SustainPedalLineSpanner UnaCordaPedalLineSpanner",
virtual void initialize ();
virtual bool try_music (Music *);
virtual void create_audio_elements ();
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
private:
Link_array<Audio_piano_pedal> audios_;
return false;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Piano_pedal_performer, "", "",
"pedal-event",
"", "", "");
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Pitch_squash_engraver,
/* descr */
"Set the vertical position of noteheads to "
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual bool try_music (Music*);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
private:
Item *trill_head_;
Item *trill_group_;
return false;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Pitched_trill_engraver,
/* descr */ "Print the bracketed notehead after a notehead with trill.",
/* creats*/ "TrillPitchHead TrillPitchAccidental TrillPitchGroup",
(c) 2003--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
+#include "recording-group-engraver.hh"
#include "context.hh"
-#include "engraver-group-engraver.hh"
-#include "protected-scm.hh"
-class Recording_group_engraver : public Engraver_group_engraver
-{
-public:
- TRANSLATOR_DECLARATIONS (Recording_group_engraver);
- virtual bool try_music (Music *m);
- void add_music (SCM, SCM);
- virtual void stop_translation_timestep ();
- virtual void finalize ();
- virtual void initialize ();
- virtual void derived_mark () const;
- SCM now_events_;
- SCM accumulator_;
-};
void
Recording_group_engraver::derived_mark () const
scm_gc_mark (accumulator_);
}
-void
-Recording_group_engraver::initialize ()
-{
- Engraver_group_engraver::initialize ();
-}
-
Recording_group_engraver::Recording_group_engraver ()
{
accumulator_ = SCM_EOL;
void
Recording_group_engraver::stop_translation_timestep ()
{
- Engraver_group_engraver::stop_translation_timestep ();
-
- accumulator_ = scm_acons (scm_cons (now_mom ().smobbed_copy (),
- get_property ("instrumentTransposition")),
+ accumulator_ = scm_acons (scm_cons (context ()->now_mom ().smobbed_copy (),
+ context ()->get_property ("instrumentTransposition")),
now_events_,
accumulator_);
now_events_ = SCM_EOL;
void
Recording_group_engraver::finalize ()
{
- Engraver_group_engraver::finalize ();
- SCM proc = get_property ("recordEventSequence");
+ SCM proc = context()->get_property ("recordEventSequence");
if (ly_is_procedure (proc))
scm_call_2 (proc, context ()->self_scm (), scm_cdr (accumulator_));
return retval;
}
-ADD_TRANSLATOR (Recording_group_engraver,
+void
+recording_engraver (Translator_group *tg)
+{
+ Recording_group_engraver *rg = dynamic_cast<Recording_group_engraver*> (tg);
+ rg->stop_translation_timestep ();
+}
+
+void
+Recording_group_engraver::fetch_precomputable_methods (Translator_group_void_method ptrs[])
+{
+ ptrs[STOP_TRANSLATION_TIMESTEP] = &recording_engraver;
+}
+
+#include "translator.icc"
+
+ADD_TRANSLATOR_GROUP (Recording_group_engraver,
"Engraver_group_engraver that records all music events "
"for this context. Calls the procedure "
"in @code{recordEventSequence} when finished.",
#include "context.hh"
#include "repeated-music.hh"
+#include "translator.icc"
+
/*
Objective:
TRANSLATOR_DECLARATIONS (Repeat_acknowledge_engraver);
protected:
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void initialize ();
};
}
}
+
ADD_TRANSLATOR (Repeat_acknowledge_engraver,
/* descr */ "Acknowledge repeated music, and convert the contents of "
"repeatCommands ainto an appropriate setting for whichBar.",
Link_array<Grob> note_columns_;
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void process_acknowledged_grobs ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
public:
TRANSLATOR_DECLARATIONS (Rest_collision_engraver);
};
}
void
-Rest_collision_engraver::process_acknowledged_grobs ()
+Rest_collision_engraver::process_acknowledged ()
{
if (rest_collision_
|| note_columns_.is_empty ()
rest_count_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Rest_collision_engraver,
/* descr */ "Handles collisions of rests.",
/* creats*/ "RestCollision",
Grob *rest_;
protected:
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
public:
TRANSLATOR_DECLARATIONS (Rest_engraver);
return false;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Rest_engraver,
/* descr */ "",
/* creats*/ "Rest Dots",
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void process_acknowledged_grobs ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
Rhythmic_column_engraver::Rhythmic_column_engraver ()
}
void
-Rhythmic_column_engraver::process_acknowledged_grobs ()
+Rhythmic_column_engraver::process_acknowledged ()
{
if (rheads_.size ())
{
stem_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Rhythmic_column_engraver,
/* descr */ "Generates NoteColumn, an objects that groups stems, noteheads and rests.",
/* creats*/ "NoteColumn NoteSpacing",
void
Score_context::prepare (Moment w)
{
- Translator *t = implementation ();
+ Translator_group *t = implementation ();
Score_translator *s = dynamic_cast<Score_translator *> (t);
s->prepare (w);
void
Score_context::finish ()
{
- Translator *t = implementation ();
+ Translator_group *t = implementation ();
Score_translator *s = dynamic_cast<Score_translator *> (t);
s->finish ();
void
Score_context::one_time_step ()
{
- Translator *t = implementation ();
+ Translator_group *t = implementation ();
Score_translator *s = dynamic_cast<Score_translator *> (t);
s->one_time_step ();
}
SCM
Score_context::get_output ()
{
- Translator *t = implementation ();
+ Translator_group *t = implementation ();
Score_translator *s = dynamic_cast<Score_translator *> (t);
return s->get_output ();
}
#include "output-def.hh"
#include "axis-group-interface.hh"
#include "context-def.hh"
-#include "staff-spacing.hh"
-#include "note-spacing.hh"
#include "global-context.hh"
#include "open-type-font.hh"
+#include "paper-column-engraver.hh"
/*
TODO: the column creation logic is rather hairy. Revise it.
Score_engraver::Score_engraver ()
{
system_ = 0;
- command_column_ = 0;
- musical_column_ = 0;
- breaks_ = 0;
pscore_ = 0;
}
Engraver_group_engraver::derived_mark ();
}
-void
-Score_engraver::make_columns ()
-{
- /*
- ugh.
- */
- if (!command_column_)
- {
- SCM nmp
- = updated_grob_properties (context (),
- ly_symbol2scm ("NonMusicalPaperColumn"));
-
- Object_key const *key1 = context ()->get_grob_key ("NonMusicalPaperColumn");
-
- SCM pc = updated_grob_properties (context (),
- ly_symbol2scm ("PaperColumn"));
- Object_key const *key2 = context ()->get_grob_key ("PaperColumn");
- set_columns (new Paper_column (nmp, key1), new Paper_column (pc, key2));
-
- Grob_info i1 (this, command_column_);
- announce_grob (i1);
-
- Grob_info i2 (this, musical_column_);
- announce_grob (i2);
- }
-}
void
Score_engraver::prepare (Moment m)
{
- /*
- TODO: don't make columns when skipTypesetting is true.
- */
- make_columns ();
-
- SCM w = m.smobbed_copy ();
- command_column_->set_property ("when", w);
- musical_column_->set_property ("when", w);
-
- recurse_over_translators (context (), &Translator::start_translation_timestep, DOWN);
+ (void) m;
+
+ precomputed_recurse_over_translators (context (), START_TRANSLATION_TIMESTEP, DOWN);
}
void
Score_engraver::finish ()
{
- if ((breaks_ % 8))
- progress_indication ("[" + to_string (breaks_) + "]");
-
- recurse_over_translators (context (), &Translator::finalize, UP);
+ recurse_over_translators (context (), &Translator::finalize,
+ &Translator_group::finalize,
+ UP);
}
#define MUSIC_FONT "emmentaler-20"
+ _ ("Aborting"));
}
- pscore_ = new Paper_score (dynamic_cast<Output_def *> (get_output_def ()));
+ pscore_ = new Paper_score (dynamic_cast<Output_def *> (context ()->get_output_def ()));
scm_gc_unprotect_object (pscore_->self_scm ());
SCM props = updated_grob_properties (context (), ly_symbol2scm ("System"));
Object_key const *sys_key = context ()->get_grob_key ("System");
pscore_->typeset_system (new System (props, sys_key));
-
system_ = pscore_->root_system ();
- make_columns ();
- system_->set_bound (LEFT, command_column_);
- command_column_->set_property ("breakable", SCM_BOOL_T);
-
+ context ()->set_property ("rootSystem", system_->self_scm ());
+
Engraver_group_engraver::initialize ();
}
{
Score_translator::finalize ();
- Grob *cc
- = unsmob_grob (get_property ("currentCommandColumn"));
- system_->set_bound (RIGHT, cc);
- cc->set_property ("breakable", SCM_BOOL_T);
-
typeset_all ();
}
void
Score_engraver::one_time_step ()
{
- if (!to_boolean (get_property ("skipTypesetting")))
+ if (!to_boolean (context ()->get_property ("skipTypesetting")))
{
- recurse_over_translators (context (), &Engraver::process_music, UP);
+ precomputed_recurse_over_translators (context (), PROCESS_MUSIC, UP);
Engraver_group_engraver::do_announces ();
}
- recurse_over_translators (context (), &Translator::stop_translation_timestep, UP);
+ precomputed_recurse_over_translators (context (), STOP_TRANSLATION_TIMESTEP, UP);
+ typeset_all ();
}
void
{
Grob *elem = elems_[i];
- if (dynamic_cast<Item *> (elem))
- {
- if ((!elem->get_parent (X_AXIS)
- || !unsmob_grob (elem->get_object ("axis-group-parent-X")))
- && elem != command_column_
- && elem != musical_column_)
- {
- bool br = to_boolean (elem->get_property ("breakable"));
- Axis_group_interface::add_element (br ? command_column_ : musical_column_, elem);
- }
- }
if (!elem->get_parent (Y_AXIS))
Axis_group_interface::add_element (system_, elem);
}
elems_.clear ();
}
-void
-Score_engraver::stop_translation_timestep ()
+SCM
+Score_engraver::get_output ()
{
- // this generates all items.
- Engraver_group_engraver::stop_translation_timestep ();
-
- typeset_all ();
- if (to_boolean (command_column_->get_property ("breakable")))
- {
- breaks_++;
- if (! (breaks_%8))
- progress_indication ("[" + to_string (breaks_) + "]");
- }
-
- command_column_ = 0;
- musical_column_ = 0;
+ Music_output *o = pscore_;
+ return o->self_scm ();
}
+
+/*
+ UGH UGH
+ */
void
-Score_engraver::set_columns (Paper_column *new_command,
- Paper_column *new_musical)
+Score_engraver::forbid_breaks ()
{
- assert (!command_column_ && !musical_column_);
-
- command_column_ = new_command;
- musical_column_ = new_musical;
- if (new_command)
- {
- context ()->set_property ("currentCommandColumn", new_command->self_scm ());
- }
-
- if (new_musical)
+ for (SCM s = simple_trans_list_; scm_is_pair (s); s = scm_cdr (s))
{
- context ()->set_property ("currentMusicalColumn", new_musical->self_scm ());
+ Translator *tr = unsmob_translator (scm_car (s));
+ if (Paper_column_engraver* pce = dynamic_cast<Paper_column_engraver*> (tr))
+ {
+ pce->forbid_breaks ();
+ }
}
-
- system_->add_column (command_column_);
- system_->add_column (musical_column_);
-}
-
-SCM
-Score_engraver::get_output ()
-{
- Music_output *o = pscore_;
- return o->self_scm ();
}
bool
if (Engraver_group_engraver::try_music (m))
return true;
- if (m->is_mus_type ("break-event"))
- {
- SCM pen = command_column_->get_property ("penalty");
- Real total_penalty = scm_is_number (pen) ? scm_to_double (pen) : 0.0;
-
- SCM mpen = m->get_property ("penalty");
- if (scm_is_number (mpen))
- total_penalty += scm_to_double (mpen);
-
- command_column_->set_property ("penalty", scm_make_real (total_penalty));
-
- /* ugh. arbitrary, hardcoded */
- if (total_penalty > 10000.0)
- forbid_breaks ();
-
- SCM page_pen = command_column_->get_property ("page-penalty");
- Real total_pp = scm_is_number (page_pen) ? scm_to_double (page_pen) : 0.0;
- SCM mpage_pen = m->get_property ("page-penalty");
- if (scm_is_number (mpage_pen))
- total_pp += scm_to_double (mpage_pen);
-
- command_column_->set_property ("page-penalty", scm_make_real (total_pp));
- return true;
- }
return false;
}
-void
-Score_engraver::forbid_breaks ()
-{
- if (command_column_)
- command_column_->set_property ("breakable", SCM_EOL);
-}
-
-void
-Score_engraver::acknowledge_grob (Grob_info gi)
-{
- if (Staff_spacing::has_interface (gi.grob ()))
- {
- Pointer_group_interface::add_grob (command_column_,
- ly_symbol2scm ("spacing-wishes"),
- gi.grob ());
- }
- if (Note_spacing::has_interface (gi.grob ()))
- {
- Pointer_group_interface::add_grob (musical_column_,
- ly_symbol2scm ("spacing-wishes"),
- gi.grob ());
- }
-
- if (Axis_group_interface::has_interface (gi.grob ())
- && gi.grob ()->internal_has_interface (ly_symbol2scm ("vertically-spaceable-interface")))
- {
- SCM spaceable = get_property ("verticallySpacedContexts");
- Context *orig = gi.origin_contexts (this)[0];
-
- if (scm_memq (ly_symbol2scm (orig->context_name ().to_str0 ()),
- spaceable) != SCM_BOOL_F)
- {
- Pointer_group_interface::add_grob (system_,
- ly_symbol2scm ("spaceable-staves"),
- gi.grob ());
- }
- }
-}
+#include "translator.icc"
-ADD_TRANSLATOR (Score_engraver,
+ADD_TRANSLATOR_GROUP (Score_engraver,
/* descr */ "Top level engraver. Takes care of generating columns and the complete system (ie. System) "
"\n\n "
"This engraver decides whether a column is breakable. The default is "
#include "warn.hh"
#include "context-def.hh"
#include "output-def.hh"
+#include "context.hh"
-ADD_TRANSLATOR (Score_performer,
+ADD_TRANSLATOR_GROUP (Score_performer,
/* descr */ "",
/* creats*/ "",
/* accepts */ "",
{
audio_column_ = new Audio_column (m);
play_element (audio_column_);
- recurse_over_translators (context (), &Translator::start_translation_timestep, UP);
+ precomputed_recurse_over_translators (context (), START_TRANSLATION_TIMESTEP, UP);
}
void
Score_performer::finish ()
{
- recurse_over_translators (context (), &Translator::finalize, UP);
+ recurse_over_translators (context (),
+ &Translator::finalize,
+ &Translator_group::finalize,
+ UP);
}
void
Score_performer::one_time_step ()
{
- recurse_over_translators (context (), &Performer::process_music, UP);
- recurse_over_translators (context (), &Performer::do_announces, UP);
- recurse_over_translators (context (), &Translator::stop_translation_timestep, UP);
+ precomputed_recurse_over_translators (context (), PROCESS_MUSIC, UP);
+ do_announces ();
+ precomputed_recurse_over_translators (context (), STOP_TRANSLATION_TIMESTEP, UP);
}
int
{
performance_ = new Performance;
scm_gc_unprotect_object (performance_->self_scm ());
- performance_->midi_ = get_output_def ();
+ performance_->midi_ = context ()->get_output_def ();
Translator_group::initialize ();
}
#include "script-column.hh"
#include "side-position-interface.hh"
+#include "translator.icc"
+
+
/**
Find potentially colliding scripts, and put them in a
Script_column, that will fix the collisions. */
TRANSLATOR_DECLARATIONS (Script_column_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void process_acknowledged_grobs ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
Script_column_engraver::Script_column_engraver ()
}
void
-Script_column_engraver::process_acknowledged_grobs ()
+Script_column_engraver::process_acknowledged ()
{
if (!scol_ && scripts_.size () > 1)
{
protected:
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void acknowledge_grob (Grob_info);
public:
scripts_.clear ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Script_engraver,
/* descr */ "Handles note scripted articulations.",
/* creats*/ "Script",
(c) 1998--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
+#include "engraver.hh"
+
#include "separating-group-spanner.hh"
#include "separation-item.hh"
#include "paper-column.hh"
#include "output-def.hh"
-#include "engraver.hh"
#include "axis-group-interface.hh"
#include "note-spacing.hh"
#include "accidental-placement.hh"
#include "context.hh"
#include "grob-array.hh"
+#include "pointer-group-interface.hh"
struct Spacings
{
Spanner *sep_span_;
virtual void acknowledge_grob (Grob_info);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void finalize ();
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
public:
TRANSLATOR_DECLARATIONS (Separating_line_group_engraver);
};
musical_item_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Separating_line_group_engraver,
/* descr */ "Generates objects for computing spacing parameters.",
/* creats*/ "SeparationItem SeparatingGroupSpanner StaffSpacing",
Item *double_percent_;
protected:
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
Slash_repeat_engraver::Slash_repeat_engraver ()
beat_slash_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Slash_repeat_engraver,
/* descr */ "Make beat repeats.",
/* creats*/ "RepeatSlash",
protected:
virtual bool try_music (Music *);
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void finalize ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
public:
TRANSLATOR_DECLARATIONS (Slur_engraver);
events_[START] = events_[STOP] = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Slur_engraver,
/* descr */ "Build slurs grobs from slur events",
/* creats*/ "Slur",
protected:
virtual bool try_music (Music *ev);
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
void set_melisma (bool);
private:
Music *start_ev_;
return false;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Slur_performer, "", "",
"slur-event", "", "", "");
TRANSLATOR_DECLARATIONS (Spacing_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void start_translation_timestep ();
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void finalize ();
};
stopped_durations_.push (playing_durations_.get ());
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Spacing_engraver,
/* descr */ "make a SpacingSpanner and do bookkeeping of shortest starting and playing notes ",
/* creats*/ "SpacingSpanner",
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void process_acknowledged_grobs ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
private:
Item *span_arpeggio_;
}
void
-Span_arpeggio_engraver::process_acknowledged_grobs ()
+Span_arpeggio_engraver::process_acknowledged ()
{
/*
connectArpeggios is slightly brusque; we should really read a grob
arpeggios_.clear ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Span_arpeggio_engraver,
/* descr */ "",
/* creats*/ "Arpeggio",
TRANSLATOR_DECLARATIONS (Span_bar_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
Span_bar_engraver::Span_bar_engraver ()
bars_.set_size (0);
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Span_bar_engraver,
/* descr */ "This engraver makes cross-staff barlines: It catches all normal "
"bar lines, and draws a single span-bar across them.",
#include "axis-group-interface.hh"
#include "bar-line.hh"
#include "grob.hh"
+#include "pointer-group-interface.hh"
+
void
Span_bar::add_bar (Grob *me, Grob *b)
protected:
virtual bool try_music (Music *);
virtual void acknowledge_audio_element (Audio_element_info);
- virtual void process_music ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
private:
Audio_dynamic *audio_;
}
return false;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Span_dynamic_performer,
"", "",
"crescendo-event decrescendo-event",
break_index_ = 0;
spanned_drul_[LEFT] = 0;
spanned_drul_[RIGHT] = 0;
-
- interfaces_ = scm_cons (ly_symbol2scm ("spanner-interface"), interfaces_);
}
Spanner::Spanner (Spanner const &s, int count)
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Staff_collecting_engraver,
/* descr */ "Maintain the stavesFound variable",
/** Perform a staff. Individual notes should have their instrument
(staff-wide) set, so we override play_element ()
*/
-class Staff_performer : public Performer_group_performer
+class Staff_performer : public Performer
{
public:
TRANSLATOR_DECLARATIONS (Staff_performer);
String instrument_string_;
protected:
- virtual void play_element (Audio_element *p);
+ virtual void acknowledge_audio_element (Audio_element *p);
virtual void finalize ();
virtual void initialize ();
virtual void create_audio_elements ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
private:
Audio_staff *audio_staff_;
Audio_tempo *tempo_;
};
+#include "translator.icc"
+
ADD_TRANSLATOR (Staff_performer, "", "",
"",
"", "", "");
tempo_ = new Audio_tempo (get_tempo ());
announce_element (Audio_element_info (tempo_, 0));
-
- Performer_group_performer::initialize ();
}
void
play_element (instrument_);
play_element (instrument_name_);
}
- Performer_group_performer::create_audio_elements ();
}
void
}
instrument_name_ = 0;
instrument_ = 0;
- Performer_group_performer::stop_translation_timestep ();
}
void
Staff_performer::finalize ()
{
- Performer_group_performer::finalize ();
Performer::play_element (audio_staff_);
audio_staff_ = 0;
}
}
void
-Staff_performer::play_element (Audio_element *p)
+Staff_performer::acknowledge_audio_element (Audio_element *p)
{
if (Audio_item *ai = dynamic_cast<Audio_item *> (p))
{
audio_staff_->add_audio_item (ai);
}
- Performer::play_element (p);
}
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Staff_symbol_engraver,
/* descr */ "Create the constellation of five (default) "
"staff lines.",
Link_array<Grob> lyrics_;
Link_array<Grob> stanza_numbers_;
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
Stanza_number_align_engraver::Stanza_number_align_engraver ()
lyrics_.clear ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Stanza_number_align_engraver,
"This engraver ensures that stanza numbers are neatly aligned. ",
"",
SCM last_stanza_;
public:
TRANSLATOR_DECLARATIONS (Stanza_number_engraver);
- virtual void process_music ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void acknowledge_grob (Grob_info);
};
text_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Stanza_number_engraver,
/* descr */ "",
/* creats*/ "StanzaNumber",
void make_stem (Grob_info);
virtual void acknowledge_grob (Grob_info);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual bool try_music (Music *);
};
return false;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Stem_engraver,
/* descr */ "Create stems and single-stem tremolos. It also works together with "
"the beam engraver for overriding beaming.",
engraver should provide this functionality.
*/
+#include "translator.icc"
+
ADD_TRANSLATOR (String_number_engraver,
/* descr */ "Swallow string-number-events - the purpose of this engraver is to"
" process tab for normal notation. To provent warnings for unprocessed "
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Swallow_engraver,
/* descr */ "This engraver swallows everything given to it silently. The purpose of "
"this is to prevent spurious \"event junked\" warnings.",
Swallow_performer::Swallow_performer ()
{}
+#include "translator.icc"
+
ADD_TRANSLATOR (Swallow_performer,
/* descr */ "",
/* creats*/ "",
protected:
Spanner *delim_;
virtual void acknowledge_grob (Grob_info);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void finalize ();
};
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (System_start_delimiter_engraver,
/* descr */ "Creates a system start delimiter (ie. SystemStart@{Bar, Brace, Bracket@} spanner",
/* creats*/ "SystemStartBar SystemStartBrace SystemStartBracket",
#include "lookup.hh"
#include "item.hh"
+#include "pointer-group-interface.hh"
Stencil
#include "paper-system.hh"
#include "tweak-registration.hh"
#include "grob-array.hh"
+#include "pointer-group-interface.hh"
System::System (System const &src, int count)
: Spanner (src, count)
System::columns () const
{
extract_grob_set (this, "columns", ro_columns);
- Link_array<Grob> columns (ro_columns);
-
- bool found = false;
- for (int i = columns.size (); i--;)
+
+ int last_breakable = ro_columns.size ();
+
+ while (last_breakable --)
{
- bool brb = Item::is_breakable (columns[i]);
- found = found || brb;
-
- /*
- the last column should be breakable. Weed out any columns that
- seem empty. We need to retain breakable columns, in case
- someone forced a breakpoint.
- */
- if (!found || !Paper_column::is_used (columns[i]))
- columns.del (i);
+ if (Item::is_breakable (ro_columns [last_breakable]))
+ break;
}
+
+ Link_array<Grob> columns;
+ for (int i = 0; i <= last_breakable; i++)
+ {
+ if (Paper_column::is_used (ro_columns[i]))
+ columns.push (ro_columns[i]);
+ }
+
return columns;
}
protected:
virtual bool try_music (Music *event);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
};
Tab_note_heads_engraver::Tab_note_heads_engraver ()
tabstring_events_.clear ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Tab_note_heads_engraver,
/* descr */ "Generate one or more tablature noteheads from Music of type NoteEvent.",
/* creats*/ "TabNoteHead Dots",
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Tab_staff_symbol_engraver,
/* descr */ "Create a staff-symbol, but look at stringTunings for the number of lines."
"staff lines.",
protected:
virtual bool try_music (Music *req);
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void create_audio_elements ();
private:
return true;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Tempo_performer, "", "",
"metronome-change-event",
"", "", "");
TRANSLATOR_DECLARATIONS (Text_engraver);
protected:
virtual bool try_music (Music *m);
- virtual void stop_translation_timestep ();
- virtual void process_acknowledged_grobs ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_acknowledged ();
virtual void acknowledge_grob (Grob_info);
};
}
void
-Text_engraver::process_acknowledged_grobs ()
+Text_engraver::process_acknowledged ()
{
if (texts_.size ())
return;
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Text_engraver,
/* descr */ "Create text-scripts",
/* creats*/ "TextScript",
virtual void finalize ();
virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
private:
Spanner *span_;
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Text_spanner_engraver,
/* descr */ "Create text spanner from a Music.",
/* creats*/ "TextSpanner",
Spanner *tie_column_;
protected:
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void derived_mark () const;
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music *);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
void typeset_tie (Grob *);
public:
TRANSLATOR_DECLARATIONS (Tie_engraver);
index_set_cell (her->get_property ("head-pair"), RIGHT, new_head_drul[RIGHT]->self_scm ());
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Tie_engraver,
/* descr */ "Generate ties between noteheads of equal pitch.",
/* creats*/ "Tie TieColumn",
bool ties_created_;
protected:
- virtual void stop_translation_timestep ();
- virtual void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
virtual void acknowledge_audio_element (Audio_element_info);
virtual bool try_music (Music *);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
public:
TRANSLATOR_DECLARATIONS (Tie_performer);
};
now_heads_.clear ();
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Tie_performer,
/* descr */ "Generate ties between noteheads of equal pitch.",
/* creats*/ "",
SCM last_time_fraction_;
protected:
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
public:
TRANSLATOR_DECLARATIONS (Time_signature_engraver);
};
time_signature_ = 0;
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Time_signature_engraver,
/* descr */ "Create a TimeSignature whenever @code{timeSignatureFraction} changes",
/* creats*/ "TimeSignature",
protected:
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
virtual void create_audio_elements ();
virtual void derived_mark () const;
SCM prev_fraction_;
}
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Time_signature_performer, "", "", "", "", "", "");
/*
- timing-engraver.cc -- implement Timing_engraver
+ timing-engraver.cc -- implement Default_bar_line_engraver
source file of the GNU LilyPond music typesetter
(c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-#include "timing-translator.hh"
#include "engraver.hh"
-
#include "context.hh"
#include "multi-measure-rest.hh"
#include "grob.hh"
#include "warn.hh"
-class Timing_engraver : public Timing_translator, public Engraver
+class Default_bar_line_engraver : public Engraver
{
protected:
/* Need to know whether we're advancing in grace notes, or not. */
Moment last_moment_;
- virtual void start_translation_timestep ();
- virtual void process_music ();
- virtual void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
public:
- TRANSLATOR_DECLARATIONS (Timing_engraver);
+ TRANSLATOR_DECLARATIONS (Default_bar_line_engraver);
};
-ADD_TRANSLATOR (Timing_engraver,
- /* descr */ " Responsible for synchronizing timing information from staves. "
- "Normally in @code{Score}. In order to create polyrhythmic music, "
- "this engraver should be removed from @code{Score} and placed in "
- "@code{Staff}. "
- "\n\nThis engraver adds the alias @code{Timing} to its containing context.",
+#include "translator.icc"
+
+ADD_TRANSLATOR (Default_bar_line_engraver,
+ "This engraver determines what kind of automatic bar lines should be produced, "
+ "and sets @code{whichBar} accordingly. It should be at the same "
+ "level as @ref{Timing_translator}. ",
/* creats*/ "",
/* accepts */ "",
/* acks */ "",
- /* reads */ "automaticBars whichBar barAlways defaultBarType "
- "skipBars timing measureLength measurePosition currentBarNumber",
- /* write */ "");
+ /* reads */
+ "measurePosition automaticBars whichBar barAlways defaultBarType "
+ "measureLength",
+ /* write */ "automaticBars");
-Timing_engraver::Timing_engraver ()
+Default_bar_line_engraver::Default_bar_line_engraver ()
{
last_moment_.main_part_ = Rational (-1);
}
void
-Timing_engraver::process_music ()
+Default_bar_line_engraver::start_translation_timestep ()
{
- Timing_translator::process_music ();
-
- bool start_of_measure = (last_moment_.main_part_ != now_mom ().main_part_
- && !measure_position ().main_part_);
-
- /*
- We can't do this in start_translation_timestep(), since time sig
- changes won't have happened by then.
- */
- if (start_of_measure)
- {
- Moment mlen = Moment (measure_length ());
- Grob * column = unsmob_grob (get_property ("currentCommandColumn"));
- if (column)
- column->set_property ("measure-length", mlen.smobbed_copy ());
- else
- programming_error("No command column?");
- }
-}
-
-void
-Timing_engraver::start_translation_timestep ()
-{
- Timing_translator::start_translation_timestep ();
-
SCM automatic_bars = get_property ("automaticBars");
Moment now = now_mom ();
SCM which = get_property ("whichBar");
if (!scm_is_string (which))
which = SCM_EOL;
- Moment mp = measure_position ();
+ Moment mp = measure_position (context ());
bool start_of_measure = (last_moment_.main_part_ != now.main_part_
&& !mp.main_part_);
}
void
-Timing_engraver::stop_translation_timestep ()
+Default_bar_line_engraver::stop_translation_timestep ()
{
- Timing_translator::stop_translation_timestep ();
context ()->set_property ("whichBar", SCM_EOL);
last_moment_ = now_mom ();
}
bool timb = to_boolean (tim);
if (timb && allbars)
{
- Moment barleft = (measure_length () - measure_position ());
+ Moment barleft = (measure_length () - measure_position (context ()));
Moment now = now_mom ();
if (barleft > Moment (0)
{
}
-Moment
-Timing_translator::measure_position () const
-{
- SCM sm = get_property ("measurePosition");
-
- Moment m = 0;
- if (unsmob_moment (sm))
- {
- m = *unsmob_moment (sm);
- while (m.main_part_ < Rational (0))
- m.main_part_ += measure_length ();
- }
-
- return m;
-}
void
Timing_translator::start_translation_timestep ()
context ()->set_property ("measurePosition", measposp.smobbed_copy ());
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Timing_translator,
"This engraver adds the alias "
- "@code{Timing} to its containing context.",
+ "@code{Timing} to its containing context."
+ "Responsible for synchronizing timing information from staves. "
+ "Normally in @code{Score}. In order to create polyrhythmic music, "
+ "this engraver should be removed from @code{Score} and placed in "
+ "@code{Staff}. "
+ "\n\nThis engraver adds the alias @code{Timing} to its containing context."
+
+ ,
"", "", "", "", "");
--- /dev/null
+/*
+ translator-group-ctors.cc -- implement Translator_group factory.
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+
+#include "score-engraver.hh"
+#include "score-performer.hh"
+#include "engraver-group-engraver.hh"
+#include "performer-group-performer.hh"
+#include "recording-group-engraver.hh"
+
+/*
+ Quick & dirty.
+ */
+Translator_group *
+get_translator_group (SCM sym)
+{
+ if (sym == ly_symbol2scm ("Engraver_group_engraver"))
+ return new Engraver_group_engraver ();
+ else if (sym == ly_symbol2scm ("Performer_group_performer"))
+ return new Performer_group_performer();
+ else if (sym == ly_symbol2scm ("Score_engraver"))
+ return new Score_engraver();
+ else if (sym == ly_symbol2scm ("Score_performer"))
+ return new Score_performer();
+ else if (sym == ly_symbol2scm ("Recording_group_engraver"))
+ return new Recording_group_engraver();
+
+ assert (0);
+ return 0;
+}
#include "main.hh"
#include "music.hh"
+
Translator_group *
Translator_group::get_daddy_translator () const
{
void
Translator_group::initialize ()
{
+ precompute_method_bindings ();
+
SCM tab = scm_make_vector (scm_int2num (19), SCM_BOOL_F);
context ()->set_property ("acceptHashTable", tab);
}
+void
+Translator_group::finalize ()
+{
+}
+
bool
translator_accepts_any_of (Translator *tr, SCM ifaces)
{
bool
Translator_group::try_music (Music *m)
{
- SCM tab = get_property ("acceptHashTable");
+ SCM tab = context ()->get_property ("acceptHashTable");
SCM name = scm_sloppy_assq (ly_symbol2scm ("name"),
m->get_property_alist (false));
void
-recurse_over_translators (Context *c, Translator_method ptr, Direction dir)
+precomputed_recurse_over_translators (Context *c, Translator_precompute_index idx, Direction dir)
{
Translator_group *tg
= dynamic_cast<Translator_group *> (c->implementation ());
if (dir == DOWN)
{
- translator_each (tg->get_simple_trans_list (),
- ptr);
+ tg->precomputed_translator_foreach (idx);
+ tg->call_precomputed_self_method (idx);
+ }
+
+ for (SCM s = c->children_contexts (); scm_is_pair (s);
+ s = scm_cdr (s))
+ {
+ precomputed_recurse_over_translators (unsmob_context (scm_car (s)), idx, dir);
+ }
+
+ if (dir == UP)
+ {
+ tg->precomputed_translator_foreach (idx);
+ tg->call_precomputed_self_method (idx);
+ }
+
+}
- (tg->*ptr) ();
+void
+recurse_over_translators (Context *c, Translator_method ptr, Translator_group_method tg_ptr, Direction dir)
+{
+ Translator_group *tg
+ = dynamic_cast<Translator_group *> (c->implementation ());
+
+ if (dir == DOWN)
+ {
+ (tg->*tg_ptr) ();
+ translator_each (tg->get_simple_trans_list (), ptr);
}
for (SCM s = c->children_contexts (); scm_is_pair (s);
s = scm_cdr (s))
{
- recurse_over_translators (unsmob_context (scm_car (s)), ptr, dir);
+ recurse_over_translators (unsmob_context (scm_car (s)), ptr, tg_ptr, dir);
}
if (dir == UP)
translator_each (tg->get_simple_trans_list (),
ptr);
- (tg->*ptr) ();
+ (tg->*tg_ptr) ();
}
}
Translator_group::Translator_group ()
{
simple_trans_list_ = SCM_EOL;
+ context_ = 0;
+ smobify_self ();
}
void
Translator_group::derived_mark () const
{
- scm_gc_mark (simple_trans_list_);
}
+
+
+void
+Translator_group::precompute_method_bindings ()
+{
+ for (SCM s = simple_trans_list_; scm_is_pair (s); s = scm_cdr (s))
+ {
+ Translator *tr = unsmob_translator (scm_car (s));
+ Translator_void_method_ptr ptrs[TRANSLATOR_METHOD_PRECOMPUTE_COUNT];
+ tr->fetch_precomputable_methods (ptrs);
+
+ assert (tr);
+ for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++)
+ {
+ if (ptrs[i])
+ {
+ precomputed_method_bindings_[i].push (Translator_method_binding (tr, ptrs[i]));
+ }
+ }
+ }
+
+ fetch_precomputable_methods (precomputed_self_method_bindings_);
+}
+
+void
+Translator_group::precomputed_translator_foreach (Translator_precompute_index idx)
+{
+ Array<Translator_method_binding> &bindings(precomputed_method_bindings_[idx]);
+ for (int i = 0; i < bindings.size (); i++)
+ {
+ bindings[i].invoke ();
+ }
+}
+
+void
+Translator_group::fetch_precomputable_methods (Translator_group_void_method ptrs[])
+{
+ for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++)
+ ptrs[i] = 0;
+}
+
+void
+Translator_group::call_precomputed_self_method (Translator_precompute_index idx)
+{
+ if (precomputed_self_method_bindings_[idx])
+ (*precomputed_self_method_bindings_[idx])(this);
+}
+
+
+Translator_group::~Translator_group ()
+{
+}
+
+#include "ly-smobs.icc"
+
+IMPLEMENT_SMOBS (Translator_group);
+IMPLEMENT_DEFAULT_EQUAL_P (Translator_group);
+IMPLEMENT_TYPE_P (Translator_group, "ly:translator-group?");
+
+
+int
+Translator_group::print_smob (SCM s, SCM port, scm_print_state *)
+{
+ Translator_group *me = (Translator_group *) SCM_CELL_WORD_1 (s);
+ scm_puts ("#<Translator_group ", port);
+ scm_puts (classname (me), port);
+ scm_display (me->simple_trans_list_, port);
+ scm_puts (" >", port);
+ return 1;
+}
+
+
+SCM
+Translator_group::mark_smob (SCM smob)
+{
+ Translator_group *me = (Translator_group*)SCM_CELL_WORD_1 (smob);
+
+ me->derived_mark ();
+
+ return me->simple_trans_list_;
+}
+
return tr->translator_description ();
}
-int
-Translator::print_smob (SCM s, SCM port, scm_print_state *)
-{
- Translator *me = (Translator *) SCM_CELL_WORD_1 (s);
- scm_puts ("#<Translator ", port);
- scm_puts (classname (me), port);
- scm_puts (" >", port);
- return 1;
-}
-
#include "context-def.hh"
#include "global-context.hh"
+#include "translator.icc"
#include "ly-smobs.icc"
Translator::~Translator ()
smobify_self ();
}
+
void
-Translator::do_announces ()
+Translator::process_music ()
{
}
void
-Translator::process_music ()
+Translator::process_acknowledged ()
{
}
Translator::derived_mark () const
{
}
+
+void
+Translator::fetch_precomputable_methods (Translator_void_method_ptr ptrs[])
+{
+ for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++)
+ ptrs[i] = 0;
+}
+
+int
+Translator::print_smob (SCM s, SCM port, scm_print_state *)
+{
+ Translator *me = (Translator *) SCM_CELL_WORD_1 (s);
+ scm_puts ("#<Translator ", port);
+ scm_puts (classname (me), port);
+ scm_puts (" >", port);
+ return 1;
+}
+
#include "side-position-interface.hh"
#include "engraver.hh"
+#include "translator.icc"
+
class Trill_spanner_engraver : public Engraver
{
public:
virtual void finalize ();
virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music *);
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
private:
Spanner *span_;
#include "engraver.hh"
#include "spanner.hh"
+#include "translator.icc"
+
struct Tuplet_description
{
Music *music_;
virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music *r);
- virtual void start_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void start_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
};
bool
#include "translator.hh"
#include "music.hh"
-class Skip_event_swallow_translator : public virtual Translator
+#include "translator.icc"
+
+class Skip_event_swallow_translator : public Translator
{
protected:
virtual bool try_music (Music *) { return true; }
TRANSLATOR_DECLARATIONS (Skip_event_swallow_translator);
};
-class Rest_swallow_translator : public virtual Translator
+class Rest_swallow_translator : public Translator
{
protected:
virtual bool try_music (Music *) { return true; }
"");
-class Note_swallow_translator : public virtual Translator
+class Note_swallow_translator : public Translator
{
protected:
virtual bool try_music (Music *) { return true; }
TRANSLATOR_DECLARATIONS (Note_swallow_translator);
};
-Note_swallow_translator::Note_swallow_translator (){}
+Note_swallow_translator::Note_swallow_translator ()
+{
+}
ADD_TRANSLATOR (Note_swallow_translator,
"Swallow notes",
#include "output-def.hh"
#include "paper-column.hh"
+#include "translator.icc"
+
/*
* This class implements the notation specific aspects of Vaticana
* style ligatures for Gregorian chant notation.
#include "pointer-group-interface.hh"
#include "grob-array.hh"
+#include "translator.icc"
+
class Vertical_align_engraver : public Engraver
{
Spanner *valign_;
protected:
virtual void derived_mark () const;
virtual void acknowledge_grob (Grob_info);
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void process_music ();
virtual void finalize ();
virtual void initialize ();
};
--- /dev/null
+/*
+ vertically-spaced-contexts-engraver.cc -- implement Vertically_spaced_contexts_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#include "engraver.hh"
+#include "grob.hh"
+#include "axis-group-interface.hh"
+#include "context.hh"
+#include "pointer-group-interface.hh"
+
+class Vertically_spaced_contexts_engraver : public Engraver
+{
+ TRANSLATOR_DECLARATIONS(Vertically_spaced_contexts_engraver);
+protected:
+ virtual void acknowledge_grob (Grob_info);
+ virtual void initialize ();
+
+private:
+ Grob * system_;
+};
+
+
+
+Vertically_spaced_contexts_engraver::Vertically_spaced_contexts_engraver ()
+{
+ system_ = 0;
+}
+
+void
+Vertically_spaced_contexts_engraver::initialize ()
+{
+ system_ = unsmob_grob (get_property ("rootSystem"));
+}
+
+void
+Vertically_spaced_contexts_engraver::acknowledge_grob (Grob_info gi)
+{
+ if (Axis_group_interface::has_interface (gi.grob ())
+ && gi.grob ()->internal_has_interface (ly_symbol2scm ("vertically-spaceable-interface")))
+ {
+ SCM spaceable = get_property ("verticallySpacedContexts");
+ Context *orig = gi.origin_contexts (this)[0];
+
+ if (scm_memq (ly_symbol2scm (orig->context_name ().to_str0 ()),
+ spaceable) != SCM_BOOL_F)
+ {
+ Pointer_group_interface::add_grob (system_,
+ ly_symbol2scm ("spaceable-staves"),
+ gi.grob ());
+ }
+ }
+}
+
+#include "translator.icc"
+
+ADD_TRANSLATOR (Vertically_spaced_contexts_engraver,
+ /* descr */ "",
+ /* creats*/ "",
+ /* accepts */ "",
+ /* acks */ "axis-group-interface",
+ /* reads */ "verticallySpacedContexts",
+ /* write */ "verticallySpacedContexts");
#include "warn.hh"
#include "staff-symbol.hh"
+#include "translator.icc"
+
/*
Create Volta spanners, by reading repeatCommands property, usually
set by Unfolded_repeat_iterator.
virtual void acknowledge_grob (Grob_info);
virtual void finalize ();
- virtual void stop_translation_timestep ();
- virtual void process_music ();
+ PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+ PRECOMPUTED_VIRTUAL void process_music ();
Moment started_mom_;
Spanner *volta_span_;
not contained in any other context). It is instantiated
automatically when an output definition (a @code{\score} or
@code{\layout} block) is processed."
-
+
+
+ \consists "Paper_column_engraver"
+ \consists "Vertically_spaced_contexts_engraver"
\consists "Repeat_acknowledge_engraver"
\consists "Staff_collecting_engraver"
%% move the alias along with the engraver.
- \consists "Timing_engraver"
-
+ \consists "Timing_translator"
+ \consists "Default_bar_line_engraver"
\consists "Output_property_engraver"
\consists "System_start_delimiter_engraver"
\consists "Mark_engraver"
% setup for Request->Element conversion. Guru-only
%
\context {
- \type "Staff_performer"
+ \type "Performer_group_performer"
\name Staff
\accepts Voice
-
+
+ \consists "Staff_performer"
\consists "Key_performer"
\consists "Tempo_performer"
\consists "Time_signature_performer"
\context {
- \type "Staff_performer" % Performer_group_performer ?
+ \type "Performer_group_performer"
+ \consists "Staff_performer" % Performer_group_performer ?
\consists "Lyric_performer"
\name Lyrics
\consists "Time_signature_performer"
(defaultBarType ,string? "Sets the default type of bar line.
See @code{whichBar} for information on available bar types.
-This variable is read by @internalsref{Timing_engraver} at
+This variable is read by @internalsref{Timing_translator} at
@internalsref{Score} level.
")
(printKeyCancellation ,boolean? "Print restoration alterations before a key signature change. ")
(printPartCombineTexts ,boolean? "set Solo/A due texts in the part combiner?")
(printOctaveNames ,boolean? "Print octave marks for the NoteNames context.")
- (recordEventSequence ,procedure? "When
-@internalsref{Recording_group_engraver} is in this context, then upon
-termination of the context, this function is called with current
-context and a list of music objects. The list of contains entries
-with start times, music objects and whether they are processed in this
-context.")
-
+ (recordEventSequence ,procedure? "When Recording_group_engraver
+is in this context, then upon termination of the context, this
+function is called with current context and a list of music objects.
+The list of contains entries with start times, music objects and
+whether they are processed in this context.")
(rehearsalMark ,integer? "The last rehearsal mark printed.")
(repeatCommands ,list? "This property is read to find any command of the form @code{(volta . @var{x})}, where @var{x} is a string or @code{#f}")
(inside-slur . #t)
(cautionary-style . parentheses)
(after-line-breaking-callback . ,Accidental_interface::after_line_breaking)
- (meta . ((interfaces . (item-interface accidental-interface
+ (meta . ((class . Item)
+ (interfaces . (accidental-interface
font-interface))))
))
;; this is quite small, but it is very ugly to have
;; accs closer to the previous note than to the next one.
(right-padding . 0.15)
- (meta . ((interfaces . (item-interface accidental-placement-interface))))
+ (meta . ((class . Item)
+ (interfaces . (accidental-placement-interface))))
))
(Ambitus
. (
(breakable . #t)
(break-align-symbol . ambitus)
(break-visibility . ,begin-of-line-visible)
- (meta . ((interfaces . (axis-group-interface
- break-aligned-interface ambitus-interface item-interface))))
+ (meta . ((class . Item)
+ (interfaces . (axis-group-interface
+ break-aligned-interface ambitus-interface))))
))
(AmbitusLine
. (
- (print-function . ,Ambitus::print)
- (join-heads . #t)
- (thickness . 2)
- (X-offset-callbacks . (,Self_alignment_interface::centered_on_parent))
+ (print-function . ,Ambitus::print)
+ (join-heads . #t)
+ (thickness . 2)
+ (X-offset-callbacks . (,Self_alignment_interface::centered_on_parent))
- (meta . ((interfaces . (ambitus-interface staff-symbol-referencer-interface item-interface font-interface))))
- ))
+ (meta . ((class . Item)
+ (interfaces . (ambitus-interface staff-symbol-referencer-interface font-interface))))
+ ))
(AmbitusAccidental
. (
(print-function . ,Accidental_interface::print)
(direction . -1)
(cautionary-style . parentheses)
(after-line-breaking-callback . ,Accidental_interface::after_line_breaking)
- (meta . ((interfaces . (item-interface
+ (meta . ((class . Item)
+ (interfaces . (item-interface
accidental-interface break-aligned-interface
side-position-interface font-interface))))
))
(print-function . ,Note_head::print)
(glyph-name-procedure . ,find-notehead-symbol)
(Y-offset-callbacks . (,Staff_symbol_referencer::callback))
- (meta . ((interfaces . (font-interface note-head-interface
+ (meta . ((class . Item)
+ (interfaces . (font-interface note-head-interface
ambitus-interface
staff-symbol-referencer-interface
rhythmic-head-interface
ledgered-interface
- item-interface ))))
+ ))))
))
(Arpeggio
(direction . -1)
(padding . 0.5)
(staff-position . 0.0)
- (meta . ((interfaces . (arpeggio-interface
+ (meta . ((class . Item)
+ (interfaces . (arpeggio-interface
staff-symbol-referencer-interface side-position-interface
- item-interface font-interface))))
+ font-interface))))
))
(BarLine
(thin-kern . 3.0)
(hair-thickness . 1.9)
(thick-thickness . 6.0)
- (meta . ((interfaces . (bar-line-interface
- item-interface break-aligned-interface font-interface))))
+ (meta . ((class . Item)
+ (interfaces . (bar-line-interface
+ break-aligned-interface font-interface))))
))
(self-alignment-X . 1)
(meta .
- ((interfaces . (side-position-interface
+ ((class . Item)
+ (interfaces . (side-position-interface
text-interface
self-alignment-interface
- font-interface item-interface break-aligned-interface))))
+ font-interface break-aligned-interface))))
- ))
+ ))
(BassFigure
. (
;; layout16 become too small.
(font-size . -4)
(kern . 0.2)
- (meta . ((interfaces . (text-interface
- rhythmic-grob-interface bass-figure-interface item-interface
+ (meta . ((class . Item)
+ (interfaces . (text-interface
+ rhythmic-grob-interface bass-figure-interface
self-alignment-interface font-interface))))
))
(Beam
,Beam::slope_damping
,Beam::shift_region_to_valid
,Beam::quanting
- ))
+ ))
;; TODO: should be in SLT.
(thickness . 0.48) ; in staff-space
(font-family . roman)
(space-function . ,Beam::space_function)
- (meta . ((interfaces . (staff-symbol-referencer-interface beam-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (staff-symbol-referencer-interface beam-interface))))
))
(BreakAlignment
clef staff-bar key-cancellation key-signature
time-signature custos)
- ; unbroken
+ ; unbroken
(instrument-name left-edge ambitus breathing-sign
clef staff-bar key-cancellation key-signature
staff
time-signature custos)
- ; begin of line
+ ; begin of line
(instrument-name left-edge ambitus breathing-sign
clef key-cancellation key-signature staff-bar
time-signature custos)
))
(axes . (0))
(X-extent-callback . ,Axis_group_interface::group_extent_callback)
- (meta . ((interfaces . (break-alignment-interface item-interface axis-group-interface)))))
- )
+ (meta . ((class . Item)
+ (interfaces . (break-alignment-interface axis-group-interface)))))
+ )
(BreakAlignGroup
. (
(axes . (0))
(X-offset-callbacks . (,Break_align_interface::alignment_callback))
(X-extent-callback . ,Axis_group_interface::group_extent_callback)
- (meta . ((interfaces . (break-aligned-interface item-interface axis-group-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (break-aligned-interface axis-group-interface ))))
))
(BreathingSign
(text . ,(make-musicglyph-markup "scripts.rcomma"))
(Y-offset-callbacks . (,Breathing_sign::offset_callback))
(break-visibility . ,begin-of-line-invisible)
- (meta . ((interfaces . (break-aligned-interface breathing-sign-interface text-interface font-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (break-aligned-interface
+ breathing-sign-interface text-interface font-interface ))))
))
(Clef
(right-edge . (extra-space . 0.5))
))
(Y-offset-callbacks . (,Staff_symbol_referencer::callback))
- (meta . ((interfaces . (clef-interface
+ (meta . ((class . Item)
+ (interfaces . (clef-interface
staff-symbol-referencer-interface font-interface
- break-aligned-interface item-interface ))))
+ break-aligned-interface ))))
))
(ClusterSpannerBeacon
. (
(print-function . #f)
(Y-extent-callback . ,Cluster_beacon::height)
- (meta . ((interfaces . (cluster-beacon-interface item-interface))))
+ (meta . ((class . Item)
+ (interfaces . (cluster-beacon-interface))))
))
(ClusterSpanner
(minimum-length . 0.0)
(padding . 0.25)
(style . ramp)
- (meta . ((interfaces . (cluster-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (cluster-interface))))
))
(word-space . 0.0)
(font-family . sans)
(font-size . 1.5)
- (meta . ((interfaces . (font-interface
+ (meta . ((class . Item)
+ (interfaces . (font-interface
rhythmic-grob-interface text-interface chord-name-interface
item-interface))))
))
;; todo: add X self alignment?
(baseline-skip . 2)
(font-series . bold)
- (meta . ((interfaces . (text-script-interface
+ (meta . ((class . Item)
+ (interfaces . (text-script-interface
text-interface side-position-interface
- font-interface item-interface ))))
+ font-interface ))))
))
(Custos
(first-note . (minimum-fixed-space . 0.0))
(right-edge . (extra-space . 0.1))
))
- (meta . ((interfaces
+ (meta . ((class . Item)
+ (interfaces
. (custos-interface staff-symbol-referencer-interface
font-interface
- break-aligned-interface item-interface ))))
+ break-aligned-interface ))))
))
(DotColumn
(direction . ,RIGHT)
(X-extent-callback . ,Axis_group_interface::group_extent_callback)
(X-offset-callbacks . (,Dot_column::side_position))
- (meta . ((interfaces . (dot-column-interface axis-group-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (dot-column-interface axis-group-interface ))))
))
(Dots
. (
(print-function . ,Dots::print)
(dot-count . 1)
- (meta . ((interfaces . (font-interface
- staff-symbol-referencer-interface dots-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (font-interface
+ staff-symbol-referencer-interface dots-interface ))))
))
(DoublePercentRepeat
(thickness . 0.48)
(break-align-symbol . staff-bar)
(break-visibility . ,begin-of-line-invisible)
- (meta . ((interfaces . (font-interface
+ (meta . ((class . Item)
+ (interfaces . (font-interface
break-aligned-interface
- percent-repeat-interface item-interface ))))
+ percent-repeat-interface ))))
))
(DynamicText
(font-encoding . fetaDynamic)
(font-shape . italic)
(self-alignment-Y . 0)
- (meta . ((interfaces . (font-interface text-interface self-alignment-interface
- dynamic-interface script-interface item-interface))))
+ (meta . ((class . Item)
+ (interfaces . (font-interface text-interface self-alignment-interface
+ dynamic-interface script-interface))))
))
+
(DynamicTextSpanner
. ((print-function . ,Dynamic_text_spanner::print)
-
-;; rather ugh with NCSB
-; (font-series . bold)
+
+ ;; rather ugh with NCSB
+ ; (font-series . bold)
(font-shape . italic)
(style . dashed-line)
- ; need to blend with dynamic texts.
+ ; need to blend with dynamic texts.
(font-size . 1)
(bound-padding . 0.75)
(dash-fraction . 0.2)
(dash-period . 3.0)
- (meta . ((interfaces . (font-interface
+ (meta . ((class . Spanner)
+ (interfaces . (font-interface
text-interface
dynamic-interface dynamic-text-spanner-interface
- item-interface))))
- ))
+ spanner-interface))))
+ ))
(DynamicLineSpanner
. (
(minimum-space . 1.2)
(direction . -1)
- (meta . ((interfaces . (dynamic-interface axis-group-interface
- side-position-interface spanner-interface))))))
+ (meta . ((class . Spanner)
+ (interfaces . (dynamic-interface axis-group-interface
+ side-position-interface))))))
(Fingering
. (
(print-function . ,Text_interface::print)
- ; sync with TextScript (?)
+ ; sync with TextScript (?)
(padding . 0.5)
(staff-padding . 0.5)
(self-alignment-X . 0)
(script-priority . 100)
(font-encoding . fetaNumber)
(font-size . -5) ; don't overlap when next to heads.
- (meta . ((interfaces . (finger-interface
+ (meta . ((class . Item)
+ (interfaces . (finger-interface
font-interface text-script-interface text-interface
side-position-interface self-alignment-interface
item-interface))))
(Y-extent-callback . #f)
(after-line-breaking-callback . ,Line_spanner::after_line_breaking)
(print-function . ,Line_spanner::print)
- (meta . ((interfaces . (line-interface line-spanner-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (line-interface line-spanner-interface))))
))
(GridPoint
. (
(X-extent . (0 . 0))
(Y-extent . (0 . 0))
- (meta . ((interfaces . (grid-point-interface))))
+ (meta . ((class . Item)
+ (interfaces . (grid-point-interface))))
))
(GridLine
(X-offset-callbacks . (,Self_alignment_interface::aligned_on_self
,Self_alignment_interface::centered_on_parent))
(layer . 0)
- (meta . ((interfaces . (self-alignment-interface grid-line-interface)))
- )))
-
+ (meta . ((class . Spanner)
+ (interfaces . (self-alignment-interface grid-line-interface)))
+ )))
+
(Hairpin
. (
(print-function . ,Hairpin::print)
(bound-padding . 1.0)
(self-alignment-Y . 0)
(Y-offset-callbacks . (,Self_alignment_interface::aligned_on_self))
- (meta . ((interfaces . (hairpin-interface
+ (meta . ((class . Spanner)
+ (interfaces . (hairpin-interface
line-interface self-alignment-interface dynamic-interface
spanner-interface))))
))
(staff-padding . 0.2)
(direction . -1)
(bracket-flare . (0.5 . 0.5))
- (meta . ((interfaces . (horizontal-bracket-interface
+ (meta . ((class . Spanner)
+ (interfaces . (horizontal-bracket-interface
side-position-interface
line-interface
spanner-interface))))
(break-align-symbol . instrument-name)
(break-visibility . ,begin-of-line-visible)
(baseline-skip . 2)
- (meta . ((interfaces . (font-interface
+ (meta . ((class . Item)
+ (interfaces . (font-interface
self-alignment-interface side-position-interface text-interface
- break-aligned-interface item-interface ))))
+ break-aligned-interface ))))
))
(KeyCancellation
(break-visibility . ,begin-of-line-invisible)
(breakable . #t)
- (meta . ((interfaces . (key-signature-interface font-interface
- break-aligned-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (key-signature-interface font-interface
+ break-aligned-interface ))))
))
(KeySignature
. (
(break-visibility . ,begin-of-line-visible)
(breakable . #t)
- (meta . ((interfaces . (key-signature-interface font-interface
- break-aligned-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (key-signature-interface font-interface
+ break-aligned-interface ))))
))
(LedgerLineSpanner
. (
(spacing-procedure . ,Ledger_line_spanner::set_spacing_rods)
(print-function . ,Ledger_line_spanner::print)
(layer . 0)
- (meta . ((interfaces . (spanner-interface ledger-line-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (ledger-line-interface))))
))
(LeftEdge
(key-cancellation . (extra-space . 0.0))
))
- (meta . ((interfaces . (break-aligned-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (break-aligned-interface ))))
))
(LigatureBracket
(before-line-breaking-callback . ,Tuplet_bracket::before_line_breaking)
(after-line-breaking-callback . ,Tuplet_bracket::after_line_breaking)
(print-function . ,Tuplet_bracket::print)
- (meta . ((interfaces . (tuplet-bracket-interface line-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (tuplet-bracket-interface line-interface))))
))
(LyricHyphen
(length . 0.66)
(minimum-length . 0.3)
(padding . 0.07)
-; (spacing-procedure . ,Hyphen_spanner::set_spacing_rods)
+ ; (spacing-procedure . ,Hyphen_spanner::set_spacing_rods)
(print-function . ,Hyphen_spanner::print)
(Y-extent . (0 . 0))
- (meta . ((interfaces . (lyric-interface lyric-hyphen-interface
+ (meta . ((class . Spanner)
+ (interfaces . (lyric-interface lyric-hyphen-interface
spanner-interface))))
))
(thickness . 0.8) ; linethickness
(minimum-length . 1.5)
(Y-extent . (0 . 0))
- (meta . ((interfaces . (lyric-interface
- lyric-extender-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (lyric-interface
+ lyric-extender-interface))))
))
(LyricText
(word-space . 0.6)
(font-series . bold-narrow)
(font-size . 1.0)
- (meta . ((interfaces . (rhythmic-grob-interface
+ (meta . ((class . Item)
+ (interfaces . (rhythmic-grob-interface
lyric-syllable-interface
self-alignment-interface text-interface
- font-interface item-interface ))))
+ font-interface ))))
))
(MensuralLigature
(flexa-width . 2.0)
(ligature-primitive-callback . ,Mensural_ligature::brew_ligature_primitive)
(print-function . ,Mensural_ligature::print)
- (meta . ((interfaces . (mensural-ligature-interface font-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (mensural-ligature-interface font-interface))))
))
- (MetronomeMark
+ (MetronomeMark
. (
(print-function . ,Text_interface::print)
(Y-offset-callbacks . (,Side_position_interface::aligned_side))
(direction . 1)
(padding . 0.8)
- (meta . ((interfaces . (text-interface
+ (meta . ((class . Item)
+ (interfaces . (text-interface
side-position-interface font-interface
- metronome-mark-interface item-interface))))
+ metronome-mark-interface))))
))
(MeasureGrouping
. (
(thickness . 1)
(height . 2.0)
(staff-padding . 3)
- (meta . ((interfaces . (spanner-interface side-position-interface
+ (meta . ((class . Spanner)
+ (interfaces . (side-position-interface
measure-grouping-interface))))
))
(MultiMeasureRest
(thick-thickness . 6.6)
(hair-thickness . 2.0)
(padding . 1)
- (meta . ((interfaces . (multi-measure-rest-interface
+ (meta . ((class . Spanner)
+ (interfaces . (multi-measure-rest-interface
multi-measure-interface rest-interface
font-interface staff-symbol-referencer-interface))))
))
(padding . 0.4)
(staff-padding . 0.4)
(font-encoding . fetaNumber)
- (meta . ((interfaces . (side-position-interface
+ (meta . ((class . Spanner)
+ (interfaces . (side-position-interface
multi-measure-interface self-alignment-interface
- font-interface spanner-interface text-interface))))
+ font-interface text-interface))))
))
(MultiMeasureRestText
. (
(direction . 1)
(padding . 0.2)
(staff-padding . 0.25)
- (meta . ((interfaces . (side-position-interface
+ (meta . ((class . Spanner)
+ (interfaces . (side-position-interface
multi-measure-interface self-alignment-interface font-interface
- spanner-interface text-interface))))
+ text-interface))))
))
(NoteCollision
(axes . (0 1))
(X-extent-callback . ,Axis_group_interface::group_extent_callback)
(Y-extent-callback . ,Axis_group_interface::group_extent_callback)
- (meta . ((interfaces . (note-collision-interface axis-group-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (note-collision-interface axis-group-interface ))))
))
(NoteColumn
(axes . (0 1))
(X-extent-callback . ,Axis_group_interface::group_extent_callback)
(Y-extent-callback . ,Axis_group_interface::group_extent_callback)
- (meta . ((interfaces . (axis-group-interface note-column-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (axis-group-interface note-column-interface ))))
))
(NoteHead
(glyph-name-procedure . ,find-notehead-symbol)
(Y-offset-callbacks . (,Staff_symbol_referencer::callback))
(stem-attachment-function . ,note-head-style->attachment-coordinates)
- (meta . ((interfaces . (rhythmic-grob-interface
+ (meta . ((class . Item)
+ (interfaces . (rhythmic-grob-interface
rhythmic-head-interface font-interface note-head-interface
ledgered-interface
- staff-symbol-referencer-interface item-interface ))))
+ staff-symbol-referencer-interface ))))
))
(NoteSpacing
;; If you ever change this back, please document! --hwn
(knee-spacing-correction . 1.0)
- (meta . ((interfaces . (spacing-interface note-spacing-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (spacing-interface note-spacing-interface ))))
))
(NoteName
. (
(print-function . ,Text_interface::print)
- (meta . ((interfaces . (note-name-interface
- text-interface font-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (note-name-interface
+ text-interface font-interface ))))
))
(OctavateEight
(padding . 0.6)
(staff-padding . 0.2)
(font-size . -4)
- (meta . ((interfaces . (text-interface self-alignment-interface side-position-interface font-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (text-interface self-alignment-interface side-position-interface font-interface ))))
))
(OttavaBracket
(dash-fraction . 0.3)
(edge-height . (0 . 1.2))
(direction . 1)
- (meta . ((interfaces . (ottava-bracket-interface
+ (meta . ((class . Spanner)
+ (interfaces . (ottava-bracket-interface
line-interface side-position-interface
- font-interface text-interface spanner-interface))))
+ font-interface text-interface))))
))
(PaperColumn
(X-extent-callback . ,Axis_group_interface::group_extent_callback)
;; debugging
-;; (print-function . ,Paper_column::print) (font-size . -6) (font-name . "sans") (Y-extent-callback . #f)
- (meta . ((interfaces . (paper-column-interface axis-group-interface spaceable-grob-interface item-interface ))))
+ ;; (print-function . ,Paper_column::print) (font-size . -6) (font-name . "sans") (Y-extent-callback . #f)
+ (meta . ((class . Paper_column)
+ (interfaces . (paper-column-interface axis-group-interface spaceable-grob-interface ))))
))
(PhrasingSlur
(Y-extent-callback . ,Slur::height)
(height-limit . 2.0)
(ratio . 0.333)
- (meta . ((interfaces . (slur-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (slur-interface))))
))
(NonMusicalPaperColumn
(breakable . #t)
;; debugging stuff: print column number.
-;; (print-function . ,Paper_column::print) (font-size . -6) (font-name . "sans") (Y-extent-callback . #f)
+ ;; (print-function . ,Paper_column::print) (font-size . -6) (font-name . "sans") (Y-extent-callback . #f)
- (meta . ((interfaces . (paper-column-interface axis-group-interface spaceable-grob-interface item-interface ))))
+ (meta . ((class . Paper_column)
+ (interfaces . (paper-column-interface axis-group-interface spaceable-grob-interface ))))
))
(PercentRepeat
(slope . 1.0)
(thickness . 0.48)
(font-encoding . fetaMusic)
- (meta . ((interfaces . (multi-measure-rest-interface spanner-interface font-interface percent-repeat-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (multi-measure-rest-interface
+ font-interface percent-repeat-interface))))
))
;; an example of a text spanner
(edge-height . (1.0 . 1.0))
(shorten-pair . (0.0 . 0.0))
(thickness . 1.0)
- (meta . ((interfaces . (line-interface
- piano-pedal-interface piano-pedal-bracket-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (line-interface
+ piano-pedal-interface piano-pedal-bracket-interface))))
))
(RehearsalMark
(baseline-skip . 2)
(break-visibility . ,end-of-line-invisible)
(padding . 0.8)
- (meta . ((interfaces . (text-interface
+ (meta . ((class . Item)
+ (interfaces . (text-interface
side-position-interface font-interface mark-interface
- self-alignment-interface item-interface ))))
+ self-alignment-interface ))))
))
(Y-offset-callbacks . (,Hara_kiri_group_spanner::force_hara_kiri_callback))
(Y-extent-callback . ,Hara_kiri_group_spanner::y_extent)
(axes . (1))
- (meta . ((interfaces . (axis-group-interface
+ (meta . ((class . Spanner)
+ (interfaces . (axis-group-interface
vertically-spaceable-interface hara-kiri-group-interface
- item-interface spanner-interface))))
+ spanner-interface))))
))
(RepeatSlash
(print-function . ,Percent_repeat_item_interface::beat_slash)
(thickness . 0.48)
(slope . 1.7)
- (meta . ((interfaces . (percent-repeat-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (percent-repeat-interface ))))
))
(Rest
. (
,Rest::polyphonic_offset_callback
))
(minimum-distance . 0.25)
- (meta . ((interfaces . (font-interface
+ (meta . ((class . Item)
+ (interfaces . (font-interface
rhythmic-head-interface
rhythmic-grob-interface
staff-symbol-referencer-interface
- rest-interface item-interface ))
- ))))
+ rest-interface ))
+ ))))
(RestCollision
. (
(minimum-distance . 0.75)
- (meta . ((interfaces . (rest-collision-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (rest-collision-interface ))))
))
(Script
(X-offset-callbacks . (,Self_alignment_interface::centered_on_parent))
(before-line-breaking-callback . ,Script_interface::before_line_breaking)
(font-encoding . fetaMusic)
- (meta . ((interfaces . (script-interface
- side-position-interface font-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (script-interface
+ side-position-interface font-interface ))))
))
(ScriptColumn
. (
(before-line-breaking-callback . ,Script_column::before_line_breaking)
- (meta . ((interfaces . (script-column-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (script-column-interface ))))
))
. (
(X-extent-callback . #f)
(Y-extent-callback . #f)
- (meta . ((interfaces . (spacing-interface separation-item-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (spacing-interface separation-item-interface ))))
))
(SeparatingGroupSpanner
. (
(spacing-procedure . ,Separating_group_spanner::set_spacing_rods)
- (meta . ((interfaces . (only-prebreak-interface spacing-interface separation-spanner-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (only-prebreak-interface spacing-interface separation-spanner-interface))))
))
(Slur
; Slur::height)
(height-limit . 2.0)
(ratio . 0.25)
- (meta . ((interfaces . (slur-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (slur-interface))))
))
(SpacingSpanner
(shortest-duration-space . 2.0)
(spacing-increment . 1.2)
(base-shortest-duration . ,(ly:make-moment 3 16))
- (meta . ((interfaces . (spacing-interface spacing-spanner-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (spacing-interface spacing-spanner-interface))))
))
(SpanBar
(thin-kern . 3.0)
(hair-thickness . 1.6)
(thick-thickness . 6.0)
- (meta . ((interfaces . (span-bar-interface font-interface
- bar-line-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (span-bar-interface font-interface
+ bar-line-interface ))))
))
(StanzaNumber
(padding . 1.0)
(X-offset-callbacks . (,Side_position_interface::aligned_side))
(direction . ,LEFT)
- (meta . ((interfaces . (side-position-interface
- stanza-number-interface text-interface font-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (side-position-interface
+ stanza-number-interface text-interface font-interface ))))
))
(StringNumber
(script-priority . 100)
(font-encoding . fetaNumber)
(font-size . -5) ; don't overlap when next to heads.
- (meta . ((interfaces . (string-number-interface
+ (meta . ((class . Item)
+ (interfaces . (string-number-interface
font-interface text-script-interface text-interface
side-position-interface self-alignment-interface
item-interface))))
(breakable . #t)
(stem-spacing-correction . 0.4)
- (meta . ((interfaces . (spacing-interface staff-spacing-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (spacing-interface staff-spacing-interface ))))
))
(SostenutoPedal
(padding . 0.0) ;; padding relative to SostenutoPedalLineSpanner
(font-shape . italic)
(self-alignment-X . 0)
- (meta . ((interfaces . (text-interface
- self-alignment-interface font-interface item-interface))))
+ (meta . ((class . Item)
+ (interfaces . (text-interface
+ self-alignment-interface font-interface))))
))
(SostenutoPedalLineSpanner
(padding . 1.2)
(minimum-space . 1.0)
(direction . -1)
- (meta . ((interfaces . (piano-pedal-interface
- axis-group-interface side-position-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (piano-pedal-interface
+ axis-group-interface side-position-interface))))
))
(StaffSymbol
(line-count . 5)
(ledger-line-thickness . (1.0 . 0.1))
(layer . 0)
- (meta . ((interfaces . (staff-symbol-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (staff-symbol-interface))))
))
-
+
(Stem
. (
;; this list is rather long. Trim --hwn
;; The 'normal' minima
(beamed-minimum-free-lengths . (1.83 1.5 1.25))
- ;(beamed-minimum-free-lengths . (2.0 1.83 1.25))
+ ;(beamed-minimum-free-lengths . (2.0 1.83 1.25))
;; The 'extreme case' minima
(beamed-extreme-minimum-free-lengths . (2.0 1.25))
(X-extent-callback . ,Stem::width_callback)
(Y-extent-callback . ,Stem::height)
(Y-offset-callbacks . (,Staff_symbol_referencer::callback))
- (meta . ((interfaces . (stem-interface font-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (stem-interface font-interface ))))
))
(StemTremolo
(beam-width . 1.6) ; staff-space
(beam-thickness . 0.48) ; staff-space
- (meta . ((interfaces . (stem-tremolo-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (stem-tremolo-interface ))))
))
(SustainPedal
(direction . 1)
(padding . 0.0) ;; padding relative to SustainPedalLineSpanner
(X-offset-callbacks . (,Self_alignment_interface::aligned_on_self))
- (meta . ((interfaces . (piano-pedal-interface
+ (meta . ((class . Item)
+ (interfaces . (piano-pedal-interface
text-spanner-interface text-interface self-alignment-interface
- font-interface item-interface))))
+ font-interface))))
))
(SustainPedalLineSpanner
(staff-padding . 1.2)
(minimum-space . 1.0)
(direction . -1)
- (meta . ((interfaces . (piano-pedal-interface
- axis-group-interface side-position-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (piano-pedal-interface
+ axis-group-interface side-position-interface))))
))
(System
(axes . (0 1))
(X-extent-callback . ,Axis_group_interface::group_extent_callback)
(Y-extent-callback . ,Axis_group_interface::group_extent_callback)
- (meta . ((interfaces . (system-interface axis-group-interface spanner-interface))))
+ (meta . ((class . System)
+ (interfaces . (system-interface axis-group-interface))))
))
(SystemStartBrace
(collapse-height . 5.0)
(font-encoding . fetaBraces)
(Y-extent-callback . #f)
- (meta . ((interfaces . (system-start-delimiter-interface font-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (system-start-delimiter-interface font-interface))))
))
(SystemStartBracket
(glyph . "bracket")
(collapse-height . 1)
(thickness . 0.45)
- (meta . ((interfaces . (font-interface system-start-delimiter-interface
- spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (font-interface system-start-delimiter-interface
+ ))))
))
(SystemStartBar
(glyph . "bar-line")
(thickness . 1.6)
(after-line-breaking-callback . ,System_start_delimiter::after_line_breaking)
- (meta . ((interfaces . (system-start-delimiter-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (system-start-delimiter-interface))))
))
(font-size . -2)
(stem-attachment-function . ,tablature-stem-attachment-function)
(font-series . bold)
- (meta . ((interfaces
+ (meta . ((class . Item)
+ (interfaces
. (rhythmic-head-interface
font-interface
note-head-interface staff-symbol-referencer-interface
- text-interface item-interface ))))
+ text-interface ))))
))
(X-offset-callbacks . (,Self_alignment_interface::aligned_on_self))
(direction . -1)
- ; sync with Fingering ?
+ ; sync with Fingering ?
(padding . 0.5)
(staff-padding . 0.5)
(script-priority . 200)
;; todo: add X self alignment?
- (meta . ((interfaces . (text-script-interface
+ (meta . ((class . Item)
+ (interfaces . (text-script-interface
text-interface side-position-interface font-interface
- item-interface ))))
+ ))))
))
(TextSpanner
(dash-fraction . 0.2)
(dash-period . 3.0)
(direction . 1)
- (meta . ((interfaces . (text-spanner-interface side-position-interface font-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (text-spanner-interface
+ side-position-interface font-interface))))
))
(x-gap . -0.1)
(y-offset . 0.6)
(minimum-length . 2.5)
- (meta . ((interfaces . (tie-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (tie-interface))))
))
(TieColumn
(before-line-breaking-callback . ,Tie_column::before_line_breaking)
(X-extent-callback . #f)
(Y-extent-callback . #f)
- (meta . ((interfaces . (tie-column-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (tie-column-interface))))
))
(TimeSignature
))
(breakable . #t)
(style . C)
- (meta . ((interfaces . (time-signature-interface break-aligned-interface font-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (time-signature-interface break-aligned-interface font-interface ))))
))
(padding . 0.5)
(direction . 1)
(Y-offset-callbacks . (,Side_position_interface::aligned_side))
- (meta . ((interfaces . (text-spanner-interface side-position-interface font-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (text-spanner-interface side-position-interface font-interface))))
))
(TrillPitchAccidental
(direction . ,LEFT)
(font-size . -4)
(print-function . ,Accidental_interface::print)
- (meta . ((interfaces . (item-interface
+ (meta . ((class . Item)
+ (interfaces . (item-interface
accidental-interface
side-position-interface font-interface))))
))
(print-function . ,parenthesize-elements)
(direction . ,RIGHT)
(padding . 0.3)
- (meta . ((interfaces . (side-position-interface
+ (meta . ((class . Item)
+ (interfaces . (side-position-interface
note-head-interface rhythmic-head-interface
font-interface accidental-interface
- item-interface axis-group-interface))))
+ axis-group-interface))))
))
(TrillPitchHead
(duration-log . 2)
(Y-offset-callbacks . (,Staff_symbol_referencer::callback))
(font-size . -4)
- (meta . ((interfaces . (item-interface
+ (meta . ((class . Item)
+ (interfaces . (item-interface
rhythmic-head-interface
font-interface pitched-trill-interface
ledgered-interface staff-symbol-referencer-interface))))
(font-shape . italic)
(font-size . -2)
- (meta . ((interfaces . (text-interface line-interface
+ (meta . ((class . Spanner)
+ (interfaces . (text-interface line-interface
tuplet-bracket-interface
- font-interface spanner-interface))))
+ font-interface))))
))
(UnaCordaPedal
(direction . 1)
(padding . 0.0) ;; padding relative to UnaCordaPedalLineSpanner
(X-offset-callbacks . (,Self_alignment_interface::aligned_on_self))
- (meta . ((interfaces . (text-interface self-alignment-interface font-interface item-interface ))))
+ (meta . ((class . Item)
+ (interfaces . (text-interface self-alignment-interface font-interface ))))
))
(UnaCordaPedalLineSpanner
(staff-padding . 1.2)
(minimum-space . 1.0)
(direction . -1)
- (meta . ((interfaces . (piano-pedal-interface axis-group-interface side-position-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (piano-pedal-interface axis-group-interface side-position-interface))))
))
(VaticanaLigature
(flexa-width . 2.0)
(ligature-primitive-callback . ,Vaticana_ligature::brew_ligature_primitive)
(print-function . ,Vaticana_ligature::print)
- (meta . ((interfaces . (vaticana-ligature-interface font-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (vaticana-ligature-interface font-interface))))
))
(Y-extent-callback . ,Axis_group_interface::group_extent_callback)
(X-extent-callback . ,Axis_group_interface::group_extent_callback)
(stacking-dir . -1)
- (meta . ((interfaces . (align-interface axis-group-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (align-interface axis-group-interface))))
))
(VerticalAxisGroup
(Y-extent-callback . ,Axis_group_interface::group_extent_callback)
(X-extent-callback . ,Axis_group_interface::group_extent_callback)
- (meta . ((interfaces . (axis-group-interface
- vertically-spaceable-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (axis-group-interface
+ vertically-spaceable-interface))))
))
(VocalName
(break-align-symbol . clef)
(break-visibility . ,begin-of-line-visible)
(baseline-skip . 2)
- (meta . ((interfaces . (font-interface
+ (meta . ((class . Item)
+ (interfaces . (font-interface
self-alignment-interface
side-position-interface text-interface
- break-aligned-interface item-interface ))))
+ break-aligned-interface))))
))
(VoltaBracket
(height . 2.0) ;; staffspace;
(minimum-space . 5)
(font-size . -4)
- (meta . ((interfaces . (volta-bracket-interface
+ (meta . ((class . Spanner)
+ (interfaces . (volta-bracket-interface
line-interface text-interface
- side-position-interface font-interface spanner-interface))))
+ side-position-interface font-interface))))
))
(Y-extent-callback . #f)
(print-function . ,Line_spanner::print)
(after-line-breaking-callback . ,Line_spanner::after_line_breaking)
- (meta . ((interfaces . (line-spanner-interface line-interface spanner-interface))))
+ (meta . ((class . Spanner)
+ (interfaces . (line-spanner-interface line-interface))))
))
- ))
+ ))
(define (completize-grob-entry x)
- "transplant assoc key into 'name entry of 'meta of X
+ "transplant assoc key into 'name entry of 'meta of X. Set interfaces for Item, Spanner etc.
"
+;; (display (car x))
+;; (newline)
(let* ((name-sym (car x))
(grob-entry (cdr x))
- (metaentry (cdr (assoc 'meta grob-entry)))
+ (meta-entry (cdr (assoc 'meta grob-entry)))
+ (class (cdr (assoc 'class meta-entry)))
(ifaces-entry
- (cdr (assoc 'interfaces metaentry)))
-
- )
- (set! metaentry (assoc-set! metaentry 'name name-sym))
- (set! metaentry (assoc-set! metaentry 'interfaces
- (cons 'grob-interface ifaces-entry)))
- (set! grob-entry (assoc-set! grob-entry 'meta metaentry))
+ (cdr (assoc 'interfaces meta-entry)))
+ )
+
+ (cond
+ ((eq? 'Item class)
+ (set! ifaces-entry (cons 'item-interface ifaces-entry)))
+ ((eq? 'Spanner class)
+ (set! ifaces-entry (cons 'spanner-interface ifaces-entry)))
+ ((eq? 'Paper_column class)
+ (set! ifaces-entry (cons 'item-interface
+ (cons 'paper-column-interface ifaces-entry))))
+ ((eq? 'System class)
+ (set! ifaces-entry (cons 'system-interface
+ (cons 'spanner-interface ifaces-entry))))
+ (else
+ (ly:warning "Unknown class ~a" class)))
+
+
+ (set! ifaces-entry (cons 'grob-interface ifaces-entry))
+
+ (set! meta-entry (assoc-set! meta-entry 'name name-sym))
+ (set! meta-entry (assoc-set! meta-entry 'interfaces
+ ifaces-entry))
+ (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
(cons name-sym grob-entry)))
(set! all-grob-descriptions (map completize-grob-entry all-grob-descriptions))
all-grob-descriptions)
(set! all-grob-descriptions (sort all-grob-descriptions alist<?))
+
+
(define (document-engraver-by-name name)
"NAME is a symbol."
- (let* ((eg (find-engraver-by-name name )))
+
+ (let* ((eg (find-engraver-by-name name)))
(cons (string-append "@code{" (ref-ify (symbol->string name)) "}")
(engraver-doc-string eg #f))))
(cdr desc-handle) "(not documented)"))
(accepts (cdr (assoc 'accepts context-desc)))
- (group (assq-ref context-desc 'group-type))
-
- (consists (append
- (if group (list group)
- '())
- (cdr (assoc 'consists context-desc))))
+ (consists (cdr (assoc 'consists context-desc)))
(props (cdr (assoc 'property-ops context-desc)))
(grobs (context-grobs context-desc))
(grob-refs (map (lambda (x) (ref-ify x)) grobs)))
(lambda (page)
(display
";;;;;;;;;;;;;;;;;;;;;;;;;;\n;;;PAGE\n" file)
- (pretty-print (ly:stencil-expr page) file))
+; (pretty-print (ly:stencil-expr page) file)
+ (write (ly:stencil-expr page) file)
+ )
(ly:paper-book-pages book))))
(define-public output-classic-framework output-framework)