* 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
======
# 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
-MY_PATCH_LEVEL=jcn2
+PATCH_LEVEL=13
+MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
/* 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
kpathsea_b=yes
+ #FIXME --with-xxx is meant for specifying a PATH too,
+ # so this should read: --enable-kpathsea,
+ # or --with-kpathsea-include=PATH --with-kpathsea-lib=PATH
# Check whether --with-kpathsea or --without-kpathsea was given.
if test "${with_kpathsea+set}" = set; then
withval="$with_kpathsea"
- kpathsea_b=$enableval
+ kpathsea_b=$with_kpathsea
fi
- if test "$kpathsea_b" = "yes"; then
+ if test "$kpathsea_b" != "no"; then
for ac_hdr in kpathsea/kpathsea.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2959: checking for $ac_hdr" >&5
+echo "configure:2962: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2964 "configure"
+#line 2967 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2969: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2972: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
done
echo $ac_n "checking for kpse_find_file in -lkpathsea""... $ac_c" 1>&6
-echo "configure:2996: checking for kpse_find_file in -lkpathsea" >&5
+echo "configure:2999: checking for kpse_find_file in -lkpathsea" >&5
ac_lib_var=`echo kpathsea'_'kpse_find_file | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lkpathsea $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3004 "configure"
+#line 3007 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
kpse_find_file()
; return 0; }
EOF
-if { (eval echo configure:3018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3021: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
for ac_func in kpse_find_file
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3048: checking for $ac_func" >&5
+echo "configure:3051: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3053 "configure"
+#line 3056 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:3079: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3082: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
fi
echo $ac_n "checking whether to use kpathsea""... $ac_c" 1>&6
-echo "configure:3106: checking whether to use kpathsea" >&5
- if test "$kpathsea_b" = yes; then
+echo "configure:3109: checking whether to use kpathsea" >&5
+ if test "$kpathsea_b" != no; then
echo "$ac_t""yes" 1>&6
KPATHSEA=1
else
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3127: checking for $ac_word" >&5
+echo "configure:3130: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_BIBTEX2HTML'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6
-echo "configure:3168: checking for 8-bit clean memcmp" >&5
+echo "configure:3171: checking for 8-bit clean memcmp" >&5
if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_func_memcmp_clean=no
else
cat > conftest.$ac_ext <<EOF
-#line 3176 "configure"
+#line 3179 "configure"
#include "confdefs.h"
#ifdef __cplusplus
extern "C" void exit(int) throw();
}
EOF
-if { (eval echo configure:3189: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3192: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_memcmp_clean=yes
else
test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}"
echo $ac_n "checking for vprintf""... $ac_c" 1>&6
-echo "configure:3207: checking for vprintf" >&5
+echo "configure:3210: checking for vprintf" >&5
if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3212 "configure"
+#line 3215 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char vprintf(); below. */
; return 0; }
EOF
-if { (eval echo configure:3238: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3241: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_vprintf=yes"
else
if test "$ac_cv_func_vprintf" != yes; then
echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
-echo "configure:3262: checking for _doprnt" >&5
+echo "configure:3265: checking for _doprnt" >&5
if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3267 "configure"
+#line 3270 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char _doprnt(); below. */
; return 0; }
EOF
-if { (eval echo configure:3293: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3296: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func__doprnt=yes"
else
for ac_func in memmem snprintf vsnprintf gettext isinf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3320: checking for $ac_func" >&5
+echo "configure:3323: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3325 "configure"
+#line 3328 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:3351: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3354: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3391: checking for $ac_word" >&5
+echo "configure:3394: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_MAKEINFO'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test "$MAKEINFO" != "error"; then
echo $ac_n "checking whether makeinfo can split html by @node""... $ac_c" 1>&6
-echo "configure:3423: checking whether makeinfo can split html by @node" >&5
+echo "configure:3426: checking whether makeinfo can split html by @node" >&5
mkdir -p out
makeinfo --html --output=out/split <<EOF
\input texinfo
# Extract the first word of "perl", so it can be a program name with args.
set dummy perl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3451: checking for $ac_word" >&5
+echo "configure:3454: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
-for ac_hdr in python2/Python.h python/Python.h python1.5/Python.h Python.h
+for ac_hdr in python2.0/Python.h python2/Python.h python/Python.h python1.5/Python.h Python.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3489: checking for $ac_hdr" >&5
+echo "configure:3492: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3494 "configure"
+#line 3497 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3499: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3502: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
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 ();
};
bool type_check_assignment (SCM val, SCM sym, SCM type_symbol) ;
SCM ly_number2string (SCM s);
-inline SCM
-ly_cdr (SCM x)
-{
- return SCM_CDR (x);
-}
-inline SCM
-ly_car (SCM x)
-{
- return SCM_CAR (x);
-}
-inline SCM
-ly_caar (SCM x)
-{
- return SCM_CAAR (x);
-}
-inline SCM
-ly_cdar (SCM x)
-{
- return SCM_CDAR (x);
-}
-inline SCM
-ly_cadr (SCM x)
-{
- return SCM_CADR (x);
-}
-inline SCM
-ly_cddr (SCM x)
-{
- return SCM_CDDR (x);
-}
-inline SCM
-ly_pair_p (SCM x)
-{
- return scm_pair_p (x);
-}
-inline bool
-ly_symbol_p (SCM x)
-{
- return SCM_SYMBOLP (x);
-}
-inline bool
-ly_number_p (SCM x)
-{
- return SCM_NUMBERP (x);
-}
-inline bool
-ly_procedure_p (SCM x)
-{
- return SCM_NFALSEP (scm_procedure_p(x));
-}
+SCM parse_symbol_list (char const *);
+
+inline SCM ly_cdr (SCM x) { return SCM_CDR (x); }
+inline SCM ly_car (SCM x) { return SCM_CAR (x); }
+inline SCM ly_caar (SCM x) { return SCM_CAAR (x); }
+inline SCM ly_cdar (SCM x) { return SCM_CDAR (x); }
+inline SCM ly_cadr (SCM x) { return SCM_CADR (x); }
+inline SCM ly_cddr (SCM x) { return SCM_CDDR (x); }
+inline SCM ly_caddr (SCM x) { return SCM_CADDR (x); }
+inline SCM ly_cdadr (SCM x) { return SCM_CDADR (x); }
+inline SCM ly_caadr (SCM x) { return SCM_CAADR (x); }
+inline bool ly_pair_p (SCM x) { return SCM_NFALSEP (scm_pair_p (x)); }
+inline bool ly_symbol_p (SCM x) { return SCM_SYMBOLP (x); }
+inline bool ly_number_p (SCM x) { return SCM_NUMBERP (x); }
+inline bool ly_procedure_p (SCM x) { return SCM_NFALSEP (scm_procedure_p(x)); }
/*
display and print newline.
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);
{
for (SCM k = a; gh_pair_p (k); k = ly_cdr (k))
{
- p->set_mus_property (gh_caar (k), gh_cdar (k));
+ p->set_mus_property (ly_caar (k), ly_cdar (k));
}
}
%token CONSISTS
%token DURATION
%token SEQUENTIAL
-%token ELEMENTDESCRIPTIONS
+%token GROBDESCRIPTIONS
%token SIMULTANEOUS
%token CONSISTSEND
%token DENIES
SCM tab = scm_make_vector (gh_int2scm (i), SCM_EOL);
for (SCM s = $1; gh_pair_p (s); s = ly_cdr (s)) {
- SCM pt = gh_cdar (s);
+ SCM pt = ly_cdar (s);
if (!unsmob_pitch (pt))
THIS->parser_error ("Need pitch object.");
else
- scm_hashq_set_x (tab, gh_caar (s), pt);
+ scm_hashq_set_x (tab, ly_caar (s), pt);
}
$$ = tab;
Translator_def*td = unsmob_translator_def ($$);
td->type_aliases_ = gh_cons ($3, td->type_aliases_);
}
- | translator_spec_body ELEMENTDESCRIPTIONS embedded_scm {
+ | translator_spec_body GROBDESCRIPTIONS embedded_scm {
+ Translator_def*td = unsmob_translator_def($$);
+ // td->add_property_assign (ly_symbol2scm ("allGrobDescriptions"), $3);
for (SCM p = $3; gh_pair_p (p); p = ly_cdr (p))
- unsmob_translator_def ($$)
- ->add_property_assign (scm_symbol_to_string (gh_caar (p)), gh_cdar (p));
-
+ td->add_property_assign (scm_symbol_to_string (ly_caar (p)), ly_cdar (p));
}
| translator_spec_body CONSISTSEND STRING {
unsmob_translator_def ($$)->add_last_element ( $3);
{
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 {
Begin3
Title: LilyPond
-Version: 1.5.12
-Entered-date: 23SEP01
+Version: 1.5.13
+Entered-date: 24SEP01
Description: @BLURB@
Keywords: music notation typesetting midi fonts engraving
Author: hanwen@cs.uu.nl (Han-Wen Nienhuys)
janneke@gnu.org (Jan Nieuwenhuizen)
Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
- 1000k lilypond-1.5.12.tar.gz
+ 1000k lilypond-1.5.13.tar.gz
Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 1000k lilypond-1.5.12.tar.gz
+ 1000k lilypond-1.5.13.tar.gz
Copying-policy: GPL
End
%define name lilypond
-%define version 1.5.12
+%define version 1.5.13
%define release 1mdk
Name: %{name}
%define info yes
Name: lilypond
-Version: 1.5.12
+Version: 1.5.13
Release: 1
License: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.12.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.13.tar.gz
Summary: Create and print music notation
URL: http://www.lilypond.org/
BuildRoot: /tmp/lilypond-install
Distribution: SuSE Linux 7.0 (i386)
Name: lilypond
-Version: 1.5.12
+Version: 1.5.13
Release: 2
Copyright: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.12.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.13.tar.gz
# music notation software for.. ?
Summary: A program for printing sheet music.
URL: http://www.lilypond.org/
/* 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
--- /dev/null
+# Danish translation of lilypond
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Keld Simonsen <keld@dkuug.dk>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lilypond 1.4.6\n"
+"POT-Creation-Date: 2001-06-14 13:22+0200\n"
+"PO-Revision-Date: 2001-09-22 21:00+0200\n"
+"Last-Translator: Keld Simonsen <keld@dkuug.dk>\n"
+"Language-Team: Danish <dansk@klid.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ly2dvi.py:105
+msgid "Generate .dvi with LaTeX for LilyPond"
+msgstr "Generér .dvi med LaTeX for LilyPond"
+
+#: data-file.cc:118 input.cc:85 ly2dvi.py:190 midi-parser.cc:100 mup2ly.py:93
+#: update-lily.py:118 warn.cc:23
+msgid "warning: "
+msgstr "advarsel: "
+
+#: input.cc:90 ly2dvi.py:205 ly2dvi.py:804 mup2ly.py:98 mup2ly.py:188
+#: update-lily.py:123 update-lily.py:211 warn.cc:9 warn.cc:17
+msgid "error: "
+msgstr "fejl: "
+
+#: ly2dvi.py:206 mup2ly.py:100 update-lily.py:125
+msgid "Exiting ... "
+msgstr "Afslutter... "
+
+#: ly2dvi.py:264 mup2ly.py:158 update-lily.py:183
+#, c-format
+msgid "Usage: %s [OPTION]... FILE"
+msgstr "Brug: %s [FLAG]... FIL"
+
+#: ly2dvi.py:268 main.cc:120 main.cc:148 mup2ly.py:162 update-lily.py:187
+msgid "Options:"
+msgstr "Flag:"
+
+#: ly2dvi.py:272 main.cc:124 main.cc:171 mup2ly.py:168 update-lily.py:191
+#, c-format
+msgid "Report bugs to %s"
+msgstr ""
+"Rapportér programfejl til %s\n"
+"Rapportér fejl i oversættelsen til <dansk@klid.dk>"
+
+#: ly2dvi.py:305 mup2ly.py:185 update-lily.py:208
+#, c-format
+msgid "Invoking `%s'"
+msgstr "Starter \"%s\""
+
+#: ly2dvi.py:309 mup2ly.py:188 update-lily.py:211
+#, c-format
+msgid "command exited with value %d"
+msgstr "kommandoen afsluttede med værdi %d"
+
+#: ly2dvi.py:311 mup2ly.py:190 update-lily.py:213
+msgid "(ignored)"
+msgstr "(ignoreret)"
+
+# hær er det spørg om rensning af en temporærkatalog
+#: ly2dvi.py:321
+#, c-format
+msgid "Cleaning %s..."
+msgstr "Renser %s..."
+
+#: ly2dvi.py:336 mup2ly.py:214 update-lily.py:237
+#, c-format
+msgid "no such setting: %s"
+msgstr "indstillingen findes ikke: %s"
+
+#: ly2dvi.py:349 main.cc:112
+msgid "write Makefile dependencies for every input file"
+msgstr "skriv Makefile-afhængigheder for hver inddatafil"
+
+# forklaring af flag -h
+#: ly2dvi.py:350 main.cc:96 main.cc:108 mup2ly.py:1117 update-lily.py:251
+msgid "this help"
+msgstr "denne hjælp"
+
+#: ly2dvi.py:351 main.cc:110 main.cc:115
+msgid "DIR"
+msgstr "KATALOG"
+
+#: ly2dvi.py:351
+msgid "add DIR to LilyPond's search path"
+msgstr "tilføj KATALOG til LilyPonds søgesti"
+
+# %s er programmets navn
+#: ly2dvi.py:352
+#, c-format
+msgid "keep all output, and name the directory %s.dir"
+msgstr "behold al uddata, og navngiv kataloget %s.dir"
+
+#: ly2dvi.py:353
+msgid "don't run LilyPond"
+msgstr "kør ikke LilyPond"
+
+#: ly2dvi.py:354 main.cc:113
+msgid "produce MIDI output only"
+msgstr "lav kun MIDI-uddata"
+
+#: ly2dvi.py:355 main.cc:99 main.cc:111 main.cc:114
+msgid "FILE"
+msgstr "FIL"
+
+#: ly2dvi.py:355
+msgid "write ouput to FILE"
+msgstr "skriv uddata til FIL"
+
+#: ly2dvi.py:357
+msgid "generate PostScript output"
+msgstr "lav PostScript-uddata"
+
+#: ly2dvi.py:358
+msgid "KEY=VAL"
+msgstr "NØGLE=VÆRDI"
+
+#: ly2dvi.py:358
+msgid "change global setting KEY to VAL"
+msgstr "ændr global indstilling NØGLE til VÆRDI"
+
+# Førklaring til --verbose (borde være længre)
+#: ly2dvi.py:359 main.cc:118 mup2ly.py:1120 update-lily.py:255
+msgid "verbose"
+msgstr "udførlig uddata"
+
+#: ly2dvi.py:360 main.cc:105 main.cc:117 mup2ly.py:1121 update-lily.py:256
+msgid "print version number"
+msgstr "vis versionsnummer"
+
+#: ly2dvi.py:361 main.cc:107 main.cc:119 mup2ly.py:1122 update-lily.py:258
+msgid "show warranty and copyright"
+msgstr "vis garanti og copyright"
+
+#: ly2dvi.py:383 ly2dvi.py:578 ly2dvi.py:603
+#, c-format
+msgid "Running %s..."
+msgstr "Kør %s..."
+
+#: ly2dvi.py:396
+#, c-format
+msgid "Analyzing %s..."
+msgstr "Analyserer %s..."
+
+#: ly2dvi.py:452
+#, c-format
+msgid "no lilypond output found for %s"
+msgstr "ingen lilyponduddata fundet for %s"
+
+#: ly2dvi.py:494
+#, c-format
+msgid "invalid value: %s"
+msgstr "ugyldigt værdi: %s"
+
+# hær er det spørg om skrivning til en fil
+#: ly2dvi.py:781 scores.cc:44
+#, c-format
+msgid "dependencies output to `%s'..."
+msgstr "afhængigheder udskrevet til \"%s\"..."
+
+# hær er det spørg om skrivning til en fil (første parametern er t.ex
+# DVI, LATEX, MIDI, TEX)
+#: ly2dvi.py:791
+#, c-format
+msgid "%s output to `%s'..."
+msgstr "%s udskrevet til \"%s\"..."
+
+#: includable-lexer.cc:49 lily-guile.cc:139 ly2dvi.py:793
+#: midi-score-parser.cc:24 scores.cc:136 scores.cc:142
+#, c-format
+msgid "can't find file: `%s'"
+msgstr "kan ikke finde fil: \"%s\""
+
+#: ly2dvi.py:804
+msgid "no files specified on command line."
+msgstr "ingen filer angivne på kommandolinjen."
+
+#: mup2ly.py:51
+msgid "Convert mup to ly"
+msgstr "Konvertér mup til ly"
+
+# %s er progravnavnet (mup2ly)
+#: mup2ly.py:166
+#, c-format
+msgid "%s is far from completed. Not all constructs are recognised."
+msgstr "%s er langt fra færdig, og kan ikke genkende alle konstruktioner."
+
+#: mup2ly.py:964
+#, c-format
+msgid "no such context: %s"
+msgstr "omgivelse findes ikke: %s"
+
+#: mup2ly.py:1115
+msgid "debug"
+msgstr "fejlsøgningsuddata"
+
+#: mup2ly.py:1116
+msgid "define macro NAME [optional expansion EXP]"
+msgstr "definér makro NAVN [valfri makroudvidelse EXP]"
+
+#: main.cc:114 mup2ly.py:1118
+msgid "write output to FILE"
+msgstr "skriv uddata til FIL"
+
+#: mup2ly.py:1119
+msgid "only pre-process"
+msgstr "kun forbehandling"
+
+#: mup2ly.py:1200
+#, c-format
+msgid "Processing `%s'..."
+msgstr "Behandler \"%s\"..."
+
+#: mup2ly.py:1219
+#, c-format
+msgid "Writing `%s'..."
+msgstr "Skriver \"%s\"..."
+
+#: update-lily.py:51
+msgid "Fetch and rebuild from latest source package"
+msgstr "Hent og byg om fra seneste kildekodepakke"
+
+#: update-lily.py:223
+#, c-format
+msgid "Cleaning `%s'..."
+msgstr "Renser \"%s\"..."
+
+#: update-lily.py:243
+#, c-format
+msgid "unpack and build in DIR [%s]"
+msgstr "udpak og byg i DIR [%s]"
+
+#: update-lily.py:244
+msgid "execute COMMAND, subtitute:"
+msgstr "kør COMMAND, erstat:"
+
+#: update-lily.py:245
+msgid "%b: build root"
+msgstr "%b: rod for opbygning"
+
+#: update-lily.py:246
+#, c-format
+msgid "%n: package name"
+msgstr "%n: pakkenavn"
+
+#: update-lily.py:247
+msgid "%r: release directory"
+msgstr "%r: katalog for programudgivelse"
+
+#: update-lily.py:248
+msgid "%t: tarball"
+msgstr "%t: tarball"
+
+#: update-lily.py:249
+msgid "%v: package version"
+msgstr "%v: pakkeversion"
+
+#: update-lily.py:252
+#, c-format
+msgid "keep all output, and name the directory %s"
+msgstr "behold al uddata, og døb kataloget til %s"
+
+#: update-lily.py:253
+msgid "upon failure notify EMAIL[,EMAIL]"
+msgstr "ved fejl, underret EMAIL[,EMAIL]"
+
+#: update-lily.py:254
+msgid "remove previous build"
+msgstr "fjern foregående bygning"
+
+#: update-lily.py:257
+#, c-format
+msgid "fetch and build URL [%s]"
+msgstr "hent og byg URL [%s]"
+
+#: update-lily.py:365
+#, c-format
+msgid "Listing `%s'..."
+msgstr "Lister \"%s\"..."
+
+#: update-lily.py:426
+#, c-format
+msgid "latest is: %s"
+msgstr "seneste er: %s"
+
+#: update-lily.py:427
+#, c-format
+msgid "relax, %s is up to date"
+msgstr "slap af, %s er seneste version"
+
+#: update-lily.py:435 update-lily.py:448
+#, c-format
+msgid "Fetching `%s'..."
+msgstr "Henter \"%s\"..."
+
+#: update-lily.py:457
+#, c-format
+msgid "Building `%s'..."
+msgstr "Bygger \"%s\"..."
+
+#: data-file.cc:54
+msgid "EOF in a string"
+msgstr "EOF i en streng"
+
+#: getopt-long.cc:145
+#, c-format
+msgid "option `%s' requires an argument"
+msgstr "flag \"%s\" kræver et argument"
+
+#: getopt-long.cc:149
+#, c-format
+msgid "option `%s' doesn't allow an argument"
+msgstr "flag.gan \"%s\" tillader intet argument"
+
+#: getopt-long.cc:153
+#, c-format
+msgid "unrecognized option: `%s'"
+msgstr "ukendt flag: \"%s\""
+
+#: getopt-long.cc:160
+#, c-format
+msgid "invalid argument `%s' to option `%s'"
+msgstr "ugyldigt argument \"%s\" til flag \"%s\""
+
+#: input.cc:96
+msgid "non fatal error: "
+msgstr "ikke-fatal fejl: "
+
+#: input.cc:104 source-file.cc:63 source-file.cc:156
+msgid "position unknown"
+msgstr "ukendt position"
+
+# det handlar om mmap hær
+#: mapped-file-storage.cc:74
+msgid "can't map file"
+msgstr "kan ikke lave \"mmap\" på filen"
+
+#: lilypond-stream.cc:111 mapped-file-storage.cc:87 paper-stream.cc:45
+#: scores.cc:48 simple-file-storage.cc:44 text-stream.cc:23
+#, c-format
+msgid "can't open file: `%s'"
+msgstr "kan ikke åbne fil: \"%s\""
+
+#: simple-file-storage.cc:56
+#, c-format
+msgid "Huh? Got %d, expected %d characters"
+msgstr "Øh? Fik %d, forventede %d tegn"
+
+#: text-stream.cc:10
+msgid "<stdin>"
+msgstr "<stdin>"
+
+#: warn.cc:36
+msgid "programming error: "
+msgstr "programmeringsfejl: "
+
+#: warn.cc:36
+msgid " (Continuing; cross thumbs)"
+msgstr " (Fortsætter, kryds fingrene)"
+
+#: afm.cc:59
+#, c-format
+msgid "can't find character number: %d"
+msgstr "kan ikke finde tegnnummer: %d"
+
+#: afm.cc:74
+#, c-format
+msgid "can't find character called: `%s'"
+msgstr "kan ikke finde tegn som hedder: \"%s\""
+
+#: afm.cc:124
+#, c-format
+msgid "Error parsing AFM file: `%s'"
+msgstr "Fejl ved tolkning af AFM-fil: \"%s\""
+
+#: all-font-metrics.cc:95
+#, c-format
+msgid "checksum mismatch for font file: `%s'"
+msgstr "fejlagtig checksum for skrifttypefil: \"%s\""
+
+#: all-font-metrics.cc:97
+#, c-format
+msgid "does not match: `%s'"
+msgstr "matcher ikke: \"%s\""
+
+#: all-font-metrics.cc:102
+msgid " Rebuild all .afm files, and remove all .pk and .tfm files. Rerun with -V to show font paths."
+msgstr " Genopbyg alle .afm-filer, og fjern alle .pk- og .tfm-filer. Kør igen med -V for at vise skrifttypesøgestier."
+
+#: all-font-metrics.cc:167
+#, c-format
+msgid "can't find font: `%s'"
+msgstr "kan ikke finde skrifttype: \"%s\""
+
+#: all-font-metrics.cc:168
+msgid "Loading default font"
+msgstr "Indlæser standardskrifttype"
+
+#: all-font-metrics.cc:183
+#, c-format
+msgid "can't find default font: `%s'"
+msgstr "kan ikke finde standardskrifttype: \"%s\""
+
+#: all-font-metrics.cc:184 includable-lexer.cc:51 scores.cc:137
+#, c-format
+msgid "(search path: `%s')"
+msgstr "(søgesti: \"%s\")"
+
+#: all-font-metrics.cc:185
+msgid "Giving up"
+msgstr "Giver op"
+
+#: auto-change-iterator.cc:43 change-iterator.cc:59
+#: part-combine-music-iterator.cc:97
+msgid "Can't switch translators, I'm there already"
+msgstr "Kan ikke skifte oversætter, jeg er her allerede"
+
+#: beam.cc:86
+msgid "beam has less than two stems"
+msgstr "bjælke har mindre end to nodehalse"
+
+#: beam.cc:637
+msgid "weird beam vertical offset"
+msgstr "underligt lodret afstand for bjælke"
+
+#: beam-engraver.cc:91 beam-engraver.cc:124
+msgid "can't find start of beam"
+msgstr "kan ikke finde start på bjælke"
+
+#: beam-engraver.cc:158
+msgid "already have a beam"
+msgstr "har allerede en bjælke"
+
+#: beam-engraver.cc:222
+msgid "unterminated beam"
+msgstr "uafsluttet bjælke"
+
+#: beam-engraver.cc:260 chord-tremolo-engraver.cc:195
+msgid "stem must have Rhythmic structure"
+msgstr "nodehals skal have en rytmisk struktur"
+
+#: beam-engraver.cc:272
+msgid "stem doesn't fit in beam"
+msgstr "nodehalsen passer ikke i bjælke"
+
+#: beam-engraver.cc:273
+msgid "beam was started here"
+msgstr "bjælken startede her"
+
+#: break-align-item.cc:136
+#, c-format
+msgid "unknown spacing pair `%s', `%s'"
+msgstr "ukendt afstandspar \"%s\", \"%s\""
+
+#: change-iterator.cc:21
+#, c-format
+msgid "can't change `%s' to `%s'"
+msgstr "kan ikke ændre \"%s\" til \"%s\""
+
+#.
+#. We could change the current translator's id, but that would make
+#. errors hard to catch
+#.
+#. last->translator_id_str_ = change_l ()->change_to_id_str_;
+#.
+#: change-iterator.cc:78
+msgid "I'm one myself"
+msgstr "Jeg er selv én"
+
+#: change-iterator.cc:81
+msgid "none of these in my family"
+msgstr "ingen af disse i min familie"
+
+#: chord.cc:369
+#, c-format
+msgid "invalid subtraction: not part of chord: %s"
+msgstr "ugyldig subtraktion: ikke del af akkord: %s"
+
+# "pitch" hær skal alltså være en ton i et akkord
+#: chord.cc:398
+#, c-format
+msgid "invalid inversion pitch: not part of chord: %s"
+msgstr "ugyldig tone for inversion: ikke del af en akkord: %s"
+
+#: chord-tremolo-engraver.cc:141 percent-repeat-engraver.cc:192
+msgid "unterminated chord tremolo"
+msgstr "ikke-afsluttet akkordtremolo"
+
+#: chord-tremolo-iterator.cc:48
+msgid "no one to print a tremolos"
+msgstr "der er ingen som kan skrive en tremolo"
+
+#: collision.cc:127
+msgid "Too many clashing notecolumns. Ignoring them."
+msgstr "For mange sammenhængende nodekolonner. Ignorerer dem."
+
+#: dimensions.cc:13
+msgid "NaN"
+msgstr "-"
+
+#: dynamic-engraver.cc:197 span-dynamic-performer.cc:86
+msgid "can't find start of (de)crescendo"
+msgstr "kan ikke finde starten på crescendo/diminuendo"
+
+#: dynamic-engraver.cc:222
+msgid "already have a crescendo"
+msgstr "har allerede et crescendo"
+
+#: dynamic-engraver.cc:223
+msgid "already have a decrescendo"
+msgstr "har allerede et diminuendo"
+
+#: dynamic-engraver.cc:317
+msgid "unterminated (de)crescendo"
+msgstr "uafsluttet crescendo/diminuendo"
+
+#: extender-engraver.cc:97
+msgid "unterminated extender"
+msgstr "uafsluttet udvider"
+
+#: extender-engraver.cc:109
+msgid "Nothing to connect extender to on the left. Ignoring extender request."
+msgstr "Der er ingenting at forbinde udvideren mod til venstre. Ignorerer ønsket om udvider"
+
+#: folded-repeat-iterator.cc:78
+msgid "no one to print a repeat brace"
+msgstr "det er ingen som kan skrive et gentagelsestegn"
+
+#: font-interface.cc:237
+msgid "couldn't find any font satisfying "
+msgstr "kunne ikke finde nogen skrifttype som opfylder "
+
+#: gourlay-breaking.cc:157
+msgid "No feasible line breaking found"
+msgstr "Ingen mulig linjebrydning fandtes"
+
+#: grace-iterator.cc:43
+msgid "no Grace context available"
+msgstr "ingen prydomgivelse tilgængelig"
+
+#: grace-position-engraver.cc:96
+msgid "Unattached grace notes. Attaching to last musical column."
+msgstr "Ikke-fæstede prydsnoder. Fæster ved sidste musikkolonne."
+
+#: hairpin.cc:93
+msgid "decrescendo too small"
+msgstr "diminuendo for lille"
+
+#: hairpin.cc:94
+msgid "crescendo too small"
+msgstr "crescendo for lille"
+
+#: hyphen-engraver.cc:90
+msgid "unterminated hyphen"
+msgstr "uafsluttet bindestreg"
+
+#: hyphen-engraver.cc:102
+msgid "Nothing to connect hyphen to on the left. Ignoring hyphen request."
+msgstr "Det er ingenting at forbinde bindestregen mod til venstre. Ignorerer bindestregsforespørgslen."
+
+#: key-engraver.cc:99
+msgid "Conflicting key signatures found."
+msgstr "Konfliktende tonartssignaturer fundet."
+
+#: key-engraver.cc:100
+msgid "This was the other key definition."
+msgstr "Dette var den anden tonartsdefinition."
+
+#: key-performer.cc:77
+msgid "FIXME: key change merge"
+msgstr "FIX: tonartsskiftsfletning"
+
+#: lily-guile.cc:141
+#, c-format
+msgid "(load path: `%s')"
+msgstr "(indlæsningssøgesti: \"%s\""
+
+#: line-of-score.cc:96
+#, c-format
+msgid "Element count %d."
+msgstr "Elementantal %d."
+
+#: line-of-score.cc:253 paper-score.cc:77
+#, c-format
+msgid "Element count %d "
+msgstr "Elementantal %d "
+
+#: line-of-score.cc:267
+msgid "Calculating column positions..."
+msgstr "Beregner kolonnepositioner..."
+
+#: lyric-phrasing-engraver.cc:284
+msgid "lyrics found without any matching notehead"
+msgstr "tekst fundet uden noget matchende nodehoved"
+
+#: lyric-phrasing-engraver.cc:289
+msgid "Huh? Melismatic note found to have associated lyrics."
+msgstr "Øh? Melismatisk node har tilhørende tekst."
+
+#: main.cc:104
+msgid "EXPR"
+msgstr "UDTR"
+
+#: main.cc:104
+msgid "evalute EXPR as Scheme after .scm init is read"
+msgstr "evaluér UDTR som Scheme efter .scm-init er læst"
+
+#. another bug in option parser: --output=foe is taken as an abbreviation
+#. for --output-format
+#: main.cc:107
+msgid "EXT"
+msgstr "FMT"
+
+#: main.cc:107
+msgid "use output format EXT (scm, ps, tex or as)"
+msgstr "brug uddataformat FMT (scm, ps, tex eller as)"
+
+#: main.cc:109
+msgid "FIELD"
+msgstr "FELT"
+
+#: main.cc:109
+msgid "write header field to BASENAME.FIELD"
+msgstr "skriv rubrikfælt til BASNAVN.FELT"
+
+#: main.cc:110
+msgid "add DIR to search path"
+msgstr "tilføj KATALOG til søgestien"
+
+#: main.cc:111
+msgid "use FILE as init file"
+msgstr "brug FIL som init-fil"
+
+#: main.cc:115
+msgid "prepend DIR to dependencies"
+msgstr "tilføj KATALOG efter afhængigheder"
+
+#: main.cc:116
+msgid "inhibit file output naming and exporting"
+msgstr "hindr navngivning af filuddata og eksportering"
+
+#.
+#. No version number or newline here. It confuses help2man
+#.
+#: main.cc:136
+#, c-format
+msgid "Usage: %s [OPTION]... FILE..."
+msgstr "Brug: %s [FLAG]... FIL..."
+
+#: main.cc:138
+msgid "Typeset music and or play MIDI from FILE"
+msgstr "Typesæt musik og/eller afspil MIDI fra FIL"
+
+#: main.cc:142
+msgid ""
+"LilyPond is a music typesetter. It produces beautiful sheet music\n"
+"using a high level description file as input. LilyPond is part of \n"
+"the GNU Project.\n"
+msgstr ""
+"LilyPond er en musiktypesætter. Den producerer smukke noder fra en\n"
+"højniveaubeskrivning af musikken i en fil. LilyPond er en del af\n"
+"GNU-projektet.\n"
+
+#: main.cc:152
+msgid "This binary was compiled with the following options:"
+msgstr "Dette program blev oversat med følgende flag:"
+
+#: main.cc:56 main.cc:179
+#, c-format
+msgid ""
+"This is free software. It is covered by the GNU General Public License,\n"
+"and you are welcome to change it and/or distribute copies of it under\n"
+"certain conditions. Invoke as `%s --warranty' for more information.\n"
+msgstr ""
+"Dette er frit programmel. Det dækkes af \"GNU General Public License\",\n"
+"og du må ændre og/eller distribuere kopier af det under visse\n"
+"betingelser. Kør \"%s --warranty\" for mere information.\n"
+
+#: main.cc:63 main.cc:186 main.cc:198
+#, c-format
+msgid "Copyright (c) %s by"
+msgstr "Copyright © %s af"
+
+#: main.cc:196
+msgid "GNU LilyPond -- The music typesetter"
+msgstr "GNU Lilypond -- Musiktypesætteren"
+
+#: main.cc:72 main.cc:204
+msgid ""
+" This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License version 2\n"
+"as published by the Free Software Foundation.\n"
+"\n"
+" This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
+"General Public License for more details.\n"
+"\n"
+" You should have received a copy (refer to the file COPYING) of the\n"
+"GNU General Public License along with this program; if not, write to\n"
+"the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,\n"
+"USA.\n"
+msgstr ""
+"Dette program er frit programmel. Du kan distribuere det og/eller\n"
+"ændre det under betingelserne i GNU General Public License version 2,\n"
+"udgivet af Free Software Foundation.\n"
+"\n"
+"Dette program distribueres i håb om at det vil være nyttigt, men\n"
+"UDEN NOGEN SOM HELST GARANTI, endog uden underforstået garanti om\n"
+"SALGBARHED eller EGNETHED FOR NOGET SPECIELT FORMÃ…L. Se GNU General\n"
+"Public License for yderligere information.\n"
+"\n"
+"Du bør have fået en kopi af GNU General Public License sammen med\n"
+"dette program. Hvis ikke, skriv til Free Software Foundation, Inc., 59\n"
+"Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n"
+
+#: midi-item.cc:139
+#, c-format
+msgid "no such instrument: `%s'"
+msgstr "instrumentet findes ikke: \"%s\""
+
+#: midi-item.cc:228
+msgid "silly duration"
+msgstr "tåbelig længde"
+
+#: midi-item.cc:241
+msgid "silly pitch"
+msgstr "tåbelig tone"
+
+#: musical-request.cc:28
+#, c-format
+msgid "Transposition by %s makes accidental larger than two"
+msgstr "Transponering med %s gør accicental større end to"
+
+#: music.cc:232
+msgid "ly_get_mus_property (): Not a Music"
+msgstr "ly_get_mus_property (): Ikke en \"Music\""
+
+#: music.cc:246
+msgid "ly_set_mus_property (): Not a symbol"
+msgstr "ly_set_mus_property (): ikke et symbol"
+
+#: music.cc:258
+msgid "ly_set_mus_property (): not of type Music"
+msgstr "ly_set_mus_property (): ikke af typen \"Music\""
+
+#: music.cc:272
+msgid "ly_make_music (): Not a string"
+msgstr "ly_make_music (): Ikke en streng"
+
+#: music.cc:292
+msgid "ly_music_name (): Not a music expression"
+msgstr "ly_music_name (): Ikke et musikudtryk"
+
+#: music-output-def.cc:115
+#, c-format
+msgid "can't find `%s' context"
+msgstr "kan ikke finde omgivelsen \"%s\""
+
+#: my-lily-lexer.cc:139
+#, c-format
+msgid "Identifier name is a keyword: `%s'"
+msgstr "Identificerernavn er et nøgleord: \"%s\""
+
+#: my-lily-lexer.cc:159
+#, c-format
+msgid "error at EOF: %s"
+msgstr "fejl ved filslutning: %s"
+
+#: midi-score-parser.cc:94 my-lily-parser.cc:47
+msgid "Parsing..."
+msgstr "Tolker..."
+
+#: my-lily-parser.cc:57
+msgid "Braces don't match"
+msgstr "Krølleparenteser passer ikke"
+
+#: output-property-music-iterator.cc:20 request-chord-iterator.cc:76
+#, c-format
+msgid "Junking request: `%s'"
+msgstr "Stryger forespørgslen: \"%s\""
+
+#: paper-def.cc:109
+#, c-format
+msgid "paper output to `%s'..."
+msgstr "papirsuddata til \"%s\"..."
+
+#: lilypond-stream.cc:93 paper-outputter.cc:85 performance.cc:99
+msgid ", at "
+msgstr ", ved "
+
+#: paper-outputter.cc:232
+#, c-format
+msgid "writing header field `%s' to `%s'..."
+msgstr "skriver rubrikfelt \"%s\" til \"%s\"..."
+
+#: paper-score.cc:80
+msgid "Preprocessing elements..."
+msgstr "Forbehandler element..."
+
+#: paper-score.cc:114
+msgid "Outputting Score, defined at: "
+msgstr "Udskriver partitur, defineret ved: "
+
+#: paper-stream.cc:41
+#, c-format
+msgid "can't create directory: `%s'"
+msgstr "kan ikke oprette katalog: \"%s\""
+
+#: paper-stream.cc:55
+msgid "Error syncing file (disk full?)"
+msgstr "Fejl ved synkning af fil (disken fuld?)"
+
+#.
+#. We could change the current translator's id, but that would make
+#. errors hard to catch
+#.
+#. last->translator_id_str_ = change_l ()->change_to_id_str_;
+#.
+#: part-combine-music-iterator.cc:116
+#, c-format
+msgid "I'm one myself: `%s'"
+msgstr "Jag er selv én: \"%s\""
+
+#: part-combine-music-iterator.cc:119
+#, c-format
+msgid "none of these in my family: `%s'"
+msgstr "ingen af disse i min familie: \"%s\""
+
+#: percent-repeat-engraver.cc:117
+msgid "Don't know how to handle a percent repeat of this length."
+msgstr "Véd ikke hvordan en procentgentagelse af denne længde skal håndteres."
+
+#: percent-repeat-iterator.cc:53
+msgid "no one to print a percent"
+msgstr "der er ingen som kan skrive en procent"
+
+#: performance.cc:51
+msgid "Track ... "
+msgstr "Spor... "
+
+#: performance.cc:83
+msgid "Creator: "
+msgstr "Skaber: "
+
+#: performance.cc:113
+#, c-format
+msgid "from musical definition: %s"
+msgstr "fra musikdefinition: %s"
+
+#: performance.cc:168
+#, c-format
+msgid "MIDI output to `%s'..."
+msgstr "MIDI-uddata til \"%s\"..."
+
+#: phrasing-slur-engraver.cc:119
+msgid "unterminated phrasing slur"
+msgstr "uafsluttet fraseringsbue"
+
+#: phrasing-slur-engraver.cc:134
+msgid "can't find start of phrasing slur"
+msgstr "kan ikke finde start på fraseringsbue"
+
+#: piano-pedal-engraver.cc:142 piano-pedal-engraver.cc:154
+#: piano-pedal-performer.cc:87
+#, c-format
+msgid "can't find start of piano pedal: `%s'"
+msgstr "kan ikke finde start på pianopedal: \"%s\""
+
+#: pitch.cc:25
+msgid "Pitch arguments out of range"
+msgstr "Toneargument udenfor intervallet"
+
+#: property-engraver.cc:121
+#, c-format
+msgid ""
+"`%s' is deprecated. Use\n"
+" \\property %s.%s \\override #'%s = #%s"
+msgstr ""
+"\"%s\" er forældet. Brug\n"
+" \\property %s.%s \\override #'%s = #%s"
+
+#: property-engraver.cc:145
+#, c-format
+msgid "Wrong type for property: %s, type: %s, value found: %s, type: %s"
+msgstr "Forkert type for egenskab: %s, type: %s, værdi fundet: %s, type: %s"
+
+#: rest-collision.cc:194
+msgid "too many colliding rests"
+msgstr "for mange kolliderende pauser"
+
+#: rest-collision.cc:198
+msgid "too many notes for rest collision"
+msgstr "for mange noder for pausesammenstød"
+
+#: scm-option.cc:59
+msgid "Scheme options:"
+msgstr "Scheme-flag:"
+
+#: score.cc:78
+msgid "Interpreting music..."
+msgstr "Tolker musik..."
+
+#: score.cc:92
+msgid "Need music in a score"
+msgstr "Behøver musik i partitur"
+
+#. should we? hampers debugging.
+#: score.cc:105
+msgid "Errors found/*, not processing score*/"
+msgstr "Fejl fundne/*, behandler ikke partitur*/"
+
+#: score.cc:112
+#, c-format
+msgid "elapsed time: %.2f seconds"
+msgstr "tidsforbrug: %.2f sekunder"
+
+#: score-engraver.cc:188
+#, c-format
+msgid "unbound spanner `%s'"
+msgstr "ubunden bro \"%s\""
+
+#: scores.cc:106
+msgid "Score contains errors; will not process it"
+msgstr "Partitur indholder fejl; vil ikke behandle det"
+
+#: scores.cc:152
+#, c-format
+msgid "Now processing: `%s'"
+msgstr "Behandler nu: \"%s\""
+
+#: script-engraver.cc:66
+#, c-format
+msgid "Don't know how to interpret articulation `%s'"
+msgstr "Kan ikke tolke artikulering \"%s\""
+
+#. this shouldn't happen, but let's continue anyway.
+#: separation-item.cc:47
+msgid "Separation_item: I've been drinking too much"
+msgstr "Separation_item: Jeg har drukket for meget"
+
+#: slur.cc:48
+msgid "Putting slur over rest. Ignoring."
+msgstr "Sætter bue over pause. Ignorerer."
+
+#: slur.cc:383
+msgid "Slur over rest?"
+msgstr "Bue over pause?"
+
+#: slur-engraver.cc:127
+msgid "unterminated slur"
+msgstr "uafsluttet bue"
+
+#. How to shut up this warning, when Voice_devnull_engraver has
+#. eaten start request?
+#: slur-engraver.cc:144
+msgid "can't find start of slur"
+msgstr "kan ikke finde start på bue"
+
+#: stem.cc:116
+msgid "Weird stem size; check for narrow beams"
+msgstr "Mærkelig nodehalsstørrelse; tjek for smalle bjælker"
+
+#: stem-engraver.cc:115
+#, c-format
+msgid "Adding note head to incompatible stem (type = %d)"
+msgstr "Tilføjer nodehoved til inkompatibel bue (type = %d)"
+
+#: text-spanner.cc:121
+msgid "Text_spanner too small"
+msgstr "Tekst_bro for lille"
+
+#: text-spanner-engraver.cc:94
+msgid "can't find start of text spanner"
+msgstr "kan ikke finde start på tekstbro"
+
+#: text-spanner-engraver.cc:114
+msgid "already have a text spanner"
+msgstr "har allerede en tekstbro"
+
+#: text-spanner-engraver.cc:169
+msgid "unterminated text spanner"
+msgstr "uafsluttet tekstbro"
+
+#: tfm.cc:77
+#, c-format
+msgid "can't find ascii character: %d"
+msgstr "kan ikke finde ASCII-tegn: %d"
+
+#: tfm-reader.cc:106
+#, c-format
+msgid "TFM header of `%s' has only %u word (s)"
+msgstr "TFM-rubrik i \"%s\" har kun %u ord"
+
+#: tfm-reader.cc:140
+#, c-format
+msgid "%s: TFM file has %u parameters, which is more than the %u I can handle"
+msgstr "%s: TFM-fil har %u parametre, hvilket er mere end de %u jeg kan håndtere"
+
+#. How to shut up this warning, when no notes appeared because
+#. they were suicided by Thread_devnull_engraver?
+#: tie-engraver.cc:220 tie-performer.cc:173
+msgid "No ties were created!"
+msgstr "Ingen buer blev lavet!"
+
+#: tie-engraver.cc:240
+msgid "lonely tie"
+msgstr "ensom bue"
+
+#: time-scaled-music-iterator.cc:25
+msgid "no one to print a tuplet start bracket"
+msgstr "der findes ingen som kan skrive en startparentes for tuppel"
+
+#: timing-translator.cc:38
+#, c-format
+msgid "barcheck failed at: %s"
+msgstr "taktkontrol mislykkedes ved: %s"
+
+#: translator-ctors.cc:40
+#, c-format
+msgid "unknown translator: `%s'"
+msgstr "ukendt oversætter: \"%s\""
+
+#: translator-def.cc:99
+msgid "Program has no such type"
+msgstr "Programmet har ingen sådan type"
+
+#: translator-def.cc:105
+#, c-format
+msgid "Already contains: `%s'"
+msgstr "Indholder allerede: \"%s\""
+
+#: translator-def.cc:106
+#, c-format
+msgid "Not adding translator: `%s'"
+msgstr "Tilføjer ikke oversætter: \"%s\""
+
+#: translator-def.cc:224
+#, c-format
+msgid "can't find: `%s'"
+msgstr "kan ikke finde: \"%s\""
+
+#: translator-group.cc:146
+#, c-format
+msgid "can't find or create `%s' called `%s'"
+msgstr "kan ikke finde eller oprette \"%s\" kaldet \"%s\""
+
+#: translator-group.cc:231
+#, c-format
+msgid "can't find or create: `%s'"
+msgstr "kan ikke finde eller oprette: \"%s\""
+
+#: translator-group.cc:414
+#, c-format
+msgid "Can't find property type-check for `%s'. Perhaps you made a typing error? Doing assignment anyway."
+msgstr "Kan ikke finde egenskabstypekontrol for \"%s\". MÃ¥ske har du lavet en tastefejl? Laver tildeling alligevel."
+
+#: translator-group.cc:428
+#, c-format
+msgid "Type check for `%s' failed; value `%s' must be of type `%s'"
+msgstr "Typekontrol for \"%s\" mislykkedes; værdi \"%s\" skal have typen \"%s\""
+
+#. programming_error?
+#: translator-group.cc:447
+msgid "ly-get-trans-property: expecting a Translator_group argument"
+msgstr "ly-get-trans-property: forventede et Translator_group-argument"
+
+#: volta-engraver.cc:87
+msgid "No volta spanner to end"
+msgstr "Ingen reprisebro til slut"
+
+#: volta-engraver.cc:104
+msgid "Already have a volta spanner. Stopping that one prematurely."
+msgstr "Har allerede en reprisebro. Stopper denne for tidligt."
+
+#: volta-engraver.cc:108
+msgid "Also have a stopped spanner. Giving up."
+msgstr "Har også en stoppet bro. Giver op."
+
+#: parser.yy:121
+#, c-format
+msgid "Expecting %d arguments"
+msgstr "Forventer %d argumenter"
+
+#: parser.yy:423
+msgid "Identifier should have alphabetic characters only"
+msgstr "Identificerer må kun indeholde alfabetiske tegn"
+
+#: parser.yy:697
+msgid "More alternatives than repeats. Junking excess alternatives."
+msgstr "Flere alternativer end repriser. Stryger tiloversblevne alternativer."
+
+#: parser.yy:761
+msgid "Second argument must be a symbol"
+msgstr "Andet argument skal være et symbol"
+
+#: parser.yy:766
+msgid "First argument must be a procedure taking 1 argument"
+msgstr "Første argument skal være en procedure som tager 1 argument"
+
+#: parser.yy:1263
+msgid "Expecting string as script definition"
+msgstr "Forventer streng som skriptdefinition"
+
+#: parser.yy:1273
+msgid "Can't specify direction for this request"
+msgstr "Kan ikke angive retning for denne forespørgsel"
+
+#: parser.yy:1398
+msgid "Expecting musical-pitch value"
+msgstr "Forventer nodeværdi"
+
+#: parser.yy:1409
+msgid "Must have duration object"
+msgstr "Skal have tidslængdeobjekt"
+
+#: parser.yy:1418 parser.yy:1426
+msgid "Have to be in Lyric mode for lyrics"
+msgstr "Skal være i teksttilstand (Lyric mode) for tekst"
+
+#: parser.yy:1579 parser.yy:1636
+#, c-format
+msgid "not a duration: %d"
+msgstr "ikke en tidslængde: %d"
+
+#: parser.yy:1645
+msgid "Have to be in Note mode for notes"
+msgstr "Skal være i nodetilstand (Note mode) for noder"
+
+#: parser.yy:1731
+msgid "Have to be in Chord mode for chords"
+msgstr "Skal være i akkordtilstand (Chord mode) for akkord"
+
+#: parser.yy:1910
+msgid "need integer number arg"
+msgstr "behøver heltalsargument"
+
+#: lexer.ll:174
+msgid "EOF found inside a comment"
+msgstr "filslutning fundet inden i en kommentar"
+
+#: lexer.ll:188
+msgid "\\maininput disallowed outside init files"
+msgstr "\\maininput forbudt udenfor init-filer"
+
+#: lexer.ll:212
+#, c-format
+msgid "wrong or undefined identifier: `%s'"
+msgstr "fejlagtig eller udefineret identificerer: \"%s\""
+
+#. backup rule
+#: lexer.ll:221
+msgid "Missing end quote"
+msgstr "Mangler slutcitationstegn"
+
+#. backup rule
+#: lexer.ll:243 lexer.ll:247
+msgid "white expected"
+msgstr "forventede mellemrum"
+
+#: lexer.ll:256
+msgid "Can't evaluate Scheme in safe mode"
+msgstr "Kan ikke evaluere Scheme i sikker tilstand"
+
+#: lexer.ll:349
+msgid "Brace found at end of lyric. Did you forget a space?"
+msgstr "Krølleparentes fundet i slutning af tekst. Glemte du et mellemrum?"
+
+#: lexer.ll:457
+#, c-format
+msgid "invalid character: `%c'"
+msgstr "ugyldigt tegn: \"%c\""
+
+#: lexer.ll:538
+#, c-format
+msgid "unknown escaped string: `\\%s'"
+msgstr "ukendt \"escaped\" streng: \"\\%s\""
+
+#: lexer.ll:617
+#, c-format
+msgid "Oldest supported input version: %s"
+msgstr "Ældste inddataversion som understøttes: %s"
+
+#: lexer.ll:629
+#, c-format
+msgid "incorrect lilypond version: %s (%s, %s)"
+msgstr "fejlagtig lilypond-version: %s (%s, %s)"
+
+#: lexer.ll:630
+msgid "Consider converting the input with the convert-ly script"
+msgstr "Overvej at konvertere inddata med skriptet \"convert-ly\""
+
+#: lilypond-item.cc:161
+#, c-format
+msgid "#32 in quarter: %d"
+msgstr "#32 i fjerdedel: %d"
+
+#: lilypond-score.cc:108
+#, c-format
+msgid "LY output to `%s'..."
+msgstr "LY-uddata til \"%s\"..."
+
+#: lilypond-score.cc:119
+#, c-format
+msgid "track %d:"
+msgstr "spor %d:"
+
+#: lilypond-score.cc:155
+msgid "Processing..."
+msgstr "Behandler..."
+
+#: lilypond-score.cc:164
+msgid "Creating voices..."
+msgstr "Laver stemmer..."
+
+#: lilypond-score.cc:168
+msgid "track "
+msgstr "spor "
+
+#: lilypond-score.cc:177
+msgid "NOT Filtering tempo..."
+msgstr "Filtrerer IKKE tempo..."
+
+#: lilypond-score.cc:186
+msgid "NOT Quantifying columns..."
+msgstr "Kvantificerer IKKE kolonner..."
+
+#: lilypond-score.cc:190
+msgid "Quantifying columns..."
+msgstr "Kvantificerer kolonner..."
+
+#: lilypond-score.cc:223
+msgid "Settling columns..."
+msgstr "Bestemmer kolonner..."
+
+#: lilypond-staff.cc:209
+msgid "% MIDI copyright:"
+msgstr "% MIDI-copyright:"
+
+#: lilypond-staff.cc:210
+msgid "% MIDI instrument:"
+msgstr "% MIDI-instrument:"
+
+#: lilypond-stream.cc:37
+#, c-format
+msgid "lily indent level: %d"
+msgstr "indenteringsniveau for lily: %d"
+
+# Kanske man ikke skal oversætta, men når får de tage bort _() i stællet for
+# at skrive en fånig kommentar
+#. Maybe better not to translate these?
+#: lilypond-stream.cc:83
+msgid "% Creator: "
+msgstr "% Kreatør: "
+
+#: lilypond-stream.cc:88
+msgid "% Automatically generated"
+msgstr "% Automatgenereret"
+
+#: lilypond-stream.cc:97
+#, c-format
+msgid "% from input file: "
+msgstr "% fra inddatafil: "
+
+#: main.cc:94
+msgid "write exact durations, e.g.: a4*385/384"
+msgstr "skriv eksakte tidslængder, fx: a4*385/384"
+
+#: main.cc:95
+msgid "enable debugging output"
+msgstr "aktivér fejlsøgningsuddata"
+
+#: main.cc:97
+msgid "ACC[:MINOR]"
+msgstr "TONE[:MOL]"
+
+#: main.cc:97
+msgid "set key: ACC +sharps/-flads; :1 minor"
+msgstr "sæt tonart: TONE +forhøjelser/-sænkninger; :1 mol"
+
+#: main.cc:98
+msgid "don't output tuplets, double dots or rests, smallest is 32"
+msgstr "udskriv ikke tupler, dobbeltpunktninger eller pauser, mindste er 32"
+
+#: main.cc:99
+msgid "set FILE as default output"
+msgstr "sæt FIL som standarduddata"
+
+#: main.cc:100
+msgid "don't output tuplets"
+msgstr "udskriv ikke tupler"
+
+#: main.cc:101
+msgid "be quiet"
+msgstr "vær stille"
+
+#: main.cc:102
+msgid "don't output rests or skips"
+msgstr "udskriv ikke pauser eller hop"
+
+#: main.cc:103
+msgid "DUR"
+msgstr "LÆNGDE"
+
+#: main.cc:103
+msgid "set smallest duration"
+msgstr "indstil mindste længde"
+
+#: main.cc:104
+msgid "don't timestamp the output"
+msgstr "tidsstempl ikke uddata"
+
+#: main.cc:106
+msgid "be verbose"
+msgstr "vær udførlig"
+
+#: main.cc:108
+msgid "assume no double dotted notes"
+msgstr "antag ingen dobbeltpunktede noder"
+
+#: main.cc:115
+#, c-format
+msgid "Usage: %s [OPTION]... [FILE]"
+msgstr "Brug: %s [FLAG]... [FIL]"
+
+#: main.cc:117
+msgid "Translate MIDI-file to lilypond"
+msgstr "Oversæt MIDI-fil til lilypond"
+
+#: main.cc:131
+#, c-format
+msgid "no_double_dots: %d\n"
+msgstr "no_double_dots: %d\n"
+
+#: main.cc:133
+#, c-format
+msgid "no_rests: %d\n"
+msgstr "no_rests: %d\n"
+
+#: main.cc:135
+#, c-format
+msgid "no_quantify_b_s: %d\n"
+msgstr "no_quantify_b_s: %d\n"
+
+#: main.cc:137
+#, c-format
+msgid "no_smaller_than: %d (1/%d)\n"
+msgstr "no_smaller_than: %d (1/%d)\n"
+
+#: main.cc:140
+#, c-format
+msgid "no_tuplets: %d\n"
+msgstr "no_tuplets: %d\n"
+
+#: midi-parser.cc:64
+msgid "zero length string encountered"
+msgstr "streng med længde nul mødtes"
+
+#: midi-score-parser.cc:44
+msgid "MIDI header expected"
+msgstr "forventede MIDI-rubrik"
+
+#: midi-score-parser.cc:49
+msgid "invalid header length"
+msgstr "ugyldig rubriklængde"
+
+#: midi-score-parser.cc:52
+msgid "invalid MIDI format"
+msgstr "ugyldigt MIDI-format"
+
+#: midi-score-parser.cc:55
+msgid "invalid number of tracks"
+msgstr "ugyldigt antal spor"
+
+#: midi-score-parser.cc:58
+msgid "can't handle non-metrical time"
+msgstr "kan ikke håndtere ikke-metrisk tid"
+
+#: midi-track-parser.cc:68
+#, c-format
+msgid "Junking note-end event: channel = %d, pitch = %d"
+msgstr "Stryger nodeslutshændelse: kanal = %d, tone = %d"
+
+#: midi-track-parser.cc:124
+msgid "invalid running status"
+msgstr "ugyldig kørselstatus"
+
+#: midi-track-parser.cc:328
+msgid "unimplemented MIDI meta-event"
+msgstr "uimplementeret MIDI-metahændelse"
+
+#: midi-track-parser.cc:333
+msgid "invalid MIDI event"
+msgstr "ugyldig MIDI-hændelse"
+
+#: midi-track-parser.cc:348
+msgid "MIDI track expected"
+msgstr "forventede MIDI-spor"
+
+#: midi-track-parser.cc:353
+msgid "invalid track length"
+msgstr "ugyldig sporlængde"
((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
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: