+2002-03-02 Han-Wen <hanwen@cs.uu.nl>
+
+ * lily/lily-guile.cc: isdir_b and isaxis_b changed to ly_axis_p,
+ ly_dir_p
+
+ * lily/music.cc (ly_get_mus_property): typechecking
+ (ly_set_mus_property): idem
+ (ly_make_music): idem
+ (ly_music_name): idem
+
+ * lily/chord.cc: use scm_reverse_x iso. gh_reverse()
+
+ * lily/note-spacing.cc (stem_dir_correction): correction for
+ same stem notes as well.
+
+ * lily/pitch.cc (pitch_transpose): stricter typechecking
+
+ * mf/parmesan*mf: magnification fixes.
+
+ * Documentation/topdocs/INSTALL.texi: update RedHat reqs
+
+2002-03-01 Mats Bengtsson <mats.bengtsson@s3.kth.se>
+
+ * buildscripts/mf-to-table.py (postfixes): Output also .ly file
+ documenting the font. (Doesn't work for parmesan at the moment)
+
+ * Documentation/user/appendices.itely (The Feta font): Add list of
+ Feta font symbols with names.
+
+ * mf/GNUmakefile ($(outdir)/lilypond.map): Generate lilypond.map
+ automatically
+
+2002-03-01 Han-Wen <hanwen@cs.uu.nl>
+
+ * lily/translator-group.cc (ly_set_trans_property): typechecking
+ (ly_get_trans_property): typechecking.
+
+ * lily/font-metric.cc (ly_text_dimension): typechecking
+ (ly_find_glyph_by_name): idem.
+
+ * scm/bass-figure.scm (brew-complete-figure): support for
+ bracketed numbers.
+
+ * lily/grob.cc (ly_get_paper_var): new function
+
2002-02-28 Han-Wen Nienhuys <hanwen@cs.uu.nl>
* VERSION (PATCH_LEVEL): 1.5.35 released.
@lilypondfile[printfilename]{spacing-stem-direction.ly}
+@lilypondfile[printfilename]{spacing-stem-same-direction.ly}
+
@lilypondfile[printfilename]{spacing-individual-tuning.ly}
@lilypondfile[printfilename]{lyrics-bar.ly}
For compilation on a Red Hat system you need these packages, in addition
to the those needed for running: glibc-devel, gcc-c++, libstdc++-devel,
-guile-devel, flex, bison, texinfo, tetex-devel, groff,
-libgr-progs.
+guile-devel, flex, bison, texinfo, groff.
+
@subsection LinuxPPC
* American Chords ::
* Jazz chords::
* MIDI instruments::
+* The Feta font::
@end menu
@node Lyrics mode definition
"viola" "lead 5 (charang)" "gunshot"
"cello" "lead 6 (voice)"
@end example
+
+@node The Feta font
+@section The Feta font
+The following symbols are available in the Feta font and may be
+accessed directly using text markup such as
+@code{g^#'(music "scripts-segno")}, see @ref{Text markup}.
+
+@lilypondfile{feta16.ly}
+
For compilation on a Red Hat system you need these packages, in
addition to the those needed for running: glibc-devel, gcc-c++,
-libstdc++-devel, guile-devel, flex, bison, texinfo, tetex-devel, groff,
-libgr-progs.
+libstdc++-devel, guile-devel, flex, bison, texinfo, groff.
LinuxPPC
--------
PACKAGE_NAME=LilyPond
MAJOR_VERSION=1
MINOR_VERSION=5
-PATCH_LEVEL=35
+PATCH_LEVEL=36
MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
for m in charmetrics:
file.write (r'''\def\%s%s{\char%d}%s''' % (nm, m['tex'], m['code'],'\n'))
+def write_fontlist (file, global_info, charmetrics):
+ nm = global_info['FontFamily']
+ file.write (r"""
+% Lilypond file to list all font symbols and the corresponding names
+% Automatically generated by mf-to-table.py
+\score{\notes{\fatText
+""")
+ for m in charmetrics:
+ escapedname=re.sub('_','\\\\\\\\_', m['name'])
+ file.write ('s^#\'(lines (music \"%s\") \"%s\")\n' % (m['name'], escapedname))
+ file.write (r"""
+}
+ \paper{
+ \translator{
+ \ScoreContext
+ \remove "Bar_number_engraver"
+ TextScript \override #'extra-extent-X = #'(-1 . 1)
+ }
+ \translator{
+ \StaffContext
+ \remove "Clef_engraver"
+ \remove "Key_engraver"
+ \remove "Time_signature_engraver"
+ \remove "Staff_symbol_engraver"
+ }
+ }
+}
+""")
def write_deps (file, deps, targets):
for t in targets:
(options, files) = getopt.getopt(
sys.argv[1:], 'a:d:hl:o:p:t:',
- ['afm=', 'outdir=', 'dep=', 'tex=', 'debug', 'help', 'package='])
+ ['afm=', 'outdir=', 'dep=', 'tex=', 'ly=', 'debug', 'help', 'package='])
texfile_nm = ''
depfile_nm = ''
afmfile_nm = ''
+lyfile_nm = ''
outdir_prefix = '.'
for opt in options:
outdir_prefix = a
elif o == '--tex' or o == '-t':
texfile_nm = a
+ elif o == '--ly' or o == '-':
+ lyfile_nm = a
elif o== '--help' or o == '-h':
help()
elif o=='--afm' or o == '-a':
write_afm_metric (afm, g,m)
write_tex_defs (open (texfile_nm, 'w'), g, m)
write_deps (open (depfile_nm, 'wb'), deps, [base + '.dvi', texfile_nm, afmfile_nm])
+ if lyfile_nm != '':
+ write_fontlist(open (lyfile_nm, 'w'), g, m)
+
--- /dev/null
+\header {
+ texidoc = "For juxtaposed chords with the same direction, a
+slight optical correction is used. It is constant, and only works if
+two chords have no common head-positions range."
+}
+
+\score { \notes \relative c'' {
+\stemDown
+\time 12/4
+[f8 e f e] [f d f d] [f c f c] [f b, f' b,] [f' a, f' a,]
+}
+\paper { linewidth = -1. }
+}
FIXME: uncommenting freaks out the Y-alignment of
line-of-score.
*/
- // Real align_param = isdir_b (align) ? gh_scm2double (align) : 0.0;
+ // Real align_param = ly_dir_p (align) ? gh_scm2double (align) : 0.0;
if (gh_number_p (align))
center_offset = total.linear_combination (gh_scm2double (align));
}
Direction dir = CENTER;
- if (isdir_b (me->get_grob_property ("arpeggio-direction")))
+ if (ly_dir_p (me->get_grob_property ("arpeggio-direction")))
{
dir = to_dir (me->get_grob_property ("arpeggio-direction"));
}
The result is that an offsets of align_elements_to_extents () are
not compensated for, and spring_len is completely off.
-
*/
column->set_grob_property ("extra-space",
#include "music-list.hh"
#include "musical-request.hh"
-/* some SCM abbrevs
- zijn deze nou handig?
- zijn ze er al in scheme, maar heten ze anders? */
-
-
-/* Remove doubles from (sorted) list */
-SCM
-ly_unique (SCM list)
-{
- SCM unique = SCM_EOL;
- 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), ly_cadr (i)))
- unique = gh_cons (ly_car (i), unique);
- }
- return gh_reverse (unique);
-}
-
-/* Hmm, rewrite this using ly_split_list? */
-SCM
-ly_remove_member (SCM s, SCM list)
-{
- SCM removed = SCM_EOL;
- for (SCM i = list; gh_pair_p (i); i = ly_cdr (i))
- {
- if (!gh_equal_p (ly_car (i), s))
- removed = gh_cons (ly_car (i), removed);
- }
- return gh_reverse (removed);
-}
-
-/* tail add */
-SCM
-ly_snoc (SCM s, SCM list)
-{
- return gh_append2 (list, scm_list_n (s, SCM_UNDEFINED));
-}
-
-
-/* Split list at member s, removing s.
- Return (BEFORE . AFTER) */
-SCM
-ly_split_list (SCM s, SCM list)
-{
- SCM before = SCM_EOL;
- SCM after = list;
- for (; gh_pair_p (after);)
- {
- SCM i = ly_car (after);
- after = ly_cdr (after);
- if (gh_equal_p (i, s))
- break;
- before = gh_cons (i, before);
- }
- return gh_cons (gh_reverse (before), after);
-}
-
-/*
- JUNKME.
- do something smarter.
- zoals?
- */
SCM
Chord::base_pitches (SCM tonic)
{
SCM minor = Pitch (0, 2, -1).smobbed_copy ();
base = gh_cons (tonic, base);
- base = gh_cons (Pitch::transpose (ly_car (base), major), base);
- base = gh_cons (Pitch::transpose (ly_car (base), minor), base);
+ base = gh_cons (pitch_transpose (ly_car (base), major), base);
+ base = gh_cons (pitch_transpose (ly_car (base), minor), base);
- return gh_reverse (base);
+ return scm_reverse_x (base, SCM_EOL);
}
SCM
SCM transposed = SCM_EOL;
for (SCM i = pitches; gh_pair_p (i); i = ly_cdr (i))
{
- transposed = gh_cons (Pitch::transpose (tonic, ly_car (i)),
+ transposed = gh_cons (pitch_transpose (tonic, ly_car (i)),
transposed);
}
- return gh_reverse (transposed);
+ return scm_reverse_x (transposed, SCM_EOL);
}
/*
if (gh_equal_p (step_scm (tonic, ly_car (i)), step)
|| gh_scm2int (step) == 0)
{
- p = Pitch::transpose (p, Pitch (0, 0, -1).smobbed_copy ());
+ p = pitch_transpose (p, Pitch (0, 0, -1).smobbed_copy ());
}
lowered = gh_cons (p, lowered);
}
- return gh_reverse (lowered);
+ return scm_reverse_x (lowered, SCM_EOL);
}
/* Return member that has same notename, disregarding octave or alterations */
for (int i=0; i < 7; i++)
thirds = gh_cons (Pitch (0, 2, minormajor_a[i]).smobbed_copy (),
thirds);
- thirds = scm_vector (gh_reverse (thirds));
+ thirds = scm_vector (scm_reverse_x (thirds, SCM_EOL));
SCM tonic = ly_car (pitches);
SCM last = tonic;
{
int third = (unsmob_pitch (last)->notename_i_
- unsmob_pitch (tonic)-> notename_i_ + 7) % 7;
- last = Pitch::transpose (last, scm_vector_ref (thirds, gh_int2scm (third)));
+ last = pitch_transpose (last, scm_vector_ref (thirds, gh_int2scm (third)));
}
if (step > gh_scm2int (step_scm (tonic, last)))
missing = gh_cons (last, missing);
int third = (unsmob_pitch (last)->notename_i_
- unsmob_pitch (tonic)->notename_i_ + 7) % 7;
- last = Pitch::transpose (last, scm_vector_ref (thirds,
+ last = pitch_transpose (last, scm_vector_ref (thirds,
gh_int2scm (third)));
}
}
/* Should we maybe first make sure that PITCH is below tonic? */
if (pitches != SCM_EOL)
while (Pitch::less_p (pitch, ly_car (pitches)) == SCM_BOOL_T)
- pitch = Pitch::transpose (pitch, Pitch (1, 0, 0).smobbed_copy ());
+ pitch = pitch_transpose (pitch, Pitch (1, 0, 0).smobbed_copy ());
pitches = gh_cons (pitch, pitches);
return scm_sort_list (pitches, Pitch::less_p_proc);
bool
Directional_element_interface::has_interface (Grob*me)
{
- return isdir_b (me->get_grob_property ("direction"));
+ return ly_dir_p (me->get_grob_property ("direction"));
}
Direction
{
// return dir_;
SCM d= me->get_grob_property ("direction");
- if (!isdir_b (d))
+ if (!ly_dir_p (d))
return CENTER;
return to_dir (d);
static SCM
make_duration (SCM l, SCM d)
{
+ SCM_ASSERT_TYPE(gh_number_p(l), l, SCM_ARG1, __FUNCTION__, "integer");
+ SCM_ASSERT_TYPE(gh_number_p(d), d, SCM_ARG2, __FUNCTION__, "integer");
+
Duration p (gh_scm2int (l), gh_scm2int (d));
return p.smobbed_copy ();
}
for (int i= pitch_sorted_reqs.size(); i--;)
{
SCM dir = pitch_sorted_reqs[i]->get_mus_property ("direction");
- if (isdir_b (dir) && to_dir (dir)) {
+ if (ly_dir_p (dir) && to_dir (dir)) {
if (to_dir (dir) == UP)
up_reqs_.push (pitch_sorted_reqs[i]);
else if (to_dir (dir) == DOWN)
gh_int2scm (100 + d* i));
- if (!isdir_b (fingering->get_grob_property ("direction")))
+ if (!ly_dir_p (fingering->get_grob_property ("direction")))
{
if (d)
fingering->set_grob_property ("direction", gh_int2scm (d));
ly_font_interface_get_default_font (SCM grob)
{
Grob * gr = unsmob_grob (grob);
-
- if (!gr)
- {
- warning ("ly_font_interface_get_default_font (): invalid argument");
- return SCM_UNDEFINED;
- }
+ SCM_ASSERT_TYPE(gr, grob, SCM_ARG1, __FUNCTION__, "grob");
return Font_interface::get_default_font (gr)->self_scm ();
}
SCM
ly_find_glyph_by_name (SCM font, SCM name)
{
- if (!unsmob_metrics (font) || !gh_string_p (name))
- {
- warning ("ly-find-glyph-by-name: invalid argument.");
- Molecule m;
- return m.smobbed_copy ();
- }
+ Font_metric *fm = unsmob_metrics (font);
+ SCM_ASSERT_TYPE(fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
+ SCM_ASSERT_TYPE(gh_string_p (name), name, SCM_ARG2, __FUNCTION__, "string");
- return unsmob_metrics (font)->find_by_name (ly_scm2string (name)).smobbed_copy ();
+ return fm->find_by_name (ly_scm2string (name)).smobbed_copy ();
}
ly_text_dimension (SCM font, SCM text)
{
Box b;
-
- if (!unsmob_metrics (font) || !gh_string_p(text))
- {
- warning ("ly-find-glyph-by-name: invalid argument.");
- Molecule m;
- return m.smobbed_copy ();
- }
- else
- {
- b = unsmob_metrics (font)->text_dimension (ly_scm2string (text));
- }
+ Font_metric *fm = unsmob_metrics (font);
+ SCM_ASSERT_TYPE(fm, font, SCM_ARG1, __FUNCTION__, "font-metric");
+ SCM_ASSERT_TYPE(gh_string_p (text), text, SCM_ARG2, __FUNCTION__, "string");
+
+ b = fm->text_dimension (ly_scm2string (text));
return gh_cons (ly_interval2scm (b[X_AXIS]), ly_interval2scm(b[Y_AXIS]));
}
SCM
spanner_get_bound (SCM slur, SCM dir)
{
- return dynamic_cast<Spanner*> (unsmob_grob (slur))->get_bound (to_dir (dir))->self_scm ();
+ Spanner * sl = dynamic_cast<Spanner*> (unsmob_grob (slur));
+ SCM_ASSERT_TYPE(sl, slur, SCM_ARG1, __FUNCTION__, "spanner grob");
+ SCM_ASSERT_TYPE(ly_dir_p (dir), slur, SCM_ARG2, __FUNCTION__, "dir");
+ return sl->get_bound (to_dir (dir))->self_scm ();
}
+SCM
+ly_get_paper_var (SCM grob, SCM sym)
+{
+ Grob * sc = unsmob_grob (grob);
+ SCM_ASSERT_TYPE(sc, grob, SCM_ARG1, __FUNCTION__, "grob");
+ SCM_ASSERT_TYPE(gh_symbol_p(sym), sym, SCM_ARG2, __FUNCTION__, "symbol");
+
+ return sc->paper_l() ->get_scmvar_scm (sym);
+}
(Scheme_function_unknown)ly_set_grob_property);
scm_c_define_gsubr ("ly-get-spanner-bound", 2 , 0, 0,
(Scheme_function_unknown) spanner_get_bound);
+ scm_c_define_gsubr ("ly-get-paper-variable", 2 , 0, 0,
+ (Scheme_function_unknown) ly_get_paper_var);
}
bool
Real line = me->paper_l ()->get_var ("stafflinethickness");
SCM s = me->get_grob_property ("grow-direction");
- if (!isdir_b (s))
+ if (!ly_dir_p (s))
{
me->suicide ();
return SCM_EOL;
void read_lily_scm_file (String);
void init_lily_guile (String dir);
-bool isdir_b (SCM s);
-bool isaxis_b (SCM s);
+bool ly_dir_p (SCM s);
bool ly_number_pair_p (SCM);
bool ly_axis_p (SCM);
SCM index_set_cell (SCM cellp, Direction d, SCM val);
+
+SCM ly_snoc (SCM s, SCM list);
+SCM ly_split_list (SCM s, SCM list);
+SCM ly_unique (SCM list);
/*
snarfing.
*/
*/
Real get_realvar (SCM symbol) const;
Real get_var (String id) const;
- SCM get_scmvar (String id)const;
+ SCM get_scmvar (String id)const;
+ SCM get_scmvar_scm (SCM sym) const;
void reinit ();
Paper_def ();
Paper_def (Paper_def const&);
/// return pitch from central c (in halfnotes)
int semitone_pitch () const;
String str () const;
+ static SCM transpose (SCM,SCM);
- static SCM transpose (SCM p, SCM delta);
SCM smobbed_copy () const;
DECLARE_SCHEME_CALLBACK (less_p, (SCM a, SCM b));
};
-
+SCM pitch_transpose (SCM p, SCM delta);
DECLARE_UNSMOB(Pitch,pitch);
#include "compare.hh"
return 0;
}
+/*
+ for unknown reason, we don't use IMPLEMENT_TYPE_P
+ */
SCM
ly_input_p (SCM x)
{
return unsmob_input (x) ? SCM_BOOL_T : SCM_BOOL_F ;
}
+
+
static void
start_input_smobs ()
{
scm_set_smob_print (input_tag, print_smob);
scm_set_smob_equalp (input_tag, 0);
+
scm_c_define_gsubr ("ly-input-location?", 1, 0, 0,
(Scheme_function_unknown)ly_input_p);
}
_ {
return FIGURE_SPACE;
}
- \] {
- return FIGURE_BRACKET_CLOSE;
- }
- \[ {
- return FIGURE_BRACKET_OPEN;
- }
\> {
return FIGURE_CLOSE;
}
return gh_pair_p (p) && gh_number_p (ly_car (p)) && gh_number_p (ly_cdr (p));
}
-bool
-ly_axis_p (SCM a)
-{
- return gh_number_p (a) && (gh_scm2int (a) == 0 || gh_scm2int (a) == 1);
-}
-
typedef void (*Void_fptr) ();
Array<Void_fptr> *scm_init_funcs_;
bool
-isdir_b (SCM s)
+ly_dir_p (SCM s)
{
if (gh_number_p (s))
{
bool
-isaxis_b (SCM s)
+ly_axis_p (SCM s)
{
if (gh_number_p (s))
{
}
return ok;
}
+
+
+/* some SCM abbrevs
+
+ zijn deze nou handig?
+ zijn ze er al in scheme, maar heten ze anders? */
+
+
+/* Remove doubles from (sorted) list */
+SCM
+ly_unique (SCM list)
+{
+ SCM unique = SCM_EOL;
+ 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), ly_cadr (i)))
+ unique = gh_cons (ly_car (i), unique);
+ }
+ return scm_reverse_x (unique, SCM_EOL);
+}
+
+/* tail add */
+SCM
+ly_snoc (SCM s, SCM list)
+{
+ return gh_append2 (list, scm_list_n (s, SCM_UNDEFINED));
+}
+
+
+/* Split list at member s, removing s.
+ Return (BEFORE . AFTER) */
+SCM
+ly_split_list (SCM s, SCM list)
+{
+ SCM before = SCM_EOL;
+ SCM after = list;
+ for (; gh_pair_p (after);)
+ {
+ SCM i = ly_car (after);
+ after = ly_cdr (after);
+ if (gh_equal_p (i, s))
+ break;
+ before = gh_cons (i, before);
+ }
+ return gh_cons ( scm_reverse_x (before, SCM_EOL), after);
+
+}
{
SCM_ASSERT_TYPE(ly_axis_p (a), a, SCM_ARG1, __FUNCTION__, "axis") ;
SCM_ASSERT_TYPE(ly_number_pair_p (iv), iv, SCM_ARG1, __FUNCTION__, "number pair") ;
- SCM_ASSERT_TYPE(isdir_b (d), a, SCM_ARG1, __FUNCTION__, "direction") ;
+ SCM_ASSERT_TYPE(ly_dir_p (d), a, SCM_ARG1, __FUNCTION__, "direction") ;
SCM_ASSERT_TYPE(gh_number_p (t), a, SCM_ARG1, __FUNCTION__, "number") ;
SCM_ASSERT_TYPE(gh_number_p(p), a, SCM_ARG1, __FUNCTION__, "number") ;
Molecule::ly_get_molecule_extent (SCM mol, SCM axis)
{
Molecule *m = unsmob_molecule (mol);
+ SCM_ASSERT_TYPE (m, mol, SCM_ARG1, __FUNCTION__, "molecule");
+ SCM_ASSERT_TYPE (ly_axis_p(axis), axis, SCM_ARG2, __FUNCTION__, "axis");
- if (!m || !ly_axis_p (axis))
- {
- warning ("ly-get-molecule-extent: invalid arguments");
- return ly_interval2scm (Interval (0,0));
- }
-
return ly_interval2scm (m->extent (Axis (gh_scm2int (axis))));
}
SCM_ASSERT_TYPE(ly_axis_p(axis), axis, SCM_ARG2, __FUNCTION__, "axis");
- SCM_ASSERT_TYPE(isdir_b (direction), direction, SCM_ARG3, __FUNCTION__, "dir");
+ SCM_ASSERT_TYPE(ly_dir_p (direction), direction, SCM_ARG3, __FUNCTION__, "dir");
SCM_ASSERT_TYPE(gh_number_p(padding), padding, SCM_ARG4, __FUNCTION__, "number");
if (m1)
{
SCM_ASSERT_TYPE(unsmob_molecule (mol), mol, SCM_ARG1, __FUNCTION__, "molecule");
SCM_ASSERT_TYPE(ly_axis_p(axis), axis, SCM_ARG2, __FUNCTION__, "axis");
- SCM_ASSERT_TYPE(isdir_b (dir), dir, SCM_ARG3, __FUNCTION__, "dir");
+ SCM_ASSERT_TYPE(ly_dir_p (dir), dir, SCM_ARG3, __FUNCTION__, "dir");
unsmob_molecule (mol)->align_to ((Axis)gh_scm2int (axis), Direction (gh_scm2int (dir)));
return (s == SCM_BOOL_F) ? SCM_EOL : ly_cdr (s);
}
-
-
void
Music::internal_set_mus_property (SCM s, SCM v)
{
assert (type_check_assignment (s, v, ly_symbol2scm ("music-type?")));
#endif
-
mutable_property_alist_ = scm_assq_set_x (mutable_property_alist_, s, v);
}
set_mus_property ("origin", make_input (ip));
}
-
-
Input*
Music::origin () const
{
}
-
-
-
Music::~Music ()
{
ly_get_mus_property (SCM mus, SCM sym)
{
Music * sc = unsmob_music (mus);
-
- if (sc)
- {
+ SCM_ASSERT_TYPE(sc, mus, SCM_ARG1, __FUNCTION__, "grob");
+ SCM_ASSERT_TYPE(gh_symbol_p(sym), sym, SCM_ARG2, __FUNCTION__, "symbol");
+
return sc->internal_get_mus_property (sym);
- }
- else
- {
- warning (_ ("ly_get_mus_property (): Not a Music"));
- scm_write (mus, scm_current_error_port ());
- }
- return SCM_EOL;
+
}
ly_set_mus_property (SCM mus, SCM sym, SCM val)
{
Music * sc = unsmob_music (mus);
-
- if (!gh_symbol_p (sym))
- {
- warning (_ ("ly_set_mus_property (): Not a symbol"));
- scm_write (mus, scm_current_error_port ());
-
- return SCM_UNSPECIFIED;
- }
-
- if (!sc)
- {
- warning (_ ("ly_set_mus_property (): not of type Music: "));
- scm_write (mus, scm_current_error_port ());
- return SCM_UNSPECIFIED;
- }
-
+ SCM_ASSERT_TYPE(sc, mus, SCM_ARG1, __FUNCTION__, "grob");
+ SCM_ASSERT_TYPE(gh_symbol_p(sym), sym, SCM_ARG2, __FUNCTION__, "symbol");
bool ok = type_check_assignment (sym, val, ly_symbol2scm ("music-type?"));
if (ok)
SCM
ly_make_music (SCM type)
{
- if (!gh_string_p (type))
- {
- warning (_ ("ly_make_music (): Not a string"));
- scm_write (type, scm_current_error_port ());
-
- return SCM_UNSPECIFIED;
- }
- else
- {
- SCM s = get_music (ly_scm2string (type))->self_scm ();
- scm_gc_unprotect_object (s);
+ SCM_ASSERT_TYPE(gh_string_p(type), type, SCM_ARG1, __FUNCTION__, "string");
+
+
+ SCM s = get_music (ly_scm2string (type))->self_scm ();
+ scm_gc_unprotect_object (s);
- return s;
- }
+ return s;
}
SCM
ly_music_name (SCM mus)
{
Music * m = unsmob_music (mus);
- const char *nm ="";
- if (!m)
- {
- warning (_ ("ly_music_name (): Not a music expression"));
- scm_write (mus, scm_current_error_port ());
- }
- else
- nm = classname (m);
- return ly_str02scm (nm);
+ SCM_ASSERT_TYPE(m, mus, SCM_ARG1, __FUNCTION__ ,"music");
+
+ const char * nm = classname (m);
+ return ly_str02scm (nm);
}
SCM
Interval
Note_head::head_extent (Grob *me, Axis a)
{
- return internal_brew_molecule (me, false).extent (a);
+ return internal_brew_molecule (me, false).extent (a);
}
bool
Note_spacing::stem_dir_correction (Grob*me)
{
Drul_array<Direction> stem_dirs(CENTER,CENTER);
- Drul_array<Interval> posns;
+ Drul_array<Interval> stem_posns;
+ Drul_array<Interval> head_posns;
Drul_array<SCM> props(me->get_grob_property ("left-items"),
me->get_grob_property ("right-items"));
Interval intersect;
bool correct = true;
Direction d = LEFT;
+ bool acc_right = false;
+
do
{
for (SCM s = props[d]; gh_pair_p (s); s = gh_cdr (s))
{
Item * it= dynamic_cast<Item*> (unsmob_grob (gh_car(s)));
+ if (d == RIGHT)
+ acc_right = acc_right || Note_column::accidentals (it);
+
Grob *stem = Note_column::stem_l (it);
if (!stem || Stem::invisible_b (stem))
}
stem_dirs[d] = sd;
- Real chord_start = Stem::head_positions (stem)[sd];
+ Interval hp = Stem::head_positions (stem);
+ Real chord_start = hp[sd];
Real stem_end = Stem::stem_end_position (stem);
- posns[d] = Interval(chord_start<?stem_end, chord_start>? stem_end);
+ stem_posns[d] = Interval(chord_start<?stem_end, chord_start>? stem_end);
+ head_posns[d].unite (hp);
}
}
while (flip (&d) != LEFT);
- intersect = posns[LEFT];
- intersect.intersect(posns[RIGHT]);
- correct = correct && !intersect.empty_b ();
- correct = correct && (stem_dirs[LEFT] *stem_dirs[RIGHT] == -1);
-
- exit_loop:
- if(!correct)
- return 0.0;
/*
- Ugh. 7 is hardcoded.
- */
- Real correction = abs (intersect.length ());
- correction = (correction/7) <? 1.0;
- correction *= stem_dirs[LEFT] ;
- correction *= gh_scm2double (me->get_grob_property ("stem-spacing-correction"));
+ don't correct if accidentals are sticking out of the right side.
- return correction;
+ */
+ if (acc_right)
+ return 0.0;
+
+
+ if (correct && stem_dirs[LEFT] *stem_dirs[RIGHT] == -1)
+ {
+ intersect = stem_posns[LEFT];
+ intersect.intersect(stem_posns[RIGHT]);
+ correct = correct && !intersect.empty_b ();
+
+ if (!correct)
+ return 0.0;
+ /*
+ Ugh. 7 is hardcoded.
+ */
+ Real correction = abs (intersect.length ());
+ correction = (correction/7) <? 1.0;
+ correction *= stem_dirs[LEFT] ;
+ correction *= gh_scm2double (me->get_grob_property ("stem-spacing-correction"));
+ return correction;
+ }
+ else if (correct)
+ {
+ /*
+ Correct for the following situation:
+
+ X X
+ | |
+ | |
+ | X |
+ | | |
+ ========
+
+ ^ move the center one to the left.
+
+
+ this effect seems to be much more subtle than the
+ stem-direction stuff (why?), and also does not scale with the
+ difference in stem length.
+
+ */
+
+
+ Interval hp = head_posns[LEFT];
+ hp.intersect (head_posns[RIGHT]);
+ if (!hp.empty_b())
+ return 0.0;
+
+ Direction lowest =
+ (head_posns[LEFT][DOWN] > head_posns[RIGHT][UP]) ? RIGHT : LEFT;
+
+ Real delta = head_posns[-lowest][DOWN] - head_posns[lowest][UP] ;
+ Real corr = gh_scm2double (me->get_grob_property ("stem-spacing-correction"));
+ corr = (delta <= 1) ? 0.0 : 0.25;
+
+ return -lowest * corr ;
+ }
+
+
+ exit_loop:
+ return 0.0;
}
#include "file-results.hh" // urg? header_global_p
#include "paper-outputter.hh"
+/*
+ This is an almost empty thing. The only substantial thing this class
+ handles, is scaling up and down to real-world dimensions (internally
+ dimensions are against global staff-space.)
+
+ */
Paper_def::Paper_def ()
{
}
return scope_p_->scm_elem (ly_symbol2scm (s.ch_C ()));
}
+
+SCM
+Paper_def::get_scmvar_scm (SCM sym) const
+{
+ return gh_double2scm (get_realvar (sym));
+}
+
Real
Paper_def::get_realvar (SCM s) const
{
br_bass_figure:
'[' bass_figure {
- unsmob_music ($2)->set_mus_property ("bracket-start", SCM_BOOL_T);
+ $$ = $2;
+ unsmob_music ($$)->set_mus_property ("bracket-start", SCM_BOOL_T);
}
| bass_figure {
-
+ $$ = $1;
}
| br_bass_figure ']' {
+ $$ = $1;
unsmob_music ($1)->set_mus_property ("bracket-stop", SCM_BOOL_T);
}
;
notename_i_ = notename;
}
-///MAKE_SCHEME_CALLBACK (Pitch, transpose, 2);
-///transpose_proc?
+/*
+ can't use macro MAKE_SCHEME_CALLBACK().
+ messy stuff since Pitch::transpose is overloaded.
+ */
+
SCM
-Pitch::transpose (SCM p, SCM delta)
+pitch_transpose (SCM p, SCM delta)
{
- Pitch t = *unsmob_pitch (p);
- t.transpose (*unsmob_pitch (delta));
- return t.smobbed_copy ();
+ Pitch* t = unsmob_pitch (p);
+ Pitch *d = unsmob_pitch (delta);
+ SCM_ASSERT_TYPE(t, p, SCM_ARG1, __FUNCTION__, "pitch") ;
+ SCM_ASSERT_TYPE(d, delta, SCM_ARG1, __FUNCTION__, "pitch") ;
+
+ Pitch tp =*t;
+ tp.transpose (*d);
+ return tp.smobbed_copy ();
}
-static SCM
-pitch_transpose (SCM p, SCM delta)
+SCM
+Pitch::transpose (SCM p, SCM d)
{
- return Pitch::transpose (p, delta);
+ return pitch_transpose (p,d);
}
/****************************************************************/
}
IMPLEMENT_SIMPLE_SMOBS (Pitch);
-
-
int
Pitch::print_smob (SCM s, SCM port, scm_print_state *)
{
/*
should add optional args
*/
-
static SCM
make_pitch (SCM o, SCM n, SCM a)
{
+ SCM_ASSERT_TYPE(gh_number_p(o), o, SCM_ARG1, __FUNCTION__, "number");
+ SCM_ASSERT_TYPE(gh_number_p(n), n, SCM_ARG2, __FUNCTION__, "number");
+ SCM_ASSERT_TYPE(gh_number_p(a), a, SCM_ARG3, __FUNCTION__, "number");
+
Pitch p (gh_scm2int (o), gh_scm2int (n), gh_scm2int (a));
return p.smobbed_copy ();
}
pitch_octave (SCM pp)
{
Pitch *p = unsmob_pitch (pp);
- int q = 0;
- if (!p)
- warning ("Not a pitch");
- else
- q = p->octave_i ();
+ SCM_ASSERT_TYPE(p, pp, SCM_ARG1, __FUNCTION__, "Pitch");
+ int q = p->octave_i ();
return gh_int2scm (q);
}
pitch_alteration (SCM pp)
{
Pitch *p = unsmob_pitch (pp);
- int q = 0;
- if (!p)
- warning ("Not a pitch");
- else
- q = p->alteration_i ();
+ SCM_ASSERT_TYPE(p, pp, SCM_ARG1, __FUNCTION__, "Pitch");
+ int q = p->alteration_i ();
return gh_int2scm (q);
}
pitch_notename (SCM pp)
{
Pitch *p = unsmob_pitch (pp);
- int q = 0;
- if (!p)
- warning ("Not a pitch");
- else
- q = p->notename_i ();
+ SCM_ASSERT_TYPE(p, pp, SCM_ARG1, __FUNCTION__, "Pitch");
+ int q = p->notename_i ();
return gh_int2scm (q);
}
pitch_semitones (SCM pp)
{
Pitch *p = unsmob_pitch (pp);
- int q = 0;
- if (!p)
- warning ("Not a pitch");
- else
- q = p->steps ();
+ SCM_ASSERT_TYPE(p, pp, SCM_ARG1, __FUNCTION__, "Pitch");
+
+ int q = p->steps ();
return gh_int2scm (q);
}
{
// should take list?: (make-pitch ' (octave name accidental))
scm_c_define_gsubr ("make-pitch", 3, 0, 0, (Scheme_function_unknown)make_pitch);
-
scm_c_define_gsubr ("pitch-octave", 1, 0, 0, (Scheme_function_unknown)pitch_octave);
scm_c_define_gsubr ("pitch-notename", 1, 0, 0, (Scheme_function_unknown)pitch_notename);
scm_c_define_gsubr ("pitch-alteration", 1, 0, 0, (Scheme_function_unknown)pitch_alteration);
{
SCM d = get_mus_property ("direction");
- return (isdir_b (d)) ? to_dir (d) : CENTER;
+ return (ly_dir_p (d)) ? to_dir (d) : CENTER;
}
Direction
{
SCM d = get_mus_property ("span-direction");
- return (isdir_b (d)) ? to_dir (d) : CENTER;
+ return (ly_dir_p (d)) ? to_dir (d) : CENTER;
}
void
art = ly_cdr (art);
SCM force_dir = l->get_mus_property ("direction");
- if (isdir_b (force_dir) && !to_dir (force_dir))
+ if (ly_dir_p (force_dir) && !to_dir (force_dir))
force_dir = ly_car (art);
art = ly_cdr (art);
SCM priority = ly_car (art);
- if (isdir_b (force_dir) && to_dir (force_dir))
+ if (ly_dir_p (force_dir) && to_dir (force_dir))
p->set_grob_property ("direction", force_dir);
else if (to_dir (relative_stem_dir))
p->set_grob_property ("side-relative-direction", relative_stem_dir);
Side_position_interface::get_direction (Grob*me)
{
SCM d = me->get_grob_property ("direction");
- if (isdir_b (d) && to_dir (d))
+ if (ly_dir_p (d) && to_dir (d))
return to_dir (d);
Direction relative_dir = Direction (1);
SCM reldir = me->get_grob_property ("side-relative-direction"); // should use a lambda.
- if (isdir_b (reldir))
+ if (ly_dir_p (reldir))
{
relative_dir = to_dir (reldir);
}
Axis axis = X_AXIS;
SCM a = ly_assoc_chain (ly_symbol2scm ("axis"), p);
- if (gh_pair_p (a) && isaxis_b (ly_cdr (a)))
+ if (gh_pair_p (a) && ly_axis_p (ly_cdr (a)))
axis = (Axis)gh_scm2int (ly_cdr (a));
Real baseline_skip = 0;
{
Translator *t = unsmob_translator (context);
Translator_group* tr= dynamic_cast<Translator_group*> (t);
- if (!t || !tr)
- {
- /* programming_error? */
- warning (_ ("ly-get-trans-property: expecting a Translator_group argument"));
- return SCM_EOL;
- }
+ SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Translator group");
+ SCM_ASSERT_TYPE(gh_symbol_p(name), name, SCM_ARG2, __FUNCTION__, "symbol");
+
return tr->internal_get_property (name);
}
SCM
ly_set_trans_property (SCM context, SCM name, SCM val)
{
-
Translator *t = unsmob_translator (context);
Translator_group* tr= dynamic_cast<Translator_group*> (t);
- if (tr)
- {
- tr->internal_set_property (name, val);
- }
+
+ SCM_ASSERT_TYPE(tr, context, SCM_ARG1, __FUNCTION__, "Translator group");
+ tr->internal_set_property (name, val);
+
return SCM_UNSPECIFIED;
}
{
Direction d = UP;
SCM dir_sym =me->get_grob_property ("dir-forced");
- if (isdir_b (dir_sym))
+ if (ly_dir_p (dir_sym))
{
d= to_dir (dir_sym);
if (d != CENTER)
CONVERT_LY = $(script-dir)/convert-ly.py
LILYPOND = $(depth)/$(builddir)/lily/$(outconfbase)/lilypond
LILYPOND_BOOK = $(script-dir)/lilypond-book.py
-LILYPOND_BOOK_INCLUDES = -I $(pwd) -I $(outdir) -I$(input-dir) -I $(input-dir)/tricks/ -I $(input-dir)/regression/ -I $(input-dir)/test/ -I $(input-dir)/tutorial/
+LILYPOND_BOOK_INCLUDES = -I $(pwd) -I $(outdir) -I$(input-dir) -I $(input-dir)/tricks/ -I $(input-dir)/regression/ -I $(input-dir)/test/ -I $(input-dir)/tutorial/ -I $(topdir)/mf/out
LY2DVI = $(script-dir)/ly2dvi.py
LYS_TO_TELY = $(buildscript-dir)/lys-to-tely.py
PS_TO_GIFS = $(buildscript-dir)/ps-to-gifs.sh
Begin3
Title: LilyPond
-Version: 1.5.35
-Entered-date: 28FEB02
+Version: 1.5.36
+Entered-date: 02MRT02
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.35.tar.gz
+ 1000k lilypond-1.5.36.tar.gz
Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 1000k lilypond-1.5.35.tar.gz
+ 1000k lilypond-1.5.36.tar.gz
Copying-policy: GPL
End
%define name lilypond
-%define version 1.5.35
+%define version 1.5.36
%define release 1mdk
Name: %{name}
%define info yes
Name: lilypond
-Version: 1.5.35
+Version: 1.5.36
Release: 1
License: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.35.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.36.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.35
+Version: 1.5.36
Release: 2
Copyright: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.35.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.36.tar.gz
# music notation software for.. ?
Summary: A program for printing sheet music.
URL: http://www.lilypond.org/
AF_FILES = $(wildcard *.af)
-EXTRA_DIST_FILES += README feta.tex lilypond.map
+EXTRA_DIST_FILES += README feta.tex
# don't try to make fonts from test files
TEST_FILES = $(wildcard *test*.mf)
PFA_FILES = $(addprefix $(outdir)/, $(FONT_FILES:.mf=.pfa))
ALL_GEN_FILES += $(PFA_FILES)
INSTALLATION_OUT_DIR4=$(datadir)/pfa
-INSTALLATION_OUT_FILES4=$(PFA_FILES) lilypond.map
+INSTALLATION_OUT_FILES4=$(PFA_FILES)
pfa: $(PFA_FILES)
endif
default: $(ALL_GEN_FILES)
+$(outdir)/lilypond.map:
+ echo $(FONT_FILES:.mf=) | awk -v RS=' ' '{print $$1 " TeX-" $$1 " <" $$1 ".pfa"}' > $@
+
##
## todo: this also depends on .tfm, FIXME.
$(outdir)/%.afm $(outdir)/%.tex $(outdir)/%.dep: $(outdir)/%.log
- $(PYTHON) $(buildscript-dir)/mf-to-table.py --package=$(topdir) --outdir=$(outdir) --dep $(outdir)/$(<F:.log=.dep) --afm $(outdir)/$(<F:.log=.afm) --tex $(outdir)/$(<F:.log=.tex) $<
+ $(PYTHON) $(buildscript-dir)/mf-to-table.py --package=$(topdir) --outdir=$(outdir) --dep $(outdir)/$(<F:.log=.dep) --afm $(outdir)/$(<F:.log=.afm) --tex $(outdir)/$(<F:.log=.tex) --ly $(outdir)/$(<F:.log=.ly) $<
local-clean:
rm -f mfplain.mem mfplain.log
+++ /dev/null
-%vvv UniqueID=4455667
-feta11 TeX-feta11 <feta11.pfa
-feta13 TeX-feta13 <feta13.pfa
-feta16 TeX-feta16 <feta16.pfa
-feta19 TeX-feta19 <feta19.pfa
-feta20 TeX-feta20 <feta20.pfa
-feta23 TeX-feta23 <feta23.pfa
-feta26 TeX-feta26 <feta26.pfa
-feta-din4 TeX-feta-din4 <feta-din4.pfa
-feta-din5 TeX-feta-din5 <feta-din5.pfa
-feta-din6 TeX-feta-din6 <feta-din6.pfa
-feta-din7 TeX-feta-din7 <feta-din7.pfa
-feta-din8 TeX-feta-din8 <feta-din8.pfa
-feta-din9 TeX-feta-din9 <feta-din9.pfa
-feta-din10 TeX-feta-din10 <feta-din10.pfa
-feta-din11 TeX-feta-din11 <feta-din11.pfa
-feta-din12 TeX-feta-din12 <feta-din12.pfa
-feta-din13 TeX-feta-din13 <feta-din13.pfa
-feta-din14 TeX-feta-din14 <feta-din14.pfa
-feta-din17 TeX-feta-din17 <feta-din17.pfa
-feta-din19 TeX-feta-din19 <feta-din19.pfa
-feta-braces0 TeX-feta-braces0 <feta-braces0.pfa
-feta-braces1 TeX-feta-braces1 <feta-braces1.pfa
-feta-braces2 TeX-feta-braces2 <feta-braces2.pfa
-feta-braces3 TeX-feta-braces3 <feta-braces3.pfa
-feta-braces4 TeX-feta-braces4 <feta-braces4.pfa
-feta-braces5 TeX-feta-braces5 <feta-braces5.pfa
-feta-braces6 TeX-feta-braces6 <feta-braces6.pfa
-feta-braces7 TeX-feta-braces7 <feta-braces7.pfa
-feta-braces8 TeX-feta-braces8 <feta-braces8.pfa
-feta-nummer4 TeX-feta-nummer4 <feta-nummer4.pfa
-feta-nummer5 TeX-feta-nummer5 <feta-nummer5.pfa
-feta-nummer6 TeX-feta-nummer6 <feta-nummer6.pfa
-feta-nummer7 TeX-feta-nummer7 <feta-nummer7.pfa
-feta-nummer8 TeX-feta-nummer8 <feta-nummer8.pfa
-feta-nummer10 TeX-feta-nummer10 <feta-nummer10.pfa
-feta-nummer11 TeX-feta-nummer11 <feta-nummer11.pfa
-feta-nummer13 TeX-feta-nummer13 <feta-nummer13.pfa
a_w := 1.09;
save a, beta, ht, wd;
- ht# = noteheight# * mag;
+ ht# = noteheight#; %% * mag;
2beta# = ht# * b_h;
a# = beta# * a_b;
wd# = 0.4a# / a_w; % width intentionally too small
a_w := 1.09;
save a, beta, ht, wd;
- ht# = noteheight# * mag;
+ ht# = noteheight# ; %% * mag;
2beta# = ht# * b_h;
a# = beta# * a_b;
wd# = 0.4a# / a_w;
a_w := 1.09;
save a, beta, ht, wd;
- ht# = noteheight# * mag;
+ ht# = noteheight#; %% * mag;
2beta# = ht# * b_h;
a# = beta# * a_b;
wd# = 2a# / a_w;
a_w := 1.09;
save a, beta, ht, wd;
- ht# = noteheight# * mag;
+ ht# = noteheight#; %% * mag;
2beta# = ht# * b_h;
a# = beta# * a_b;
wd# = 2a# / a_w;
;;;; todo: make interfaces as 1st level objects in LilyPond.
-
-(define (fontify-text font-metric text)
- "Set TEXT with font FONT-METRIC, returning a molecule."
- (let* ((b (ly-text-dimension font-metric text)))
- (ly-make-molecule
- (ly-fontify-atom font-metric `(text ,text)) (car b) (cdr b))
- ))
-
(define (brew-one-figure grob fig-music)
"Brew a single column for a music figure"
(let* (
mol))
-(define (stack-molecules axis dir padding mols)
- "Stack molecules MOLS in direction AXIS,DIR, using PADDING."
- (if (null? mols)
- '()
- (if (pair? mols)
- (ly-combine-molecule-at-edge (car mols) axis dir
- (stack-molecules axis dir padding (cdr mols))
- padding
- )
- )
- ))
(define (brew-bass-figure grob)
"Make a molecule for a Figured Bass grob"
(let* (
(figs (ly-get-grob-property grob 'causes ))
- (fig-mols (map (lambda (x) (brew-one-figure grob x)) figs))
- (fig-mol (stack-molecules 1 -1 0.2 fig-mols))
+ (mol (ly-make-molecule '() '(0 . 0) '(0 . 0)))
+ (padding (ly-get-grob-property grob 'padding))
+ (kerning (ly-get-grob-property grob 'kern))
+ (thickness (*
+ (ly-get-paper-variable grob 'stafflinethickness)
+ (ly-get-grob-property grob 'thickness))
+ )
)
- (ly-align-to! fig-mol Y DOWN)
- fig-mol
- ))
+
+
+ (define (brew-complete-figure grob figs mol)
+ "recursive function: take some stuff from FIGS, and add it to MOL."
+ (define (end-bracket? fig)
+ (eq? (ly-get-mus-property fig 'bracket-stop) #t)
+ )
+
+ (if (null? figs)
+ mol
+ (if (eq? (ly-get-mus-property (car figs) 'bracket-start) #t)
+ (let* (
+ (gather-todo (take-from-list-until figs '() end-bracket?))
+ (unbr-mols
+ (map
+ (lambda (x) (brew-one-figure grob x))
+ (reverse! (car gather-todo) '())))
+ (br-mol (bracketify-molecule
+ (stack-molecules Y UP kerning unbr-mols)
+ Y thickness (* 2 padding) padding))
+ )
+ (brew-complete-figure
+ grob (cdr gather-todo)
+ (ly-combine-molecule-at-edge mol Y UP br-mol kerning)
+ )
+ )
+ (brew-complete-figure
+ grob (cdr figs)
+ (ly-combine-molecule-at-edge mol Y UP (brew-one-figure grob (car figs))
+ kerning))
+ )
+ ))
+
+
+ (set! mol (brew-complete-figure grob (reverse figs) mol))
+ (ly-align-to! mol Y DOWN)
+ mol
+ ))
+(define (take-from-list-until todo gathered crit?)
+ "return (G, T), where (reverse G) + T = GATHERED + TODO, and the last of G
+is the first to satisfy CRIT "
+ (if (null? todo)
+ (cons gathered todo)
+ (if (crit? (car todo))
+ (cons (cons (car todo) gathered) (cdr todo))
+ (take-from-list-until (cdr todo) (cons (car todo) gathered) crit?)
+ )
+ ))
+; test:
+; (take-from-list-until '(1 2 3 4 5) '() (lambda (x) (eq? x 3)))
+; ((3 2 1) 4 5)
+
+
+
; Make a function that checks score element for being of a specific type.
(define (make-type-checker symbol)
(lambda (elt)
(direction . 0)
(font-family . number)
(font-relative-size . -1)
+ (padding . 0.1)
+ (kern . 0.2)
+ (thickness . 1.0)
(meta . ,(grob-description text-interface font-interface ))
))
(Beam . (
(NoteSpacing . (
(X-extent-callback . #f)
(Y-extent-callback . #f)
- (stem-spacing-correction . 0.)
+ (stem-spacing-correction . 0.5)
(space-factor . 1.0)
(meta . ,(grob-description note-spacing-interface))
))
"pdf.scm"
"pdftex.scm"
"c++.scm"
+ "molecule.scm"
"bass-figure.scm"
"grob-property-description.scm"
"context-description.scm"
--- /dev/null
+
+(define (stack-molecules axis dir padding mols)
+ "Stack molecules MOLS in direction AXIS,DIR, using PADDING."
+ (if (null? mols)
+ '()
+ (if (pair? mols)
+ (ly-combine-molecule-at-edge (car mols) axis dir
+ (stack-molecules axis dir padding (cdr mols))
+ padding
+ )
+ )
+ ))
+
+
+
+
+(define (fontify-text font-metric text)
+ "Set TEXT with font FONT-METRIC, returning a molecule."
+ (let* ((b (ly-text-dimension font-metric text)))
+ (ly-make-molecule
+ (ly-fontify-atom font-metric `(text ,text)) (car b) (cdr b))
+ ))
+
+(define (other-axis a)
+ (remainder (+ a 1) 2))
+
+(define (bracketify-molecule mol axis thick protusion padding)
+ "Add brackets around MOL, producing a new molecule."
+
+ (let* (
+ (ext (ly-get-molecule-extent mol axis))
+ (lb (ly-bracket axis ext -1 thick protusion))
+ (rb (ly-bracket axis ext 1 thick protusion))
+ )
+ (set! mol (ly-combine-molecule-at-edge mol (other-axis axis) 1 lb padding))
+ (set! mol (ly-combine-molecule-at-edge mol (other-axis axis) -1 rb padding))
+ mol
+ ))