+1.5.13.hwn2
+===========
+
+* Bugfix: revert font-relative-size for grace Accidentals
+
+* Bugfix: hara kiri'd piano staffs doesn't take space anymore.
+
+* Bugfix: reinstate rest-collisions.
+
+* Bugfix: key items have the c0 position again.
+
+* Make \property Voice.GrobName = \turnOff work again.
+
+* More intelligent symbol-cache, in less code. Turned off by default, doesn't
+work with -O2 yet.
+
+* Documentation fixes: change documentation of Moment and make-moment,
+add Translator::{name,description}
+
+* Junk STL implementation of Scheme_hash_table in favor of GUILE
+hashtables with automatic resizing.
+
+
1.5.12.jcn2
===========
# Hmm, what about?
# local-dist: check-info
-info: check-info
+info: # check-info # -> reinstate when actively hacking doco.
include $(depth)/make/stepmake.make
@node Moment
@section Moment
-Moment is a rational number. Since GUILE doesn't support them natively,
-so we created our own rational data type.
+Moment is a point in musical time. It is consists of a pair of
+rationals (@var{m},@var{g}), where @var{m} is the timing for the main
+notes, and @var{g} the timing for grace notes. In absence of grace
+notes, @var{g} is zero.
@defun moment? obj
Type predicate, return true if @var{obj} is a moment.
@end defun
@defun make-moment num den
-create the rational number @var{num}/@var{den}.
+create the rational number with main timing @var{num}/@var{den}.
@end defun
@node Duration
set value of property @var{sym} in context @var{tr} to @var{val}.
@end defun
+@defun Translator::name tr
+Return the type name of the translator @var{tr}.
+@end defun
+
+@defun Translator::description tr
+Return an alist of properties of translator @var{tr}.
+@end defun
@node Grobs
@section Grobs
span. Both are measured in half staff-spaces, @code{staff-position=0}
corresponds to the middle staff line.
-
Set @code{height} to zero, to get horizontal beams:
@lilypond[fragment,relative,verbatim]
\property Voice.Beam \set #'height = #-4
[c8 c]
@end lilypond
-@cindex @code{default-neutral-direction}
+
+@c TODO -> why this ref? Document?
+@cindex @code{neutral-direction}
@node Expressive marks
@section Expressive marks
PACKAGE_NAME=LilyPond
MAJOR_VERSION=1
MINOR_VERSION=5
-PATCH_LEVEL=13
+PATCH_LEVEL=14
MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
--- /dev/null
+\header {
+texidoc = "Hara kiri should not upset fixed distance alignment like in pianostaff. In this example the middle staff is harakiried."
+}
+
+
+\score { \notes \transpose c'''
+ \context PianoStaff <
+ \context Staff = up { c c c c \break }
+ \context Staff = mid { s1 \break }
+ \context Staff = down { c4 c c c \break }
+ >
+ \paper {
+ \translator {
+ \HaraKiriStaffContext
+ }
+ }
+}
+
\score{
\notes\relative c{
- \property Voice.Stem \override #'default-neutral-direction = #-1
+ \property Voice.Stem \override #'neutral-direction = #-1
b''4 ~ b8()b8 e4 e,
}
fragment = \notes {
[b''8 b]
- \property Voice.Beam \set #'default-neutral-direction = #-1
+ \property Voice.Beam \set #'neutral-direction = #-1
[b b]
}
\header { texidoc = "
The direction of a perfectly centred beams can be
controlled through @code{Voice.Beam}'s grob-property
-@code{default-neutral-direction}
+directly@code{neutral-direction}
"}
\paper { linewidth = -1.}
\score {\notes \relative c {
[b''8 b]
- \property Voice.Beam \set #'default-neutral-direction = #-1
+ \property Voice.Beam \set #'neutral-direction = #-1
[b b]
}}
#include "grob.hh"
#include "group-interface.hh"
#include "axis-group-interface.hh"
+#include "hara-kiri-group-spanner.hh"
#include "paper-def.hh"
MAKE_SCHEME_CALLBACK (Align_interface,alignment_callback,2);
me->set_grob_property ("alignment-done", SCM_BOOL_T);
SCM d = me->get_grob_property ("stacking-dir");
-
Direction stacking_dir = gh_number_p (d) ? to_dir (d) : CENTER;
if (!stacking_dir)
stacking_dir = DOWN;
-
SCM force = me->get_grob_property ("forced-distance");
Real dy = 0.0;
v.set_empty ();
Array<Real> translates;
- for (int j=0 ; j < elems.size (); j++)
+ for (int j= elems.size (); j--; )
+ {
+ /*
+ This is not very elegant, in that we need special support for
+ hara kiri. Unfortunately, the generic wiring of
+ force_hara_kiri_callback () (extent and offset callback) is
+ such that we might get into a loop if we call extent() or
+ offset() the elements.
+
+
+ */
+ if (a == Y_AXIS
+ && Hara_kiri_group_spanner::has_interface (elems[j]))
+ Hara_kiri_group_spanner::consider_suicide (elems[j]);
+
+ if (!ly_pair_p (elems[j]-> immutable_property_alist_))
+ elems.del(j);
+ }
+
+ for (int j =0; j < elems.size (); j++)
{
where_f += stacking_dir * dy;
translates.push (where_f);
&& gh_string_p (get_property ("clefGlyph")))
create_clef ();
- if (Key_item::has_interface (item))
- {
- /*
- Key_item adapts its formatting to make sure that the
- accidentals stay in the upper half of the staff. It needs
- to know c0-pos for this. (?)
- */
-
- item->set_grob_property ("c0-position", get_property ("centralCPosition"));
- }
}
}
ENTER_DESCRIPTION(Clef_engraver,
/* descr */ "Determine and set reference point for pitches",
/* creats*/ "Clef OctavateEight",
-/* acks */ "bar-line-interface key-interface",
+/* acks */ "bar-line-interface",
/* reads */ "clefPosition clefGlyph centralCPosition clefOctavation explicitClefVisibility",
/* write */ "");
If omitted, then dots appear on top of the notes.
",
/* creats*/ "DotColumn",
-/* acks */ "dot-column-interface stem-interface",
+/* acks */ "rhythmic-head-interface dot-column-interface stem-interface",
/* reads */ "",
/* write */ "");
nm = ly_cdr (nm);
else
{
- assert (info.grob_l_->immutable_property_alist_ == SCM_EOL);
+ /*
+ it's tempting to put an assert for
+ immutable_property_alist_ == '(), but in fact, some
+ engravers (clef-engraver) add some more information to the
+ immutable_property_alist_ (after it has been '()-ed).
+
+ We ignore the grob anyway. He who has no name, shall not
+ be helped. */
+
continue;
}
}
SCM meta = get_grob_property ("meta");
- SCM ifs = scm_assoc (ly_symbol2scm ("interfaces"), meta);
+ if (gh_pair_p (meta))
+ {
+ SCM ifs = scm_assoc (ly_symbol2scm ("interfaces"), meta);
- set_grob_property ("interfaces",ly_cdr (ifs));
+ set_grob_property ("interfaces",ly_cdr (ifs));
+ }
}
-
Grob::Grob (Grob const&s)
: dim_cache_ (s.dim_cache_)
{
#include "lily-guile.hh"
#include "lily-proto.hh"
-
class Hara_kiri_group_spanner
{
public:
SCM ly_str02scm (char const*c);
SCM ly_write2scm (SCM s);
SCM ly_deep_copy (SCM);
-SCM ly_symbol2scm (char const *);
+
+#ifdef CACHE_SYMBOLS
+/*
+ Using this trick we cache the value of gh_symbol2scm ("fooo") where
+ "fooo" is a constant string. This is done at the cost of one static
+ variable per ly_symbol2scm() use, and one boolean evaluation for
+ every call.
+
+ The overall speedup of lily is about 5% on a run of wtk1-fugue2
+
+*/
+#define ly_symbol2scm(x) ({ static SCM cached; \
+ (__builtin_constant_p (x)) \
+ ? ((cached) ? cached : scm_permanent_object (cached = gh_symbol2scm((char*)x))) \
+ : gh_symbol2scm(x); })
+#else
+inline SCM ly_symbol2scm(char const* x) { return gh_symbol2scm((char*)x); }
+#endif
+
+
+
String ly_scm2string (SCM s);
String ly_symbol2string (SCM);
SCM ly_offset2scm (Offset);
#define SCM_HASH_HH
-#include <map>
-
#include "lily-guile.hh"
#include "smobs.hh"
-struct SCM_less
-{
- bool operator () (SCM s1, SCM s2) const
- {
- return long (s1) < long (s2);
- }
-};
-
-typedef std::map<SCM,SCM, SCM_less> Scm_stl_map;
-
/**
auto resizing hash table.
- use GUILE hashtables iso STL.
*/
-class Scheme_hash_table : private Scm_stl_map
-{
+
+class Scheme_hash_table
+{
public:
bool try_retrieve (SCM key, SCM *val);
bool elem_b (SCM key) const;
Scheme_hash_table (Scheme_hash_table const &);
SCM to_alist () const;
+private:
+ SCM hash_tab_;
+ unsigned elt_count_;
+
DECLARE_SMOBS (Scheme_hash_table,foo);
};
+
#endif /* SCM_HASH_HH */
+++ /dev/null
-/*
- symbol-cache.hh -- declare Symbol cacher.
-
- source file of the GNU LilyPond music typesetter
-
- (c) 2000--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
- */
-
-#ifndef SYMBOL_CACHE_HH
-#define SYMBOL_CACHE_HH
-
-#if 1
-
-/*
- A per file cache: for each compilation unit, there is a separate
- cache that maps the address of a string directly to a SCM value
-
- */
-struct Symbol_cache_pair{
- const char * key;
- SCM val ;
-};
-
-static Symbol_cache_pair *private_symbol_cache;
-static Symbol_cache_pair *private_symbol_cache_end;
-
-static SCM
-symbol (const char *ch) __attribute__ ((unused));
-
- SCM
-symbol (const char *ch)
-{
- Symbol_cache_pair * lo = private_symbol_cache;
- Symbol_cache_pair * hi = private_symbol_cache_end -1;
-
- if (lo)
- {
- do
- {
- Symbol_cache_pair * mid = lo + (hi - lo) / 2 ;
- if (mid->key > ch)
- hi = mid;
- else
- lo = mid;
- }
- while ((hi - lo) > 1);
- if (lo->key== ch)
- return lo->val;
- }
-
-
- Symbol_cache_pair * p = private_symbol_cache;
- for (; p < private_symbol_cache_end
- && p->key < ch ; p++)
- ;
-
- int idx = p - private_symbol_cache;
-
- SCM sym = gh_symbol2scm ((char*) ch);
- scm_permanent_object (sym);
-
- int sz = private_symbol_cache_end - private_symbol_cache;
- sz ++ ;
- private_symbol_cache
- = (Symbol_cache_pair*) realloc (private_symbol_cache,
- sizeof (Symbol_cache_pair)* sz);
- private_symbol_cache_end = private_symbol_cache + sz;
- for (p = private_symbol_cache_end -1;
- p != private_symbol_cache + idx; p --)
- *p = * (p - 1);
-
- p->key = ch;
- p->val = sym;
-
- return sym;
-}
-#endif /* SYMBOL_CACHE_HH */
-#endif
{
void create_key (bool);
void read_req (Key_change_req const * r);
+ Key_change_req * keyreq_l_;
+ Item * item_p_;
public:
TRANSLATOR_DECLARATIONS(Key_engraver);
- Key_change_req * keyreq_l_;
- Item * item_p_;
- Protected_scm old_accs_; // ugh. -> property
-
protected:
virtual void initialize ();
virtual void finalize ();
void
Key_engraver::finalize ()
{
- old_accs_ = SCM_EOL; // unprotect can not be called from dtor.
}
+
Key_engraver::Key_engraver ()
{
keyreq_l_ = 0;
item_p_ = 0;
}
+
void
Key_engraver::create_key (bool def)
{
{
item_p_ = new Item (get_property ("KeySignature"));
- item_p_->set_grob_property ("c0-position", gh_int2scm (0));
-
+ item_p_->set_grob_property ("c0-position",
+ get_property ("centralCPosition"));
+
// todo: put this in basic props.
- item_p_->set_grob_property ("old-accidentals", old_accs_);
+ item_p_->set_grob_property ("old-accidentals", get_property ("lastKeySignature"));
item_p_->set_grob_property ("new-accidentals", get_property ("keySignature"));
Staff_symbol_referencer::set_interface (item_p_);
Key_item::set_interface (item_p_);
-
-
announce_grob (item_p_,keyreq_l_);
}
-
if (!def)
{
SCM vis = get_property ("explicitKeySignatureVisibility");
return false;
}
+
void
Key_engraver::acknowledge_grob (Grob_info info)
{
{
create_key (true);
}
-
}
+
void
Key_engraver::create_grobs ()
{
- if (keyreq_l_ || old_accs_ != get_property ("keySignature"))
- {
- create_key (false);
- }
+ if (keyreq_l_ ||
+ get_property ("lastKeySignature") != get_property ("keySignature"))
+ create_key (false);
}
+
void
Key_engraver::stop_translation_timestep ()
-{
+{
if (item_p_)
{
typeset_grob (item_p_);
}
}
+
void
Key_engraver::read_req (Key_change_req const * r)
{
n = scm_delete_x (ly_car (s), n);
}
}
+
for (SCM s = n ; gh_pair_p (s); s = ly_cdr (s))
if (gh_scm2int (ly_cdar (s)))
accs = gh_cons (ly_car (s), accs);
- old_accs_ = get_property ("keySignature");
+ daddy_trans_l_->set_property ("lastKeySignature",
+ get_property ("keySignature"));
daddy_trans_l_->set_property ("keySignature", accs);
}
+
void
Key_engraver::start_translation_timestep ()
{
keyreq_l_ = 0;
- old_accs_ = get_property ("keySignature");
+ daddy_trans_l_->set_property ("lastKeySignature", get_property ("keySignature"));
}
+
void
Key_engraver::initialize ()
{
daddy_trans_l_->set_property ("keySignature", SCM_EOL);
- old_accs_ = SCM_EOL;
+ daddy_trans_l_->set_property ("lastKeySignature", SCM_EOL);
}
-
-
ENTER_DESCRIPTION(Key_engraver,
/* descr */ "",
/* creats*/ "KeySignature",
/* acks */ "bar-line-interface clef-interface",
-/* reads */ "keySignature explicitKeySignatureVisibility createKeyOnClefChange keyAccidentalOrder keySignature",
-/* write */ "");
+/* reads */ "keySignature lastKeySignature explicitKeySignatureVisibility createKeyOnClefChange keyAccidentalOrder keySignature",
+/* write */ "lastKeySignature");
SCM newas = me->get_grob_property ("new-accidentals");
Molecule mol;
+
+ SCM c0s = me->get_grob_property ("c0-position");
+ int c0p=0;
+ if (gh_number_p (c0s))
+ c0p = gh_scm2int (c0s);
+
/*
SCM lists are stacks, so we work from right to left, ending with
the cancellation signature.
*/
- int c0p = gh_scm2int (me->get_grob_property ("c0-position"));
for (SCM s = newas; gh_pair_p (s); s = ly_cdr (s))
{
return mol.smobbed_copy ();
}
-
-
-
-
bool
Key_item::has_interface (Grob*m)
{
}
-SCM
-ly_symbol2scm (const char *s)
-{
- return gh_symbol2scm ((char *)s);
-}
-
String
ly_symbol2string (SCM s)
read_lily_scm_file (String fn)
{
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" {
int
Music_output_def::print_smob (SCM s, SCM p, scm_print_state *)
{
- Translator_def * def = unsmob_translator_def (s);
+ Music_output_def * def = unsmob_music_output_def (s);
scm_puts ("#<Music_output_def ", p);
- scm_write (def->type_name_, p);
+ //scm_write (def->type_name_, p);
scm_puts (">", p);
return 1;
}
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",
+/* acks */ "stem-interface rhythmicb-head-interface dot-column-interface",
/* reads */ "",
/* write */ "");
#include "scm-hash.hh"
#include "ly-smobs.icc"
+void
+copy_scm_hashes (SCM dest, SCM src)
+{
+ for (int i = SCM_LENGTH(src); i--;)
+ for (SCM s = scm_vector_ref (src, SCM_MAKINUM (i)); ly_pair_p(s); s = ly_cdr (s))
+ {
+ scm_hashq_set_x (dest, ly_caar (s), ly_cdar (s));
+ }
+}
+
Scheme_hash_table::Scheme_hash_table ()
{
+ hash_tab_ = SCM_EOL;
smobify_self ();
+ hash_tab_ = scm_make_vector (gh_int2scm (119), SCM_EOL);
+ elt_count_ = 0;
}
Scheme_hash_table::Scheme_hash_table (Scheme_hash_table const &src)
- : Scm_stl_map (src)
+
{
+ hash_tab_ = SCM_EOL;
+ elt_count_ = src.elt_count_;
smobify_self ();
+
+ hash_tab_ = scm_make_vector (gh_int2scm (src.elt_count_ >? 11 ), SCM_EOL);
+ copy_scm_hashes (hash_tab_, src.hash_tab_);
}
void
Scheme_hash_table::operator = (Scheme_hash_table const & src)
{
- Scm_stl_map::operator = (src);
-
- // we do not copy the self_scm () field!
+ if (&src == this)
+ return;
+
+ elt_count_ = src.elt_count_;
+ hash_tab_ = scm_make_vector (gh_int2scm (src.elt_count_ >? 11), SCM_EOL);
+ copy_scm_hashes (hash_tab_, src.hash_tab_);
}
SCM
Scheme_hash_table::mark_smob (SCM s)
{
- /*
- can't typecheck naively, since GC bit lives in CAR of S
- */
-
Scheme_hash_table *me = (Scheme_hash_table*) SCM_CELL_WORD_1 (s);
-
- for (Scm_stl_map::const_iterator i= me->begin (); i != me->end (); i++)
- {
- scm_gc_mark ((*i).first);
- scm_gc_mark ((*i).second);
- }
+ scm_gc_mark (me->hash_tab_);
return SCM_EOL;
}
{
assert (unsmob (s));
char str[1000];
- sprintf (str, "#<Scheme_hash_table 0x%0x ", s);
- scm_puts (str, p);
- Scheme_hash_table *me = unsmob (s);
- for (Scm_stl_map::const_iterator i = me->begin (); i != me->end (); i++)
- {
- scm_display ((*i).first, p);
- scm_puts (" = ",p);
- scm_display ((*i).second, p);
- scm_puts ("\n",p);
- }
- scm_puts ("> ",p);
- return 1;
+ sprintf (str, "#<Scheme_hash_table 0x%0lx ", SCM_UNPACK(s));
+ Scheme_hash_table *me = (Scheme_hash_table*) SCM_CELL_WORD_1 (s);
+ scm_display (me->hash_tab_, p);
+ scm_puts ("> ",p);
+ return 1;
}
bool
Scheme_hash_table::try_retrieve (SCM k, SCM *v)
{
- Scm_stl_map ::const_iterator i (find (k));
- bool found = i != end ();
- if (found)
- *v = (*i).second;
- return found;
+ SCM handle = scm_hashq_get_handle (hash_tab_, k);
+ if (ly_pair_p (handle))
+ {
+ *v = ly_cdr (handle);
+ return true;
+ }
+ else
+ return false;
+
}
bool
Scheme_hash_table::elem_b (SCM k) const
{
- Scm_stl_map::const_iterator i (find (k));
- return i != end ();
+ return ly_pair_p (scm_hashq_get_handle (hash_tab_, k));
}
void
Scheme_hash_table::set (SCM k, SCM v)
{
- (*this)[k] = v;
+ assert (gh_symbol_p (k));
+ SCM handle = scm_hashq_create_handle_x (hash_tab_, k, SCM_UNDEFINED);
+ if (ly_cdr (handle) == SCM_UNDEFINED)
+ {
+ elt_count_++;
+ }
+
+ gh_set_cdr_x (handle, v);
+
+ /*
+ resize if getting too large.
+ */
+ if (elt_count_ > 2 * SCM_LENGTH (hash_tab_))
+ {
+ SCM nh = scm_make_vector (gh_int2scm (3* elt_count_+1), SCM_EOL);
+ copy_scm_hashes (nh, hash_tab_);
+ hash_tab_ = nh;
+ }
+
}
// UGH.
SCM
Scheme_hash_table::get (SCM k)const
{
- return (* (Scheme_hash_table*)this)[k];
+ /*
+ 42 will stick out like a sore thumb, hopefully.
+ */
+ return scm_hashq_ref (hash_tab_, k, SCM_MAKINUM(42));
}
void
Scheme_hash_table::remove (SCM k)
{
- Scm_stl_map::erase (k);
+ scm_hashq_remove_x (hash_tab_, k);
+ elt_count_ --;
}
Scheme_hash_table::~Scheme_hash_table ()
Scheme_hash_table::to_alist () const
{
SCM l = SCM_EOL;
- for (Scm_stl_map ::const_iterator i = begin (); i != end (); i++)
- l = gh_cons (gh_cons ((*i).first, (*i).second), l);
+ for (int i = SCM_LENGTH(hash_tab_); i--;)
+ for (SCM s = scm_vector_ref (hash_tab_, gh_int2scm (i)); ly_pair_p(s); s = ly_cdr (s))
+ {
+ l = scm_acons (ly_caar (s), ly_cdar (s), l);
+ }
return l;
}
+
IMPLEMENT_UNSMOB (Scheme_hash_table,scheme_hash);
IMPLEMENT_SMOBS (Scheme_hash_table);
IMPLEMENT_DEFAULT_EQUAL_P (Scheme_hash_table);
/*
TODO: this is not very elegant....
*/
- /* 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;
if (rb)
find_rods (rb, ly_cdr (s));
}
-
find_musical_sequences (me);
#if 0
/*
+++ /dev/null
-/*
- symbol-cache.cc -- implement a cache for literal symbols, eg
- symbol ("foo-bar")
-
-
- source file of the GNU LilyPond music typesetter
-
- (c) 2000--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
- */
-
-#include <map>
-#include "lily-guile.hh"
-
-#if 0
-
-typedef map<const char*, SCM> Literal_symbol_map;
-Literal_symbol_map literal_map;
-
-
-SCM
-symbol (const char*s)
-{
- Literal_symbol_map::const_iterator i = literal_map.find (s);
- if (i != literal_map.end ())
- return (*i).second;
-
- SCM sym = gh_symbol2scm ((char*)s);
- scm_permanent_object (sym);
- literal_map[s] = sym;
- return sym;
-}
-
-
-/*
- This is a gory trick to cache the value gh_symbol2scm (), without
- cluttering up the C code with snarf macros.
-
- You should *ONLY* use symbol () for arguments that are literal
- strings!
-
- without (wtk1-fugue2)
-
- real 0m20.157s
- user 0m19.800s
- sys 0m0.140s
-
- with: (per file.)
-
- real 0m19.284s
- user 0m18.630s
- sys 0m0.190s
-
-
- global with STL map
-
- real 0m20.616s
- user 0m19.360s
- sys 0m0.080s
-
- global with binsearch.
-
- real 0m19.352s
- user 0m18.710s
- sys 0m0.230s
-
- local binsearch
-
- user 18.8
-
- local with binsearch, and other optimizations.
-
- 17.7
-*/
-#endif
-
-
-\version "1.3.148"
+\version "1.5.12"
-% german-chords.ly:
+% german-chords-init.ly:
% german/norwegian/danish?
% To get Bb instead of B, use
-% \include "german-chords.ly"
+% \include "german-chords-init.ly"
% #(set! german-Bb #t)
#(define german-Bb #f)
(list 7 (+ (if german-Bb 0 1) (caddr pitch)))
(cdr pitch)
)))
- (cons
+ (list
+ 'columns
(list-ref '("C" "D" "E" "F" "G" "A" "H" "B") (car dopitch))
(accidental->text-super (cadr dopitch))
)
}
stopGraceMusic = {
+ \property Staff.Accidentals \revert #'font-relative-size
\property Voice.Beam \revert #'space-function
\property Voice.Beam \revert #'thickness
% be smaller as well.
\property Voice.fontSize \unset
- \property Staff.LocalKeyItem \revert #'font-relative-size
}
papersizename = \papersize
% ly2dvi now uses `papersize' internally (and on cmd line)
-papersize = \papersize
+%papersize = \papersize
% FIXME
% direct PostScript line height for single line staves
% To remove a Volta bracet or some other graphical object,
% set it to turnOff. Example: \property Staff.VoltaBracket = \turnOff
-turnOff = #'((meta . ((interfaces . ()))))
+turnOff = #'()
Begin3
Title: LilyPond
-Version: 1.5.13
-Entered-date: 24SEP01
+Version: 1.5.14
+Entered-date: 29SEP01
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.13.tar.gz
+ 1000k lilypond-1.5.14.tar.gz
Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 1000k lilypond-1.5.13.tar.gz
+ 1000k lilypond-1.5.14.tar.gz
Copying-policy: GPL
End
%define name lilypond
-%define version 1.5.13
+%define version 1.5.14
%define release 1mdk
Name: %{name}
%define info yes
Name: lilypond
-Version: 1.5.13
+Version: 1.5.14
Release: 1
License: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.13.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.14.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.13
+Version: 1.5.14
Release: 2
Copyright: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.13.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.14.tar.gz
# music notation software for.. ?
Summary: A program for printing sheet music.
URL: http://www.lilypond.org/
;; alist of property descriptions
+;;;;;; TODO: sort out symbol vs. string stuff.
+;;;;;; TODO: use flatten write iso. string-append; might be possible to fold
+;;;;;; in symbol->string integrally.
+
(define (backend-property->texi sym)
(let* ((name (symbol->string sym))
(type (object-property sym 'backend-type?))
(node (grob-name name))
(texi-section 2 (grob-name name) #f)
"\n"
- (let* ((grob (string->symbol name))
+ (let* ((grob name)
(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: "
+ (symbol->string name) " grobs are created by: "
(human-listify (map ref-ify
(map engraver-name engraver-names)))))
(apply string-append ifacedoc))))
-(define (engraver-makes-grob? name grav)
- (memq name (assoc 'grobs-created (Translator::description grav)))
+(define (engraver-makes-grob? name-symbol grav)
+ (memq name-symbol (assoc 'grobs-created (Translator::description grav)))
)
(define (document-all-grobs name)
(name (Translator::name engraver))
(name-sym (string->symbol name))
(desc (cdr (assoc 'description (Translator::description engraver))))
- (grobs (cdr (assoc 'grobs-created (Translator::description engraver))))
+ (grobs (engraver-grobs engraver))
)
(string-append
(apply string-append
(map document-engraver-by-name consists))))))
-(define (engraver-grobs name)
+(define (engraver-grobs grav)
(let* (
- (eg (find-engraver-by-name name all-engravers-list))
- )
+ (eg (if (string? grav)
+ (find-engraver-by-name grav all-engravers-list)
+ grav))
+
+ )
(if (eq? eg #f)
'()
- (cdr (assoc 'grobs-created (Translator::description eg)))
+ (map symbol->string (cdr (assoc 'grobs-created (Translator::description eg))))
)
))
-
;;; generate-documentation.scm -- Generate documentation
;;;
;;; source file of the GNU LilyPond music typesetter
(document-music "LilyPond music properties")
(document-paper "LilyPond interpretation contexts")
(document-all-engravers "LilyPond engravers")
- (document-all-engraver-properties "LilyPond context properties")
+ (document-all-engraver-properties "LilyPond context properties")
(document-all-grobs "LilyPond backend")
(document-all-interfaces "LilyPond interfaces")
(document-all-backend-properties "LilyPond backend properties")
")
(translator-property-description 'keySignature list? "The current key signature. This is an alist containing (NAME . ALTER) or ((OCTAVE . NAME) . ALTER) pairs, where NAME is from 0.. 6 and ALTER from -2,-1,0,1,2 ")
+(translator-property-description 'lastKeySignature list? "Last key
+signature before a key signature change.")
+
(translator-property-description 'localKeySignature list? "the key
signature at this point in the measure. The format is the same as for keySignature. "
)
%
% escape the colon with \string to avoid problems with french babel
%
+\def\PSsetTeXdimen#1{\expandafter\special{! /#1 (\csname #1\endcsname) set_tex_dimen}}
\def\lilySpace{ }
\def\turnOnPostScript{%
% This sets CTM so that you get to the currentpoint
% FUCKING REDHAT XDVI -- ARG!
skeel ##1 @endspecial}%
}
+ \PSsetTeXdimen{lilypondpaperblotdiameter}
}
-\def\PSsetTeXdimen#1{\expandafter\special{! /#1 (\csname #1\endcsname) set_tex_dimen}}
-\PSsetTeXdimen{lilypondpaperblotdiameter}
\def\turnOnExperimentalFeatures{}