+1.5.12.jcn2
+===========
+
+* half-baken --with-kpathsea configuration fix.
+
+* ly2dvi: add `.' to TEXINPUTS to catch broken TEXINPUTS settings.
+
+* guile-1.4 compile fix.
+
+1.5.12.hwn1
+===========
+
+* Move engraver descriptions into the C code. They are accessible
+from Scheme. Grand rehacking to make stuff work again.
+
+* Precompute which engravers are eligible to acknowledge a certain
+type of grob. Speedup: approx 10 % on interpretation phase.
+
+
+1.5.12
+======
+
1.5.11.jcn1
===========
# however, this triggers compilation during install, which is a bad thing (tm).
$(outdir)/lilypond-internals.nexi $(outdir)/lilypond-internals.texi: $(depth)/$(builddir)/lily/$(outconfbase)/lilypond
- cd $(outdir) && ../$(depth)/$(builddir)/lily/$(outconfbase)/lilypond ../$(src-depth)/ly/generate-documentation
+ cd $(outdir) && GUILE_LOAD_PATH=$(topdir)/scm/ ../$(depth)/$(builddir)/lily/$(outconfbase)/lilypond ../$(src-depth)/ly/generate-documentation
-ln $(outdir)/lilypond-internals.texi $(outdir)/lilypond-internals.nexi
\grace @var{musicexpr}
@end example
-When grace music is interpreted, a score-within-a-score is set up:
-@var{musicexpr} has its own time bookkeeping, and you could (for
-example) have a separate time signature within the grace notes. While in
-this score-within-a-score, you can create notes, beams, slurs, etc.
Unbeamed eighth notes and shorter by default have a slash through the
stem.
}
@end lilypond
-
A grace note expression has duration 0; the next real note is assumed to
be the main note. If you want the note to appear after the main note,
set @code{Voice.graceAlignPosition} to @code{1}.
@refbugs
-At present, slurs or ties from the grace notes to the following notes
-are not supported. Also, nesting @code{\grace} notes is not
-supported. The following may cause run-time errors:
-@example
+Nesting @code{\grace} notes is not supported. The following may cause
+run-time errors: @example
@code{\grace @{ \grace c32 c16 @} c4}
@end example
Since the meaning of such a construct is unclear, we don't consider this
Ending a staff or score with grace notes may also generate a run-time
error, since there will be no main note to attach the grace notes to.
-The present implementation of grace notes is not robust and generally
-kludgey. We expect it to change after LilyPond 1.4. Syntax changes might
-also be implemented.
-
@menu
* Glissando ::
* Dynamics::
PACKAGE_NAME=LilyPond
MAJOR_VERSION=1
MINOR_VERSION=5
-PATCH_LEVEL=12
+PATCH_LEVEL=13
MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
/* define if you have kpse_find_tfm */
#define HAVE_KPSE_FIND_TFM 0
+/* define if you have python2.0/Python.h header */
+#define HAVE_PYTHON2_0_PYTHON_H 0
+
/* define if you have python2/Python.h header */
#define HAVE_PYTHON2_PYTHON_H 0
AC_PATH_PROG(PERL, perl, error)
-AC_HAVE_HEADERS(python2/Python.h python/Python.h python1.5/Python.h Python.h)
+AC_HAVE_HEADERS(python2.0/Python.h python2/Python.h python/Python.h python1.5/Python.h Python.h)
AC_STEPMAKE_END
class A2_engraver : public Engraver
{
-public:
- A2_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(A2_engraver);
+
protected:
virtual void acknowledge_grob (Grob_info);
virtual void create_grobs ();
enum State { SOLO, SPLIT_INTERVAL, UNIRHYTHM, UNISILENCE, UNISON } state_;
};
-ADD_THIS_TRANSLATOR (A2_engraver);
+
A2_engraver::A2_engraver ()
{
if (text_p_)
{
- if (Note_head::has_interface (i.elem_l_))
+ if (Note_head::has_interface (i.grob_l_))
{
Grob*t = text_p_;
- Side_position_interface::add_support (t, i.elem_l_);
+ Side_position_interface::add_support (t, i.grob_l_);
if (Side_position_interface::get_axis (t) == X_AXIS
&& !t->parent_l (Y_AXIS))
- t->set_parent (i.elem_l_, Y_AXIS);
+ t->set_parent (i.grob_l_, Y_AXIS);
}
- if (Stem::has_interface (i.elem_l_))
+ if (Stem::has_interface (i.grob_l_))
{
- Side_position_interface::add_support (text_p_, i.elem_l_);
+ Side_position_interface::add_support (text_p_, i.grob_l_);
}
}
/* Must only set direction for VoiceCombines, not for StaffCombines:
we can't detect that here, so, ugh, yet another property */
if (!to_boolean (get_property ("noDirection"))
- && (Stem::has_interface (i.elem_l_)
- || Slur::has_interface (i.elem_l_)
- // || Tie::has_interface (i.elem_l_)
- || i.elem_l_->has_interface (ly_symbol2scm ("tie-interface"))
+ && (Stem::has_interface (i.grob_l_)
+ || Slur::has_interface (i.grob_l_)
+ // || Tie::has_interface (i.grob_l_)
+ || i.grob_l_->has_interface (ly_symbol2scm ("tie-interface"))
/*
Usually, dynamics are removed by *_devnull_engravers for the
hand, colliding of scripts may be worse.
So, we don't set directions for these when we're playing solo.
*/
- || (i.elem_l_->has_interface (ly_symbol2scm ("dynamic-interface"))
+ || (i.grob_l_->has_interface (ly_symbol2scm ("dynamic-interface"))
&& state_ != SOLO)
- || (i.elem_l_->has_interface (ly_symbol2scm ("text-interface"))
+ || (i.grob_l_->has_interface (ly_symbol2scm ("text-interface"))
&& state_ != SOLO)
))
{
/*
Blunt axe method: every grob gets a propertysetting.
*/
- i.elem_l_->set_grob_property ("direction", gh_int2scm (d));
+ i.grob_l_->set_grob_property ("direction", gh_int2scm (d));
}
}
/*
todo: should we have separate state variable for being "rest while
other has solo?" */
- if ( Multi_measure_rest::has_interface (i.elem_l_) && d )
+ if ( Multi_measure_rest::has_interface (i.grob_l_) && d )
if (state_ == UNIRHYTHM
&& unisilence != SCM_BOOL_T)
{
- i.elem_l_->set_grob_property ("staff-position", gh_int2scm (d * 6));
+ i.grob_l_->set_grob_property ("staff-position", gh_int2scm (d * 6));
}
}
}
}
+ENTER_DESCRIPTION(A2_engraver,
+/* descr */ "Part combine engraver for orchestral scores.
+
+The markings @emph{a2}, @emph{Solo} and @emph{Solo II}, are
+created by this engraver. It also acts upon instructions of the part
+combiner. Another thing that the this engraver, is forcing of stem,
+slur and tie directions, always when both threads are not identical;
+up for the musicexpr called @code{one}, down for the musicexpr called
+@code{two}.
+
+",
+/* creats*/ "TextScript",
+/* acks */ "grob-interface tie-interface note-head-interface ",
+/* reads */ "combineParts noDirection soloADue soloText soloIIText aDueText split-interval unison solo unisilence unirhythm",
+/* write */ "");
class Arpeggio_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
- Arpeggio_engraver ();
-
+ TRANSLATOR_DECLARATIONS(Arpeggio_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
virtual void create_grobs ();
{
if (arpeggio_req_)
{
- if (Stem::has_interface (info.elem_l_))
+ if (Stem::has_interface (info.grob_l_))
{
- stems_.push (info.elem_l_);
+ stems_.push (info.grob_l_);
}
/*
We can't catch local key items (accidentals) from Voice context,
see Local_key_engraver
*/
- else if (Rhythmic_head::has_interface (info.elem_l_))
+ else if (Rhythmic_head::has_interface (info.grob_l_))
{
- supports_.push (info.elem_l_);
+ supports_.push (info.grob_l_);
}
}
}
}
-ADD_THIS_TRANSLATOR (Arpeggio_engraver);
+
+ENTER_DESCRIPTION(Arpeggio_engraver,
+/* descr */ "Generate an Arpeggio from a Arpeggio_req",
+/* creats*/ "Arpeggio",
+/* acks */ "stem-interface rhythmic-head-interface",
+/* reads */ "",
+/* write */ "");
*/
class Auto_beam_engraver : public Engraver
{
-public:
- Auto_beam_engraver ();
- VIRTUAL_COPY_CONS (Translator);
-
+ TRANSLATOR_DECLARATIONS(Auto_beam_engraver);
protected:
virtual void stop_translation_timestep ();
virtual void start_translation_timestep ();
Beaming_info_list*finished_grouping_p_;
};
-ADD_THIS_TRANSLATOR (Auto_beam_engraver);
+
Auto_beam_engraver::Auto_beam_engraver ()
{
void
Auto_beam_engraver::stop_translation_timestep ()
{
-
typeset_beam ();
}
{
if (stem_l_arr_p_)
{
- if (Beam::has_interface (info.elem_l_))
+ if (Beam::has_interface (info.grob_l_))
{
end_beam ();
}
- else if (Bar::has_interface (info.elem_l_))
+ else if (Bar::has_interface (info.grob_l_))
{
end_beam ();
}
- else if (Rest::has_interface (info.elem_l_))
+ else if (Rest::has_interface (info.grob_l_))
{
end_beam ();
}
}
- if (Stem::has_interface (info.elem_l_))
+ if (Stem::has_interface (info.grob_l_))
{
- Item* stem_l = dynamic_cast<Item *> (info.elem_l_);
+ Item* stem_l = dynamic_cast<Item *> (info.grob_l_);
Rhythmic_req *rhythmic_req = dynamic_cast <Rhythmic_req *> (info.req_l_);
if (!rhythmic_req)
auto-beam-engraver.cc:459: warning: value computed is not used (gcc: 2.96) */
count_i_ = count_i_ + 1;
}
+ENTER_DESCRIPTION(Auto_beam_engraver,
+/* descr */ "Generate beams based on measure characteristics and observed
+Stems. Uses beatLength, measureLength and measurePosition to decide
+when to start and stop a beam. Overriding beaming is done through
+@ref{Stem_engraver} properties stemLeftBeamCount and
+stemRightBeamCount.
+",
+/* creats*/ "Beam",
+/* acks */ "stem-interface rest-interface beam-interface bar-line-interface",
+/* reads */ "noAutoBeaming autoBeamSettings",
+/* write */ "");
virtual Spanner* get_spanner_p () const;
virtual void add_element (Grob*) ;
public:
- VIRTUAL_COPY_CONS (Translator);
- Axis_group_engraver ();
+TRANSLATOR_DECLARATIONS(
+ Axis_group_engraver );
};
-ADD_THIS_TRANSLATOR (Axis_group_engraver);
+
Axis_group_engraver::Axis_group_engraver ()
{
void
Axis_group_engraver::acknowledge_grob (Grob_info i)
{
- elts_.push (i.elem_l_);
+ elts_.push (i.grob_l_);
}
/*
virtual void acknowledge_grob (Grob_info);
virtual void add_element (Grob *e);
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Hara_kiri_engraver);
};
void
Hara_kiri_engraver::acknowledge_grob (Grob_info i)
{
Axis_group_engraver::acknowledge_grob (i);
- if (Rhythmic_head::has_interface (i.elem_l_)
- || i.elem_l_->has_interface (ly_symbol2scm ("lyric-syllable-interface")))
+ if (Rhythmic_head::has_interface (i.grob_l_)
+ || i.grob_l_->has_interface (ly_symbol2scm ("lyric-syllable-interface")))
{
- Hara_kiri_group_spanner::add_interesting_item (staffline_p_, i.elem_l_);
+ Hara_kiri_group_spanner::add_interesting_item (staffline_p_, i.grob_l_);
}
}
-ADD_THIS_TRANSLATOR (Hara_kiri_engraver);
+
+Hara_kiri_engraver::Hara_kiri_engraver(){}
+
+ENTER_DESCRIPTION(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)
+",
+/* creats*/ "HaraKiriVerticalGroup",
+/* acks */ "grob-interface",
+/* reads */ "",
+/* write */ "");
+
+ENTER_DESCRIPTION(Axis_group_engraver,
+/* descr */ "Group all objects created in this context in a VerticalAxisGroup spanner.",
+/* creats*/ "VerticalAxisGroup",
+/* acks */ "grob-interface",
+/* reads */ "VerticalExtent MinimumVerticalExtent ExtraVerticalExtent",
+/* write */ "");
class Bar_engraver : public Engraver
{
public:
- Bar_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS( Bar_engraver );
void request_bar (String type_str);
protected:
typeset_bar ();
}
-ADD_THIS_TRANSLATOR (Bar_engraver);
+
+ENTER_DESCRIPTION(Bar_engraver,
+/* descr */ "Create barlines. This engraver is controlled through the
+@code{whichBar} property. If it has no bar line to create, it will forbid a linebreak at this point",
+/* creats*/ "BarLine",
+/* acks */ "",
+/* reads */ "whichBar stavesFound",
+/* write */ "");
virtual void initialize ();
virtual void create_grobs ();
void create_items ();
-
-public:
- VIRTUAL_COPY_CONS (Translator);
- Bar_number_engraver ();
+ TRANSLATOR_DECLARATIONS( Bar_number_engraver );
};
}
}
-ADD_THIS_TRANSLATOR (Bar_number_engraver);
+
Bar_number_engraver::Bar_number_engraver ()
{
void
Bar_number_engraver::acknowledge_grob (Grob_info inf)
{
- Grob * s = inf.elem_l_;
+ Grob * s = inf.grob_l_;
if (Staff_symbol::has_interface (s))
{
SCM sts = get_property ("stavesFound");
- SCM thisstaff = inf.elem_l_->self_scm ();
+ SCM thisstaff = inf.grob_l_->self_scm ();
if (scm_memq (thisstaff, sts) == SCM_BOOL_F)
daddy_trans_l_->set_property ("stavesFound", gh_cons (thisstaff, sts));
}
announce_grob (text_p_, 0);
}
+ENTER_DESCRIPTION(Bar_number_engraver,
+/* descr */ "A bar number is created whenever measurePosition is zero. It is
+put on top of all staves, and appears only at left side of the staff.",
+/* creats*/ "BarNumber",
+/* acks */ "staff-symbol-interface break-aligned-interface",
+/* reads */ "currentBarNumber",
+/* write */ "");
virtual void process_music ();
public:
- Beam_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS( Beam_engraver );
};
{
if (beam_p_)
{
- if (Rest::has_interface (info.elem_l_))
+ if (Rest::has_interface (info.grob_l_))
{
- info.elem_l_->add_offset_callback (Beam::rest_collision_callback_proc, Y_AXIS);
+ info.grob_l_->add_offset_callback (Beam::rest_collision_callback_proc, Y_AXIS);
}
- else if (Stem::has_interface (info.elem_l_))
+ else if (Stem::has_interface (info.grob_l_))
{
Moment now = now_mom();
if(bool (now.grace_part_ ) != bool (beam_start_mom_.grace_part_))
return ;
- Item *stem_l = dynamic_cast<Item*> (info.elem_l_);
+ Item *stem_l = dynamic_cast<Item*> (info.grob_l_);
if (Stem::beam_l (stem_l))
return;
-ADD_THIS_TRANSLATOR (Beam_engraver);
+
+ENTER_DESCRIPTION(Beam_engraver,
+/* descr */ "Handles Beam_requests by engraving Beams. If omitted, then notes will be
+printed with flags instead of beams.",
+/* creats*/ "Beam",
+/* acks */ "stem-interface rest-interface",
+/* reads */ "beamMelismaBusy",
+/* write */ "");
void add_column (SCM);
public:
- VIRTUAL_COPY_CONS (Translator);
- Break_align_engraver ();
+ TRANSLATOR_DECLARATIONS(Break_align_engraver);
};
-ADD_THIS_TRANSLATOR (Break_align_engraver);
+
void
Break_align_engraver::add_column (SCM smob)
void
Break_align_engraver::acknowledge_grob (Grob_info inf)
{
- if (Item * item_l = dynamic_cast <Item *> (inf.elem_l_))
+ if (Item * item_l = dynamic_cast <Item *> (inf.grob_l_))
{
if (item_l->empty_b (X_AXIS) || item_l->parent_l (X_AXIS))
return;
Axis_group_interface::add_element (group, item_l);
}
}
+ENTER_DESCRIPTION(Break_align_engraver,
+/* descr */ "Align grobs with corresponding break-align-symbols into groups, and order the groups according to breakAlignOrder",
+/* creats*/ "BreakAlignment BreakAlignGroup LeftEdge",
+/* acks */ "grob-interface", // break-aligned-interface ?
+/* reads */ "breakAlignOrder",
+/* write */ "");
}
SCM symbol = ly_car (extra_space);
- Real spc = gh_scm2double (gh_cadr (extra_space));
+ Real spc = gh_scm2double (ly_cadr (extra_space));
dists.push (spc);
symbol_list = gh_cons (symbol, symbol_list);
class Breathing_sign_engraver : public Engraver {
public:
- Breathing_sign_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Breathing_sign_engraver);
protected:
virtual bool try_music (Music *req_l);
breathing_sign_req_l_ = 0;
}
-ADD_THIS_TRANSLATOR (Breathing_sign_engraver);
+
+ENTER_DESCRIPTION(Breathing_sign_engraver,
+/* descr */ "",
+/* creats*/ "BreathingSign",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
class Chord_name_engraver : public Engraver
{
-public:
- Chord_name_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+
+ TRANSLATOR_DECLARATIONS( Chord_name_engraver);
protected:
virtual void stop_translation_timestep ();
Protected_scm last_chord_;
};
-ADD_THIS_TRANSLATOR (Chord_name_engraver);
+
Chord_name_engraver::Chord_name_engraver ()
{
chord_ = gh_cons (SCM_EOL, gh_cons (SCM_EOL, SCM_EOL));
}
+ENTER_DESCRIPTION(Chord_name_engraver,
+/* descr */ "Catch Note_req's, Tonic_reqs, Inversion_reqs, Bass_req
+and generate the appropriate chordname.",
+/* creats*/ "ChordName",
+/* acks */ "grob-interface",
+/* reads */ "chordChanges",
+/* write */ "");
class Chord_tremolo_engraver : public Engraver
{
void typeset_beam ();
-public:
- VIRTUAL_COPY_CONS (Translator);
- Chord_tremolo_engraver ();
+TRANSLATOR_DECLARATIONS(Chord_tremolo_engraver);
protected:
Repeated_music * repeat_;
{
if (beam_p_)
{
- if (Stem::has_interface (info.elem_l_))
+ if (Stem::has_interface (info.grob_l_))
{
- Grob * s = info.elem_l_;
+ Grob * s = info.grob_l_;
int f = Stem::flag_i (s);
f = (f > 2) ? f - 2 : 1;
Stem::set_beaming (s, f, LEFT);
}
}
}
- else if (stem_tremolo_ && Stem::has_interface (info.elem_l_))
+ else if (stem_tremolo_ && Stem::has_interface (info.grob_l_))
{
- Stem_tremolo::set_stem (stem_tremolo_, info.elem_l_);
+ Stem_tremolo::set_stem (stem_tremolo_, info.grob_l_);
- info.elem_l_->set_grob_property ("duration-log", gh_int2scm (intlog2 (note_head_i_)));
+ info.grob_l_->set_grob_property ("duration-log", gh_int2scm (intlog2 (note_head_i_)));
}
- if (repeat_ && Note_head::has_interface (info.elem_l_))
+ if (repeat_ && Note_head::has_interface (info.grob_l_))
{
- info.elem_l_->set_grob_property ("duration-log", gh_int2scm (intlog2 (note_head_i_)));
+ info.grob_l_->set_grob_property ("duration-log", gh_int2scm (intlog2 (note_head_i_)));
}
}
}
-ADD_THIS_TRANSLATOR (Chord_tremolo_engraver);
+
+ENTER_DESCRIPTION(Chord_tremolo_engraver,
+/* descr */ "Generates beams for tremolo repeats.",
+/* creats*/ "Beam",
+/* acks */ "stem-interface note-head-interface",
+/* reads */ "",
+/* write */ "");
for (SCM i = list; gh_pair_p (i); i = ly_cdr (i))
{
if (!gh_pair_p (ly_cdr (i))
- || !gh_equal_p (ly_car (i), gh_cadr (i)))
+ || !gh_equal_p (ly_car (i), ly_cadr (i)))
unique = gh_cons (ly_car (i), unique);
}
return gh_reverse (unique);
missing = lower_step (tonic, missing, gh_int2scm (0));
/* if additions include any 3, don't add third */
- SCM third = gh_cadr (base_pitches (tonic));
+ SCM third = ly_cadr (base_pitches (tonic));
if (member_notename (third, add) != SCM_BOOL_F)
missing = scm_delete (third, missing);
class Clef_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
- Clef_engraver ();
+ TRANSLATOR_DECLARATIONS(Clef_engraver);
Direction octave_dir_;
virtual void start_translation_timestep ();
virtual void process_music ();
virtual void acknowledge_grob (Grob_info);
- virtual void do_creation_processing ();
private:
Item * clef_p_;
Item * octavate_p_;
void
Clef_engraver::acknowledge_grob (Grob_info info)
{
- Item * item =dynamic_cast <Item *> (info.elem_l_);
+ Item * item =dynamic_cast <Item *> (info.grob_l_);
if (item)
{
- if (Bar::has_interface (info.elem_l_)
+ if (Bar::has_interface (info.grob_l_)
&& gh_string_p (get_property ("clefGlyph")))
create_clef ();
inspect_clef_properties ();
}
-/*
- this must be done in creation_proc() since grace notes will be
- processed before Clef_engraver::prcoess_music()
-
- Grace notes and clef changes are still broken.
-*/
-void
-Clef_engraver::do_creation_processing ()
-{
- inspect_clef_properties ();
-}
-
void
Clef_engraver::inspect_clef_properties ()
{
{
}
-ADD_THIS_TRANSLATOR (Clef_engraver);
+
+ENTER_DESCRIPTION(Clef_engraver,
+/* descr */ "Determine and set reference point for pitches",
+/* creats*/ "Clef OctavateEight",
+/* acks */ "bar-line-interface key-interface",
+/* reads */ "clefPosition clefGlyph centralCPosition clefOctavation explicitClefVisibility",
+/* write */ "");
virtual void create_grobs ();
virtual void stop_translation_timestep ();
public:
- VIRTUAL_COPY_CONS (Translator);
- Collision_engraver ();
+ TRANSLATOR_DECLARATIONS(Collision_engraver);
};
void
Collision_engraver::acknowledge_grob (Grob_info i)
{
- if (Note_column::has_interface (i.elem_l_))
+ if (Note_column::has_interface (i.grob_l_))
{
/*should check Y axis? */
- if (Note_column::rest_b (i.elem_l_) || i.elem_l_->parent_l (X_AXIS))
+ if (Note_column::rest_b (i.grob_l_) || i.grob_l_->parent_l (X_AXIS))
return ;
- note_column_l_arr_.push (i.elem_l_);
+ note_column_l_arr_.push (i.grob_l_);
}
}
-ADD_THIS_TRANSLATOR (Collision_engraver);
+
+ENTER_DESCRIPTION(Collision_engraver,
+/* descr */ "",
+/* creats*/ "NoteCollision",
+/* acks */ "note-column-interface",
+/* reads */ "",
+/* write */ "");
for (; gh_pair_p (hand); hand =ly_cdr (hand))
{
- Grob * s = unsmob_grob (gh_caar (hand));
- Real amount = gh_scm2double (gh_cdar (hand));
+ Grob * s = unsmob_grob (ly_caar (hand));
+ Real amount = gh_scm2double (ly_cdar (hand));
s->translate_axis (amount *wid, X_AXIS);
done.push (s);
}
for (; gh_pair_p (autos); autos =ly_cdr (autos))
{
- Grob * s = unsmob_grob (gh_caar (autos));
- Real amount = gh_scm2double (gh_cdar (autos));
+ Grob * s = unsmob_grob (ly_caar (autos));
+ Real amount = gh_scm2double (ly_cdar (autos));
if (!done.find_l (s))
s->translate_axis (amount * wid, X_AXIS);
SCM pa = get_mus_property ("pitch-alist");
for (SCM s = pa; gh_pair_p (s); s = ly_cdr (s))
{
- SCM key = gh_caar (s);
- SCM alter = gh_cdar (s);
+ SCM key = ly_caar (s);
+ SCM alter = ly_cdar (s);
if (gh_pair_p (key))
{
Pitch orig (gh_scm2int (ly_car (key)),
for (SCM s = a;
gh_pair_p (s); s = ly_cdr (s))
{
- SCM key = gh_caar (s);
- SCM val = gh_cdar (s);
+ SCM key = ly_caar (s);
+ SCM val = ly_cdar (s);
SCM l = scm_assoc (key, b);
if (l == SCM_BOOL_F
class Custos_engraver : public Engraver
{
public:
- Custos_engraver ();
+TRANSLATOR_DECLARATIONS( Custos_engraver);
virtual void start_translation_timestep ();
virtual void acknowledge_grob (Grob_info);
virtual void create_grobs ();
virtual void stop_translation_timestep ();
virtual void finalize ();
- VIRTUAL_COPY_CONS (Translator);
+
private:
Item * create_custos ();
void
Custos_engraver::acknowledge_grob (Grob_info info)
{
- Item *item = dynamic_cast <Item *> (info.elem_l_);
+ Item *item = dynamic_cast <Item *> (info.grob_l_);
if (item)
{
- if (Bar::has_interface (info.elem_l_))
+ if (Bar::has_interface (info.grob_l_))
custos_permitted = true;
- else if (Note_head::has_interface (info.elem_l_))
+ else if (Note_head::has_interface (info.grob_l_))
{
/*
custos_arr_.clear ();
}
-ADD_THIS_TRANSLATOR (Custos_engraver);
+
+ENTER_DESCRIPTION(Custos_engraver,
+/* descr */ "",
+/* creats*/ "Custos",
+/* acks */ "bar-line-interface note-head-interface",
+/* reads */ "",
+/* write */ "");
Grob * stem_;
Link_array<Item> head_l_arr_;
public:
- VIRTUAL_COPY_CONS (Translator);
- Dot_column_engraver ();
+ TRANSLATOR_DECLARATIONS(
+ Dot_column_engraver );
protected:
virtual void acknowledge_grob (Grob_info);
void
Dot_column_engraver::acknowledge_grob (Grob_info info)
{
- Grob *d = unsmob_grob (info.elem_l_->get_grob_property ("dot"));
+ Grob *d = unsmob_grob (info.grob_l_->get_grob_property ("dot"));
if (d)
{
if (!dotcol_)
{
dotcol_ = new Item (get_property ("DotColumn"));
-
- Dot_column::set_interface (dotcol_);
announce_grob (dotcol_, 0);
}
- Dot_column::add_head (dotcol_, info.elem_l_);
+ Dot_column::add_head (dotcol_, info.grob_l_);
}
- else if (Stem::has_interface (info.elem_l_))
+ else if (Stem::has_interface (info.grob_l_))
{
- stem_ = info.elem_l_;
+ stem_ = info.grob_l_;
}
}
-ADD_THIS_TRANSLATOR (Dot_column_engraver);
+
+ENTER_DESCRIPTION(Dot_column_engraver,
+/* descr */ " Engraves dots on dotted notes shifted to the right of the note.
+If omitted, then dots appear on top of the notes.
+",
+/* creats*/ "DotColumn",
+/* acks */ "dot-column-interface stem-interface",
+/* reads */ "",
+/* write */ "");
#include "axis-group-interface.hh"
#include "stem.hh"
-void
-Dot_column::set_interface (Grob* me)
-{
-}
MAKE_SCHEME_CALLBACK (Dot_column,force_shift_callback,2);
SCM
Dot_column::force_shift_callback (SCM element_smob, SCM axis)
void typeset_all ();
-public:
- VIRTUAL_COPY_CONS (Translator);
- Dynamic_engraver ();
+TRANSLATOR_DECLARATIONS(Dynamic_engraver );
protected:
virtual void finalize ();
virtual void start_translation_timestep ();
};
-ADD_THIS_TRANSLATOR (Dynamic_engraver);
+
Dynamic_engraver::Dynamic_engraver ()
void
Dynamic_engraver::acknowledge_grob (Grob_info i)
{
- if (Note_column::has_interface (i.elem_l_))
+ if (Note_column::has_interface (i.grob_l_))
{
if (line_spanner_
/* Don't refill killed spanner */
&& line_spanner_->immutable_property_alist_ != SCM_EOL)
{
- Side_position_interface::add_support (line_spanner_,i.elem_l_);
- add_bound_item (line_spanner_,dynamic_cast<Item*> (i.elem_l_));
+ Side_position_interface::add_support (line_spanner_,i.grob_l_);
+ add_bound_item (line_spanner_,dynamic_cast<Item*> (i.grob_l_));
}
}
}
+ENTER_DESCRIPTION(Dynamic_engraver,
+/* descr */ "",
+/* creats*/ "DynamicLineSpanner DynamicText Hairpin TextSpanner",
+/* acks */ "note-column-interface",
+/* reads */ "",
+/* write */ "");
class Dynamic_performer : public Performer
{
public:
- VIRTUAL_COPY_CONS (Translator);
-
- Dynamic_performer ();
-
+ TRANSLATOR_DECLARATIONS(Dynamic_performer);
protected:
virtual bool try_music (Music* req_l);
virtual void stop_translation_timestep ();
Audio_dynamic* audio_p_;
};
-ADD_THIS_TRANSLATOR (Dynamic_performer);
+
Dynamic_performer::Dynamic_performer ()
{
return false;
}
+ENTER_DESCRIPTION(Dynamic_performer,
+ "","","","","");
#include "paper-score.hh"
#include "grob.hh"
-
-ADD_THIS_TRANSLATOR (Engraver_group_engraver);
-
void
Engraver_group_engraver::announce_grob (Grob_info info)
{
}
}
+SCM find_acknowledge_engravers (SCM gravlist, SCM meta);
void
Engraver_group_engraver::acknowledge_grobs ()
{
+ if (!announce_info_arr_.size ())
+ return ;
+
+ SCM tab =get_property (ly_symbol2scm ("acknowledgeHashTable"));
+ SCM name_sym = ly_symbol2scm ("name");
+ SCM meta_sym = ly_symbol2scm ("meta");
+
+
for (int j =0; j < announce_info_arr_.size (); j++)
{
Grob_info info = announce_info_arr_[j];
- for (SCM p = simple_trans_list_; gh_pair_p (p); p = ly_cdr (p))
+
+ SCM meta = info.grob_l_->get_grob_property (meta_sym);
+ SCM nm = scm_assoc (name_sym, meta);
+ if (gh_pair_p (nm))
+ nm = ly_cdr (nm);
+ else
+ {
+ assert (info.grob_l_->immutable_property_alist_ == SCM_EOL);
+ continue;
+ }
+
+ SCM acklist = scm_hashq_ref (tab, nm, SCM_UNDEFINED);
+ if (acklist == SCM_BOOL_F)
+ {
+ acklist= find_acknowledge_engravers (simple_trans_list_, meta);
+ scm_hashq_set_x (tab, nm, acklist);
+ }
+
+ for (SCM p = acklist; gh_pair_p (p); p = ly_cdr (p))
{
Translator * t = unsmob_translator (ly_car (p));
Engraver * eng = dynamic_cast<Engraver*> (t);
}
}
+void find_all_acknowledge_engravers (SCM tab, SCM gravlist, SCM allgrobs);
+
+void
+Engraver_group_engraver::initialize ()
+{
+ SCM tab = scm_make_vector (gh_int2scm (61), SCM_BOOL_F); // magic ->
+ set_property (ly_symbol2scm ("acknowledgeHashTable"), tab);
+
+ Translator_group::initialize ();
+}
+
+Engraver_group_engraver::Engraver_group_engraver() {}
+ENTER_DESCRIPTION(Engraver_group_engraver,
+/* descr */ "A group of engravers taken together",
+/* creats*/ "",
+/* acks */ "grob-interface",
+/* reads */ "",
+/* write */ "");
+
+/*****************/
+
+
+bool engraver_valid (Translator*tr, SCM ifaces)
+{
+ SCM ack_ifs = scm_assoc (ly_symbol2scm ("interfaces-acked"), tr->translator_description());
+ ack_ifs = gh_cdr (ack_ifs);
+ for (SCM s = ifaces; ly_pair_p (s); s = ly_cdr (s))
+ if (scm_memq (ly_car (s), ack_ifs) != SCM_BOOL_F)
+ return true;
+ return false;
+}
+
+
+SCM
+find_acknowledge_engravers (SCM gravlist, SCM meta_alist)
+{
+ SCM ifaces = gh_cdr (scm_assoc (ly_symbol2scm ("interfaces"), meta_alist));
+
+ SCM l = SCM_EOL;
+ for (SCM s = gravlist; ly_pair_p (s); s = ly_cdr (s))
+ {
+ Translator* tr = unsmob_translator (ly_car (s));
+ if (engraver_valid (tr, ifaces))
+ l = scm_cons (tr->self_scm (), l);
+ }
+ l = scm_reverse_x (l, SCM_EOL);
+
+ return l;
+}
{
}
+
+Engraver::Engraver()
+{
+}
+
+
+ENTER_DESCRIPTION(Engraver,
+ "", "", "", "", "");
Extender_req* req_l_;
Spanner* extender_p_;
public:
- Extender_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Extender_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
};
-ADD_THIS_TRANSLATOR (Extender_engraver);
+
Extender_engraver::Extender_engraver ()
{
Extender_engraver::acknowledge_grob (Grob_info i)
{
// -> text_item
- if (i.elem_l_->has_interface (ly_symbol2scm ("lyric-syllable-interface")))
+ if (i.grob_l_->has_interface (ly_symbol2scm ("lyric-syllable-interface")))
{
- current_lyric_l_ = i.elem_l_;
+ current_lyric_l_ = i.grob_l_;
if (extender_p_
&& !extender_p_->get_bound (RIGHT)
)
{
- Lyric_extender::set_textitem (extender_p_, RIGHT, dynamic_cast<Item*> (i.elem_l_));
+ Lyric_extender::set_textitem (extender_p_, RIGHT, dynamic_cast<Item*> (i.grob_l_));
}
}
}
}
+ENTER_DESCRIPTION(Extender_engraver,
+/* descr */ "Create lyric extenders",
+/* creats*/ "LyricExtender",
+/* acks */ "lyric-syllable-interface",
+/* reads */ "",
+/* write */ "");
class Figured_bass_engraver : public Engraver
{
-public:
- VIRTUAL_COPY_CONS(Translator);
- Figured_bass_engraver();
-
+
+ TRANSLATOR_DECLARATIONS(Figured_bass_engraver);
protected:
Link_array<Note_req> figures_;
Rest_req * rest_req_;
}
-ADD_THIS_TRANSLATOR(Figured_bass_engraver);
+ENTER_DESCRIPTION(Figured_bass_engraver,
+/* descr */ "Make volta brackets",
+/* creats*/ "BassFigure",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
for (SCM s = fonts ; gh_pair_p (s); s = ly_cdr (s))
{
- SCM qlist = gh_caar (s);
+ SCM qlist = ly_caar (s);
if (name != SCM_BOOL_F)
{
}
- SCM qname = gh_cdar (s);
+ SCM qname = ly_cdar (s);
return qname;
}
smobify_self ();
}
-Font_metric::Font_metric (Font_metric const &s)
+Font_metric::Font_metric (Font_metric const &)
{
}
class Font_size_engraver : public Engraver
{
-public:
- VIRTUAL_COPY_CONS(Translator);
- Font_size_engraver ();
+
+ TRANSLATOR_DECLARATIONS(Font_size_engraver);
protected:
virtual void acknowledge_grob (Grob_info gi);
private:
if (gh_number_p (sz)
&& gh_scm2int (sz)
- && !gh_number_p (gi.elem_l_->get_grob_property ("font-relative-size")))
+ && !gh_number_p (gi.grob_l_->get_grob_property ("font-relative-size")))
{
- gi.elem_l_->set_grob_property ("font-relative-size", sz);
+ gi.grob_l_->set_grob_property ("font-relative-size", sz);
}
}
-ADD_THIS_TRANSLATOR(Font_size_engraver);
+
+
+ENTER_DESCRIPTION(Font_size_engraver,
+/* descr */ "Puts fontSize into font-relative-size grob property.",
+/* creats*/ "",
+/* acks */ "grob-interface",
+/* reads */ "fontSize",
+/* write */ "");
Grob_info::Grob_info (Grob*s_l, Music *r_l)
{
- elem_l_ = s_l;
+ grob_l_ = s_l;
req_l_ = r_l;
origin_trans_l_ = 0;
}
Grob_info::Grob_info ()
{
- elem_l_ = 0;
+ grob_l_ = 0;
req_l_ = 0;
origin_trans_l_ = 0;
}
/* now: sc && sc->line_l () == line */
if (!line
+ /*
+ This was introduced in 1.3.49 as a measure to prevent
+ programming errors. It looks expensive (?). TODO:
+ benchmark , document when (what kind of programming
+ errors) this happens.
+ */
|| (sc->common_refpoint (line, X_AXIS)
&& sc->common_refpoint (line, Y_AXIS)))
{
SCM meta = get_grob_property ("meta");
SCM nm = scm_assoc (ly_symbol2scm ("name"), meta);
nm = (gh_pair_p (nm)) ? ly_cdr (nm) : SCM_EOL;
- return gh_string_p (nm) ?ly_scm2string (nm) : classname (this);
+ return gh_symbol_p (nm) ? ly_symbol2string (nm) : classname (this);
}
void
Hyphen_req* req_l_;
Spanner* hyphen_p_;
public:
- Hyphen_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Hyphen_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
};
-ADD_THIS_TRANSLATOR (Hyphen_engraver);
+
Hyphen_engraver::Hyphen_engraver ()
{
Hyphen_engraver::acknowledge_grob (Grob_info i)
{
// -> text-item
- if (i.elem_l_->has_interface (ly_symbol2scm ("lyric-syllable-interface")))
+ if (i.grob_l_->has_interface (ly_symbol2scm ("lyric-syllable-interface")))
{
- current_lyric_l_ = i.elem_l_;
+ current_lyric_l_ = i.grob_l_;
if (hyphen_p_
&& !hyphen_p_->get_bound (RIGHT)
)
{
- Hyphen_spanner (hyphen_p_).set_textitem (RIGHT, i.elem_l_);
+ Hyphen_spanner (hyphen_p_).set_textitem (RIGHT, i.grob_l_);
}
}
}
}
+ENTER_DESCRIPTION(Hyphen_engraver,
+/* descr */ "Create lyric hyphens",
+/* creats*/ "LyricHyphen",
+/* acks */ "lyric-syllable-interface",
+/* reads */ "",
+/* write */ "");
public:
static int compare (Grob * const&,Grob * const&);
static void add_head (Grob * dotcol, Grob* rh );
- static void set_interface (Grob*);
+
static bool has_interface (Grob*);
DECLARE_SCHEME_CALLBACK (force_shift_callback, (SCM ,SCM));
DECLARE_SCHEME_CALLBACK (side_position, (SCM ,SCM));
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Engraver_group_engraver);
+ virtual void initialize ();
virtual void do_announces ();
virtual void announce_grob (Grob_info);
virtual void process_music ();
virtual void announce_grob (Grob_info);
virtual void process_music ();
public:
- VIRTUAL_COPY_CONS (Translator);
Engraver_group_engraver * daddy_grav_l () const;
/**
override other ctor
*/
- Engraver () {}
+ TRANSLATOR_DECLARATIONS(Engraver);
};
friend class Engraver;
public:
Link_array<Translator> origin_trans_l_arr (Translator*) const;
- Grob * elem_l_;
+ Grob * grob_l_;
Music *req_l_;
-
Grob_info (Grob*, Music*);
Grob_info ();
};
DEPRECATED.
*/
-class Line_group_engraver_group : public Engraver_group_engraver {
+class Line_group_engraver_group : public Engraver_group_engraver
+{
protected:
Spanner *staffline_p_;
virtual void finalize ();
virtual void typeset_grob (Grob*);
public:
- VIRTUAL_COPY_CONS (Translator);
-
- Line_group_engraver_group ();
+ TRANSLATOR_DECLARATIONS(Line_group_engraver_group);
};
Syllable_group * lookup_context_id (const String &context_id);
public:
- Lyric_phrasing_engraver ();
+
~Lyric_phrasing_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS( Lyric_phrasing_engraver);
private:
/** association list of Syllable_group smobs
class Performer_group_performer : public Performer, public virtual Translator_group {
public:
- VIRTUAL_COPY_CONS (Translator);
-
+ TRANSLATOR_DECLARATIONS(Performer_group_performer);
+
virtual void do_announces ();
virtual void announce_element (Audio_element_info);
protected:
void typeset_all ();
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Score_engraver);
Paper_score * pscore_p_;
void forbid_breaks ();
- Score_engraver ();
+
virtual Music_output *get_output_p ();
protected:
virtual void prepare (Moment);
public Performer_group_performer, public Global_translator
{
public:
- VIRTUAL_COPY_CONS (Translator);
-
- Score_performer ();
+ TRANSLATOR_DECLARATIONS(Score_performer);
~Score_performer ();
Performance *performance_p_;
Translator_group (Translator_group const &);
Translator_group ();
void add_group_translator (Translator *trans_p);
-
/// Score_register = 0, Staff_registers = 1, etc)
Translator_group* ancestor_l (int l=1);
Translator_group *find_existing_translator_l (String n, String id);
Translator_group *find_create_translator_l (String n, String id);
Link_array<Translator_group> path_to_acceptable_translator (String alias, Music_output_def*) const;
-
Translator_group*get_default_interpreter ();
-
+
public:
bool try_music_on_nongroup_children (Music *m);
virtual void initialize ();
virtual void finalize ();
virtual void each (Method_pointer);
-
};
#endif // TRANSLATOR_GROUP_HH
#include "input.hh"
#include "smobs.hh"
+#define TRANSLATOR_DECLARATIONS(NAME) \
+public: \
+ NAME();\
+ VIRTUAL_COPY_CONS (Translator); \
+ static SCM static_description_; \
+ virtual SCM static_translator_description () const; \
+ virtual SCM translator_description () const;
+
/** Make some kind of #Element#s from Requests. Elements are made by
hierarchically grouped #Translator#s
*/
Music_output_def * output_def_l_;
String type_str_;
- virtual const char *name () const;
bool is_alias_b (String) const;
- VIRTUAL_COPY_CONS (Translator);
+
Translator (Translator const &);
- Translator ();
+
Translator_group * daddy_trans_l_ ;
-
-
+ DECLARE_SCHEME_CALLBACK(name, (SCM trans));
+ DECLARE_SCHEME_CALLBACK(description,(SCM trans));
void announces ();
void removal_processing ();
SCM properties_scm_;
DECLARE_SMOBS (Translator, dummy);
-public:
+public:
+ TRANSLATOR_DECLARATIONS(Translator);
/**
try to fit the request in this engraver
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_);\
t->type_str_ = classname (t);\
add_translator (t);\
}\
+SCM T::translator_description() const\
+{ \
+ return static_description_;\
+}\
ADD_GLOBAL_CTOR (_ ## T ## _adder);
+
+#define ENTER_DESCRIPTION(classname,desc,grobs,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"), \
+ ly_str02scm (desc), static_properties); \
+ \
+ static_properties= scm_acons (ly_symbol2scm ("interfaces-acked"), \
+ parse_symbol_list (acked), 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; \
+}
+
+
+
extern Dictionary<Translator*> *global_translator_dict_p;
void add_translator (Translator*trans_p);
VIRTUAL_COPY_CONS (Translator);
};
-#define DECLARE_REQUEST_SWALLOWER(TYPE) \
-struct TYPE ## _swallow_translator : public Type_swallow_translator {\
- TYPE ## _swallow_translator () { \
- swallow_str_ = #TYPE;\
- }\
- \
- VIRTUAL_COPY_CONS (Translator);\
-};\
-ADD_THIS_TRANSLATOR (TYPE ## _swallow_translator);\
+#define DECLARE_REQUEST_SWALLOWER(TYPE) \
+struct TYPE ## _swallow_translator : public Type_swallow_translator { \
+ TRANSLATOR_DECLARATIONS (TYPE ## _swallow_translator); \
+}; \
+ TYPE ## _swallow_translator :: TYPE ## _swallow_translator() {\
+ swallow_str_ = #TYPE; \
+ } \
+ENTER_DESCRIPTION(TYPE ## _swallow_translator, \
+ "Swallow requests of " #TYPE " type.", \
+ "", \
+ "", \
+ "", \
+ "");
#endif // TYPESWALLOW_GRAV_HH
void create_text (SCM s);
public:
- VIRTUAL_COPY_CONS (Translator);
- Instrument_name_engraver ();
+ TRANSLATOR_DECLARATIONS(Instrument_name_engraver);
+
virtual void initialize ();
virtual void acknowledge_grob (Grob_info);
virtual void stop_translation_timestep ();
};
-ADD_THIS_TRANSLATOR (Instrument_name_engraver);
+
Instrument_name_engraver::Instrument_name_engraver ()
{
void
Instrument_name_engraver::acknowledge_grob (Grob_info i)
{
- if (Bar::has_interface (i.elem_l_))
+ if (Bar::has_interface (i.grob_l_))
{
SCM s = get_property ("instrument");
create_text (s);
}
- if (dynamic_cast<Spanner*> (i.elem_l_)
- && i.elem_l_->has_interface (ly_symbol2scm ("dynamic-interface")))
+ if (dynamic_cast<Spanner*> (i.grob_l_)
+ && i.grob_l_->has_interface (ly_symbol2scm ("dynamic-interface")))
return;
/*
therefore the location of its refpoint won't be very useful.
*/
- if (dynamic_cast<Spanner*> (i.elem_l_)
- && ((Axis_group_interface::has_interface (i.elem_l_)
- && Axis_group_interface::axis_b (i.elem_l_, Y_AXIS)))
- && !Align_interface::has_interface (i.elem_l_))
+ if (dynamic_cast<Spanner*> (i.grob_l_)
+ && ((Axis_group_interface::has_interface (i.grob_l_)
+ && Axis_group_interface::axis_b (i.grob_l_, Y_AXIS)))
+ && !Align_interface::has_interface (i.grob_l_))
{
- SCM nl = gh_cons (i.elem_l_->self_scm (),
+ SCM nl = gh_cons (i.grob_l_->self_scm (),
get_property ("instrumentSupport"));
daddy_trans_l_->set_property ("instrumentSupport", nl);
+ENTER_DESCRIPTION(Instrument_name_engraver,
+/* descr */ " Prints the name of the instrument (specified by
+@code{Staff.instrument} and @code{Staff.instr})
+at the left of the
+staff.",
+/* creats*/ "InstrumentName",
+/* acks */ "bar-line-interface axis-group-interface",
+/* reads */ "instrument instr",
+/* write */ "");
void read_req (Key_change_req const * r);
public:
- Key_engraver ();
-
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Key_engraver);
Key_change_req * keyreq_l_;
Item * item_p_;
void
Key_engraver::acknowledge_grob (Grob_info info)
{
- if (Clef::has_interface (info.elem_l_))
+ if (Clef::has_interface (info.grob_l_))
{
SCM c = get_property ("createKeyOnClefChange");
if (to_boolean (c))
create_key (false);
}
}
- else if (Bar::has_interface (info.elem_l_)
+ else if (Bar::has_interface (info.grob_l_)
&& gh_pair_p (get_property ("keySignature")))
{
create_key (true);
}
}
for (SCM s = n ; gh_pair_p (s); s = ly_cdr (s))
- if (gh_scm2int (gh_cdar (s)))
+ if (gh_scm2int (ly_cdar (s)))
accs = gh_cons (ly_car (s), accs);
old_accs_ = get_property ("keySignature");
}
-ADD_THIS_TRANSLATOR (Key_engraver);
+
+ENTER_DESCRIPTION(Key_engraver,
+/* descr */ "",
+/* creats*/ "KeySignature",
+/* acks */ "bar-line-interface clef-interface",
+/* reads */ "keySignature explicitKeySignatureVisibility createKeyOnClefChange keyAccidentalOrder keySignature",
+/* write */ "");
for (SCM s = newas; gh_pair_p (s); s = ly_cdr (s))
{
- SCM what = gh_caar (s);
- int alter = gh_scm2int (gh_cdar (s));
+ SCM what = ly_caar (s);
+ int alter = gh_scm2int (ly_cdar (s));
int pos = alteration_pos (what, alter, c0p);
Molecule m = Font_interface::get_default_font (me)->
for (; gh_pair_p (old); old = ly_cdr (old))
{
- SCM found = scm_assoc (gh_caar (old), newas);
+ SCM found = scm_assoc (ly_caar (old), newas);
if (found == SCM_BOOL_F
- || ly_cdr (found) != gh_cdar (old))
+ || ly_cdr (found) != ly_cdar (old))
{
- SCM what = gh_caar (old);
+ SCM what = ly_caar (old);
int alter = 0;
int pos = alteration_pos (what, alter, c0p);
class Key_performer : public Performer
{
public:
- VIRTUAL_COPY_CONS (Translator);
-
- Key_performer ();
+ TRANSLATOR_DECLARATIONS(Key_performer);
~Key_performer ();
protected:
Audio_key* audio_p_;
};
-ADD_THIS_TRANSLATOR (Key_performer);
-
Key_performer::Key_performer ()
{
key_req_l_ = 0;
return false;
}
+ENTER_DESCRIPTION(Key_performer,"","","","","");
void
read_lily_scm_file (String fn)
{
- scm_c_eval_string ((char *) gulp_file_to_string (fn).ch_C ());
+ gh_eval_str ((char *) gulp_file_to_string (fn).ch_C ());
+ // scm_c_eval_string ((char *) gulp_file_to_string (fn).ch_C ());
}
extern "C" {
{
char const* vs = "\' (" MAJOR_VERSION " " MINOR_VERSION " " PATCH_LEVEL " " MY_PATCH_LEVEL ")" ;
- return scm_c_eval_string ((char*)vs);
+ return gh_eval_str ((char*)vs);
}
static void
else
return SCM_BOOL_F;
}
+
+/*
+ LIST has the form "sym1 sym2 sym3"
+ */
+SCM
+parse_symbol_list (const char * list)
+{
+ char * s = strdup (list);
+ char *orig = s;
+ SCM create_list = SCM_EOL;
+ if (!s[0] )
+ s = 0;
+
+ while (s)
+ {
+ char *next = strchr (s, ' ');
+ if (next)
+ *next++ = 0;
+
+ create_list = gh_cons (ly_symbol2scm (s), create_list);
+ s = next;
+ }
+
+ free (orig);
+ return create_list;
+}
Axis_group_interface::set_axes (staffline_p_, Y_AXIS,Y_AXIS);
}
-
-
-
-ADD_THIS_TRANSLATOR (Line_group_engraver_group);
+ENTER_DESCRIPTION(Line_group_engraver_group,
+ "",
+ "",
+ "",
+ "",
+ "");
gh_int2scm (ip->line_number ()),
gh_int2scm (ip->column_number ()),
SCM_UNDEFINED));
- expr = gh_cadr (expr);
+ expr = ly_cadr (expr);
}
else if (head == no_origin_sym)
{
pscore_l_->outputter_l_->output_scheme (scm_list_n (no_origin_sym, SCM_UNDEFINED));
- expr = gh_cadr (expr);
+ expr = ly_cadr (expr);
}
else if (head == offset_sym)
{
- o += ly_scm2offset (gh_cadr (expr));
- expr = gh_caddr (expr);
+ o += ly_scm2offset (ly_cadr (expr));
+ expr = ly_caddr (expr);
}
else if (head == combine_sym)
{
- output_molecule (gh_cadr (expr), o);
- expr = gh_caddr (expr);
+ output_molecule (ly_cadr (expr), o);
+ expr = ly_caddr (expr);
}
else
{
struct Local_key_engraver : Engraver {
Item *key_item_p_;
protected:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Local_key_engraver);
virtual void process_music ();
virtual void acknowledge_grob (Grob_info);
virtual void stop_translation_timestep ();
Link_array<Grob> support_l_arr_;
Link_array<Item> forced_l_arr_;
Link_array<Grob> tie_l_arr_;
- Local_key_engraver ();
+
};
Local_key_engraver::Local_key_engraver ()
{
key_item_p_ =0;
-
last_keysig_ = SCM_EOL;
}
{
Note_req * note_l = dynamic_cast <Note_req *> (info.req_l_);
- if (note_l && Rhythmic_head::has_interface (info.elem_l_))
+ if (note_l && Rhythmic_head::has_interface (info.grob_l_))
{
mel_l_arr_.push (note_l);
- support_l_arr_.push (info.elem_l_);
+ support_l_arr_.push (info.grob_l_);
}
- else if (Tie::has_interface (info.elem_l_))
+ else if (Tie::has_interface (info.grob_l_))
{
- tie_l_arr_.push (info.elem_l_);
+ tie_l_arr_.push (info.grob_l_);
}
- else if (Arpeggio::has_interface (info.elem_l_))
+ else if (Arpeggio::has_interface (info.grob_l_))
{
- arpeggios_.push (info.elem_l_);
+ arpeggios_.push (info.grob_l_);
}
}
-ADD_THIS_TRANSLATOR (Local_key_engraver);
+
+ENTER_DESCRIPTION(Local_key_engraver,
+/* descr */ "Make accidentals. Catches note heads, ties and notices key-change
+events. Due to interaction with ties (which don't come together
+with note heads), this needs to be in a context higher than Tie_engraver. FIXME",
+/* creats*/ "Accidentals",
+/* acks */ "rhythmic-head-interface tie-interface arpeggio-interface",
+/* reads */ "localKeySignature forgetAccidentals noResetKey",
+/* write */ "");
for (SCM s = accs;
gh_pair_p (s); s = ly_cdr (s))
{
- SCM opts = gh_cdar (s);
+ SCM opts = ly_cdar (s);
SCM t = scm_memq (ly_symbol2scm ("tie-break-reminder"), opts);
if (t != SCM_BOOL_F)
{
- Grob *tie = unsmob_grob (gh_cadr (t));
+ Grob *tie = unsmob_grob (ly_cadr (t));
Spanner *sp = dynamic_cast<Spanner*> (tie);
if (!sp->original_l_)
{
/* there should be a better way to delete part of me */
- scm_set_car_x (s, scm_list_n (gh_caar (s),
+ scm_set_car_x (s, scm_list_n (ly_caar (s),
ly_symbol2scm ("deleted"),
SCM_UNDEFINED));
me->set_grob_property ("molecule", SCM_EOL);
for (SCM s = accs;
gh_pair_p (s); s = ly_cdr (s))
{
- Pitch p (*unsmob_pitch (gh_caar (s)));
- SCM opts = gh_cdar (s);
+ Pitch p (*unsmob_pitch (ly_caar (s)));
+ SCM opts = ly_cdar (s);
if (scm_memq (ly_symbol2scm ("deleted"), opts) != SCM_BOOL_F)
continue;
Box b (Interval (0, w + sqrt (sqr(t/s) + sqr (t))),
Interval (0, w * s));
- return Molecule (b, slashnodot);
+ return Molecule (b, slashnodot); // http://slashnodot.org
}
virtual void start_translation_timestep ();
public:
- Lyric_engraver ();
- VIRTUAL_COPY_CONS (Translator);
-
+ TRANSLATOR_DECLARATIONS(Lyric_engraver);
private:
Lyric_req * req_l_;
Item* text_p_;
};
-ADD_THIS_TRANSLATOR (Lyric_engraver);
+
Lyric_engraver::Lyric_engraver ()
}
+ENTER_DESCRIPTION(Lyric_engraver,
+/* descr */ "",
+/* creats*/ "",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
class Lyric_performer : public Performer {
public:
- VIRTUAL_COPY_CONS (Translator);
- Lyric_performer ();
-
+ TRANSLATOR_DECLARATIONS(Lyric_performer);
protected:
virtual bool try_music (Music* req_l);
Audio_text* audio_p_;
};
-ADD_THIS_TRANSLATOR (Lyric_performer);
+
+
Lyric_performer::Lyric_performer ()
{
return false;
}
+ENTER_DESCRIPTION(Lyric_performer,"","","","","");
String get_context_id (Translator_group * ancestor, const char * type);
String trim_suffix (String &id);
-ADD_THIS_TRANSLATOR (Lyric_phrasing_engraver);
+
/*
TODO: this code is too hairy, and does things that should be in the
if (! (gh_boolean_p (s) && !to_boolean (s))) {
/* match found */
// (key . ((alist_entry . old_entry) . previous_entry))
- if (to_boolean (gh_cdadr (s))) { // it's an old entry ... make it a new one
- SCM val = gh_cons (gh_cons (gh_caadr (s), SCM_BOOL_F), gh_cddr (s));
+ if (to_boolean (ly_cdadr (s))) { // it's an old entry ... make it a new one
+ SCM val = gh_cons (gh_cons (ly_caadr (s), SCM_BOOL_F), ly_cddr (s));
voice_alist_ = scm_assoc_set_x (voice_alist_, ly_car (s), val);
- return unsmob_voice_entry (gh_caar (val));
+ return unsmob_voice_entry (ly_caar (val));
}
else { // the entry is current ... return it.
- SCM entry_scm = gh_caadr (s);
+ SCM entry_scm = ly_caadr (s);
return unsmob_voice_entry (entry_scm);
}
}
Syllable_group::make_entry ());
voice_alist_ = scm_acons (key, val, voice_alist_);
- return unsmob_voice_entry (gh_caar (val));
+ return unsmob_voice_entry (ly_caar (val));
}
if (! (gh_boolean_p (s) && !to_boolean (s))) {
/* match found */
// (key . ((alist_entry . old_entry) . previous_entry))
- SCM previous_scm = gh_cddr (s);
+ SCM previous_scm = ly_cddr (s);
if (previous_scm != SCM_EOL) {
Syllable_group * v = unsmob_voice_entry (previous_scm);
v->add_extender (extender);
return;
- Grob *h = i.elem_l_;
+ Grob *h = i.grob_l_;
if (Note_head::has_interface (h)) {
/* caught a note head ... do something with it */
punc = gh_string_p (sp) ? ly_scm2string (sp) : ".,;:?!\"";
for (SCM v=voice_alist_; gh_pair_p (v); v = ly_cdr (v)) {
- SCM v_entry = gh_cdar (v);
+ SCM v_entry = ly_cdar (v);
// ((current . oldflag) . previous)
- if (!to_boolean (gh_cdar (v_entry))) { // not an old entry left over from a prior note ...
- Syllable_group *entry = unsmob_voice_entry (gh_caar (v_entry));
+ if (!to_boolean (ly_cdar (v_entry))) { // not an old entry left over from a prior note ...
+ Syllable_group *entry = unsmob_voice_entry (ly_caar (v_entry));
/*
TODO: give context for warning.
Lyric_phrasing_engraver::stop_translation_timestep ()
{
for (SCM v=voice_alist_; gh_pair_p (v); v = ly_cdr (v)) {
- SCM entry_scm = gh_cdar (v);
+ SCM entry_scm = ly_cdar (v);
// ((alist_entry . entry_is_old) . previous_entry)
- Syllable_group * entry = unsmob_voice_entry (gh_caar (entry_scm));
+ Syllable_group * entry = unsmob_voice_entry (ly_caar (entry_scm));
// set previous_entry, set entry_is_old, and resave it to alist_
// but only change if this current was not old.
- if (! to_boolean (gh_cdar (entry_scm))) {
+ if (! to_boolean (ly_cdar (entry_scm))) {
Syllable_group * previous_entry = unsmob_voice_entry (ly_cdr (entry_scm));
previous_entry->copy (entry);
- entry_scm = gh_cons (gh_cons (gh_caar (entry_scm), SCM_BOOL_T), ly_cdr (entry_scm));
- voice_alist_ = scm_assoc_set_x (voice_alist_, gh_caar (v), entry_scm);
+ entry_scm = gh_cons (gh_cons (ly_caar (entry_scm), SCM_BOOL_T), ly_cdr (entry_scm));
+ voice_alist_ = scm_assoc_set_x (voice_alist_, ly_caar (v), entry_scm);
}
entry->next_lyric ();
}
+ENTER_DESCRIPTION(Lyric_phrasing_engraver,
+/* descr */ "",
+/* creats*/ "",
+/* acks */ "lyric-syllable-interface note-head-interface lyric-extender-interface",
+/* reads */ "automaticPhrasing melismaEngraverBusy associatedVoice phrasingPunctuation",
+/* write */ "");
all_fonts_global_p = new All_font_metrics (global_path.str ());
init_scheme_code_string += ")";
- scm_c_eval_string ((char *)init_scheme_code_string.ch_C());
+ gh_eval_str ((char *)init_scheme_code_string.ch_C());
int p=0;
const char *arg = oparser_p_static->get_next_arg ();
class Mark_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
- Mark_engraver ();
+ TRANSLATOR_DECLARATIONS(Mark_engraver);
protected:
Item* text_p_;
};
-ADD_THIS_TRANSLATOR (Mark_engraver);
+
Mark_engraver::Mark_engraver ()
}
+
+
+/*
+
+which grobs carry INVISIBLE-STAFF ?
+
+*/
+
void
Mark_engraver::acknowledge_grob (Grob_info inf)
{
- Grob * s = inf.elem_l_;
+ Grob * s = inf.grob_l_;
if (Staff_symbol::has_interface (s)
|| to_boolean (s->get_grob_property ("invisible-staff")))
{
SCM sts = get_property ("stavesFound");
- SCM thisstaff = inf.elem_l_->self_scm ();
+ SCM thisstaff = inf.grob_l_->self_scm ();
if (scm_memq (thisstaff, sts) == SCM_BOOL_F)
daddy_trans_l_->set_property ("stavesFound", gh_cons (thisstaff, sts));
}
}
}
+ENTER_DESCRIPTION(Mark_engraver,
+/* descr */ "",
+/* creats*/ "RehearsalMark",
+/* acks */ "grob-interface",
+/* reads */ "rehearsalMark stavesFound",
+/* write */ "");
class Melisma_engraver:public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Melisma_engraver);
bool try_music (Music *);
};
-ADD_THIS_TRANSLATOR (Melisma_engraver);
+
bool
Melisma_engraver::try_music (Music *m)
daddy_trans_l_->set_property ("melismaEngraverBusy",SCM_BOOL_F);
return false;
}
+Melisma_engraver::Melisma_engraver()
+{
+}
+ENTER_DESCRIPTION(Melisma_engraver,
+/* descr */ "",
+/* creats*/ "",
+/* acks */ "",
+/* reads */ "melismaBusy slurMelismaBusy tieMelismaBusy beamMelismaBusy",
+/* write */ "");
if (m && ly_axis_p (axis) && ly_number_pair_p (np))
{
Interval iv = ly_scm2interval (np);
- m->dim_[Axis (gh_scm2int (axis))] = ly_scm2interval (np);
+ m->dim_[Axis (gh_scm2int (axis))] = iv;
}
else
warning ("ly-set-molecule-extent!: invalid arguments");
int
Molecule::print_smob (SCM s, SCM port, scm_print_state *)
{
- Molecule *r = (Molecule *) ly_cdr (s);
scm_puts ("#<Molecule ", port);
- /* String str (r->str ());
- scm_puts ((char *)str.ch_C (), port);*/
+#if 0
+ Molecule *r = (Molecule *) ly_cdr (s);
+ String str (r->str ());
+ scm_puts ((char *)str.ch_C (), port);
+#endif
scm_puts (" >", port);
return 1;
class Multi_measure_rest_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
- Multi_measure_rest_engraver ();
+ TRANSLATOR_DECLARATIONS(Multi_measure_rest_engraver);
protected:
virtual bool try_music (Music*);
Spanner *lastrest_p_;
};
-ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver);
+
Multi_measure_rest_engraver::Multi_measure_rest_engraver ()
{
if (lastrest_p_)
typeset_grob (lastrest_p_);
}
+
+ENTER_DESCRIPTION(Multi_measure_rest_engraver,
+/* descr */ "Engraves multi-measure rests that are produced with @code{R}. Reads
+measurePosition and currentBarNumber to determine what number to print over the MultiMeasureRest
+",
+/* creats*/ "MultiMeasureRest",
+/* acks */ "",
+/* reads */ "currentBarNumber currentCommandColumn measurePosition",
+/* write */ "");
{
for (SCM s = a; gh_pair_p (s); s = ly_cdr (s))
{
- scm_display (gh_caar (s), port);
+ scm_display (ly_caar (s), port);
scm_puts (" = ", port);
- scm_write (gh_cdar (s), port);
+ scm_write (ly_cdar (s), port);
scm_puts ("\n", port);
}
}
{"denies", DENIES},
{"duration", DURATION},
{"dynamicscript", DYNAMICSCRIPT},
- {"elementdescriptions", ELEMENTDESCRIPTIONS},
+ {"grobdescriptions", GROBDESCRIPTIONS},
{"figures",FIGURES},
{"grace", GRACE},
{"glissando", GLISSANDO},
SCM l = SCM_EOL;
for (SCM s = al ; gh_pair_p (s); s = ly_cdr (s))
{
- Translator_def * td = unsmob_translator_def (gh_cdar (s));
- l = gh_cons (gh_cons (gh_caar (s), td->to_alist ()), l);
+ Translator_def * td = unsmob_translator_def (ly_cdar (s));
+ l = gh_cons (gh_cons (ly_caar (s), td->to_alist ()), l);
}
return l;
}
cols->del (i);
}
- int n = 0;
+
for (int i =0 ; i < cols->size (); i++)
{
if (Paper_column::musical_b (cols->elem (i)))
*/
for (SCM s = seq; gh_pair_p (s); s = ly_cdr (s))
{
- Grob *lm = unsmob_grob (gh_caar (s));
- Grob *rm = unsmob_grob (gh_cdar (s));
+ Grob *lm = unsmob_grob (ly_caar (s));
+ Grob *rm = unsmob_grob (ly_cdar (s));
// TODO; configgable.
hinterfleisch += -headwid + Separation_item::my_width (lm)[RIGHT] -
class Note_head_line_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
- Note_head_line_engraver ();
+ TRANSLATOR_DECLARATIONS(Note_head_line_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
void
Note_head_line_engraver::acknowledge_grob (Grob_info info)
{
- if (Rhythmic_head::has_interface (info.elem_l_))
+ if (Rhythmic_head::has_interface (info.grob_l_))
{
- head_ = info.elem_l_;
+ head_ = info.grob_l_;
if (to_boolean (get_property ("followVoice")))
{
Translator_group * tr = daddy_trans_l_;
}
-ADD_THIS_TRANSLATOR (Note_head_line_engraver);
+
+ENTER_DESCRIPTION(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.",
+/* creats*/ "Glissando VoiceFollower",
+/* acks */ "rhythmic-head-interface",
+/* reads */ "followVoice",
+/* write */ "");
Link_array<Note_req> note_req_l_arr_;
Moment note_end_mom_;
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Note_heads_engraver);
protected:
virtual void start_translation_timestep ();
}
}
+Note_heads_engraver::Note_heads_engraver()
+{}
-
-ADD_THIS_TRANSLATOR (Note_heads_engraver);
-
+ENTER_DESCRIPTION(Note_heads_engraver,
+/* descr */ "Generate one or more noteheads from Music of type Note_req.",
+/* creats*/ "NoteHead Dots",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
class Note_name_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Note_name_engraver);
+
Link_array<Note_req> req_l_arr_;
Link_array<Item> texts_;
virtual bool try_music (Music*m);
req_l_arr_.clear ();
}
-ADD_THIS_TRANSLATOR (Note_name_engraver);
+
+Note_name_engraver::Note_name_engraver()
+{
+}
+
+ENTER_DESCRIPTION(Note_name_engraver,
+/* descr */ "",
+/* creats*/ "NoteName",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
*/
class Note_performer : public Performer {
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Note_performer);
protected:
virtual bool try_music (Music *req_l) ;
Array<Audio_note*> delayed_p_arr_;
};
-ADD_THIS_TRANSLATOR (Note_performer);
-
void
Note_performer::create_audio_elements ()
{
}
return false;
}
+
+ENTER_DESCRIPTION(Note_performer,"","","","","");
+
+Note_performer::Note_performer()
+{
+}
class Output_property_engraver : public Engraver
{
-public:
- VIRTUAL_COPY_CONS (Translator);
+TRANSLATOR_DECLARATIONS(Output_property_engraver);
protected:
/*
should typecheck pred.
*/
SCM result=gh_apply (pred,
- scm_list_n (inf.elem_l_->self_scm (), SCM_UNDEFINED));
+ scm_list_n (inf.grob_l_->self_scm (), SCM_UNDEFINED));
if (to_boolean (result))
{
SCM sym = o->get_mus_property ("grob-property");
SCM val = o->get_mus_property ("grob-value");
- inf.elem_l_->set_grob_property (sym, val);
+ inf.grob_l_->set_grob_property (sym, val);
}
}
}
props_.clear ();
}
-ADD_THIS_TRANSLATOR (Output_property_engraver);
+Output_property_engraver::Output_property_engraver()
+{
+}
+
+ENTER_DESCRIPTION(Output_property_engraver,
+/* descr */ "Interpret Music of Output_property type, and apply a function
+to any Graphic objects that satisfies the predicate.",
+/* creats*/ "",
+/* acks */ "grob-interface",
+/* reads */ "",
+/* write */ "");
SCM l = SCM_EOL;
for (SCM s = scaled_fonts_; gh_pair_p (s); s = ly_cdr (s))
{
- SCM desc = gh_caar (s);
- SCM mdesc = unsmob_metrics (gh_cdar (s))->description_;
+ SCM desc = ly_caar (s);
+ SCM mdesc = unsmob_metrics (ly_cdar (s))->description_;
l = gh_cons (gh_cons (mdesc, desc), l);
}
dump_scheme (scm);
}
+void flatten_write (SCM x, Paper_stream*ps)
+{
+ if (ly_pair_p (x))
+ {
+ flatten_write (ly_car (x),ps);
+ flatten_write (ly_cdr (x),ps);
+ }
+ else if (gh_string_p (x))
+ {
+ *ps << String ( SCM_STRING_CHARS(x)) ;
+ }
+}
+
/*
UGH.
else
{
SCM result = scm_primitive_eval (s);
- char *c=gh_scm2newstr (result, NULL);
-
- *stream_p_ << c;
- free (c);
+ flatten_write (result, stream_p_);
}
}
SCM al = scope->to_alist ();
for (SCM s = al ; gh_pair_p (s); s = ly_cdr (s))
{
- SCM k = gh_caar (s);
- SCM v = gh_cdar (s);
+ SCM k = ly_caar (s);
+ SCM v = ly_cdar (s);
String s = ly_symbol2string (k);
{
void typeset_perc ();
public:
- VIRTUAL_COPY_CONS (Translator);
- Percent_repeat_engraver ();
+ TRANSLATOR_DECLARATIONS(Percent_repeat_engraver);
protected:
Repeated_music * repeat_;
typeset_perc ();
}
-ADD_THIS_TRANSLATOR (Percent_repeat_engraver);
+
+ENTER_DESCRIPTION(Percent_repeat_engraver,
+/* descr */ "Make beat, whole bar and double bar repeats.",
+/* creats*/ "PercentRepeat RepeatSlash DoublePercentRepeat",
+/* acks */ "",
+/* reads */ "measureLength currentCommandColumn",
+/* write */ "");
#include "debug.hh"
-ADD_THIS_TRANSLATOR (Performer_group_performer);
+ENTER_DESCRIPTION(Performer_group_performer,
+/* descr */ "",
+/* creats*/ "",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
+
void
announce_info_arr_.clear ();
}
}
+
+Performer_group_performer::Performer_group_performer(){}
virtual void create_grobs ();
public:
- VIRTUAL_COPY_CONS (Translator);
- Phrasing_slur_engraver ();
+ TRANSLATOR_DECLARATIONS(Phrasing_slur_engraver);
+
};
Phrasing_slur_engraver::Phrasing_slur_engraver ()
void
Phrasing_slur_engraver::acknowledge_grob (Grob_info info)
{
- if (Note_column::has_interface (info.elem_l_))
+ if (Note_column::has_interface (info.grob_l_))
{
- Grob *e =info.elem_l_;
+ Grob *e =info.grob_l_;
for (int i = 0; i < phrasing_slur_l_stack_.size (); i++)
Slur::add_column (phrasing_slur_l_stack_[i], e);
for (int i = 0; i < end_phrasing_slur_l_arr_.size (); i++)
}
-ADD_THIS_TRANSLATOR (Phrasing_slur_engraver);
+
+ENTER_DESCRIPTION(Phrasing_slur_engraver,
+/* descr */ "Print phrasing slurs. Similar to Slur_engraver",
+/* creats*/ "PhrasingSlur",
+/* acks */ "note-column-interface",
+/* reads */ "slurBeginAttachment slurEndAttachment slurMelismaBusy",
+/* write */ "");
class Piano_pedal_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
- Piano_pedal_engraver ();
+ TRANSLATOR_DECLARATIONS(Piano_pedal_engraver);
~Piano_pedal_engraver ();
protected:
virtual void initialize ();
Pedal_info *info_list_;
};
-ADD_THIS_TRANSLATOR (Piano_pedal_engraver);
+
Piano_pedal_engraver::Piano_pedal_engraver ()
{
{
if (p->item_p_)
{
- if (Rhythmic_head::has_interface (info.elem_l_))
+ if (Rhythmic_head::has_interface (info.grob_l_))
{
- Side_position_interface::add_support (p->item_p_, info.elem_l_);
+ Side_position_interface::add_support (p->item_p_, info.grob_l_);
if (Side_position_interface::get_axis (p->item_p_) == X_AXIS
&& !p->item_p_->parent_l (Y_AXIS))
- p->item_p_->set_parent (info.elem_l_, Y_AXIS);
+ p->item_p_->set_parent (info.grob_l_, Y_AXIS);
}
- if (Stem::has_interface (info.elem_l_))
+ if (Stem::has_interface (info.grob_l_))
{
- Side_position_interface::add_support (p->item_p_,info.elem_l_);
+ Side_position_interface::add_support (p->item_p_,info.grob_l_);
}
}
}
}
else
{
- s = gh_cadr (strings);
+ s = ly_cadr (strings);
}
p->start_req_l_ = p->req_l_drul_[START];
}
}
else
{
- s = gh_caddr (strings);
+ s = ly_caddr (strings);
}
p->start_req_l_ = 0;
}
p->req_l_drul_[START] = 0;
}
}
+ENTER_DESCRIPTION(Piano_pedal_engraver,
+/* descr */ "Engrave piano pedal symbols.",
+/* creats*/ "SostenutoPedal SustainPedal UnaCordaPedal",
+/* acks */ "rhythmic-head-interface stem-interface",
+/* reads */ "pedalSostenutoStrings pedalSustainStrings pedalUnaCordaStrings",
+/* write */ "");
};
public:
- VIRTUAL_COPY_CONS (Translator);
- Piano_pedal_performer ();
+ TRANSLATOR_DECLARATIONS(Piano_pedal_performer);
~Piano_pedal_performer ();
protected:
Pedal_info * info_alist_;
};
-ADD_THIS_TRANSLATOR (Piano_pedal_performer);
-
Piano_pedal_performer::Piano_pedal_performer ()
{
info_alist_ = 0;
}
return false;
}
+ENTER_DESCRIPTION (Piano_pedal_performer, "","","","","" );
class Pitch_squash_engraver : public Engraver {
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Pitch_squash_engraver);
virtual void acknowledge_grob (Grob_info);
};
Pitch_squash_engraver::acknowledge_grob (Grob_info i)
{
SCM newpos = get_property ("squashedPosition");
- if (Note_head::has_interface (i.elem_l_))
+ if (Note_head::has_interface (i.grob_l_))
{
- i.elem_l_->set_grob_property ("staff-position", newpos);
+ i.grob_l_->set_grob_property ("staff-position", newpos);
}
}
-ADD_THIS_TRANSLATOR (Pitch_squash_engraver);
+Pitch_squash_engraver::Pitch_squash_engraver()
+{
+}
+
+ENTER_DESCRIPTION(Pitch_squash_engraver,
+/* descr */ "Treat all pitches as middle C. Note that the notes move, but
+the locations of accidentals stay the same.
+Set the position field of all note heads to zero. This useful for
+making a single line staff that demonstrates the rhythm of a melody.",
+/* creats*/ "",
+/* acks */ "note-head-interface",
+/* reads */ "squashedPosition",
+/* write */ "");
class Porrectus_engraver : public Engraver {
public:
- Porrectus_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Porrectus_engraver);
protected:
virtual bool try_music (Music *req_l);
void
Porrectus_engraver::acknowledge_grob (Grob_info info_l_)
{
- if (Rhythmic_head::has_interface (info_l_.elem_l_))
+ if (Rhythmic_head::has_interface (info_l_.grob_l_))
{
Note_req *note_req_l_ = dynamic_cast <Note_req *> (info_l_.req_l_);
if (!note_req_l_)
return;
- right_heads_.push (PHead_melodic_tuple (info_l_.elem_l_, note_req_l_,
+ right_heads_.push (PHead_melodic_tuple (info_l_.grob_l_, note_req_l_,
now_mom () +
note_req_l_->length_mom ()));
}
left_heads_.push (past_notes_pq_.get ());
}
-ADD_THIS_TRANSLATOR (Porrectus_engraver);
+
// TODO: PHead_melodic_tuple is duplicated code from tie-engraver.cc.
// Maybe put this into public class?
int result = Moment::compare(h1.end_, h2.end_);
return result;
}
+ENTER_DESCRIPTION(Porrectus_engraver,
+/* descr */ "Join adjacent notes to a porrectus ligature.",
+/* creats*/ "Porrectus",
+/* acks */ "rhythmic-head-interface",
+/* reads */ "",
+/* write */ "");
virtual void finalize ();
public:
~Property_engraver ();
- Property_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Property_engraver);
};
void
Property_engraver::acknowledge_grob (Grob_info i)
{
- SCM ifs = i.elem_l_->get_grob_property ("interfaces");
+ SCM ifs = i.grob_l_->get_grob_property ("interfaces");
SCM props;
for (; gh_pair_p (ifs); ifs = ly_cdr (ifs))
{
if (prop_dict_->try_retrieve (ly_car (ifs), &props))
{
- apply_properties (props,i.elem_l_, i.origin_trans_l_->daddy_trans_l_);
+ apply_properties (props,i.grob_l_, i.origin_trans_l_->daddy_trans_l_);
}
}
if (prop_dict_->try_retrieve (ly_symbol2scm ("all"), &props))
{
- apply_properties (props, i.elem_l_, i.origin_trans_l_->daddy_trans_l_);
+ apply_properties (props, i.grob_l_, i.origin_trans_l_->daddy_trans_l_);
}
}
SCM entry = ly_car (p);
SCM prop_sym = ly_car (entry);
- SCM type_p = gh_cadr (entry);
- SCM elt_prop_sym = gh_caddr (entry);
+ SCM type_p = ly_cadr (entry);
+ SCM elt_prop_sym = ly_caddr (entry);
SCM preset = scm_assq (elt_prop_sym, e->mutable_property_alist_);
if (preset != SCM_BOOL_F)
}
}
-ADD_THIS_TRANSLATOR (Property_engraver);
+
+ENTER_DESCRIPTION(Property_engraver,
+/* descr */ "This is a engraver that converts property settings into
+back-end grob-property settings. Example: Voice.stemLength will set
+#'length in all Stem objects.
+
+Due to CPU and memory requirements, the use of this engraver is deprecated.",
+/* creats*/ "",
+/* acks */ "grob-interface",
+/* reads */ "Generic_property_list",
+/* write */ "");
class Regular_spacing_engraver : public Engraver
{
public:
- Regular_spacing_engraver ();
- VIRTUAL_COPY_CONS(Translator);
-
+ TRANSLATOR_DECLARATIONS(Regular_spacing_engraver);
Moment last_moment_;
SCM last_col_;
protected:
}
-ADD_THIS_TRANSLATOR(Regular_spacing_engraver);
+ENTER_DESCRIPTION(Regular_spacing_engraver,
+/* descr */ ".",
+/* creats*/ "",
+/* acks */ "",
+/* reads */ "regularSpacingDelta",
+/* write */ "");
+
class Repeat_acknowledge_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
- Repeat_acknowledge_engraver ();
+ TRANSLATOR_DECLARATIONS(Repeat_acknowledge_engraver);
virtual void start_translation_timestep ();
virtual void process_music ();
}
}
-ADD_THIS_TRANSLATOR (Repeat_acknowledge_engraver);
+
+ENTER_DESCRIPTION(Repeat_acknowledge_engraver,
+/* descr */ "Acknowledge repeated music, and convert the contents of
+repeatCommands ainto an appropriate setting for whichBar",
+/* creats*/ "",
+/* acks */ "",
+/* reads */ "repeatCommands whichBar",
+/* write */ "");
virtual void create_grobs ();
virtual void stop_translation_timestep ();
public:
- VIRTUAL_COPY_CONS (Translator);
- Rest_collision_engraver ();
-
+ TRANSLATOR_DECLARATIONS(Rest_collision_engraver);
};
-ADD_THIS_TRANSLATOR (Rest_collision_engraver);
+
Rest_collision_engraver::Rest_collision_engraver ()
{
void
Rest_collision_engraver::acknowledge_grob (Grob_info i)
{
- if (Note_column::has_interface (i.elem_l_))
- note_column_l_arr_.push (i.elem_l_);
+ if (Note_column::has_interface (i.grob_l_))
+ note_column_l_arr_.push (i.grob_l_);
}
void
}
note_column_l_arr_.clear ();
}
+ENTER_DESCRIPTION(Rest_collision_engraver,
+/* descr */ "Handles collisions of rests.",
+/* creats*/ "RestCollision",
+/* acks */ "note-column-interface",
+/* reads */ "",
+/* write */ "");
public:
- VIRTUAL_COPY_CONS (Translator);
- Rest_engraver ();
+ TRANSLATOR_DECLARATIONS(Rest_engraver);
};
}
-ADD_THIS_TRANSLATOR (Rest_engraver);
+
+ENTER_DESCRIPTION(Rest_engraver,
+/* descr */ "",
+/* creats*/ "Rest Dots",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
Grob * stem_l_;
Grob *ncol_p_;
Grob *dotcol_l_;
-
+
+ TRANSLATOR_DECLARATIONS(Rhythmic_column_engraver);
protected:
- VIRTUAL_COPY_CONS (Translator);
+
virtual void acknowledge_grob (Grob_info);
virtual void create_grobs ();
virtual void stop_translation_timestep ();
virtual void start_translation_timestep ();
-public:
- Rhythmic_column_engraver ();
};
void
Rhythmic_column_engraver::acknowledge_grob (Grob_info i)
{
- Item * item = dynamic_cast <Item *> (i.elem_l_);
+ Item * item = dynamic_cast <Item *> (i.grob_l_);
if (item && Stem::has_interface (item))
{
stem_l_ = item;
stem_l_ =0;
}
-ADD_THIS_TRANSLATOR (Rhythmic_column_engraver);
+
+ENTER_DESCRIPTION(Rhythmic_column_engraver,
+/* descr */ "Generates NoteColumn, an objects that groups stems, noteheads and rests.",
+/* creats*/ "NoteColumn",
+/* acks */ "stem-interface note-head-interface dot-column-interface",
+/* reads */ "",
+/* write */ "");
Score_engraver::announce_grob (Grob_info info)
{
announce_info_arr_.push (info);
- pscore_p_->line_l_->typeset_grob (info.elem_l_);
+ pscore_p_->line_l_->typeset_grob (info.grob_l_);
}
/* All elements are propagated to the top upon announcement. If
void
Score_engraver::do_announces ()
{
- ////// do
- Engraver_group_engraver::do_announces ();
- //////while (announce_info_arr_.size ());
+ Engraver_group_engraver::do_announces ();
}
command_column_l_->remove_grob_property ("breakable");
}
-ADD_THIS_TRANSLATOR (Score_engraver);
+
+ENTER_DESCRIPTION(Score_engraver,
+/* descr */ "Top level engraver. Takes care of generating columns and the complete system (ie. LineOfScore)
+
+
+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*/ "LineOfScore PaperColumn NonMusicalPaperColumn",
+/* acks */ "grob-interface",
+/* reads */ "currentMusicalColumn currentCommandColumn",
+/* write */ "");
#include "debug.hh"
#include "translator-def.hh"
-ADD_THIS_TRANSLATOR (Score_performer);
+
+
+ENTER_DESCRIPTION(Score_performer,
+/* descr */ "",
+/* creats*/ "",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
Score_performer::Score_performer ()
/*
TODO: this is not very elegant....
*/
- store_locations_global_b = (scm_c_eval_string ("point-and-click") != SCM_BOOL_F);
+ /* store_locations_global_b = (scm_c_eval_string ("point-and-click") != SCM_BOOL_F);*/
+ store_locations_global_b = (gh_eval_str ("point-and-click") != SCM_BOOL_F);
+
Music * m =unsmob_music (s.music_);
music_ = m?m->clone ()->self_scm () : SCM_EOL;
}
int
-Score::print_smob (SCM s, SCM p, scm_print_state*)
+Score::print_smob (SCM , SCM p, scm_print_state*)
{
scm_puts ("#<Score>", p);
Link_array<Item> script_l_arr_;
public:
- Script_column_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Script_column_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
virtual void create_grobs ();
void
Script_column_engraver::acknowledge_grob (Grob_info inf)
{
- Item *thing = dynamic_cast<Item*> (inf.elem_l_);
- if (thing && Side_position_interface::has_interface (inf.elem_l_)) // ugh FIXME
+ Item *thing = dynamic_cast<Item*> (inf.grob_l_);
+ if (thing && Side_position_interface::has_interface (inf.grob_l_)) // ugh FIXME
{
if (!Item::breakable_b (thing)
- && Side_position_interface::get_axis (inf.elem_l_) == Y_AXIS)
+ && Side_position_interface::get_axis (inf.grob_l_) == Y_AXIS)
{
script_l_arr_.push (thing);
}
script_l_arr_.clear ();
}
}
-ADD_THIS_TRANSLATOR (Script_column_engraver);
+
+ENTER_DESCRIPTION(Script_column_engraver,
+/* descr */ "",
+/* creats*/ "ScriptColumn",
+/* acks */ "side-position-interface",
+/* reads */ "",
+/* write */ "");
Link_array<Articulation_req> script_req_l_arr_;
public:
- VIRTUAL_COPY_CONS (Translator);
-
+ TRANSLATOR_DECLARATIONS(Script_engraver);
protected:
virtual bool try_music (Music*);
virtual void initialize ();
void
Script_engraver::acknowledge_grob (Grob_info inf)
{
- if (Stem::has_interface (inf.elem_l_))
+ if (Stem::has_interface (inf.grob_l_))
{
for (int i=0; i < script_p_arr_.size (); i++)
{
Grob*e = script_p_arr_[i];
- e->set_grob_property ("direction-source", inf.elem_l_->self_scm ());
- e->add_dependency (inf.elem_l_);
- Side_position_interface::add_support (e, inf.elem_l_);
+ e->set_grob_property ("direction-source", inf.grob_l_->self_scm ());
+ e->add_dependency (inf.grob_l_);
+ Side_position_interface::add_support (e, inf.grob_l_);
}
}
- else if (Rhythmic_head::has_interface (inf.elem_l_))
+ else if (Rhythmic_head::has_interface (inf.grob_l_))
{
for (int i=0; i < script_p_arr_.size (); i++)
{
if (!e->parent_l (X_AXIS))
{
- e->set_parent (inf.elem_l_, X_AXIS);
+ e->set_parent (inf.grob_l_, X_AXIS);
}
if (Side_position_interface::get_axis (e) == X_AXIS
&& !e->parent_l (Y_AXIS))
{
- e->set_parent (inf.elem_l_, Y_AXIS);
- e->add_dependency (inf.elem_l_); // ??
+ e->set_parent (inf.grob_l_, Y_AXIS);
+ e->add_dependency (inf.grob_l_); // ??
}
- Side_position_interface::add_support (e,inf.elem_l_);
+ Side_position_interface::add_support (e,inf.grob_l_);
}
}
}
script_req_l_arr_.clear ();
}
-ADD_THIS_TRANSLATOR (Script_engraver);
+Script_engraver::Script_engraver(){}
+
+ENTER_DESCRIPTION(Script_engraver,
+/* descr */ " Handles note ornaments generated by @code{\\script}.
+",
+/* creats*/ "Script",
+/* acks */ "stem-interface rhythmic-head-interface",
+/* reads */ "scriptDefinitions scriptHorizontal",
+/* write */ "");
virtual void finalize ();
virtual void stop_translation_timestep ();
public:
- Separating_line_group_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Separating_line_group_engraver);
};
Separating_line_group_engraver::Separating_line_group_engraver ()
void
Separating_line_group_engraver::acknowledge_grob (Grob_info i)
{
- Item * it = dynamic_cast <Item *> (i.elem_l_);
+ Item * it = dynamic_cast <Item *> (i.grob_l_);
if (!it)
return;
if (it->parent_l (X_AXIS)
-ADD_THIS_TRANSLATOR (Separating_line_group_engraver);
+
+ENTER_DESCRIPTION(Separating_line_group_engraver,
+/* descr */ "Generates objects for computing spacing parameters.",
+/* creats*/ "SeparationItem SeparatingGroupSpanner",
+/* acks */ "grob-interface",
+/* reads */ "",
+/* write */ "");
!gh_pair_p (spring_params) && gh_pair_p (s);
s = ly_cdr (s))
{
- Grob *other = unsmob_grob (gh_caar (s));
+ Grob *other = unsmob_grob (ly_caar (s));
if (other != cols[i+1])
continue;
- spring_params = gh_cdar (s);
+ spring_params = ly_cdar (s);
}
Spring_description desc;
for (SCM s = Spaceable_grob::get_minimum_distances (cols[i]);
gh_pair_p (s); s = ly_cdr (s))
{
- Grob * other = unsmob_grob (gh_caar (s));
+ Grob * other = unsmob_grob (ly_caar (s));
int oi = cols.find_i (other);
if (oi >= 0)
{
- add_rod (i, oi, gh_scm2double (gh_cdar (s)));
+ add_rod (i, oi, gh_scm2double (ly_cdar (s)));
}
}
}
virtual void create_grobs ();
public:
- VIRTUAL_COPY_CONS (Translator);
- Slur_engraver ();
+ TRANSLATOR_DECLARATIONS(Slur_engraver);
};
Slur_engraver::Slur_engraver ()
void
Slur_engraver::acknowledge_grob (Grob_info info)
{
- if (Note_column::has_interface (info.elem_l_))
+ if (Note_column::has_interface (info.grob_l_))
{
- Grob *e =info.elem_l_;
+ Grob *e =info.grob_l_;
for (int i = 0; i < slur_l_stack_.size (); i++)
Slur::add_column (slur_l_stack_[i], e);
for (int i = 0; i < end_slur_l_arr_.size (); i++)
}
-ADD_THIS_TRANSLATOR (Slur_engraver);
+
+ENTER_DESCRIPTION(Slur_engraver,
+/* descr */ "Build slurs from Slur_reqs",
+/* creats*/ "Slur",
+/* acks */ "note-column-interface",
+/* reads */ "slurBeginAttachment slurEndAttachment slurMelismaBusy",
+/* write */ "");
SCM up = me->get_grob_property ("de-uglify-parameters");
Real c1 = gh_scm2double (ly_car (up));
- Real c2 = gh_scm2double (gh_cadr (up));
- Real c3 = gh_scm2double (gh_caddr (up));
+ Real c2 = gh_scm2double (ly_cadr (up));
+ Real c3 = gh_scm2double (ly_caddr (up));
if (h > c1 * f)
{
for (SCM s = me->get_grob_property ("extremity-rules");
s != SCM_EOL; s = ly_cdr (s))
{
- SCM r = gh_call2 (gh_caar (s), me->self_scm (),
+ SCM r = gh_call2 (ly_caar (s), me->self_scm (),
gh_int2scm ((int)dir));
if (r != SCM_BOOL_F)
{
index_set_cell (me->get_grob_property ("attachment"), dir,
- gh_cdar (s));
+ ly_cdar (s));
break;
}
}
Array<Rhythmic_tuple> stopped_durations_;
Spanner * spacing_p_;
+
+ TRANSLATOR_DECLARATIONS(Spacing_engraver);
protected:
- VIRTUAL_COPY_CONS (Translator);
virtual void acknowledge_grob (Grob_info);
virtual void start_translation_timestep ();
virtual void stop_translation_timestep ();
virtual void initialize ();
virtual void finalize ();
-public:
- Spacing_engraver ();
};
inline int
void
Spacing_engraver::acknowledge_grob (Grob_info i)
{
- if (to_boolean (i.elem_l_->get_grob_property ("non-rhythmic")))
+ if (to_boolean (i.grob_l_->get_grob_property ("non-rhythmic")))
return;
if (Rhythmic_req * r = dynamic_cast<Rhythmic_req*> (i.req_l_))
stopped_durations_.push (playing_durations_.get ());
}
-ADD_THIS_TRANSLATOR (Spacing_engraver);
+
+ENTER_DESCRIPTION(Spacing_engraver,
+/* descr */ "make a SpacingSpanner and do bookkeeping of shortest starting and playing notes ",
+/* creats*/ "SpacingSpanner",
+/* acks */ "grob-interface",
+/* reads */ "",
+/* write */ "");
class Span_arpeggio_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
- Span_arpeggio_engraver ();
-
+ TRANSLATOR_DECLARATIONS(Span_arpeggio_engraver);
+
protected:
virtual void acknowledge_grob (Grob_info);
virtual void create_grobs ();
Span_arpeggio_engraver::acknowledge_grob (Grob_info info)
{
if (info.origin_trans_l_arr (this).size ()
- && Arpeggio::has_interface (info.elem_l_))
+ && Arpeggio::has_interface (info.grob_l_))
{
- arpeggios_.push (info.elem_l_);
+ arpeggios_.push (info.grob_l_);
}
}
arpeggios_.clear ();
}
-ADD_THIS_TRANSLATOR (Span_arpeggio_engraver);
+
+ENTER_DESCRIPTION(Span_arpeggio_engraver,
+/* descr */ "",
+/* creats*/ "Arpeggio",
+/* acks */ "arpeggio-interface",
+/* reads */ "connectArpeggios",
+/* write */ "");
Link_array<Item> bar_l_arr_;
public:
- VIRTUAL_COPY_CONS (Translator);
- Span_bar_engraver ();
+ TRANSLATOR_DECLARATIONS(Span_bar_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
virtual void stop_translation_timestep ();
{
int depth = i.origin_trans_l_arr (this).size ();
if (depth > 1
- && Bar::has_interface (i.elem_l_))
+ && Bar::has_interface (i.grob_l_))
{
- Item * it = dynamic_cast<Item*> (i.elem_l_);
+ Item * it = dynamic_cast<Item*> (i.grob_l_);
bar_l_arr_.push (it);
if (bar_l_arr_.size () >= 2 && !spanbar_p_)
-ADD_THIS_TRANSLATOR (Span_bar_engraver);
+
+ENTER_DESCRIPTION(Span_bar_engraver,
+/* descr */ "This engraver makes cross-staff barlines: It catches all normal
+bar lines, and draws a single span-bar across them.",
+/* creats*/ "SpanBar",
+/* acks */ "bar-line-interface",
+/* reads */ "",
+/* write */ "");
class Span_dynamic_performer : public Performer
{
public:
- VIRTUAL_COPY_CONS (Translator);
-
- Span_dynamic_performer ();
+ TRANSLATOR_DECLARATIONS(Span_dynamic_performer);
protected:
virtual bool try_music (Music*);
Direction finished_dir_;
};
-ADD_THIS_TRANSLATOR (Span_dynamic_performer);
-
Span_dynamic_performer::Span_dynamic_performer ()
{
span_req_l_drul_[START] = 0;
}
return false;
}
+ENTER_DESCRIPTION (Span_dynamic_performer, "","","","","" );
class Staff_performer : public Performer_group_performer
{
public:
- VIRTUAL_COPY_CONS (Translator);
-
-
- Staff_performer ();
+ TRANSLATOR_DECLARATIONS(Staff_performer);
~Staff_performer ();
String new_instrument_str ();
Audio_tempo* tempo_p_;
};
-ADD_THIS_TRANSLATOR (Staff_performer);
+ENTER_DESCRIPTION (Staff_performer, "","","","","" );
Staff_performer::Staff_performer ()
{
class Staff_symbol_engraver : public Engraver {
Spanner *span_p_;
public:
- VIRTUAL_COPY_CONS (Translator);
- Staff_symbol_engraver ();
+ TRANSLATOR_DECLARATIONS(Staff_symbol_engraver);
protected:
virtual ~Staff_symbol_engraver ();
void
Staff_symbol_engraver::acknowledge_grob (Grob_info s)
{
- s.elem_l_->set_grob_property ("staff-symbol", span_p_->self_scm ());
+ s.grob_l_->set_grob_property ("staff-symbol", span_p_->self_scm ());
// remove this. probly not necessary?
- s.elem_l_->add_dependency (span_p_); // UGH. UGH. UGH
+ s.grob_l_->add_dependency (span_p_); // UGH. UGH. UGH
}
-ADD_THIS_TRANSLATOR (Staff_symbol_engraver);
+
+ENTER_DESCRIPTION(Staff_symbol_engraver,
+/* descr */ "create the constellation of five (default)
+staff lines.",
+/* creats*/ "StaffSymbol",
+/* acks */ "grob-interface",
+/* reads */ "",
+/* write */ "");
#include "engraver.hh"
#include "item.hh"
-//#include "system-start-delimiter.hh"
-//#include "side-position-interface.hh"
-//#include "staff-symbol-referencer.hh"
#include "bar.hh"
class Stanza_number_engraver : public Engraver
{
Item *text_;
- bool bar_b_;;
+ bool bar_b_;
void create_text (SCM s);
public:
- VIRTUAL_COPY_CONS (Translator);
- Stanza_number_engraver ();
+ TRANSLATOR_DECLARATIONS(Stanza_number_engraver);
- virtual void acknowledge_grob (Grob_info);
+ virtual void process_music ();
virtual void stop_translation_timestep ();
};
-ADD_THIS_TRANSLATOR (Stanza_number_engraver);
+
Stanza_number_engraver::Stanza_number_engraver ()
{
}
void
-Stanza_number_engraver::acknowledge_grob (Grob_info i)
+Stanza_number_engraver::process_music ()
{
if (gh_string_p (get_property ("whichBar")))
{
// TODO
if (gh_string_p (s))
-
/*
- if (i.elem_l_->has_interface (symbol ("lyric-syllable-interface")))
+ if (i.grob_l_->has_interface (symbol ("lyric-syllable-interface")))
Tried catching lyric items to generate stanza numbers, but it
spoils lyric spacing.
+ENTER_DESCRIPTION(Stanza_number_engraver,
+/* descr */ "",
+/* creats*/ "StanzaNumber",
+/* acks */ "",
+/* reads */ "stz stanza",
+/* write */ "");
#include "translator-group.hh"
#include "engraver.hh"
+
+
/**
Make stems upon receiving noteheads.
*/
class Stem_engraver : public Engraver
{
-
-public:
- VIRTUAL_COPY_CONS (Translator);
- Stem_engraver ();
-
+ TRANSLATOR_DECLARATIONS(Stem_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
virtual void stop_translation_timestep ();
Tremolo_req* tremolo_req_l_;
};
-ADD_THIS_TRANSLATOR (Stem_engraver);
-
Stem_engraver::Stem_engraver ()
{
tremolo_req_l_ = 0;
void
Stem_engraver::acknowledge_grob (Grob_info i)
{
- Grob* h = i.elem_l_;
+ Grob* h = i.grob_l_;
if (Rhythmic_head::has_interface (h))
{
if (Rhythmic_head::stem_l (h))
return false;
}
+ENTER_DESCRIPTION(Stem_engraver,
+/* descr */ "Create stems and single-stem tremolos. It also works together with
+the beam engraver for overriding beaming.",
+/* creats*/ "Stem StemTremolo",
+/* acks */ "rhythmic-head-interface",
+/* reads */ "tremoloFlags stemLeftBeamCount stemRightBeamCount",
+/* write */ "");
class Swallow_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Swallow_engraver);
protected:
bool try_music (Music*) ;
};
-ADD_THIS_TRANSLATOR (Swallow_engraver);
+
bool
Swallow_engraver::try_music (Music*)
(c) 1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-#include "swallow-perf.hh"
+#include "performer.hh"
+class Swallow_performer : public Performer
+{
+public:
+ TRANSLATOR_DECLARATIONS(Swallow_performer);
+protected:
+ virtual bool try_music (Music*) { return true; }
+};
+Swallow_performer::Swallow_performer()
+{}
-ADD_THIS_TRANSLATOR (Swallow_performer);
+ENTER_DESCRIPTION(Swallow_performer,
+/* descr */ "",
+/* creats*/ "",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
class System_start_delimiter_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
- System_start_delimiter_engraver ();
+ TRANSLATOR_DECLARATIONS(System_start_delimiter_engraver);
protected:
Spanner * delim_;
virtual void finalize ();
};
-ADD_THIS_TRANSLATOR (System_start_delimiter_engraver);
+
void
System_start_delimiter_engraver::acknowledge_grob (Grob_info inf)
{
- if (Staff_symbol::has_interface (inf.elem_l_))
+ if (Staff_symbol::has_interface (inf.grob_l_))
{
/*
don't add as Axis_group_interface::add_element (delim_,),
because that would set the parent as well */
- Pointer_group_interface::add_element (delim_, "elements", inf.elem_l_);
+ Pointer_group_interface::add_element (delim_, "elements", inf.grob_l_);
}
- else if (System_start_delimiter::has_interface (inf.elem_l_))
+ else if (System_start_delimiter::has_interface (inf.grob_l_))
{
- SCM gl = inf.elem_l_->get_grob_property ("glyph");
+ SCM gl = inf.grob_l_->get_grob_property ("glyph");
SCM my_gl = delim_->get_grob_property ("glyph");
/*
*/
if (gh_symbol_p (gl) && gl == ly_symbol2scm ("brace")
&& gh_symbol_p (my_gl) && my_gl == ly_symbol2scm ("bracket"))
- inf.elem_l_->translate_axis (-0.8, X_AXIS); // ugh
+ inf.grob_l_->translate_axis (-0.8, X_AXIS); // ugh
else if (gh_symbol_p (gl) && gl == ly_symbol2scm ("bracket")
&& gh_symbol_p (my_gl) && my_gl == ly_symbol2scm ("bracket"))
{
- inf.elem_l_->translate_axis ( -0.8, X_AXIS); // ugh
- inf.elem_l_->set_grob_property ("arch-height",
- gh_double2scm(gh_scm2double(inf.elem_l_->get_grob_property
+ inf.grob_l_->translate_axis ( -0.8, X_AXIS); // ugh
+ inf.grob_l_->set_grob_property ("arch-height",
+ gh_double2scm(gh_scm2double(inf.grob_l_->get_grob_property
("arch-height"))+0.5));
}
}
typeset_grob (delim_);
}
+ENTER_DESCRIPTION(System_start_delimiter_engraver,
+/* descr */ "creates a system start delimiter (ie. SystemStart@{Bar,Brace,Bracket@} spanner",
+/* creats*/ "SystemStartBar SystemStartBrace SystemStartBracket",
+/* acks */ "system-start-delimiter-interface staff-symbol-interface",
+/* reads */ "",
+/* write */ "");
class Tempo_performer : public Performer
{
public:
- VIRTUAL_COPY_CONS (Translator);
-
- Tempo_performer ();
+ TRANSLATOR_DECLARATIONS(Tempo_performer);
~Tempo_performer ();
protected:
Audio_tempo* audio_p_;
};
-ADD_THIS_TRANSLATOR (Tempo_performer);
+ENTER_DESCRIPTION (Tempo_performer, "","","","","" );
+
Tempo_performer::Tempo_performer ()
{
Link_array<Text_script_req> reqs_;
Link_array<Item> texts_;
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Text_engraver);
protected:
virtual bool try_music (Music* m);
virtual void stop_translation_timestep ();
void
Text_engraver::acknowledge_grob (Grob_info inf)
{
- if (Rhythmic_head::has_interface (inf.elem_l_))
+ if (Rhythmic_head::has_interface (inf.grob_l_))
{
for (int i=0; i < texts_.size (); i++)
{
Grob*t = texts_[i];
- Side_position_interface::add_support (t,inf.elem_l_);
+ Side_position_interface::add_support (t,inf.grob_l_);
/*
ugh.
*/
if (Side_position_interface::get_axis (t) == X_AXIS
&& !t->parent_l (Y_AXIS))
- t->set_parent (inf.elem_l_, Y_AXIS);
+ t->set_parent (inf.grob_l_, Y_AXIS);
else if (Side_position_interface::get_axis (t) == Y_AXIS
&& !t->parent_l (X_AXIS))
- t->set_parent (inf.elem_l_, X_AXIS);
+ t->set_parent (inf.grob_l_, X_AXIS);
}
}
- if (Stem::has_interface (inf.elem_l_))
+ if (Stem::has_interface (inf.grob_l_))
{
for (int i=0; i < texts_.size (); i++)
{
- Side_position_interface::add_support (texts_[i],inf.elem_l_);
+ Side_position_interface::add_support (texts_[i],inf.grob_l_);
}
}
}
reqs_.clear ();
}
-ADD_THIS_TRANSLATOR (Text_engraver);
+Text_engraver::Text_engraver(){}
+
+ENTER_DESCRIPTION(Text_engraver,
+/* descr */ "Create text-scripts",
+/* creats*/ "TextScript",
+/* acks */ "rhythmic-head-interface stem-interface",
+/* reads */ "scriptHorizontal textNonEmpty",
+/* write */ "");
SCM e = ly_assoc_chain (ly_symbol2scm ("extent"), p);
if (gh_pair_p (e) && ly_number_pair_p (ly_cdr (e)))
{
- extent = Interval (gh_scm2double (gh_cadr (e)) * staff_space,
- gh_scm2double (gh_cddr (e)) * staff_space);
+ extent = Interval (gh_scm2double (ly_cadr (e)) * staff_space,
+ gh_scm2double (ly_cddr (e)) * staff_space);
extent_b = true;
}
SCM next_p = SCM_EOL;
if (gh_pair_p (ly_car (text)))
- next_p = scm_list_n (gh_call2 (f, sheet, gh_caar (text)), SCM_UNDEFINED);
+ next_p = scm_list_n (gh_call2 (f, sheet, ly_caar (text)), SCM_UNDEFINED);
SCM next_k = ly_assoc_chain (ly_symbol2scm ("kern"), next_p);
Real next_kern = kern[axis];
if (gh_pair_p (next_k) && gh_number_p (ly_cdr (next_k)))
class Text_spanner_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
- Text_spanner_engraver ();
-
+ TRANSLATOR_DECLARATIONS(Text_spanner_engraver);
protected:
virtual void finalize ();
virtual void acknowledge_grob (Grob_info);
void typeset_all ();
};
-ADD_THIS_TRANSLATOR (Text_spanner_engraver);
+
Text_spanner_engraver::Text_spanner_engraver ()
void
Text_spanner_engraver::acknowledge_grob (Grob_info info)
{
- if (span_ && Note_column::has_interface (info.elem_l_))
+ if (span_ && Note_column::has_interface (info.grob_l_))
{
- Side_position_interface::add_support (span_, info.elem_l_);
- add_bound_item (span_, dynamic_cast<Item*> (info.elem_l_));
+ Side_position_interface::add_support (span_, info.grob_l_);
+ add_bound_item (span_, dynamic_cast<Item*> (info.grob_l_));
}
}
}
}
+ENTER_DESCRIPTION(Text_spanner_engraver,
+/* descr */ "Create text spanner from a Span_req ",
+/* creats*/ "TextSpanner",
+/* acks */ "note-column-interface",
+/* reads */ "",
+/* write */ "");
class Thread_devnull_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Thread_devnull_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
};
-ADD_THIS_TRANSLATOR (Thread_devnull_engraver);
+
void
Thread_devnull_engraver::acknowledge_grob (Grob_info i)
&& to_boolean (get_property ("soloADue"))))
{
/* Ugh, we can suicide them, but they remain living */
- i.elem_l_->suicide ();
+ i.grob_l_->suicide ();
}
}
+Thread_devnull_engraver::Thread_devnull_engraver(){}
+
+ENTER_DESCRIPTION(Thread_devnull_engraver,
+/* descr */ "Kill elements whenever we are Voice called `two' and either
+unison, unisilence or soloADue is set.@footnote{On unix systems, the
+file @file{/dev/null} is special device: anything written to it is
+discarded.}. This engraver works closely together with the part
+combiner. When the part combiner notices that two threads are
+identical, it tells the @code{Thread_devnull_engraver} to discard
+everything in the second thread.
+",
+/* creats*/ "",
+/* acks */ "grob-interface",
+/* reads */ "",
+/* write */ "");
virtual void create_grobs ();
void typeset_tie (Grob*);
public:
- VIRTUAL_COPY_CONS (Translator);
- Tie_engraver ();
+ TRANSLATOR_DECLARATIONS(Tie_engraver);
};
void
Tie_engraver::acknowledge_grob (Grob_info i)
{
- if (Rhythmic_head::has_interface (i.elem_l_))
+ if (Rhythmic_head::has_interface (i.grob_l_))
{
Note_req * m = dynamic_cast<Note_req* > (i.req_l_);
if (!m)
return;
- now_heads_.push (CHead_melodic_tuple (i.elem_l_, m, now_mom ()+ m->length_mom ()));
+ now_heads_.push (CHead_melodic_tuple (i.grob_l_, m, now_mom ()+ m->length_mom ()));
}
}
Grob * p = new Spanner (basic);
Tie::set_interface (p);
- Tie::set_head (p, LEFT, dynamic_cast<Item*> (unsmob_grob (gh_caar (s))));
- Tie::set_head (p, RIGHT, dynamic_cast<Item*> (unsmob_grob (gh_cdar (s))));
+ Tie::set_head (p, LEFT, dynamic_cast<Item*> (unsmob_grob (ly_caar (s))));
+ Tie::set_head (p, RIGHT, dynamic_cast<Item*> (unsmob_grob (ly_cdar (s))));
tie_p_arr_.push (p);
announce_grob (p, req_l_);
}
-ADD_THIS_TRANSLATOR (Tie_engraver);
+
CHead_melodic_tuple::CHead_melodic_tuple ()
{
return Moment::compare(h1.end_, h2.end_);
}
+ENTER_DESCRIPTION(Tie_engraver,
+/* descr */ "Generate ties between noteheads of equal pitch.",
+/* creats*/ "Tie TieColumn",
+/* acks */ "rhythmic-head-interface",
+/* reads */ "sparseTies tieMelismaBusy",
+/* write */ "");
class Tie_performer : public Performer
{
public:
- VIRTUAL_COPY_CONS (Translator);
- Tie_performer ();
+ TRANSLATOR_DECLARATIONS(Tie_performer);
private:
bool done_;
PQueue<CNote_melodic_tuple> past_notes_pq_;
done_ = false;
}
-ADD_THIS_TRANSLATOR (Tie_performer);
+ENTER_DESCRIPTION (Tie_performer, "", "", "", "", "");
-#if 0
-Tie_performer::Tie_performer ()
-{
- // URG
- // if we don't do this, lily dumps core
- // which means that ``initialize'' and
- // ``start_translation_timestep'' did not happen?!
- initialize ();
-}
-#endif
-
void
Tie_performer::initialize ()
{
}
}
+
void
Tie_performer::stop_translation_timestep ()
{
{
return (h1.end_ - h2.end_).main_part_.sign ();
}
+
/**
generate time_signatures.
*/
-class Time_signature_engraver : public Engraver {
+class Time_signature_engraver : public Engraver
+{
+ Item * time_signature_p_;
+ SCM last_time_fraction_;
+
protected:
virtual void stop_translation_timestep ();
virtual void create_grobs ();
public:
- VIRTUAL_COPY_CONS (Translator);
- Item * time_signature_p_;
- SCM last_time_fraction_;
- Time_signature_engraver ();
+ TRANSLATOR_DECLARATIONS(Time_signature_engraver);
+
};
}
-ADD_THIS_TRANSLATOR (Time_signature_engraver);
+
+ENTER_DESCRIPTION(Time_signature_engraver,
+/* descr */ "Create a TimeSignature whenever @code{timeSignatureFraction} changes",
+/* creats*/ "TimeSignature",
+/* acks */ "",
+/* reads */ "",
+/* write */ "");
class Time_signature_performer : public Performer
{
public:
- VIRTUAL_COPY_CONS (Translator);
-
- Time_signature_performer ();
+ TRANSLATOR_DECLARATIONS(Time_signature_performer);
~Time_signature_performer ();
protected:
audio_p_ = 0;
}
}
-ADD_THIS_TRANSLATOR (Time_signature_performer);
+ENTER_DESCRIPTION (Time_signature_performer, "","","","","" );
virtual void process_music ();
public:
- Timing_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Timing_engraver);
};
last_moment_.main_part_ = Rational (-1);
}
-ADD_THIS_TRANSLATOR (Timing_engraver);
+
void
Timing_engraver::start_translation_timestep ()
{
Timing_translator::process_music ();
}
+
+ENTER_DESCRIPTION(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}.",
+/* creats*/ "",
+/* acks */ "",
+/* reads */ "timeSignatureFraction barCheckNoSynchronize barNonAuto whichBar barAlways defaultBarType skipBars timing oneBeat measureLength measurePosition currentBarNumber",
+/* write */ "");
}
-ADD_THIS_TRANSLATOR (Timing_translator);
-
void
Timing_translator::initialize ()
{
*/
Dictionary<Translator*> *global_translator_dict_p=0;
+
+SCM
+ly_get_all_translators ()
+{
+ SCM l = SCM_EOL;
+ for (std::map<String,Translator*>::const_iterator (ci (global_translator_dict_p->begin()));
+ ci != global_translator_dict_p->end (); ci++)
+ {
+ l = scm_cons ((*ci).second->self_scm (), l);
+ }
+ return l;
+}
+
+static void
+all_trans_init()
+{
+ scm_c_define_gsubr ("ly-get-all-translators", 0, 0, 0, (Scheme_function_unknown) ly_get_all_translators);
+}
+
+ADD_SCM_INIT_FUNC(all_trans_init,all_trans_init);
+
void
add_translator (Translator *t)
{
if (type == push_sym)
{
- SCM val = gh_cddr (entry);
+ SCM val = ly_cddr (entry);
val = gh_pair_p (val) ? ly_car (val) : SCM_UNDEFINED;
- apply_pushpop_property (tg, ly_car (entry), gh_cadr (entry), val);
+ apply_pushpop_property (tg, ly_car (entry), ly_cadr (entry), val);
}
else if (type == assign_sym)
{
- tg->set_property (ly_car (entry), gh_cadr (entry));
+ tg->set_property (ly_car (entry), ly_cadr (entry));
}
}
}
{
Translator_group * new_group = path[i]->instantiate (output_def_l_);
+ if (i == path.size () -1)
+ new_group->id_str_ = id;
current->add_group_translator (new_group);
current = new_group;
}
- current->id_str_ = id;
+
return current;
}
SCM prev = get_property (prop);
SCM newprops= SCM_EOL ;
- while (gh_pair_p (prev) && gh_caar (prev) != eltprop)
+ while (gh_pair_p (prev) && ly_caar (prev) != eltprop)
{
newprops = gh_cons (ly_car (prev), newprops);
prev = ly_cdr (prev);
#include "moment.hh"
#include "ly-smobs.icc"
-char const*
-Translator::name () const
-{
- return classname (this);
-}
Translator::~Translator ()
{
return me->properties_scm_;
}
+MAKE_SCHEME_CALLBACK(Translator,name,1);
+SCM
+Translator::name (SCM trans)
+{
+ if (unsmob_translator (trans))
+ {
+ char const* nm = classname (unsmob_translator (trans));
+ return gh_str02scm (nm);
+ }
+ return
+ SCM_EOL;
+}
+
+MAKE_SCHEME_CALLBACK(Translator,description,1)
+SCM
+Translator::description (SCM me)
+{
+ if (unsmob_translator (me))
+ return unsmob_translator(me)->translator_description ();
+ else
+ {
+ programming_error ("Translator::description ()");
+ return SCM_EOL;
+ }
+}
+
+SCM
+Translator::translator_description () const
+{
+ return SCM_EOL;
+}
int
Translator::print_smob (SCM s, SCM port, scm_print_state *)
Translator *sc = (Translator *) ly_cdr (s);
scm_puts ("#<Translator ", port);
- scm_puts ((char *)sc->name (), port);
+ scm_display (name (s), port);
scm_display (sc->simple_trans_list_, port);
/*
don't try to print properties, that is too much hassle.
return 1;
}
+SCM
+Translator::static_translator_description ()const
+{
+ return SCM_EOL;
+}
+
IMPLEMENT_UNSMOB (Translator, translator);
IMPLEMENT_SMOBS (Translator);
IMPLEMENT_DEFAULT_EQUAL_P (Translator);
class Tuplet_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Tuplet_engraver);
protected:
Link_array<Time_scaled_music> time_scaled_music_arr_;
void
Tuplet_engraver::acknowledge_grob (Grob_info i)
{
- if (Note_column::has_interface (i.elem_l_))
+ if (Note_column::has_interface (i.grob_l_))
{
for (int j =0; j <started_span_p_arr_.size (); j++)
if (started_span_p_arr_[j])
- Tuplet_bracket::add_column (started_span_p_arr_[j], dynamic_cast<Item*> (i.elem_l_));
+ Tuplet_bracket::add_column (started_span_p_arr_[j], dynamic_cast<Item*> (i.grob_l_));
}
}
}
}
-ADD_THIS_TRANSLATOR (Tuplet_engraver);
+Tuplet_engraver::Tuplet_engraver(){}
+
+ENTER_DESCRIPTION(Tuplet_engraver,
+/* descr */ "Catch Time_scaled_music and generate appropriate bracket ",
+/* creats*/ "TupletBracket",
+/* acks */ "note-column-interface",
+/* reads */ "tupletNumberFormatFunction tupletSpannerDuration tupletInvisible",
+/* write */ "");
return false;
}
-
-
-DECLARE_REQUEST_SWALLOWER (Skip_req);
+DECLARE_REQUEST_SWALLOWER(Skip_req);
Spanner * valign_p_;
bool qualifies_b (Grob_info) const;
public:
- VIRTUAL_COPY_CONS (Translator);
- Vertical_align_engraver ();
+ TRANSLATOR_DECLARATIONS(Vertical_align_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
virtual void initialize ();
{
int sz = i.origin_trans_l_arr ((Translator*)this).size () ;
- return sz > 1 && Axis_group_interface::has_interface (i.elem_l_)
- && !i.elem_l_->parent_l (Y_AXIS) && Axis_group_interface::axis_b (i.elem_l_, Y_AXIS);
+ return sz > 1 && Axis_group_interface::has_interface (i.grob_l_)
+ && !i.grob_l_->parent_l (Y_AXIS) && Axis_group_interface::axis_b (i.grob_l_, Y_AXIS);
}
void
{
if (qualifies_b (i))
{
- Align_interface::add_element (valign_p_,i.elem_l_, get_property ("verticalAlignmentChildCallback"));
+ Align_interface::add_element (valign_p_,i.grob_l_, get_property ("verticalAlignmentChildCallback"));
}
}
-ADD_THIS_TRANSLATOR (Vertical_align_engraver);
+
+ENTER_DESCRIPTION(Vertical_align_engraver,
+/* descr */ "Catch Vertical axis groups and stack them.",
+/* creats*/ "VerticalAlignment",
+/* acks */ "axis-group-interface",
+/* reads */ "",
+/* write */ "");
class Voice_devnull_engraver : public Engraver
{
public:
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Voice_devnull_engraver);
protected:
virtual bool try_music (Music *m);
virtual void acknowledge_grob (Grob_info);
};
-ADD_THIS_TRANSLATOR (Voice_devnull_engraver);
+
static char const *eat_spanners[] = {
"beam",
&& (to_boolean (get_property ("unison"))
|| to_boolean (get_property ("unisilence")))))
for (char const **p = junk_interfaces; *p; p++)
- if (i.elem_l_->has_interface (ly_symbol2scm (*p)))
+ if (i.grob_l_->has_interface (ly_symbol2scm (*p)))
{
#if 0
/* Ugh: virtual mmrest::suicide () ? */
- if (i.elem_l_->has_interface (ly_symbol2scm ("multi-measure-rest-interface")))
- i.elem_l_->set_grob_property ("skip-timestep", SCM_BOOL_T);
+ if (i.grob_l_->has_interface (ly_symbol2scm ("multi-measure-rest-interface")))
+ i.grob_l_->set_grob_property ("skip-timestep", SCM_BOOL_T);
else
;
#endif
/* Ugh, we can suicide them, but they remain living */
- i.elem_l_->suicide ();
+ i.grob_l_->suicide ();
return;
}
}
+Voice_devnull_engraver::Voice_devnull_engraver(){}
+ENTER_DESCRIPTION(Voice_devnull_engraver,
+/* descr */ "Kill off certain items and spanners if we're Voice `two' and unison or unisilence is set.",
+/* creats*/ "",
+/* acks */ "grob-interface",
+/* reads */ "",
+/* write */ "");
class Volta_engraver : public Engraver
{
public:
- Volta_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ TRANSLATOR_DECLARATIONS(Volta_engraver);
protected:
virtual void acknowledge_grob (Grob_info);
SCM start_str_;
};
-ADD_THIS_TRANSLATOR (Volta_engraver);
-
Volta_engraver::Volta_engraver ()
{
volta_span_p_ = 0;
if (gh_pair_p (c) && ly_car (c) == ly_symbol2scm ("volta")
&& gh_pair_p (ly_cdr (c)))
{
- if (gh_cadr (c) == SCM_BOOL_F)
+ if (ly_cadr (c) == SCM_BOOL_F)
end = true;
else
- start_str_ = gh_cadr (c);
+ start_str_ = ly_cadr (c);
}
cs = ly_cdr (cs);
void
Volta_engraver::acknowledge_grob (Grob_info i)
{
- if (Item* item = dynamic_cast<Item*> (i.elem_l_))
+ if (Item* item = dynamic_cast<Item*> (i.grob_l_))
{
if (Note_column::has_interface (item))
{
/*
TODO: should attach volta to paper-column if no bar is found.
*/
+
+ENTER_DESCRIPTION(Volta_engraver,
+/* descr */ "Make volta brackets",
+/* creats*/ "VoltaBracket",
+/* acks */ "bar-line-interface note-column-interface",
+/* reads */ "repeatCommands voltaSpannerDuration",
+/* write */ "");
\type Score_engraver
\name Score
-
\consists "Repeat_acknowledge_engraver"
\consists "Timing_engraver"
\consists "Output_property_engraver"
\consists "Break_align_engraver"
\consists "Spacing_engraver"
\consists "Vertical_align_engraver"
-
\consists "Lyric_phrasing_engraver"
\consists "Bar_number_engraver"
\consists "Span_arpeggio_engraver"
explicitClefVisibility = #all-visible
explicitKeySignatureVisibility = #all-visible
-
+ autoBeamSettings = #auto-beam-settings
+
scriptDefinitions = #default-script-alist
verticalAlignmentChildCallback = #Align_interface::alignment_callback
)
- \elementdescriptions #all-grob-descriptions
+ \grobdescriptions #all-grob-descriptions
}
OrchestralScoreContext= \translator {
/* urg */
#if HAVE_PYTHON2_PYTHON_H
#include <python2/Python.h>
+#elif HAVE_PYTHON2_0_PYTHON_H
+#include <python2.0/Python.h>
#elif HAVE_PYTHON1_5_PYTHON_H
#include <python1.5/Python.h>
#elif HAVE_PYTHON_PYTHON_H
((end * * 12 8) . ,(make-moment 3 8))
((end 1 16 12 8) . ,(make-moment 3 8))
((end 1 32 12 8) . ,(make-moment 1 8))
- (meta . ,(grob-description "autoBeamSettings"))
))
;;; Users may override in most cases, simply by issuing
(node (grob-name name))
(texi-section 2 (grob-name name) #f)
"\n"
-
(let* ((grob (string->symbol name))
- (engravers
- (apply append
- (map (lambda (x)
- (let ((engraver (car x))
- (objs (cadddr x)))
- (if (member grob objs)
- (list engraver)
- '())))
- engraver-description-alist))))
+ (engravers (filter-list
+ (lambda (x) (engraver-makes-grob? name x)) all-engravers-list))
+ (engraver-names (map Translator::name engravers))
+ )
+
(string-append
name " grobs are created by: "
(human-listify (map ref-ify
- (map engraver-name
- (map symbol->string engravers))))))
+ (map engraver-name engraver-names)))))
- (apply string-append ifacedoc))))
+ (apply string-append ifacedoc))))
+(define (engraver-makes-grob? name grav)
+ (memq name (assoc 'grobs-created (Translator::description grav)))
+ )
(define (document-all-grobs name)
(let* ((doc (apply string-append
--- /dev/null
+
+;; todo: move this to engraver-init.ly
+
+(define context-description-alist
+ '(
+ (Grace . "
+ The context for handling grace notes. It used to be instantiated
+ automatically when you use @code{\grace}. Basically, it is an
+ `embedded' miniature of the Score context. Since this context
+ needs special interaction with the rest of LilyPond, you should
+ not explicitly instantiate it.
+
+ DEPRECATED.
+")
+ (LyricsVoice . "
+ Corresponds to a voice with lyrics. Handles the printing of a
+ single line of lyrics.
+")
+ (Thread . "
+ Handles note heads, and is contained in the Voice context. You
+ have to instantiate this explicitly if you want to adjust the
+ style of individual note heads.
+")
+ (Voice . "
+ Corresponds to a voice on a staff. This context handles the
+ conversion of dynamic signs, stems, beams, super- and subscripts,
+ slurs, ties, and rests.
+
+ You have to instantiate this explicitly if you want to have
+ multiple voices on the same staff.")
+
+ (ChordNamesVoice . "
+ A voice with chord names. Handles printing of a line of chord
+ names.")
+
+ (ChordNames . "
+ Typesets chord names. Can contain @code{ChordNamesVoice}
+ contexts.")
+
+ (Lyrics . "
+ Typesets lyrics. It can contain @code{LyricsVoice} contexts.
+")
+ (Staff . "
+ Handles clefs, bar lines, keys, accidentals. It can contain
+ @code{Voice} contexts.
+")
+ (RhythmicStaff . "
+ A context like @code{Staff} but for printing rhythms. Pitches are
+ ignored; the notes are printed on one line. It can contain
+ @code{Voice} contexts.
+")
+ (GrandStaff . "
+ Contains @code{Staff} or @code{RhythmicStaff} contexts. It adds a
+ brace on the left side, grouping the staves together. The bar
+ lines of the contained staves are connected vertically. It can
+ contain @code{Staff} contexts.")
+
+ (PianoStaff . "
+ Just like @code{GrandStaff} but with @code{minVerticalAlign} set
+ equal to @code{maxVerticalAlign} so that interstaff beaming and
+ slurring can be used.")
+
+ (StaffGroup . "
+ Contains @code{Staff} or @code{RhythmicStaff} contexts. Adds a
+ bracket on the left side, grouping the staves together. The bar
+ lines of the contained staves are connected vertically. It can
+ contain @code{Staff}, @code{RhythmicStaff}, @code{GrandStaff}, or
+ @code{Lyrics} contexts.
+")
+ (ChoirStaff . "
+ Identical to @code{StaffGroup} except that the contained staves
+ are not connected vertically.
+")
+ (Score . "
+ This is the top level notation context. No other context can
+ contain a @code{Score} context. This context handles the
+ administration of time signatures. It also makes sure that items
+ such as clefs, time signatures, and key-signatures are aligned
+ across staves. It can contain @code{Lyrics}, @code{Staff},
+ @code{RhythmicStaff}, @code{GrandStaff}, @code{StaffGroup}, and
+ @code{ChoirStaff} contexts.
+
+ You cannot explicitly instantiate a Score context (since it is
+ not contained in any other context). It is instantiated
+ automatically when an output definition (a @code{\score} or
+ @code{\paper} block) is processed.
+")
+ )
+ )
+
+(set! context-description-alist
+ (sort context-description-alist alist<?))
"\n@contents"
))
+
(define (context-name name)
name)
name)
(define (grob-name name)
- name)
+ (if (symbol? name)
+ (symbol->string name)
+ name))
(define (interface-name name)
name)
-;;; engraver-documentation-lib.scm -- Functions for engraver documentation
+;;; engraver-doumentation-lib.scm -- Functions for engraver documentation
;;;
;;; source file of the GNU LilyPond music typesetter
;;;
;; First level Engraver description and
;; second level Context description
-(define (document-engraver where engraver-descr)
+(define (document-engraver where engraver)
+
(let* (
(level (if (eq? where 'context) 3 2))
- (props (car (cdddr engraver-descr)))
- (name (car engraver-descr))
+ (propsr (cdr (assoc 'properties-read (Translator::description engraver))))
+ (propsw (cdr (assoc 'properties-written (Translator::description engraver))))
+ (name (Translator::name engraver))
(name-sym (string->symbol name))
- (desc (cadr engraver-descr))
- (objs (map symbol->string (caddr engraver-descr)))
+ (desc (cdr (assoc 'description (Translator::description engraver))))
+ (grobs (cdr (assoc 'grobs-created (Translator::description engraver))))
)
(string-append
(texi-section level (engraver-name name) (eq? where 'context))
desc
"\n\n"
- (if (null? props)
+ (if (null? propsr)
""
(string-append
- (texi-section (+ level 1) "Properties" #f)
+ (texi-section (+ level 1) "Properties (read)" #f)
(description-list->texi
- (map (lambda (x) (document-translator-property x)) props))))
- (if (null? objs)
+ (map (lambda (x) (document-translator-property x)) propsr))))
+ (if (null? propsw)
+ ""
+ (string-append
+ (texi-section (+ level 1) "Properties (write)" #f)
+ (description-list->texi
+ (map (lambda (x) (document-translator-property x)) propsw))))
+ (if (null? grobs)
""
(string-append
"This engraver creates the following grobs: \n "
- (human-listify (map ref-ify (uniq-list (sort objs string<? ))))
+ (human-listify (map ref-ify (uniq-list (sort grobs string<? ))))
".")
)
;; First level Engraver description
-(define (document-separate-engraver top description)
- (let ((name (car description)))
+(define (document-separate-engraver top grav)
+ (let ((name (Translator::name grav)))
(processing name)
(string-append
(node (engraver-name name))
- (document-engraver 'self description))))
+ (document-engraver 'self grav))))
;; Second level, part of Context description
+(define (find-engraver-by-name name list)
+ (if (null? list)
+ #f
+ (if (equal? name (Translator::name (car list)))
+ (car list)
+ (find-engraver-by-name name (cdr list)))))
+
(define (document-engraver-by-name name)
(let*
(
- (eg (assoc (string->symbol name) engraver-description-alist))
+ (eg (find-engraver-by-name name all-engravers-list))
)
(if (eq? eg #f)
(string-append "Engraver " name ", not documented.\n")
- (document-engraver 'context (cdr eg))
+ (document-engraver 'context eg)
)
))
(define (engraver-grobs name)
(let* (
- (eg (assoc (string->symbol name) engraver-description-alist))
+ (eg (find-engraver-by-name name all-engravers-list))
)
(if (eq? eg #f)
'()
- (map symbol->string (caddr (cdr eg)))
+ (cdr (assoc 'grobs-created (Translator::description eg)))
)
))
names))
doc)))
+(define all-engravers-list (ly-get-all-translators))
(define (document-all-engravers name)
- (let* ((descs (map cdr engraver-description-alist))
- (names (map symbol->string (map car engraver-description-alist)))
+ (let* ((gravs all-engravers-list)
+ (names (map Translator::name gravs))
(doc (apply string-append
(map (lambda (x) (document-separate-engraver name x))
- descs))))
+ gravs))))
(string-append
(texi-node-menu name (map (lambda (x) (cons (engraver-name x) ""))
names))
;;; Running LilyPond on this file generates the documentation
+(define load-files '("documentation-lib.scm"
+ "engraver-documentation-lib.scm"
+ "music-documentation-lib.scm"
+ "backend-documentation-lib.scm"))
+
+(map load-from-path load-files)
-;; We use ly-gulp because these files live in
-;;
-;; PATH=$LILYPONDPREFIX/scm:<datadir>/scm
-;;
-(eval-string
- (apply string-append
- (map ly-gulp-file '("documentation-lib.scm"
- "engraver-documentation-lib.scm"
- "music-documentation-lib.scm"
- "backend-documentation-lib.scm"))))
;;(define no-copies #t) ; from 490 to 410K, but doesn't look nice yet
;;
+
;;;; grob-description.scm -- part of generated backend documentation
;;;;
;;;; source file of the GNU LilyPond music typesetter
))
+;;; WARNING: the meta field should be the last one.
(define all-grob-descriptions
`(
(Accidentals . (
(direction . -1)
(left-padding . 0.2)
(right-padding . 0.4)
- (meta . ,(grob-description "Accidentals" accidentals-interface font-interface side-position-interface))
+ (meta . ,(grob-description accidentals-interface font-interface side-position-interface))
))
(Arpeggio . (
(X-offset-callbacks . (,Side_position_interface::aligned_side))
(direction . -1)
(staff-position . 0.0)
- (meta . ,(grob-description "Arpeggio" arpeggio-interface side-position-interface font-interface))
+ (meta . ,(grob-description arpeggio-interface side-position-interface font-interface))
))
- (autoBeamSettings . ,auto-beam-settings)
-
(BarLine . (
(break-align-symbol . Staff_bar)
(glyph . "|")
(thin-kern . 3.0)
(hair-thickness . 1.6)
(thick-thickness . 6.0)
- (meta . ,(grob-description "BarLine" bar-line-interface font-interface))
+ (meta . ,(grob-description bar-line-interface font-interface))
))
(BarNumber . (
(font-family . roman)
(font-relative-size . -1)
(Y-offset-callbacks . (,Side_position_interface::aligned_side))
- (meta . ,(grob-description "BarNumber"
+ (meta . ,(grob-description
side-position-interface
text-interface font-interface break-aligned-interface))
))
(accidental-alist . ,default-alteration-alist)
(font-family . number)
(font-relative-size . -1)
- (meta . ,(grob-description "BassFigure" text-interface font-interface ))
+ (meta . ,(grob-description text-interface font-interface ))
))
(Beam . (
;; todo: clean this up a bit: the list is getting
(space-function . ,default-beam-space-function)
(damping . 1)
(auto-knee-gap . 7)
- (meta . ,(grob-description "Beam" beam-interface))
+ (meta . ,(grob-description beam-interface))
))
(BreakAlignment . (
(stacking-dir . 1)
(axes 0)
(space-alist . ,default-break-align-space-alist)
- (meta . ,(grob-description "BreakAlignment"
+ (meta . ,(grob-description
axis-group-interface align-interface
)
)
(axes . (0))
(X-offset-callbacks . (,Break_align_interface::alignment_callback))
- (meta . ,(grob-description "BreakAlignGroup" axis-group-interface))
+ (meta . ,(grob-description axis-group-interface))
))
(BreathingSign . (
(molecule-callback . ,Breathing_sign::brew_molecule)
(Y-offset-callbacks . (,Breathing_sign::offset_callback))
(visibility-lambda . ,begin-of-line-invisible)
- (meta . ,(grob-description "BreathingSign" break-aligned-interface))
+ (meta . ,(grob-description break-aligned-interface))
))
(Clef . (
(break-align-symbol . Clef_item)
(visibility-lambda . ,begin-of-line-visible)
(Y-offset-callbacks . (,Staff_symbol_referencer::callback))
- (meta . ,(grob-description "Clef" clef-interface font-interface break-aligned-interface ))
+ (meta . ,(grob-description clef-interface font-interface break-aligned-interface ))
))
(ChordName . (
(after-line-breaking-callback . ,Chord_name::after_line_breaking)
(chord-name-function . ,default-chord-name-function)
(font-family . roman)
- (meta . ,(grob-description "ChordName" font-interface text-interface chord-name-interface))
+ (meta . ,(grob-description font-interface text-interface chord-name-interface))
))
(Custos . (
(visibility-lambda . ,end-of-line-visible)
(style . vaticana)
(Y-offset-callbacks . (,Staff_symbol_referencer::callback))
- (meta . ,(grob-description "Custos" custos-interface staff-symbol-referencer-interface break-aligned-interface) )
+ (meta . ,(grob-description custos-interface staff-symbol-referencer-interface break-aligned-interface) )
))
(X-extent-callback . ,Axis_group_interface::group_extent_callback)
(X-offset-callbacks . (,Dot_column::side_position))
- (meta . ,(grob-description "DotColumn" dot-column-interface axis-group-interface))
+ (meta . ,(grob-description dot-column-interface axis-group-interface))
))
(Dots . (
(dot-count . 1)
(staff-position . 0.0)
(Y-offset-callbacks . (,Dots::quantised_position_callback ,Staff_symbol_referencer::callback))
- (meta . ,(grob-description "Dots" font-interface dots-interface ))
+ (meta . ,(grob-description font-interface dots-interface ))
))
(DoublePercentRepeat
. ((molecule-callback . ,Percent_repeat_item_interface::double_percent)
(thickness . 0.48)
(break-align-symbol . Staff_bar)
(visibility-lambda . ,begin-of-line-invisible)
- (meta . ,(grob-description "DoublePercentRepeat" font-interface percent-repeat-interface))
+ (meta . ,(grob-description font-interface percent-repeat-interface))
))
(DynamicText . (
(font-family . dynamic)
(font-shape . italic)
(self-alignment-Y . 0)
- (meta . ,(grob-description "DynamicText" font-interface text-interface dynamic-interface))
+ (meta . ,(grob-description font-interface text-interface dynamic-interface))
))
(DynamicLineSpanner . (
(padding . 0.6)
(minimum-space . 1.2)
(direction . -1)
- (meta . ,(grob-description "DynamicLineSpanner" dynamic-interface axis-group-interface side-position-interface))
+ (meta . ,(grob-description dynamic-interface axis-group-interface side-position-interface))
))
(LeftEdge . (
(break-align-symbol . Left_edge_item)
(X-offset-callbacks . (,Break_align_interface::alignment_callback))
(breakable . #t)
- (meta . ,(grob-description "LeftEdge" break-aligned-interface))
+ (meta . ,(grob-description break-aligned-interface))
))
(Fingering . (
(font-family . number)
(font-relative-size . -3)
(font-shape . upright)
- (meta . ,(grob-description "Fingering" finger-interface font-interface text-script-interface text-interface side-position-interface))
+ (meta . ,(grob-description finger-interface font-interface text-script-interface text-interface side-position-interface))
))
(Y-offset-callbacks . (,Hara_kiri_group_spanner::force_hara_kiri_callback))
(Y-extent-callback . ,Hara_kiri_group_spanner::y_extent)
(axes 1)
- (meta . ,(grob-description "HaraKiriVerticalGroup" axis-group-interface hara-kiri-group-interface))
+ (meta . ,(grob-description axis-group-interface hara-kiri-group-interface))
))
(Hairpin . (
(molecule-callback . ,Hairpin::brew_molecule)
(dash-length . 4.0)
(self-alignment-Y . 0)
(Y-offset-callbacks . (,Side_position_interface::aligned_on_self))
- (meta . ,(grob-description "Hairpin" hairpin-interface dynamic-interface))
+ (meta . ,(grob-description hairpin-interface dynamic-interface))
))
(InstrumentName . (
(visibility-lambda . ,begin-of-line-visible)
(baseline-skip . 2)
(font-family . roman)
- (meta . ,(grob-description "InstrumentName" font-interface text-interface break-aligned-interface))
+ (meta . ,(grob-description font-interface text-interface break-aligned-interface))
))
(KeySignature . (
(break-align-symbol . Key_item)
(visibility-lambda . ,begin-of-line-visible)
(breakable . #t)
- (meta . ,(grob-description "KeySignature" key-signature-interface font-interface break-aligned-interface))
+ (meta . ,(grob-description key-signature-interface font-interface break-aligned-interface))
))
(maximum-length . 100)
(molecule-callback . ,Hyphen_spanner::brew_molecule)
(Y-extent-callback . ,Grob::point_dimension_callback)
- (meta . ,(grob-description "LyricHyphen" lyric-hyphen-interface ))
+ (meta . ,(grob-description lyric-hyphen-interface ))
))
(LineOfScore . (
(axes . (0 1))
- (meta . ,(grob-description "LineOfScore" line-of-score-interface axis-group-interface))
+ (meta . ,(grob-description line-of-score-interface axis-group-interface))
))
(LyricExtender . (
(height . 0.8) ; stafflinethickness;
(right-trim-amount . 0.5)
(Y-extent-callback . ,Grob::point_dimension_callback)
- (meta . ,(grob-description "LyricExtender" lyric-extender-interface))
+ (meta . ,(grob-description lyric-extender-interface))
))
(LyricText . (
(word-space . 0.6)
(font-family . roman)
(font-shape . upright)
- (meta . ,(grob-description "LyricText" lyric-syllable-interface text-interface font-interface ))
+ (meta . ,(grob-description lyric-syllable-interface text-interface font-interface ))
))
(Porrectus . (
(add-stem . #t)
(stem-direction . 1)
(molecule-callback . ,Porrectus::brew_molecule)
- (meta . ,(grob-description "Porrectus"
+ (meta . ,(grob-description
porrectus-interface))
))
(font-relative-size . 1)
(visibility-lambda . ,end-of-line-invisible)
(padding . 0.8)
- (meta . ,(grob-description "RehearsalMark" mark-interface side-position-interface))
+ (meta . ,(grob-description mark-interface side-position-interface))
))
(MultiMeasureRest . (
(minimum-width . 12.5) ; staffspace
(font-family . number)
(font-relative-size . 1)
- (meta . ,(grob-description "MultiMeasureRest" multi-measure-rest-interface rest-interface font-interface ))
+ (meta . ,(grob-description multi-measure-rest-interface rest-interface font-interface ))
))
(NoteCollision . (
(axes 0 1)
;; Ugh, should not be hard-coded.
(note-width . 1.321)
- (meta . ,(grob-description "NoteCollision"
+ (meta . ,(grob-description
note-collision-interface axis-group-interface
))
))
(NoteColumn . (
(axes . (0 1))
- (meta . ,(grob-description "NoteColumn" axis-group-interface note-column-interface))
+ (meta . ,(grob-description axis-group-interface note-column-interface))
))
(NoteHead . (
(style . default)
(molecule-callback . ,Note_head::brew_molecule)
(Y-offset-callbacks . (,Staff_symbol_referencer::callback))
- (stem-attachment-function
- . ,note-head-style->attachment-coordinates)
- (meta . ,(grob-description "NoteHead"
- rhythmic-head-interface font-interface
- note-head-interface ))
+ (stem-attachment-function . ,note-head-style->attachment-coordinates)
+ (meta . ,(grob-description rhythmic-head-interface font-interface note-head-interface))
))
(Glissando . (
(type . line)
(X-extent-callback . #f)
(Y-extent-callback . #f)
(molecule-callback . ,Line_spanner::brew_molecule)
- (meta . ,(grob-description "Glissando"
- line-spanner-interface))
+ (meta . ,(grob-description line-spanner-interface))
))
(VoiceFollower . (
(type . line)
(X-extent-callback . #f)
(Y-extent-callback . #f)
(molecule-callback . ,Line_spanner::brew_molecule)
- (meta . ,(grob-description "VoiceFollower"
- line-spanner-interface))
+ (meta . ,(grob-description line-spanner-interface))
))
(NoteName . (
(molecule-callback . ,Text_item::brew_molecule)
(font-family . roman)
- (meta . ,(grob-description "NoteName"
- note-name-interface font-interface
- ))
+ (meta . ,(grob-description note-name-interface font-interface))
))
(OctavateEight . (
(molecule-callback . ,Text_item::brew_molecule)
(font-shape . italic)
(font-family . roman)
- (meta . ,(grob-description "OctavateEight" text-interface font-interface ))
+ (meta . ,(grob-description text-interface font-interface ))
))
(PaperColumn . (
(axes 0)
(before-grace-spacing-factor . 1.2)
(before-musical-spacing-factor . 0.4)
- (meta . ,(grob-description "PaperColumn" paper-column-interface axis-group-interface spaceable-element-interface))
+ (meta . ,(grob-description paper-column-interface axis-group-interface spaceable-element-interface))
))
(PhrasingSlur . (
(molecule-callback . ,Slur::brew_molecule)
(attachment . (#f . #f))
(attachment-offset . ((0 . 0) . (0 . 0)))
(slope-limit . 0.8)
- (meta . ,(grob-description "PhrasingSlur" slur-interface))
+ (meta . ,(grob-description slur-interface))
))
(NonMusicalPaperColumn . (
(axes 0)
(before-musical-spacing-factor . 1.0)
(column-space-strength . 2.0)
- (meta . ,(grob-description "NonMusicalPaperColumn" paper-column-interface axis-group-interface spaceable-element-interface))
+ (meta . ,(grob-description paper-column-interface axis-group-interface spaceable-element-interface))
))
(PercentRepeat . (
(thickness . 0.48)
(minimum-width . 12.5) ; staffspace
(font-family . music)
- (meta . ,(grob-description "PercentRepeat" multi-measure-rest-interface font-interface percent-repeat-interface))
+ (meta . ,(grob-description multi-measure-rest-interface font-interface percent-repeat-interface))
))
(molecule-callback . , Percent_repeat_item_interface::beat_slash)
(thickness . 0.48)
(slope . 1.7)
- (meta . ,(grob-description "RepeatSlash" percent-repeat-interface))
+ (meta . ,(grob-description percent-repeat-interface))
))
(Rest . (
(after-line-breaking-callback . ,Rest::after_line_breaking)
(molecule-callback . ,Rest::brew_molecule)
(Y-offset-callbacks . (,Staff_symbol_referencer::callback))
(minimum-beam-collision-distance . 1.5)
- (meta . ,(grob-description "Rest"
+ (meta . ,(grob-description
rhythmic-head-interface
staff-symbol-referencer-interface
rest-interface))
))
(RestCollision . (
(minimum-distance . 0.75)
- (meta . ,(grob-description "RestCollision" rest-collision-interface ))
+ (meta . ,(grob-description rest-collision-interface ))
))
(Script . (
(padding . 0.29)
(X-offset-callbacks . (,Side_position_interface::centered_on_parent))
(before-line-breaking-callback . ,Script::before_line_breaking)
- (meta . ,(grob-description "Script" script-interface side-position-interface font-interface))
+ (meta . ,(grob-description script-interface side-position-interface font-interface))
))
(ScriptColumn . (
(before-line-breaking-callback . ,Script_column::before_line_breaking)
- (meta . ,(grob-description "ScriptColumn" script-column-interface))
+ (meta . ,(grob-description script-column-interface))
))
(Slur . (
(attachment . (#f . #f))
(attachment-offset . ((0 . 0) . (0 . 0)))
(slope-limit . 0.8)
- (meta . ,(grob-description "Slur" slur-interface))
+ (meta . ,(grob-description slur-interface))
))
(SpacingSpanner . (
(arithmetic-multiplier . ,(* 0.9 1.32))
;; assume that notes at least this long are present.
(maximum-duration-for-spacing . ,(make-moment 1 8))
- (meta . ,(grob-description "SpacingSpanner" spacing-spanner-interface))
+ (meta . ,(grob-description spacing-spanner-interface))
))
(SpanBar . (
(break-align-symbol . Staff_bar)
(thin-kern . 3.0)
(hair-thickness . 1.6)
(thick-thickness . 6.0)
- (meta . ,(grob-description "SpanBar" span-bar-interface bar-line-interface ))
+ (meta . ,(grob-description span-bar-interface bar-line-interface ))
))
(StanzaNumber . (
(break-align-symbol . Clef_item)
(visibility-lambda . ,begin-of-line-visible)
(font-family . roman)
- (meta . ,(grob-description "StanzaNumber" break-aligned-interface text-interface font-interface))
+ (meta . ,(grob-description break-aligned-interface text-interface font-interface))
))
(StaffSymbol . (
(staff-space . 1.0)
(line-count . 5)
(layer . 0)
- (meta . ,(grob-description "StaffSymbol" staff-symbol-interface ))
+ (meta . ,(grob-description staff-symbol-interface ))
))
(SostenutoPedal . (
(molecule-callback . ,Text_item::brew_molecule)
(no-spacing-rods . #t)
(font-shape . italic)
(self-alignment-X . 0)
- (meta . ,(grob-description "SostenutoPedal" text-interface font-interface))
+ (meta . ,(grob-description text-interface font-interface))
))
(Stem . (
(X-offset-callbacks . (,Stem::off_callback))
(X-extent-callback . ,Stem::dim_callback)
(Y-extent-callback . ,Stem::height)
- (meta . ,(grob-description "Stem" stem-interface font-interface))
+ (meta . ,(grob-description stem-interface font-interface))
))
(StemTremolo . (
(beam-width . 2.0) ; staff-space
(beam-thickness . 0.42) ; staff-space
(beam-space-function . ,default-beam-space-function)
- (meta . ,(grob-description "StemTremolo" stem-tremolo-interface ))
+ (meta . ,(grob-description stem-tremolo-interface ))
))
(SeparationItem . (
- (meta . ,(grob-description "SeparationItem" separation-item-interface ))
+ (meta . ,(grob-description separation-item-interface ))
))
(SeparatingGroupSpanner . (
(spacing-procedure . ,Separating_group_spanner::set_spacing_rods)
- (meta . ,(grob-description "SeparatingGroupSpanner" separation-spanner-interface))
+ (meta . ,(grob-description separation-spanner-interface))
))
(SustainPedal . (
(,Side_position_interface::aligned_side
,Side_position_interface::centered_on_parent))
- (meta . ,(grob-description "SustainPedal" sustain-pedal-interface side-position-interface font-interface))
+ (meta . ,(grob-description sustain-pedal-interface side-position-interface font-interface))
))
;; TODO: should split in 3
(collapse-height . 5.0)
(font-family . braces)
(Y-extent-callback . #f)
- (meta . ,(grob-description "SystemStartBrace" system-start-delimiter-interface font-interface))
+ (meta . ,(grob-description system-start-delimiter-interface font-interface))
))
(SystemStartBracket . (
(Y-extent-callback . #f)
(arch-angle . 50.0)
(arch-thick . 0.25)
(arch-width . 1.5)
- (thickness . 0.25)
- (meta . ,(grob-description "SystemStartBracket" system-start-delimiter-interface ))
(bracket-collapse-height . 1)
+ (thickness . 0.25)
+ (meta . ,(grob-description system-start-delimiter-interface ))
))
(SystemStartBar . (
(Y-extent-callback . #f)
(glyph . bar-line)
(thickness . 1.6)
(after-line-breaking-callback . ,System_start_delimiter::after_line_breaking)
- (meta . ,(grob-description "SystemStartBar" system-start-delimiter-interface ))
+ (meta . ,(grob-description system-start-delimiter-interface ))
))
(TextScript . (
;; todo: add X self alignment?
(baseline-skip . 2)
(font-family . roman)
- (meta . ,(grob-description "TextScript" text-script-interface text-interface side-position-interface font-interface ))
+ (meta . ,(grob-description text-script-interface text-interface side-position-interface font-interface ))
))
(TextSpanner . (
(molecule-callback . ,Text_spanner::brew_molecule)
(width-correct . -1)
(direction . 1)
- (meta . ,(grob-description "TextSpanner" text-spanner-interface font-interface))
+ (meta . ,(grob-description text-spanner-interface font-interface))
))
(Tie . (
(molecule-callback . ,Tie::brew_molecule)
(x-gap . 0.2)
(y-offset . 0.6)
(minimum-length . 2.5)
- (meta . ,(grob-description "Tie" tie-interface ))
+ (meta . ,(grob-description tie-interface ))
))
(TieColumn . (
(after-line-breaking-callback . ,Tie_column::after_line_breaking)
- (meta . ,(grob-description "TieColumn" tie-column-interface ))
+ (meta . ,(grob-description tie-column-interface ))
))
(TimeSignature . (
(breakable . #t)
(style . C)
(font-family . number)
- (meta . ,(grob-description "TimeSignature" time-signature-interface font-interface))
+ (meta . ,(grob-description time-signature-interface font-interface))
))
(TupletBracket . (
(font-family . roman)
(font-shape . italic)
(font-relative-size . -1)
- (meta . ,(grob-description "TupletBracket" text-interface
+ (meta . ,(grob-description text-interface
tuplet-bracket-interface font-interface))
))
(Y-offset-callbacks .
(,Side_position_interface::aligned_side
,Side_position_interface::centered_on_parent))
- (meta . ,(grob-description "UnaCordaPedal" text-interface font-interface))
+ (meta . ,(grob-description text-interface font-interface))
))
(VoltaBracket . (
(minimum-space . 5)
(font-family . number)
(font-relative-size . -2)
- (meta . ,(grob-description "VoltaBracket" volta-bracket-interface side-position-interface font-interface))
+ (meta . ,(grob-description volta-bracket-interface side-position-interface font-interface))
))
-
(VerticalAlignment . (
(axes 1)
(Y-extent-callback . ,Axis_group_interface::group_extent_callback)
(X-extent-callback . #f)
(stacking-dir . -1)
- (meta . ,(grob-description "VerticalAlignment" align-interface axis-group-interface))
+ (meta . ,(grob-description align-interface axis-group-interface))
))
-
(VerticalAxisGroup . (
(axes 1)
- (meta . ,(grob-description "VerticalAxisGroup" axis-group-interface))
+ (meta . ,(grob-description axis-group-interface))
))
))
+
+(define (completize-grob-entry x)
+ "transplant assoc key into 'name entry of 'meta of X
+"
+ (let* ((name-sym (car x))
+ (entry (cdr x))
+ (metaentry (cdr (assoc 'meta entry)))
+ (new-metaentry (assoc-set! metaentry 'name name-sym))
+ )
+
+ (cons name-sym (assoc-set! entry 'meta new-metaentry))
+ ))
+
+(set! all-grob-descriptions (map completize-grob-entry all-grob-descriptions))
+
; (display (map pair? all-grob-descriptions))
)
)
-(define (grob-description name . interfaces)
- (let* ((ifs (cons general-grob-interface interfaces))
+(define (grob-description . interfaces)
+ (let* ((ifs (cons grob-interface interfaces))
(props (map caddr ifs))
; (prop-typep-pairs (map (lambda (x) (cons (car x) (cadr x)))
; (apply append props)))
(syms (map car ifs))
)
(list (cons 'separator "\n\n\n") ;easy printing.
- (cons 'name name)
(cons 'interfaces syms)
(cons 'interface-descriptions ifs)
; (cons 'interface-descriptions (cadr merged))
(lily-interface
- 'general-grob-interface
+ 'grob-interface
"All grobs support this"
'(
X-offset-callbacks
"ascii-script.scm"
))
+(define ctor list)
+
+
+(define (ly-load x) (eval-string (ly-gulp-file x)))
+
(if (not standalone)
- (map (lambda (x) (eval-string (ly-gulp-file x)))
+ (map ly-load
+ ; load-from-path
'("c++.scm"
"grob-property-description.scm"
"translator-property-description.scm"
+ "context-description.scm"
"interface-description.scm"
"beam.scm"
"clef.scm"
)))
+
;;; Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
(define (ps-scm action-name)
;; alist containing fontname -> fontcommand assoc (both strings)
-(define (engraver-description name description created-elts properties)
- (list name description created-elts properties)
- )
-
-
-(define engraver-description-alist
- (list
- (cons
- 'Stem_engraver
- (engraver-description
- "Stem_engraver"
- "Create stems and single-stem tremolos. It also works together with
-the beam engraver for overriding beaming."
- '(Stem StemTremolo)
- '(tremoloFlags
- stemLeftBeamCount
- stemRightBeamCount
- )))
-
- (cons
- 'Hyphen_engraver
- (engraver-description
- "Hyphen_engraver"
- "Create lyric hyphens"
- '(LyricHyphen)
- '(
- )))
-
- (cons
- 'Extender_engraver
- (engraver-description
- "Extender_engraver"
- "Create lyric extenders"
- '(LyricExtender)
- '(
- )))
-
-
- (cons
- 'Separating_line_group_engraver
- (engraver-description
- "Separating_line_group_engraver"
- "Generates objects for computing spacing parameters."
- '(SeparationItem SeparatingGroupSpanner)
- '(
- )))
-
- (cons
- 'Axis_group_engraver
- (engraver-description
- "Axis_group_engraver"
- "Group all objects created in this context in a VerticalAxisGroup spanner."
- '(VerticalAxisGroup)
- '(VerticalExtent MinimumVerticalExtent ExtraVerticalExtent)
- ))
-
- (cons
- 'Hara_kiri_engraver
- (engraver-description
- "Hara_kiri_engraver"
- "Like Axis_group_engraver, but make a hara kiri spanner, and add
-interesting items (ie. note heads, lyric syllables and normal rests)"
- '(HaraKiriVerticalGroup)
- '()
- ))
-
-
- (cons
- 'Local_key_engraver
- (engraver-description
- "Local_key_engraver"
- "Make accidentals. Catches note heads, ties and notices key-change
- events. Due to interaction with ties (which don't come together
- with note heads), this needs to be in a context higher than Tie_engraver.
- (FIXME)."
- '(Accidentals)
- '(
- localKeySignature
- forgetAccidentals
- noResetKey
-
- )))
-
-
- (cons
- 'Volta_engraver
- (engraver-description
- "Volta_engraver"
- "Make volta brackets"
- '(VoltaBracket)
- '(repeatCommands voltaSpannerDuration)
- ))
-
- (cons
- 'Clef_engraver
- (engraver-description
- "Clef_engraver"
- "Determine and set reference point for pitches"
- '(Clef OctavateEight)
- '( clefPosition clefGlyph centralCPosition clefOctavation explicitClefVisibility )))
-
- (cons
- 'A2_engraver
- (engraver-description
- "A2_engraver"
- "Part combine engraver for orchestral scores.
+;;
+;; TODO: this should come from the C++ code, really.
+;;
+(define engraver-description-alist-old
+'((A2_engraver
+ (name . "A2_engraver")
+ (description . "Part combine engraver for orchestral scores.
The markings @emph{a2}, @emph{Solo} and @emph{Solo II}, are
created by this engraver. It also acts upon instructions of the part
up for the musicexpr called @code{one}, down for the musicexpr called
@code{two}.
-"
- '(TextScript)
- '(
- combineParts
- noDirection
- soloADue
- soloText
- soloIIText
- aDueText
- split-interval
- unison
- solo
- unisilence
- unirhythm
- )))
-
- (cons
- 'Arpeggio_engraver
- (engraver-description
- "Arpeggio_engraver"
- "Generate an Arpeggio from a Arpeggio_req"
- '(Arpeggio)
- '(
- )))
-
- (cons
- 'Auto_beam_engraver
- (engraver-description
- "Auto_beam_engraver"
- "Generate beams based on measure characteristics and observed
+")
+ (grobs-created TextScript)
+ (interfaces-acked all)
+ (properties-read combineParts noDirection soloADue soloText soloIIText aDueText split-interval unison solo unisilence unirhythm)
+ )
+ (Arpeggio_engraver
+
+ (name . "Arpeggio_engraver")
+ (description . "Generate an Arpeggio from a Arpeggio_req")
+ (grobs-created Arpeggio)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Auto_beam_engraver
+
+ (name . "Auto_beam_engraver")
+ (description . "Generate beams based on measure characteristics and observed
Stems. Uses beatLength, measureLength and measurePosition to decide
when to start and stop a beam. Overriding beaming is done through
@ref{Stem_engraver} properties stemLeftBeamCount and
stemRightBeamCount.
-"
- '(
- Beam)
- '(
- noAutoBeaming
- autoBeamSettings)))
-
- (cons
- 'Bar_engraver
- (engraver-description
- "Bar_engraver"
- "Create barlines. This engraver is controlled through the
-@code{whichBar} property. If it has no bar line to create, it will forbid a linebreak at this point"
- '(BarLine)
- '(
- whichBar
- stavesFound
- )))
-
-
- (cons
- 'Bar_number_engraver
- (engraver-description
- "Bar_number_engraver"
- "A bar number is created whenever measurePosition is zero. It is
-put on top of all staves, and appears only at left side of the staff."
- '(BarNumber)
- '(
- currentBarNumber
- )))
-
-
- (cons
- 'Beam_engraver
- (engraver-description
- "Beam_engraver"
- "Handles Beam_requests by engraving Beams. If omitted, then notes will be
- printed with flags instead of beams."
- '(Beam)
- '(
- beamMelismaBusy
- )))
-
- (cons
- 'Break_align_engraver
- (engraver-description
- "Break_align_engraver"
- "Align grobs with corresponding break-align-symbols into groups, and order the groups according to breakAlignOrder"
- '(BreakAlignment BreakAlignGroup LeftEdge)
- '(
- breakAlignOrder
-
- )))
-
-
- (cons
- 'Breathing_sign_engraver
- (engraver-description
- "Breathing_sign_engraver"
- ""
- '(BreathingSign)
- '(
- )))
-
-
- (cons
- 'Chord_name_engraver
- (engraver-description
- "Chord_name_engraver"
- "Catch Note_req's, Tonic_reqs, Inversion_reqs, Bass_req
-and generate the appropriate chordname."
- '(ChordName)
- '(chordChanges)))
-
-
- (cons
- 'Chord_tremolo_engraver
- (engraver-description
- "Chord_tremolo_engraver"
- "Generates beams for the \repeat X tremolo ... construct"
- '(Beam)
- '(
- )))
-
-
-
- (cons
- 'Collision_engraver
- (engraver-description
- "Collision_engraver"
- ""
- '(NoteCollision
- )
- '(
- )))
-
- (cons
- 'Custos_engraver
- (engraver-description
- "Custos_engraver"
- ""
- '(Custos)
- '(
- )))
-
-
- (cons
- 'Dot_column_engraver
- (engraver-description
- "Dot_column_engraver"
- " Engraves dots on dotted notes shifted to the right of the note.
+")
+ (grobs-created Beam)
+ (interfaces-acked grob-interface)
+ (properties-read noAutoBeaming autoBeamSettings)
+ )
+ (Axis_group_engraver
+
+ (name . "Axis_group_engraver")
+ (description . "Group all objects created in this context in a VerticalAxisGroup spanner.")
+ (grobs-created VerticalAxisGroup)
+ (interfaces-acked grob-interface)
+ (properties-read VerticalExtent MinimumVerticalExtent ExtraVerticalExtent)
+ )
+ (Bar_engraver
+
+ (name . "Bar_engraver")
+ (description . "Create barlines. This engraver is controlled through the
+@code{whichBar} property. If it has no bar line to create, it will forbid a linebreak at this point")
+ (grobs-created BarLine)
+ (interfaces-acked grob-interface)
+ (properties-read whichBar stavesFound)
+ )
+ (Bar_number_engraver
+
+ (name . "Bar_number_engraver")
+ (description . "A bar number is created whenever measurePosition is zero. It is
+put on top of all staves, and appears only at left side of the staff.")
+ (grobs-created BarNumber)
+ (interfaces-acked grob-interface)
+ (properties-read currentBarNumber)
+ )
+ (Beam_engraver
+
+ (name . "Beam_engraver")
+ (description . "Handles Beam_requests by engraving Beams. If omitted, then notes will be
+printed with flags instead of beams.")
+ (grobs-created Beam)
+ (interfaces-acked grob-interface)
+ (properties-read beamMelismaBusy)
+ )
+ (Break_align_engraver
+
+ (name . "Break_align_engraver")
+ (description . "Align grobs with corresponding break-align-symbols into groups, and order the groups according to breakAlignOrder")
+ (grobs-created BreakAlignment BreakAlignGroup LeftEdge)
+ (interfaces-acked grob-interface)
+ (properties-read breakAlignOrder)
+ )
+ (Breathing_sign_engraver
+
+ (name . "Breathing_sign_engraver")
+ (description . "")
+ (grobs-created BreathingSign)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Chord_name_engraver
+
+ (name . "Chord_name_engraver")
+ (description . "Catch Note_req's, Tonic_reqs, Inversion_reqs, Bass_req
+and generate the appropriate chordname.")
+ (grobs-created ChordName)
+ (interfaces-acked grob-interface)
+ (properties-read chordChanges)
+ )
+ (Chord_tremolo_engraver
+
+ (name . "Chord_tremolo_engraver")
+ (description . "Generates beams for tremolo repeats.")
+ (grobs-created Beam)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Clef_engraver
+
+ (name . "Clef_engraver")
+ (description . "Determine and set reference point for pitches")
+ (grobs-created Clef OctavateEight)
+ (interfaces-acked grob-interface)
+ (properties-read clefPosition clefGlyph centralCPosition clefOctavation explicitClefVisibility)
+ )
+ (Collision_engraver
+
+ (name . "Collision_engraver")
+ (description . "")
+ (grobs-created NoteCollision)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Custos_engraver
+
+ (name . "Custos_engraver")
+ (description . "")
+ (grobs-created Custos)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Dot_column_engraver
+
+ (name . "Dot_column_engraver")
+ (description . " Engraves dots on dotted notes shifted to the right of the note.
If omitted, then dots appear on top of the notes.
-"
- '(DotColumn
- )
- '(
- )))
-
-
- (cons
- 'Dynamic_engraver
- (engraver-description
- "Dynamic_engraver"
- ""
- '(DynamicLineSpanner
- DynamicText Hairpin
- TextSpanner)
- '(
- )))
-
-
-
-
-
-
- (cons
- 'Instrument_name_engraver
- (engraver-description
- "Instrument_name_engraver"
- " Prints the name of the instrument (specified by
- @code{Staff.instrument} and @code{Staff.instr}) at the left of the
- staff."
- '(InstrumentName)
- '(
- instrument
- instr
- )))
-
- (cons
- 'Engraver_group_engraver
- (engraver-description
- "Engraver_group_engraver"
- "A group of engravers taken together"
- '()
- '(
- )))
-
- (cons
- 'Key_engraver
- (engraver-description
- "Key_engraver"
- ""
- '(KeySignature
- )
- '( keySignature explicitKeySignatureVisibility createKeyOnClefChange keyAccidentalOrder keySignature )))
-
- (cons 'Lyric_engraver
- (engraver-description
- "Lyric_engraver"
- ""
- '()
- '(
- ;; FIXME
- )))
-
- (cons 'Lyric_phrasing_engraver
- (engraver-description
- "Lyric_phrasing_engraver"
- ""
- '()
- '(
- automaticPhrasing
-
- melismaEngraverBusy
- associatedVoice
- phrasingPunctuation
- )))
-
- (cons
- 'Mark_engraver
- (engraver-description
- "Mark_engraver"
- ""
- '(RehearsalMark)
- '(
-
- rehearsalMark
- stavesFound
- )))
-
-
- (cons
- 'Melisma_engraver
- (engraver-description
- "Melisma_engraver"
- ""
- '()
- '(
-
- melismaBusy
- slurMelismaBusy
- tieMelismaBusy
- beamMelismaBusy
- )))
-
-
- (cons
- 'Multi_measure_rest_engraver
- (engraver-description
- "Multi_measure_rest_engraver"
- "Engraves multi-measure rests that are produced with @code{R}. Reads
+")
+ (grobs-created DotColumn)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Dynamic_engraver
+
+ (name . "Dynamic_engraver")
+ (description . "")
+ (grobs-created DynamicLineSpanner DynamicText Hairpin TextSpanner)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Engraver_group_engraver
+
+ (name . "Engraver_group_engraver")
+ (description . "A group of engravers taken together")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Extender_engraver
+
+ (name . "Extender_engraver")
+ (description . "Create lyric extenders")
+ (grobs-created LyricExtender)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Font_size_engraver
+ (name . "Font_size_engraver")
+ (description . "Puts fontSize into font-relative-size grob property.")
+ (grobs-created )
+ (interfaces-acked grob-interface)
+ (properties-read fontSize)
+ )
+ (Hara_kiri_engraver
+
+ (name . "Hara_kiri_engraver")
+ (description . "Like Axis_group_engraver, but make a hara kiri spanner, and add
+interesting items (ie. note heads, lyric syllables and normal rests)
+")
+ (grobs-created HaraKiriVerticalGroup)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Hyphen_engraver
+
+ (name . "Hyphen_engraver")
+ (description . "Create lyric hyphens")
+ (grobs-created LyricHyphen)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Instrument_name_engraver
+
+ (name . "Instrument_name_engraver")
+ (description . " Prints the name of the instrument (specified by
+@code{Staff.instrument} and @code{Staff.instr})
+at the left of the
+staff.")
+ (grobs-created InstrumentName)
+ (interfaces-acked bar-line-interface dynamic-interface axis-group-interface)
+ (properties-read instrument instr)
+ )
+ (Key_engraver
+
+ (name . "Key_engraver")
+ (description . "")
+ (grobs-created KeySignature)
+ (interfaces-acked grob-interface)
+ (properties-read keySignature explicitKeySignatureVisibility createKeyOnClefChange keyAccidentalOrder keySignature)
+ )
+ (Local_key_engraver
+ (name . "Local_key_engraver")
+ (description . "Make accidentals. Catches note heads, ties and notices key-change
+events. Due to interaction with ties (which don't come together
+with note heads), this needs to be in a context higher than Tie_engraver. FIXME")
+ (grobs-created Accidentals)
+ (interfaces-acked grob-interface)
+ (properties-read localKeySignature forgetAccidentals noResetKey)
+ )
+ (Lyric_engraver
+
+ (name . "Lyric_engraver")
+ (description . "")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Lyric_phrasing_engraver
+
+ (name . "Lyric_phrasing_engraver")
+ (description . "")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read automaticPhrasing melismaEngraverBusy associatedVoice phrasingPunctuation)
+ )
+ (Mark_engraver
+
+ (name . "Mark_engraver")
+ (description . "")
+ (grobs-created RehearsalMark)
+ (interfaces-acked grob-interface)
+ (properties-read rehearsalMark stavesFound)
+ )
+ (Melisma_engraver
+
+ (name . "Melisma_engraver")
+ (description . "")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read melismaBusy slurMelismaBusy tieMelismaBusy beamMelismaBusy)
+ )
+ (Multi_measure_rest_engraver
+
+ (name . "Multi_measure_rest_engraver")
+ (description . "Engraves multi-measure rests that are produced with @code{R}. Reads
measurePosition and currentBarNumber to determine what number to print over the MultiMeasureRest
- "
- '(MultiMeasureRest)
- '(currentBarNumber currentCommandColumn measurePosition
- )))
-
- (cons
- 'Note_heads_engraver
- (engraver-description
- "Note_heads_engraver"
- "Generate one or more noteheads from Music of type Note_req."
- '(NoteHead Dots)
- '(
- )))
-
- (cons
- 'Note_head_line_engraver
- (engraver-description
- "Note_head_line_engraver"
- "Engrave a line between two note heads, for example a glissando.
-If followVoice is set, staff switches also generate a line."
- '(Glissando VoiceFollower)
- '(followVoice)))
-
- (cons
- 'Note_name_engraver
- (engraver-description
- "Note_name_engraver"
- ""
- '(NoteName)
- '(
- )))
-
-
- (cons
- 'Output_property_engraver
- (engraver-description
- "Output_property_engraver"
- "Interpret Music of Output_property type, and apply a function
-to any Graphic objects that satisfies the predicate."
- '()
- '(
- )))
-
-
- (cons
- 'Piano_pedal_engraver
- (engraver-description
- "Piano_pedal_engraver"
- "Engrave piano pedal symbols."
- '(SostenutoPedal SustainPedal UnaCordaPedal)
- '(pedalSostenutoStrings pedalSustainStrings pedalUnaCordaStrings
- )))
-
- (cons
- 'Pitch_squash_engraver
- (engraver-description
- "Pitch_squash_engraver"
- "Treat all pitches as middle C. Note that the notes move, but
+")
+ (grobs-created MultiMeasureRest)
+ (interfaces-acked grob-interface)
+ (properties-read currentBarNumber currentCommandColumn measurePosition)
+ )
+ (Note_head_line_engraver
+
+ (name . "Note_head_line_engraver")
+ (description . "Engrave a line between two note heads, for example a glissando.
+If followVoice is set, staff switches also generate a line.")
+ (grobs-created Glissando VoiceFollower)
+ (interfaces-acked grob-interface)
+ (properties-read followVoice)
+ )
+ (Note_heads_engraver
+
+ (name . "Note_heads_engraver")
+ (description . "Generate one or more noteheads from Music of type Note_req.")
+ (grobs-created NoteHead Dots)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Note_name_engraver
+
+ (name . "Note_name_engraver")
+ (description . "")
+ (grobs-created NoteName)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Output_property_engraver
+
+ (name . "Output_property_engraver")
+ (description . "Interpret Music of Output_property type, and apply a function
+to any Graphic objects that satisfies the predicate.")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Percent_repeat_engraver
+ (name . "Percent_repeat_engraver")
+ (description . "Make beat, whole bar and double bar repeats.")
+ (grobs-created PercentRepeat RepeatSlash DoublePercentRepeat)
+ (interfaces-acked grob-interface)
+ (properties-read measureLength currentCommandColumn)
+ )
+
+ (Piano_pedal_engraver
+ (name . "Piano_pedal_engraver")
+ (description . "Engrave piano pedal symbols.")
+ (grobs-created SostenutoPedal SustainPedal UnaCordaPedal)
+ (interfaces-acked rhythmic-head-interface stem-interface)
+ (properties-read pedalSostenutoStrings pedalSustainStrings pedalUnaCordaStrings)
+ )
+ (Pitch_squash_engraver
+ (name . "Pitch_squash_engraver")
+ (description . "Treat all pitches as middle C. Note that the notes move, but
the locations of accidentals stay the same.
Set the position field of all note heads to zero. This useful for
-making a single line staff that demonstrates the rhythm of a melody."
- '()
- '(
- squashedPosition
- )))
-
- (cons
- 'Porrectus_engraver
- (engraver-description
- "Porrectus_engraver"
- "Join adjacent notes to a porrectus ligature."
- '(Porrectus)
- '(
- )))
-
-
- (cons
- 'Property_engraver
- (engraver-description
- "Property_engraver"
-"This is a engraver that converts \property settings into
+making a single line staff that demonstrates the rhythm of a melody.")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read squashedPosition)
+ )
+ (Phrasing_slur_engraver
+ (name . "Phrasing_slur_engraver")
+ (description . "Print phrasing slurs. Similar to Slur_engraver")
+ (grobs-created PhrasingSlur)
+ (interfaces-acked grob-interface)
+ (properties-read slurBeginAttachment slurEndAttachment slurMelismaBusy)
+ )
+ (Porrectus_engraver
+
+ (name . "Porrectus_engraver")
+ (description . "Join adjacent notes to a porrectus ligature.")
+ (grobs-created Porrectus)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Property_engraver
+
+ (name . "Property_engraver")
+ (description . "This is a engraver that converts property settings into
back-end grob-property settings. Example: Voice.stemLength will set
#'length in all Stem objects.
-Due to CPU and memory requirements, the use of this engraver is deprecated."
- '()
- '(Generic_property_list)
- ))
-
-
- (cons
- 'Repeat_acknowledge_engraver
- (engraver-description
- "Repeat_acknowledge_engraver"
-
- "Acknowledge repeated music, and convert the contents of
-repeatCommands ainto an appropriate setting for whichBar"
- '()
- '(
- repeatCommands
- whichBar
-
- )))
-
-
- (cons
- 'Rest_collision_engraver
- (engraver-description
- "Rest_collision_engraver"
- "Handles collisions of rests."
- '(RestCollision)
- '(
- )))
-
-
- (cons
- 'Rest_engraver
- (engraver-description
- "Rest_engraver"
- ""
- '(Rest Dots)
- '(
- )))
-
-
- (cons
- 'Rhythmic_column_engraver
- (engraver-description
- "Rhythmic_column_engraver"
- "Generates NoteColumn, an objects that groups stems, noteheads and rests."
- '(NoteColumn)
- '(
- )))
-
-
- (cons
- 'Script_column_engraver
- (engraver-description
- "Script_column_engraver"
- ""
- '(ScriptColumn)
- '(
- )))
-
-
- (cons
- 'Script_engraver
- (engraver-description
- "Script_engraver"
- " Handles note ornaments generated by @code{\script}.
-"
- '(Script)
- '(
- scriptDefinitions
- scriptHorizontal
- )))
-
- (cons
- 'Score_engraver
- (engraver-description
- "Score_engraver"
- "Top level engraver. Takes care of generating columns and the complete system (ie. LineOfScore)
+Due to CPU and memory requirements, the use of this engraver is deprecated.")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read Generic_property_list)
+ )
+ (Repeat_acknowledge_engraver
+
+ (name . "Repeat_acknowledge_engraver")
+ (description . "Acknowledge repeated music, and convert the contents of
+repeatCommands ainto an appropriate setting for whichBar")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read repeatCommands whichBar)
+ )
+ (Rest_collision_engraver
+
+ (name . "Rest_collision_engraver")
+ (description . "Handles collisions of rests.")
+ (grobs-created RestCollision)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Rest_engraver
+
+ (name . "Rest_engraver")
+ (description . "")
+ (grobs-created Rest Dots)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Rhythmic_column_engraver
+
+ (name . "Rhythmic_column_engraver")
+ (description . "Generates NoteColumn, an objects that groups stems, noteheads and rests.")
+ (grobs-created NoteColumn)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Score_engraver
+
+ (name . "Score_engraver")
+ (description . "Top level engraver. Takes care of generating columns and the complete system (ie. LineOfScore)
+
This engraver decides whether a column is breakable. The default is
that a column is always breakable. However, when every Bar_engraver
means that you can make a breakpoint by creating a barline (assuming
that there are no beams or notes that prevent a breakpoint.)
-"
- '(LineOfScore PaperColumn NonMusicalPaperColumn)
- '(
- currentMusicalColumn
- currentCommandColumn
- )))
-
- (cons 'Skip_req_swallow_translator
- (engraver-description
- "Skip_req_swallow_translator"
- ""
- '()
- '(
- ;; FIXME
- )))
-
- (cons
- 'Slur_engraver
- (engraver-description
- "Slur_engraver"
- "Build slurs from Slur_reqs"
- '(Slur)
-
- '(
- slurBeginAttachment
- slurEndAttachment
- slurMelismaBusy
- )))
-
-
- (cons
- 'Spacing_engraver
- (engraver-description
- "Spacing_engraver"
- "make a SpacingSpanner and do bookkeeping of shortest starting and playing notes "
- '(SpacingSpanner)
- '(
- )))
-
-
- (cons
- 'Span_arpeggio_engraver
- (engraver-description
- "Span_arpeggio_engraver"
- ""
- '(Arpeggio)
- '(
- connectArpeggios
- )))
-
-
- (cons
- 'Span_bar_engraver
- (engraver-description
- "Span_bar_engraver"
- "This engraver makes cross-staff barlines: It catches all normal
-bar lines, and draws a single span-bar across them."
-
- '(SpanBar)
- '(
- )))
-
-
- (cons
- 'Staff_symbol_engraver
- (engraver-description
- "Staff_symbol_engraver"
- "create the constellation of five (default) staff lines."
- '(StaffSymbol)
- '(
- )))
-
-
- (cons
- 'Stanza_number_engraver
- (engraver-description
- "Stanza_number_engraver"
- ""
- '(StanzaNumber
- )
- '(
- stz
- stanza
- )))
-
-
-
- (cons
- 'System_start_delimiter_engraver
- (engraver-description
- "System_start_delimiter_engraver"
- "creates a system start delimiter (ie. SystemStart@{Bar,Brace,Bracket@} spanner"
- '(SystemStartBar SystemStartBrace SystemStartBracket)
- '(
- )))
-
-
- (cons
- 'Text_engraver
- (engraver-description
- "Text_engraver"
- "Create text-scripts"
- '(TextScript)
- '(
- scriptHorizontal
- textNonEmpty
- )))
-
-
- (cons
- 'Text_spanner_engraver
- (engraver-description
- "Text_spanner_engraver"
- "Create text spanner from a Span_req "
- '(TextSpanner)
- '(
- )))
-
-
- (cons
- 'Thread_devnull_engraver
- (engraver-description
- "Thread_devnull_engraver"
- "Kill elements whenever we are Voice called `two' and either
+
+")
+ (grobs-created LineOfScore PaperColumn NonMusicalPaperColumn)
+ (interfaces-acked grob-interface)
+ (properties-read currentMusicalColumn currentCommandColumn)
+ )
+ (Script_column_engraver
+
+ (name . "Script_column_engraver")
+ (description . "")
+ (grobs-created ScriptColumn)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Script_engraver
+
+ (name . "Script_engraver")
+ (description . " Handles note ornaments generated by @code{\\script}.
+")
+ (grobs-created Script)
+ (interfaces-acked grob-interface)
+ (properties-read scriptDefinitions scriptHorizontal)
+ )
+ (Separating_line_group_engraver
+
+ (name . "Separating_line_group_engraver")
+ (description . "Generates objects for computing spacing parameters.")
+ (grobs-created SeparationItem SeparatingGroupSpanner)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Skip_req_swallow_translator
+
+ (name . "Skip_req_swallow_translator")
+ (description . "")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Slur_engraver
+
+ (name . "Slur_engraver")
+ (description . "Build slurs from Slur_reqs")
+ (grobs-created Slur)
+ (interfaces-acked grob-interface)
+ (properties-read slurBeginAttachment slurEndAttachment slurMelismaBusy)
+ )
+ (Spacing_engraver
+
+ (name . "Spacing_engraver")
+ (description . "make a SpacingSpanner and do bookkeeping of shortest starting and playing notes ")
+ (grobs-created SpacingSpanner)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Span_arpeggio_engraver
+
+ (name . "Span_arpeggio_engraver")
+ (description . "")
+ (grobs-created Arpeggio)
+ (interfaces-acked grob-interface)
+ (properties-read connectArpeggios)
+ )
+ (Span_bar_engraver
+
+ (name . "Span_bar_engraver")
+ (description . "This engraver makes cross-staff barlines: It catches all normal
+bar lines, and draws a single span-bar across them.")
+ (grobs-created SpanBar)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Staff_symbol_engraver
+
+ (name . "Staff_symbol_engraver")
+ (description . "create the constellation of five (default)
+staff lines.")
+ (grobs-created Sta
+ ffSymbol)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Stanza_number_engraver
+
+ (name . "Stanza_number_engraver")
+ (description . "")
+ (grobs-created StanzaNumber)
+ (interfaces-acked grob-interface)
+ (properties-read stz stanza)
+ )
+ (Stem_engraver
+
+ (name . "Stem_engraver")
+ (description . "Create stems and single-stem tremolos. It also works together with
+the beam engraver for overriding beaming.")
+ (grobs-created Stem StemTremolo)
+ (interfaces-acked rhythmic-head-interface)
+ (properties-read tremoloFlags stemLeftBeamCount stemRightBeamCount)
+ )
+ (System_start_delimiter_engraver
+
+ (name . "System_start_delimiter_engraver")
+ (description . "creates a system start delimiter (ie. SystemStart@{Bar,Brace,Bracket@} spanner")
+ (grobs-created SystemStartBar SystemStartBrace SystemStartBracket)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Text_engraver
+
+ (name . "Text_engraver")
+ (description . "Create text-scripts")
+ (grobs-created TextScript)
+ (interfaces-acked grob-interface)
+ (properties-read scriptHorizontal textNonEmpty)
+ )
+ (Text_spanner_engraver
+
+ (name . "Text_spanner_engraver")
+ (description . "Create text spanner from a Span_req ")
+ (grobs-created TextSpanner)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Thread_devnull_engraver
+
+ (name . "Thread_devnull_engraver")
+ (description . "Kill elements whenever we are Voice called `two' and either
unison, unisilence or soloADue is set.@footnote{On unix systems, the
file @file{/dev/null} is special device: anything written to it is
discarded.}. This engraver works closely together with the part
combiner. When the part combiner notices that two threads are
identical, it tells the @code{Thread_devnull_engraver} to discard
everything in the second thread.
-"
-
- '()
- '()))
-
-
- (cons
- 'Tie_engraver
- (engraver-description
- "Tie_engraver"
- "Generate ties between noteheads of equal pitch."
- '(Tie TieColumn)
- '(sparseTies
- tieMelismaBusy
- )))
-
-
- (cons
- 'Time_signature_engraver
- (engraver-description
- "Time_signature_engraver"
- "Create a TimeSignature whenever @code{timeSignatureFraction} changes"
- '(TimeSignature)
- '(
- )))
-
-
- (cons
- 'Timing_engraver
- (engraver-description
- "Timing_engraver"
- " 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}."
- '()
- '(
- timeSignatureFraction
- barCheckNoSynchronize
- barNonAuto
- whichBar
- barAlways
- defaultBarType
- skipBars
- timing
- oneBeat
- measureLength
- measurePosition
- currentBarNumber
- )))
-
-
- (cons
- 'Tuplet_engraver
- (engraver-description
- "Tuplet_engraver"
- "Catch Time_scaled_music and generate appropriate bracket "
- '( TupletBracket)
- '(tupletNumberFormatFunction tupletSpannerDuration tupletInvisible)))
-
-
- (cons
- 'Vertical_align_engraver
- (engraver-description
- "Vertical_align_engraver"
- "Catch Vertical axis groups and stack them."
- '(VerticalAlignment)
- '(
- )))
-
-
- (cons
- 'Voice_devnull_engraver
- (engraver-description
- "Voice_devnull_engraver"
- "Kill off certain items and spanners if we're Voice `two' and unison or unisilence is set."
- '()
- '(
- )))
- ))
-
-
-(set! engraver-description-alist
- (sort engraver-description-alist alist<?))
-
-(define context-description-alist
- '(
-(Grace . "
- The context for handling grace notes. It used to be instantiated
- automatically when you use @code{\grace}. Basically, it is an
- `embedded' miniature of the Score context. Since this context
- needs special interaction with the rest of LilyPond, you should
- not explicitly instantiate it.
-
- DEPRECATED.
-")
-(LyricsVoice . "
- Corresponds to a voice with lyrics. Handles the printing of a
- single line of lyrics.
")
-(Thread . "
- Handles note heads, and is contained in the Voice context. You
- have to instantiate this explicitly if you want to adjust the
- style of individual note heads.
-")
-(Voice . "
- Corresponds to a voice on a staff. This context handles the
- conversion of dynamic signs, stems, beams, super- and subscripts,
- slurs, ties, and rests.
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Tie_engraver
- You have to instantiate this explicitly if you want to have
- multiple voices on the same staff.")
+ (name . "Tie_engraver")
+ (description . "Generate ties between noteheads of equal pitch.")
+ (grobs-created Tie TieColumn)
+ (interfaces-acked grob-interface)
+ (properties-read sparseTies tieMelismaBusy)
+ )
+ (Time_signature_engraver
-(ChordNamesVoice . "
- A voice with chord names. Handles printing of a line of chord
- names.")
+ (name . "Time_signature_engraver")
+ (description . "Create a TimeSignature whenever @code{timeSignatureFraction} changes")
+ (grobs-created TimeSignature)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Timing_engraver
+
+ (name . "Timing_engraver")
+ (description . " 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}.")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read timeSignatureFraction barCheckNoSynchronize barNonAuto whichBar barAlways defaultBarType skipBars timing oneBeat measureLength measurePosition currentBarNumber)
+ )
+ (Tuplet_engraver
-(ChordNames . "
- Typesets chord names. Can contain @code{ChordNamesVoice}
- contexts.")
+ (name . "Tuplet_engraver")
+ (description . "Catch Time_scaled_music and generate appropriate bracket ")
+ (grobs-created TupletBracket)
+ (interfaces-acked grob-interface)
+ (properties-read tupletNumberFormatFunction tupletSpannerDuration tupletInvisible)
+ )
+ (Vertical_align_engraver
-(Lyrics . "
- Typesets lyrics. It can contain @code{LyricsVoice} contexts.
-")
-(Staff . "
- Handles clefs, bar lines, keys, accidentals. It can contain
- @code{Voice} contexts.
-")
-(RhythmicStaff . "
- A context like @code{Staff} but for printing rhythms. Pitches are
- ignored; the notes are printed on one line. It can contain
- @code{Voice} contexts.
-")
-(GrandStaff . "
- Contains @code{Staff} or @code{RhythmicStaff} contexts. It adds a
- brace on the left side, grouping the staves together. The bar
- lines of the contained staves are connected vertically. It can
- contain @code{Staff} contexts.")
-
-(PianoStaff . "
- Just like @code{GrandStaff} but with @code{minVerticalAlign} set
- equal to @code{maxVerticalAlign} so that interstaff beaming and
- slurring can be used.")
-
-(StaffGroup . "
- Contains @code{Staff} or @code{RhythmicStaff} contexts. Adds a
- bracket on the left side, grouping the staves together. The bar
- lines of the contained staves are connected vertically. It can
- contain @code{Staff}, @code{RhythmicStaff}, @code{GrandStaff}, or
- @code{Lyrics} contexts.
-")
-(ChoirStaff . "
- Identical to @code{StaffGroup} except that the contained staves
- are not connected vertically.
-")
-(Score . "
- This is the top level notation context. No other context can
- contain a @code{Score} context. This context handles the
- administration of time signatures. It also makes sure that items
- such as clefs, time signatures, and key-signatures are aligned
- across staves. It can contain @code{Lyrics}, @code{Staff},
- @code{RhythmicStaff}, @code{GrandStaff}, @code{StaffGroup}, and
- @code{ChoirStaff} contexts.
-
- You cannot explicitly instantiate a Score context (since it is
- not contained in any other context). It is instantiated
- automatically when an output definition (a @code{\score} or
- @code{\paper} block) is processed.
-")
-)
+ (name . "Vertical_align_engraver")
+ (description . "Catch Vertical axis groups and stack them.")
+ (grobs-created VerticalAlignment)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Voice_devnull_engraver
+
+ (name . "Voice_devnull_engraver")
+ (description . "Kill off certain items and spanners if we're Voice `two' and unison or unisilence is set.")
+ (grobs-created)
+ (interfaces-acked grob-interface)
+ (properties-read)
+ )
+ (Volta_engraver
+
+ (name . "Volta_engraver")
+ (description . "Make volta brackets")
+ (grobs-created VoltaBracket)
+ (interfaces-acked grob-interface)
+ (properties-read repeatCommands voltaSpannerDuration)
+ )
+ )
)
+(define (alist<? x y)
+ (string<? (symbol->string (car x))
+ (symbol->string (car y))))
+
+;(set! engraver-description-alist
+; (sort engraver-description-alist alist<?))
-(set! context-description-alist
- (sort context-description-alist alist<?))
+
+(define (humane-listify l)
+ (cond
+ ((null? l) "")
+ ((null? (cdr l)) (symbol->string (car l)))
+ (else (string-append (symbol->string (car l)) " " (human-listify (cdr l)))
+
+ )))
+
+(define (print-entry x)
+ (define (mungle x)
+ (string-append (string-downcase (regexp-substitute/global #f "_" x 'pre "-" 'post)) ".cc"))
+
+ (let ((cop (open-file (mungle (car x)) "a")))
+ (define (w y)
+ (write y cop))
+ (define (d y)
+ (display y cop))
+
+ (d "ENTER_DESCRIPTION(")
+ (d (car x))
+ (d ",\n/* descr */ ")
+ (w (cdr (assoc 'description (cdr x))))
+ (d ",\n/* creats*/ ")
+ (w (human-listify (cdr (assoc 'grobs-created (cdr x)))))
+ (d ",\n/* acks */ ")
+ (w (human-listify (cdr (assoc 'interfaces-acked (cdr x)))))
+ (d ",\n/* reads */ ")
+ (w (human-listify (cdr (assoc 'properties-read (cdr x)))))
+ (d ",\n/* write */ \"\");\n")
+))
+
+;(map print-entry engraver-description-alist)
+(translator-property-description 'ExtraVerticalExtent
+ number-pair? "extra vertical extent, same format as MinimumVerticalExtent")
+(translator-property-description 'Generic_property_list list? "description of the conversion.
+
+Defines names and types for generic properties. These are properties
+than can be plugged into the backend directly. See the init file
+@file{generic-property.scm} for details. For internal use only,
+deprecated.
+")
(translator-property-description 'MinimumVerticalExtent number-pair?
"minimum vertical extent, same format as VerticalExtent")
-
(translator-property-description 'VerticalExtent number-pair?
"hard coded vertical extent.
The format is a pair of dimensions, for example, this sets the sizes
@code{Axis_group_engraver}.
")
-(translator-property-description 'ExtraVerticalExtent
- number-pair? "extra vertical extent, same format as MinimumVerticalExtent")
-(translator-property-description 'Generic_property_list list? "description of the conversion.
-
-Defines names and types for generic properties. These are properties
-than can be plugged into the backend directly. See the init file
-@file{generic-property.scm} for details. For internal use only,
-deprecated.
-")
(translator-property-description 'aDueText string? "text for begin of a due")
(translator-property-description 'associatedVoice string? "Name of the Voice that has the melody for this LyricsVoice.")
(translator-property-description 'autoBeamSettings list? "
(translator-property-description 'phrasingPunctuation string? "")
(translator-property-description 'rehearsalMark number-or-string? "")
+(translator-property-description 'regularSpacingDelta moment? "TODO")
(translator-property-description 'repeatCommands list? "This property is read to find any command of the form (volta . X), where X is a string or #f")
(translator-property-description 'scriptDefinitions list? "
Description of scripts. This is used by Script_engraver for typesetting note-super/subscripts. See @file{scm/script.scm} for more information
#
environment = {
'MFINPUTS' : datadir + '/mf' + ':',
- 'TEXINPUTS': datadir + '/tex:' + datadir + '/ps:' + os.getcwd() + ':',
+ 'TEXINPUTS': datadir + '/tex:' + datadir + '/ps:' + '.:'
+ + os.getcwd() + ':',
'TFMFONTS' : datadir + '/tfm' + ':',
'GS_FONTPATH' : datadir + '/afm:' + datadir + '/pfa',
'GS_LIB' : datadir + '/ps',
os.chdir (outdir)
cp_to_dir (PK_PATTERN, tmpdir)
+ # to be sure, add tmpdir *in front* of inclusion path.
+ #os.environ['TEXINPUTS'] = tmpdir + ':' + os.environ['TEXINPUTS']
os.chdir (tmpdir)
if lily_p: