From: fred Date: Tue, 26 Mar 2002 23:21:46 +0000 (+0000) Subject: lilypond-1.3.50 X-Git-Tag: release/1.5.59~1639 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f83d442cd94c6bfe3d70f746098e60f953242c6c;p=lilypond.git lilypond-1.3.50 --- diff --git a/Documentation/faq.texi b/Documentation/faq.texi index 5934078e7f..64232c2ae0 100644 --- a/Documentation/faq.texi +++ b/Documentation/faq.texi @@ -313,12 +313,12 @@ tagline="Typeset by GNU LilyPond" Theoretically, yes but it is easier to do with TeX: @example -\def\foo{\hbox{\vrule width 15.0cm height 0.5pt depth 0.0pt} +\def\foo@{\hbox@{\vrule width 15.0cm height 0.5pt depth 0.0pt@} \nointerlineskip -\vskip 5pt\nointerlineskip} -\def\musicline{\vbox { +\vskip 5pt\nointerlineskip@} +\def\musicline@{\vbox @{ \foo\foo\foo\foo\foo -}\par} +@}\par@} \musicline \musicline diff --git a/Documentation/user/properties.itely b/Documentation/user/properties.itely index 52af602fee..4bb6362dfd 100644 --- a/Documentation/user/properties.itely +++ b/Documentation/user/properties.itely @@ -368,7 +368,7 @@ number respectively. Setting it to false will prevent printing of the associated element. Setting the property to 'if-no-beam will make it print only if there is no beam associated with this tuplet bracket. -[fixme examples] +@mudelafile[verbatim]{tuplet.ly} @item @code{tupletInvisible}@indexcode{tupletInvisible} @propertytype{boolean} diff --git a/ROADMAP b/ROADMAP index 3894dd5d9e..dfe496a678 100644 --- a/ROADMAP +++ b/ROADMAP @@ -31,9 +31,6 @@ LilyPond's source files. F.Schubert/ Hymns/ J.S.Bach/ - L.Mozart/ - N.W.Gade/ - W.A.Mozart/ intl/ library for gettext po/ translations ps/ postscript library files diff --git a/config.hh.in b/config.hh.in index 65772eaae9..833c0eec00 100644 --- a/config.hh.in +++ b/config.hh.in @@ -24,9 +24,6 @@ /* define if you have isinf */ #define HAVE_ISINF 0 -/* define if you have isinf */ -#define HAVE_ISINF 0 - /* define if explicit instantiation is needed */ #undef NEED_EXPLICIT_INSTANTIATION diff --git a/flower/include/dictionary.hh b/flower/include/dictionary.hh index 3cb1069b39..9134b80afc 100644 --- a/flower/include/dictionary.hh +++ b/flower/include/dictionary.hh @@ -27,6 +27,9 @@ struct Dict_initialiser }; +/* + DEPRECATED. Use either SCM (preferred) or STL + */ template class Dictionary : public Hash_table { diff --git a/flower/include/hash-table.hh b/flower/include/hash-table.hh index bd437e6e97..f3f5bfe234 100644 --- a/flower/include/hash-table.hh +++ b/flower/include/hash-table.hh @@ -43,7 +43,9 @@ struct Hash_table_entry A hash table of prime size. We use quadratic probing. - */ + + DEPRECATED. Use either SCM (preferred) or STL +*/ template class Fixed_size_hash_table { diff --git a/flower/include/tuple.hh b/flower/include/tuple.hh index 251eca1afd..1adf194f1a 100644 --- a/flower/include/tuple.hh +++ b/flower/include/tuple.hh @@ -9,6 +9,7 @@ #ifndef TUPLET_HH #define TUPLET_HH +#error template diff --git a/input/bugs/slur.ly b/input/bugs/slur.ly new file mode 100644 index 0000000000..c2a8552d1d --- /dev/null +++ b/input/bugs/slur.ly @@ -0,0 +1,5 @@ + + \score { + \notes \relative c' { + c2( c \break c c c c \break c +}} diff --git a/input/test/pedal.ly b/input/test/pedal.ly index 40410a32f6..a30ab93a09 100644 --- a/input/test/pedal.ly +++ b/input/test/pedal.ly @@ -1,7 +1,7 @@ \score{ \context Staff \notes\relative c'{ -c\sustaindown d e f\sustainup g\sustaindown b c -c,\sustainup\sustaindown d e f \sustainup g\sustaindown b c +c4\sustaindown d e f\sustainup g\sustaindown b c +c, [d16 \sustainup \sustaindown c c c] [e e \sustainup \sustaindown e e ] f4 \sustainup g\sustaindown b c \property Staff.stopStartSustain = #"-P" \property Staff.startSustain = #"P" c,\sustainup\sustaindown d e f \sustainup g\sustaindown b c diff --git a/input/test/tuplet.ly b/input/test/tuplet.ly index 68e2768fd3..d39c302143 100644 --- a/input/test/tuplet.ly +++ b/input/test/tuplet.ly @@ -1,50 +1,15 @@ +\version "1.3.47" + \score { - \context Voice \notes\relative c { - \property Voice.textEmptyDimension = 1 - \property Voice.textScriptPadding = 10 - \property Voice.tupletVisibility = 0 - \times2/3{c'4^"tupletVisibility = 0" d e} \times2/3{[f8 g a]} - \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 1 - \times2/3{c,4^"tupletVisibility = 1" d e} \times2/3{[f8 g a]} - \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 2 - \times2/3{c,4^"tupletVisibility = 2" d e} \times2/3{[f8 g a]} - \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 3 - \times2/3{c,4^"tupletVisibility = 3" d e} \times2/3{[f8 g a]} - \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 4 - \times2/3{c,4^"tupletVisibility = 4" d e} \times2/3{[f8 g a]} - \times2/3{b16 c d} c8 | \break - - \property Voice.tupletDirection = \down - \property Voice.tupletVisibility = 0 - \times2/3{c,4^"tupletDirection = down" d e} - \times2/3{[[f8 g a]]} \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 1 - \times2/3{c,4 d e} \times2/3{[f8 g a]} \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 2 - \times2/3{c,4 d e} \times2/3{[f8 g a]} \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 3 - \times2/3{c,4 d e} \times2/3{[f8 g a]} \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 4 - \times2/3{c,4 d e} \times2/3{[f8 g a]} \times2/3{b16 c d} c8 |\break - - \property Voice.tupletDirection = \up - \property Voice.tupletVisibility = 0 - \times2/3{c,4^"tupletDirection = up" d e} - \times2/3{[[f8 g a]]} \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 1 - \times2/3{c,4 d e} \times2/3{[f8 g a]} \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 2 - \times2/3{c,4 d e} \times2/3{[f8 g a]} \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 3 - \times2/3{c,4 d e} \times2/3{[f8 g a]} \times2/3{b16 c d} c8 | - \property Voice.tupletVisibility = 4 - \times2/3{c,4 d e} \times2/3{[f8 g a]} \times2/3{b16 c d} c8 | - - } - \paper { } - \midi { } -} \ No newline at end of file + \context Voice \notes\relative c'' { + + \times 2/3 { [c8 c c] } + \times 2/3 { c8 [c c] } + + \property Voice .tupletBracketVisibility = #'if-no-beam + \times 2/3 { [c8 c c] } + \property Voice .tupletDirection = #1 + \property Voice .tupletNumberVisibility = ##f + \times 2/3 { c8 [c c] } +} +} diff --git a/lily/beam.cc b/lily/beam.cc index 027a08d70f..e19a82270b 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -13,13 +13,11 @@ * less hairy code * move paper vars to scm - remove *-hs variables. - */ -#include // tanh. +#include // tanh. #include "directional-element-interface.hh" #include "beaming.hh" #include "dimensions.hh" diff --git a/lily/bezier.cc b/lily/bezier.cc index 0ced85b840..72bd0e0f46 100644 --- a/lily/bezier.cc +++ b/lily/bezier.cc @@ -31,8 +31,6 @@ binomial_coefficient (Real over , int under) void flip (Array* arr_p, Axis a) { - // huh? - // for (int i = c.size (); i--;) for (int i = 0; i < arr_p->size (); i++) (*arr_p)[i][a] = - (*arr_p)[i][a]; } diff --git a/lily/breathing-sign.cc b/lily/breathing-sign.cc index 2c1f515249..64e588f727 100644 --- a/lily/breathing-sign.cc +++ b/lily/breathing-sign.cc @@ -8,9 +8,9 @@ TODO: --> see breathing-sign-engraver.cc */ + #include "staff-symbol-referencer.hh" #include "directional-element-interface.hh" - #include "breathing-sign.hh" #include "string.hh" #include "molecule.hh" @@ -32,6 +32,8 @@ Breathing_sign::do_brew_molecule () const Staff_symbol_referencer_interface si (this); Real space = si.staff_space(); + + // todo: cfg'able. Interval i1(0, space / 6), i2(-space / 2, space / 2); Box b(i1, i2); diff --git a/lily/chord-name.cc b/lily/chord-name.cc index bb6fbbc1ea..7a05a08844 100644 --- a/lily/chord-name.cc +++ b/lily/chord-name.cc @@ -25,10 +25,14 @@ "text" ("style" . "text") */ + +/* + UGH. remove Dictionary< > and use Scheme_hash_table + */ Molecule Chord_name::ly_word2molecule (SCM word) const { - Dictionary option_dict; + Dictionary option_dict; // junkme if (gh_pair_p (word)) { SCM options = gh_cdr (word); diff --git a/lily/clef-item.cc b/lily/clef-item.cc index f0a8b8566f..21d97d8075 100644 --- a/lily/clef-item.cc +++ b/lily/clef-item.cc @@ -10,14 +10,7 @@ #include "clef-item.hh" #include "string.hh" #include "molecule.hh" -#include "paper-def.hh" -#include "lookup.hh" #include "text-item.hh" -#include "paper-score.hh" -#include "dimension-cache.hh" -#include "side-position-interface.hh" -#include "warn.hh" -#include "line-of-score.hh" void Clef_item::before_line_breaking () diff --git a/lily/collision-engraver.cc b/lily/collision-engraver.cc index 16d0bf30ea..eebb06122b 100644 --- a/lily/collision-engraver.cc +++ b/lily/collision-engraver.cc @@ -7,16 +7,29 @@ */ #include "note-column.hh" -#include "collision-engraver.hh" #include "collision.hh" #include "dimension-cache.hh" +#include "engraver.hh" + +class Collision_engraver : public Engraver { + Collision* col_p_; + Link_array note_column_l_arr_; + +protected: + virtual void acknowledge_element (Score_element_info); + virtual void process_acknowledged (); + virtual void do_pre_move_processing(); +public: + VIRTUAL_COPY_CONS(Translator); + Collision_engraver(); +}; + void Collision_engraver::process_acknowledged () { - if (col_p_ || note_column_l_arr_.size () < 2) - return ; + return ; if (!col_p_) { col_p_ = new Collision; diff --git a/lily/collision.cc b/lily/collision.cc index c25f45d05c..32ee0d69f6 100644 --- a/lily/collision.cc +++ b/lily/collision.cc @@ -26,28 +26,29 @@ Collision::add_column (Note_column* ncol_l) add_dependency (ncol_l); } -/* - UGH. junk Shift_tup . - */ - void Collision::before_line_breaking () { - Array autos (automatic_shift ()); - Array hand (forced_shift ()); + SCM autos (automatic_shift ()); + SCM hand (forced_shift ()); Link_array done; Real wid = paper_l ()->get_var ("collision_note_width"); - for (int i=0; i < hand.size (); i++) + for (; gh_pair_p (hand); hand =gh_cdr (hand)) { - hand[i].e1_->translate_axis (hand[i].e2_ *wid, X_AXIS); - done.push (hand[i].e1_); + Score_element * s = unsmob_element (gh_caar (hand)); + Real amount = gh_scm2double (gh_cdar (hand)); + + s->translate_axis (amount *wid, X_AXIS); + done.push (s); } - - for (int i=0; i < autos.size (); i++) + for (; gh_pair_p (autos); autos =gh_cdr (autos)) { - if (!done.find_l (autos[i].e1_)) - autos[i].e1_->translate_axis (autos[i].e2_ * wid, X_AXIS); + Score_element * s = unsmob_element (gh_caar (autos)); + Real amount = gh_scm2double (gh_cdar (autos)); + + if (!done.find_l (s)) + s->translate_axis (amount * wid, X_AXIS); } } @@ -57,13 +58,12 @@ Collision::before_line_breaking () This should be done better, probably. */ -Array< Shift_tup > +SCM Collision::automatic_shift () { Drul_array > clash_groups; Drul_array > shifts; - Array tups; - + SCM tups = SCM_EOL; SCM s = get_elt_property ("elements"); for (; gh_pair_p (s); s = gh_cdr (s)) @@ -151,8 +151,8 @@ Collision::automatic_shift () Note_head * nu_l= cu_l->first_head(); Note_head * nd_l = cd_l->first_head(); - int downpos = cd_l->head_positions_interval ()[BIGGER]; - int uppos = cu_l->head_positions_interval ()[SMALLER]; + int downpos = cd_l->head_positions_interval ()[BIGGER]; + int uppos = cu_l->head_positions_interval ()[SMALLER]; bool merge = downpos == uppos @@ -179,17 +179,18 @@ Collision::automatic_shift () do { for (int i=0; i < clash_groups[d].size (); i++) - tups.push (Shift_tup (clash_groups[d][i], offsets[d][i])); + tups = gh_cons (gh_cons (clash_groups[d][i]->self_scm_, gh_double2scm (offsets[d][i])), + tups); } while (flip (&d) != UP); return tups; } -Array +SCM Collision::forced_shift () { - Array tups; + SCM tups = SCM_EOL; SCM s = get_elt_property ("elements"); for (; gh_pair_p (s); s = gh_cdr (s)) @@ -199,7 +200,8 @@ Collision::forced_shift () SCM force = se->remove_elt_property ("force-hshift"); if (gh_number_p (force)) { - tups. push (Shift_tup (se, gh_scm2double (force))); + tups = gh_cons (gh_cons (se->self_scm_, force), + tups); } } return tups; diff --git a/lily/include/collision.hh b/lily/include/collision.hh index 64052db5e0..7a7b5379f2 100644 --- a/lily/include/collision.hh +++ b/lily/include/collision.hh @@ -11,10 +11,7 @@ #define COLLISION_HH #include "lily-proto.hh" #include "item.hh" -#include "tuple.hh" -//junkme, use SCM conses. -typedef Tuple Shift_tup; /** Resolve conflicts between various Note_columns (chords). @@ -27,8 +24,8 @@ typedef Tuple Shift_tup; class Collision : public Item { protected: - Array automatic_shift (); - Array forced_shift (); + SCM automatic_shift (); + SCM forced_shift (); virtual void before_line_breaking (); public: diff --git a/lily/include/ly-smobs.icc b/lily/include/ly-smobs.icc index 9b54ddc24e..b652432ca8 100644 --- a/lily/include/ly-smobs.icc +++ b/lily/include/ly-smobs.icc @@ -31,7 +31,9 @@ return s;\ }\ - +/* + should include equal_p ? + */ #define IMPLEMENT_SMOBS(CL)\ long CL::smob_tag_;\ static scm_smobfuns CL ## _funs = { \ diff --git a/lily/include/score-element-callback.hh b/lily/include/score-element-callback.hh new file mode 100644 index 0000000000..949ceec254 --- /dev/null +++ b/lily/include/score-element-callback.hh @@ -0,0 +1,21 @@ +/* + score-element-callback.hh -- declare Score_element callbacks + + source file of the GNU LilyPond music typesetter + + (c) 2000 Han-Wen Nienhuys + + */ + +#ifndef SCORE_ELEMENT_CALLBACK_HH +#define SCORE_ELEMENT_CALLBACK_HH + +#include "lily-proto.hh" +#include "lily-guile.hh" + +typedef SCM (* Score_element_callback) (Score_element * , SCM extra_params); +SCM smobify_callback (Score_element_callback cb); + + +#endif /* SCORE_ELEMENT_CALLBACK_HH */ + diff --git a/lily/include/score-element.hh b/lily/include/score-element.hh index 768152545e..8bc4761cf1 100644 --- a/lily/include/score-element.hh +++ b/lily/include/score-element.hh @@ -140,6 +140,7 @@ public: */ void calculate_dependencies (int final, int busy, Score_element_method_pointer funcptr); + static SCM handle_broken_smobs (SCM, SCM criterion); void recurse_into_smobs (SCM s, void (Score_element::*meth_ptr)()); @@ -199,11 +200,7 @@ public: bool used_b_; char const * name () const; - /** - Set empty in direction A. - JUNKME - */ - void set_empty (Axis a); + bool empty_b (Axis a) const; Interval extent (Axis) const; diff --git a/lily/include/sustain-pedal.hh b/lily/include/sustain-pedal.hh new file mode 100644 index 0000000000..b2ae20e984 --- /dev/null +++ b/lily/include/sustain-pedal.hh @@ -0,0 +1,43 @@ +/* + sustain-pedal.hh -- declare + + source file of the GNU LilyPond music typesetter + + (c) 2000 Han-Wen Nienhuys + + */ + +#ifndef SUSTAIN_PEDAL_HH +#define SUSTAIN_PEDAL_HH + +#include "item.hh" + + +/* + Urg. + This is almost text + Problem is: + * we have no kerning + * symbols are at wrong place in font + + + + Properties: + + glyph -- text string (TODO: make one large glyph of the Ped symbol, removes need for do_brew_molecule ()) + +*/ + +class Sustain_pedal : public Item +{ +public: + VIRTUAL_COPY_CONS (Score_element); + +protected: + virtual Molecule do_brew_molecule () const; + virtual void after_line_breaking (); +}; + + +#endif /* SUSTAIN_PEDAL_HH */ + diff --git a/lily/note-column.cc b/lily/note-column.cc index 909629921c..1f424860fe 100644 --- a/lily/note-column.cc +++ b/lily/note-column.cc @@ -44,6 +44,7 @@ Note_column::Note_column() set_elt_property ("note-heads", SCM_EOL); Axis_group_interface (this).set_interface (); Axis_group_interface (this).set_axes (X_AXIS, Y_AXIS); + Group_interface (this, "interfaces").add_thing (ly_symbol2scm ("Note_column")); } Stem * diff --git a/lily/piano-pedal-engraver.cc b/lily/piano-pedal-engraver.cc index 61d00a4e96..be57de3d8b 100644 --- a/lily/piano-pedal-engraver.cc +++ b/lily/piano-pedal-engraver.cc @@ -16,106 +16,38 @@ #include "stem.hh" #include "side-position-interface.hh" #include "staff-symbol-referencer.hh" -#include "dictionary.hh" -#include "dictionary-iter.hh" #include "text-item.hh" - -/* - Urg. - This is almost text - Problem is: - * we have no kerning - * symbols are at wrong place in font -*/ - -class Sustain_pedal : public Item -{ -public: - VIRTUAL_COPY_CONS (Score_element); - -protected: - virtual Molecule do_brew_molecule () const; - virtual void after_line_breaking (); -}; - -void -Sustain_pedal::after_line_breaking () -{ - Side_position_interface i (this); - Direction d = i.get_direction (); - i.set_direction (d); -} - -Molecule -Sustain_pedal::do_brew_molecule () const -{ - Molecule mol; - SCM glyph = get_elt_property ("glyph"); - if (glyph == SCM_UNDEFINED) - return mol; - String text = ly_scm2string (glyph); - - for (int i = 0; i < text.length_i (); i++) - { - // leuke koor dump door tiepo, snapnie helemaal: - //String idx = ("pedal-") + text[i]; - // urg, Byte* ?? - // braak: waarom vindt String het zo moeilijk om - // String + char te doen? - //String idx = "pedal-" + String (&text.byte_C ()[i], 1); - String idx = String ("pedal-") + String (&text.byte_C ()[i], 1); - Molecule m = lookup_l ()->afm_find (idx); - if (m.empty_b ()) - continue; - Real kern = 0; - if (i) - { - SCM s = scm_eval (gh_list (ly_symbol2scm ("pedal-kerning"), - ly_str02scm (String (&text.byte_C ()[i - 1], 1).ch_C ()), - ly_str02scm (String (&text.byte_C ()[i], 1).ch_C ()), - SCM_UNDEFINED)); - if (gh_number_p (s)) - { - Staff_symbol_referencer_interface st (this); - Real staff_space = st.staff_space (); - kern = gh_scm2double (s) * staff_space; - } - } - mol.add_at_edge (X_AXIS, RIGHT, m, kern); - } - - return mol; -} - - +#include "sustain-pedal.hh" /* TODO: - * it would be real cool if an engraver could be initialised with a + * it would be really cool if an engraver could be initialised with a string, ie: Piano_pedal_engraver::"sostenuto" Piano_pedal_engraver::"sustain" Piano_pedal_engraver::"una-chorda" + */ +/* + Would it? The semantics are unclear, and real benefits are muddy + too. --hwn +*/ + + + /** - engrave Piano pedals + engrave Piano pedals symbols. */ class Piano_pedal_engraver : public Engraver { - struct Pedal_info - { - Span_req* start_req_l_; - Drul_array req_l_drul_; - Item* item_p_; - }; - public: VIRTUAL_COPY_CONS (Translator); Piano_pedal_engraver (); - + ~Piano_pedal_engraver (); protected: + virtual void do_creation_processing (); virtual bool do_try_music (Music*); virtual void do_process_music (); virtual void do_pre_move_processing (); @@ -123,24 +55,49 @@ protected: virtual void acknowledge_element (Score_element_info); private: - Dictionary info_dict_; + struct Pedal_info + { + char const * name_; + Span_req* start_req_l_; + Drul_array req_l_drul_; + Item* item_p_; + }; + + + Pedal_info *info_list_; }; ADD_THIS_TRANSLATOR (Piano_pedal_engraver); Piano_pedal_engraver::Piano_pedal_engraver () { - (void)info_dict_["Sostenuto"]; - (void)info_dict_["Sustain"]; - (void)info_dict_["UnaChorda"]; - for (Dictionary_iter i (info_dict_); i.ok (); i++) + info_list_ = 0; +} +void +Piano_pedal_engraver::do_creation_processing() +{ + info_list_ = new Pedal_info[4]; + Pedal_info *p = info_list_; + + + char * names [] = { "Sostenuto", "Sustain", "UnaChorda", 0 }; + char **np = names ; + do { - Pedal_info& p = i.val_ref (); - p.item_p_ = 0; - p.req_l_drul_[START] = 0; - p.req_l_drul_[STOP] = 0; - p.start_req_l_ = 0; + p->name_ = *np; + p->item_p_ = 0; + p->req_l_drul_[START] = 0; + p->req_l_drul_[STOP] = 0; + p->start_req_l_ = 0; + + p++; } + while (*(np ++)); +} + +Piano_pedal_engraver::~Piano_pedal_engraver() +{ + delete[] info_list_; } /* @@ -150,22 +107,21 @@ Piano_pedal_engraver::Piano_pedal_engraver () void Piano_pedal_engraver::acknowledge_element (Score_element_info info) { - for (Dictionary_iter i (info_dict_); i.ok (); i++) + for (Pedal_info*p = info_list_; p->name_; p ++) { - Pedal_info& p = i.val_ref (); - if (p.item_p_) + if (p->item_p_) { if (Note_head* n = dynamic_cast (info.elem_l_)) { - Side_position_interface st (p.item_p_); + Side_position_interface st (p->item_p_); st.add_support (n); if (st.get_axis( ) == X_AXIS - && !p.item_p_->parent_l (Y_AXIS)) - p.item_p_->set_parent (n, Y_AXIS); + && !p->item_p_->parent_l (Y_AXIS)) + p->item_p_->set_parent (n, Y_AXIS); } if (Stem* s = dynamic_cast (info.elem_l_)) { - Side_position_interface st (p.item_p_); + Side_position_interface st (p->item_p_); st.add_support (s); } } @@ -175,14 +131,13 @@ Piano_pedal_engraver::acknowledge_element (Score_element_info info) bool Piano_pedal_engraver::do_try_music (Music *m) { - for (Dictionary_iter i (info_dict_); i.ok (); i++) + if (Span_req * s = dynamic_cast(m)) { - Pedal_info& p = i.val_ref (); - if (Span_req * s = dynamic_cast(m)) + for (Pedal_info*p = info_list_; p->name_; p ++) { - if (s->span_type_str_ == i.key ()) + if (s->span_type_str_ == p->name_) { - p.req_l_drul_[s->span_dir_] = s; + p->req_l_drul_[s->span_dir_] = s; return true; } } @@ -193,70 +148,65 @@ Piano_pedal_engraver::do_try_music (Music *m) void Piano_pedal_engraver::do_process_music () { - for (Dictionary_iter i (info_dict_); i.ok (); i++) + for (Pedal_info*p = info_list_; p->name_; p ++) { - Pedal_info& p = i.val_ref (); SCM s = SCM_UNDEFINED; - if (p.req_l_drul_[STOP] && p.req_l_drul_[START]) + if (p->req_l_drul_[STOP] && p->req_l_drul_[START]) { - if (!p.start_req_l_) + if (!p->start_req_l_) { - p.req_l_drul_[STOP]->warning (_f ("can't find start of piano pedal: %s", i.key ())); + p->req_l_drul_[STOP]->warning (_f ("can't find start of piano pedal: %s", p->name_ )); } else { - s = get_property ("stopStart" + i.key ()); + s = get_property ("stopStart" + String (p->name_ )); } - p.start_req_l_ = p.req_l_drul_[START]; + p->start_req_l_ = p->req_l_drul_[START]; } - else if (p.req_l_drul_[STOP]) + else if (p->req_l_drul_[STOP]) { - if (!p.start_req_l_) + if (!p->start_req_l_) { - p.req_l_drul_[STOP]->warning (_f ("can't find start of piano pedal: %s", i.key ())); + p->req_l_drul_[STOP]->warning (_f ("can't find start of piano pedal: %s", p->name_ )); } else { - s = get_property ("stop" + i.key ()); + s = get_property ("stop" + String (p->name_ )); } - p.start_req_l_ = 0; + p->start_req_l_ = 0; } - else if (p.req_l_drul_[START]) + else if (p->req_l_drul_[START]) { - p.start_req_l_ = p.req_l_drul_[START]; - s = get_property ("start" + i.key ()); + p->start_req_l_ = p->req_l_drul_[START]; + s = get_property ("start" + String (p->name_ )); } if (s != SCM_UNDEFINED) { - if (i.key () == "Sustain") + if (p->name_ == String ("Sustain")) { - p.item_p_ = new Sustain_pedal; - p.item_p_->set_elt_property ("glyph", s); + p->item_p_ = new Sustain_pedal; + p->item_p_->set_elt_property ("text", s); } else { - p.item_p_ = new Text_item; - p.item_p_->set_elt_property ("text", s); + p->item_p_ = new Text_item; + p->item_p_->set_elt_property ("text", s); // guh - p.item_p_->set_elt_property ("style", ly_str02scm ("italic")); + p->item_p_->set_elt_property ("style", ly_str02scm ("italic")); } - Side_position_interface si (p.item_p_); + Side_position_interface si (p->item_p_); si.set_axis (Y_AXIS); - /* Hmm, - If set to empty, it can't be centred - Howto centre non-fat text? - p.item_p_->set_empty (X_AXIS); - */ - p.item_p_->set_elt_property ("self-alignment-X", gh_int2scm (0)); - p.item_p_->add_offset_callback (Side_position_interface::aligned_on_self, X_AXIS); - p.item_p_->add_offset_callback (Side_position_interface::centered_on_parent, X_AXIS); - announce_element (Score_element_info (p.item_p_, - p.req_l_drul_[START] - ? p.req_l_drul_[START] - : p.req_l_drul_[STOP])); + p->item_p_->set_elt_property ("no-spacing-rods" , SCM_BOOL_T); + p->item_p_->set_elt_property ("self-alignment-X", gh_int2scm (0)); + p->item_p_->add_offset_callback (Side_position_interface::aligned_on_self, X_AXIS); + p->item_p_->add_offset_callback (Side_position_interface::centered_on_parent, X_AXIS); + announce_element (Score_element_info (p->item_p_, + p->req_l_drul_[START] + ? p->req_l_drul_[START] + : p->req_l_drul_[STOP])); } } } @@ -264,36 +214,41 @@ Piano_pedal_engraver::do_process_music () void Piano_pedal_engraver::do_pre_move_processing () { - for (Dictionary_iter i (info_dict_); i.ok (); i++) + Item * sustain = 0; + for (Pedal_info*p = info_list_; p->name_; p ++) + { + if (p->name_ == String ("Sustain")) + sustain = p->item_p_; + } + + for (Pedal_info*p = info_list_; p->name_; p ++) { - Pedal_info& p = i.val_ref (); - if (p.item_p_) + if (p->item_p_) { - side_position (p.item_p_).add_staff_support (); + side_position (p->item_p_).add_staff_support (); /* Hmm. */ - if (i.key () != "Sustain") + if (p->name_ != String ("Sustain")) { - if (Item* sustain = info_dict_["Sustain"].item_p_) + if (sustain) { - Side_position_interface st (p.item_p_); + Side_position_interface st (p->item_p_); st.add_support (sustain); } } - typeset_element (p.item_p_); + typeset_element (p->item_p_); } - p.item_p_ = 0; + p->item_p_ = 0; } } void Piano_pedal_engraver::do_post_move_processing () { - for (Dictionary_iter i (info_dict_); i.ok (); i++) + for (Pedal_info*p = info_list_; p->name_; p ++) { - Pedal_info& p = i.val_ref (); - p.req_l_drul_[STOP] = 0; - p.req_l_drul_[START] = 0; + p->req_l_drul_[STOP] = 0; + p->req_l_drul_[START] = 0; } } diff --git a/lily/piano-pedal-performer.cc b/lily/piano-pedal-performer.cc index 01dfab892f..c3d2a1a0f4 100644 --- a/lily/piano-pedal-performer.cc +++ b/lily/piano-pedal-performer.cc @@ -20,16 +20,18 @@ class Piano_pedal_performer : public Performer { struct Pedal_info { + char const *name_; Span_req* start_req_l_; Drul_array req_l_drul_; }; public: VIRTUAL_COPY_CONS (Translator); - Piano_pedal_performer (); - + ~Piano_pedal_performer (); + protected: + virtual void do_creation_processing (); virtual bool do_try_music (Music*); virtual void do_process_music (); virtual void do_pre_move_processing (); @@ -37,52 +39,68 @@ protected: private: Link_array audio_p_arr_; - Dictionary info_dict_; + Pedal_info * info_alist_; }; ADD_THIS_TRANSLATOR (Piano_pedal_performer); Piano_pedal_performer::Piano_pedal_performer () { - (void)info_dict_["Sostenuto"]; - (void)info_dict_["Sustain"]; - (void)info_dict_["UnaChorda"]; - for (Dictionary_iter i (info_dict_); i.ok (); i++) + info_alist_ = 0; +} + +Piano_pedal_performer::~Piano_pedal_performer() +{ + delete[] info_alist_; +} + +void +Piano_pedal_performer::do_creation_processing () +{ + info_alist_ = new Pedal_info[4]; + Pedal_info *p = info_alist_; + + char * names [] = { "Sostenuto", "Sustain", "UnaChorda", 0 }; + char **np = names ; + do { - Pedal_info& p = i.val_ref (); - p.req_l_drul_[START] = 0; - p.req_l_drul_[STOP] = 0; - p.start_req_l_ = 0; + p->name_ = *np; + p->req_l_drul_[START] = 0; + p->req_l_drul_[STOP] = 0; + p->start_req_l_ = 0; + + p++; } + while (*(np ++)); } void Piano_pedal_performer::do_process_music () { - for (Dictionary_iter i (info_dict_); i.ok (); i++) + for (Pedal_info*p = info_alist_; p->name_; p ++) + { - Pedal_info& p = i.val_ref (); - if (p.req_l_drul_[STOP]) + if (p->req_l_drul_[STOP]) { - if (!p.start_req_l_) + if (!p->start_req_l_) { - p.req_l_drul_[STOP]->warning (_f ("can't find start of piano pedal: %s", i.key ())); + p->req_l_drul_[STOP]->warning (_f ("can't find start of piano pedal: %s", String (p->name_))); } else { Audio_piano_pedal* a = new Audio_piano_pedal; - a->type_str_ = i.key (); + a->type_str_ = String (p->name_); a->dir_ = STOP; audio_p_arr_.push (a); } - p.start_req_l_ = 0; + p->start_req_l_ = 0; } - if (p.req_l_drul_[START]) + if (p->req_l_drul_[START]) { - p.start_req_l_ = p.req_l_drul_[START]; + p->start_req_l_ = p->req_l_drul_[START]; Audio_piano_pedal* a = new Audio_piano_pedal; - a->type_str_ = i.key (); + a->type_str_ = String (p->name_); a->dir_ = START; audio_p_arr_.push (a); } @@ -92,7 +110,7 @@ Piano_pedal_performer::do_process_music () void Piano_pedal_performer::do_pre_move_processing () { - for (int i=0; i < audio_p_arr_.size (); i++) + for (int i=0; i< audio_p_arr_.size (); i++) play_element (audio_p_arr_[i]); audio_p_arr_.clear (); } @@ -100,25 +118,23 @@ Piano_pedal_performer::do_pre_move_processing () void Piano_pedal_performer::do_post_move_processing () { - for (Dictionary_iter i (info_dict_); i.ok (); i++) + for (Pedal_info*p = info_alist_; p->name_; p ++) { - Pedal_info& p = i.val_ref (); - p.req_l_drul_[STOP] = 0; - p.req_l_drul_[START] = 0; + p->req_l_drul_[STOP] = 0; + p->req_l_drul_[START] = 0; } } bool Piano_pedal_performer::do_try_music (Music* r) { - for (Dictionary_iter i (info_dict_); i.ok (); i++) + if (Span_req * s = dynamic_cast(r)) { - Pedal_info& p = i.val_ref (); - if (Span_req * s = dynamic_cast(r)) + for (Pedal_info*p = info_alist_; p->name_; p ++) { - if (s->span_type_str_ == i.key ()) + if (s->span_type_str_ == String (p->name_)) { - p.req_l_drul_[s->span_dir_] = s; + p->req_l_drul_[s->span_dir_] = s; return true; } } diff --git a/lily/property-engraver.cc b/lily/property-engraver.cc index c0f2887008..b60416ef42 100644 --- a/lily/property-engraver.cc +++ b/lily/property-engraver.cc @@ -12,10 +12,14 @@ #include "protected-scm.hh" #include "dictionary.hh" #include "score-element.hh" +#include "scm-hash.hh" class Property_engraver : public Engraver { - Dictionary prop_dict_; + /* + UGH. Junk Dictionary + */ + Scheme_hash_table prop_dict_; // junkme void apply_properties (SCM, Score_element*); protected: @@ -29,24 +33,29 @@ void Property_engraver::do_creation_processing () { SCM plist = get_property ("Generic_property_list"); - for (; SCM_NIMP (plist); plist = gh_cdr (plist)) + for (; gh_pair_p (plist); plist = gh_cdr (plist)) { SCM elt_props = gh_car (plist); - prop_dict_[ly_scm2string (gh_car (elt_props))] = gh_cdr (elt_props); + prop_dict_.set (gh_car (elt_props), gh_cdr (elt_props)); } } void Property_engraver::acknowledge_element (Score_element_info i) { - if (prop_dict_.elem_b (i.elem_l_->name())) - { - SCM p = prop_dict_[i.elem_l_->name()]; - apply_properties (p,i.elem_l_); + SCM ifs = i.elem_l_->get_elt_property ("interfaces"); + SCM props; + for (; gh_pair_p (ifs); ifs = gh_cdr (ifs)) + { + if (prop_dict_.try_retrieve (gh_car (ifs), &props)) + { + apply_properties (props,i.elem_l_); + } } - if (prop_dict_.elem_b ("all")) + + if (prop_dict_.try_retrieve (ly_symbol2scm ("all"), &props)) { - apply_properties (prop_dict_["all"], i.elem_l_); + apply_properties (props, i.elem_l_); } } @@ -80,7 +89,8 @@ Property_engraver::apply_properties (SCM p, Score_element *e) == SCM_BOOL_T) // defined and right type: do it e->set_elt_property (ly_symbol2string (elt_prop_sym), val); else - /* + + /* we don't print a warning if VAL == #f, because we would get lots of warnings when we restore stuff to default, eg. @@ -89,20 +99,20 @@ Property_engraver::apply_properties (SCM p, Score_element *e) should not cause "type error: slurDash expects number not boolean" - */ + */ if (val != SCM_BOOL_F) - { // not the right type: error message. - SCM errport = scm_current_error_port (); - warning (_("Wrong type for property")); - scm_display (prop_sym, errport); - scm_puts (", type predicate: ", errport); - scm_display (type_p, errport); - scm_puts (", value found: ", errport); - scm_display (val, errport); - scm_puts (" type: ", errport); - scm_display (ly_type (val), errport); - scm_puts ("\n", errport); - } + { // not the right type: error message. + SCM errport = scm_current_error_port (); + warning (_("Wrong type for property")); + scm_display (prop_sym, errport); + scm_puts (", type predicate: ", errport); + scm_display (type_p, errport); + scm_puts (", value found: ", errport); + scm_display (val, errport); + scm_puts (" type: ", errport); + scm_display (ly_type (val), errport); + scm_puts ("\n", errport); + } } } diff --git a/lily/repeated-music.cc b/lily/repeated-music.cc index bf6b9908d5..acdccf98f1 100644 --- a/lily/repeated-music.cc +++ b/lily/repeated-music.cc @@ -29,7 +29,7 @@ Repeated_music::Repeated_music (Repeated_music const &s) repeats_i_ = s.repeats_i_; fold_b_ = s.fold_b_; volta_fold_b_ = s.volta_fold_b_; - + type_ = s.type_; repeat_body_p_ = s.repeat_body_p_ ? s.repeat_body_p_->clone () : 0; alternatives_p_ = s.alternatives_p_ ? dynamic_cast (s.alternatives_p_->clone ()):0; diff --git a/lily/score-element-callback.cc b/lily/score-element-callback.cc new file mode 100644 index 0000000000..9e81fe5aa0 --- /dev/null +++ b/lily/score-element-callback.cc @@ -0,0 +1,58 @@ +/* + score-element-callback.cc -- implement Callback smob. + + source file of the GNU LilyPond music typesetter + + (c) 2000 Han-Wen Nienhuys + + */ + +#include "score-element-callback.hh" + + +static long callback_tag; + +static +SCM mark_smob (SCM) +{ + return SCM_EOL; +} + +static int +print_smob (SCM, SCM port, scm_print_state *) +{ + scm_puts ("#", port); + return 1; +} + +static +scm_sizet free_smob (SCM) +{ + return 0; +} + +static scm_smobfuns callback_funs = { + mark_smob, free_smob, + print_smob, 0, +}; + +static +void start_callback_smobs() +{ + callback_tag = scm_newsmob (&callback_funs); +} + + +SCM +smobify_callback (Score_element_callback cb ) +{ + SCM z; + + SCM_NEWCELL(z); + SCM_SETCDR(z, cb); + SCM_SETCAR(z, callback_tag); + + return z; +} + +ADD_SCM_INIT_FUNC(callback, start_callback_smobs); diff --git a/lily/score-element.cc b/lily/score-element.cc index c8307754ce..891f67e092 100644 --- a/lily/score-element.cc +++ b/lily/score-element.cc @@ -209,24 +209,6 @@ Score_element::add_processing() return; status_i_ ++; -#if 0 - /* - UGH. UGH. UGH. - */ - if (get_elt_property ("self-alignment-X") != SCM_UNDEFINED - && !dim_cache_[X_AXIS]->off_callback_l_) - { - add_offset_callback (Side_position_interface::aligned_on_self,X_AXIS); - } - - if (get_elt_property ("self-alignment-Y") != SCM_UNDEFINED - && !dim_cache_[X_AXIS]->off_callback_l_) - - { - add_offset_callback (Side_position_interface::aligned_on_self, Y_AXIS); - } -#endif - do_add_processing(); } diff --git a/lily/single-malt-grouping-item.cc b/lily/single-malt-grouping-item.cc index b03d4c59be..b017addc21 100644 --- a/lily/single-malt-grouping-item.cc +++ b/lily/single-malt-grouping-item.cc @@ -55,6 +55,11 @@ Single_malt_grouping_item::my_width () const continue; /*UGH UGH*/ } + if (to_boolean (il->get_elt_property ("no-spacing-rods"))) + { + continue; + } + Interval iv (il->extent (X_AXIS)); if (!iv.empty_b ()) { diff --git a/lily/slur.cc b/lily/slur.cc index 9b16216728..13b2c7b7c8 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -223,14 +223,6 @@ Slur::Slur () set_elt_property ("note-columns", SCM_EOL); set_elt_property ("control-points", SCM_EOL); - -#if 0 - /* - I still don't understand the merits of this Group_interface. - */ - Group_interface c (this, "control-points"); - c.set_interface (); -#endif } void @@ -240,8 +232,7 @@ Slur::add_column (Note_column*n) warning (_ ("Putting slur over rest. Ignoring.")); else { - Group_interface gi (this, "note-columns"); - gi.add_element (n); + Group_interface (this, "note-columns").add_element (n); add_dependency (n); } } diff --git a/lily/span-bar-engraver.cc b/lily/span-bar-engraver.cc index 10d2c345a8..6b9db20f74 100644 --- a/lily/span-bar-engraver.cc +++ b/lily/span-bar-engraver.cc @@ -62,13 +62,9 @@ Span_bar_engraver::acknowledge_element (Score_element_info i) spanbar_p_->set_parent (bar_l_arr_[0], Y_AXIS); spanbar_p_->set_parent (bar_l_arr_[0], X_AXIS); - /* - UGH. UGH UUHGK GUHG G - */ - String visnam = String(name()) + "-visibility"; - - spanbar_p_->set_elt_property ("visibility-lambda", - scm_eval (ly_symbol2scm (visnam.ch_C()))); + SCM v = bar_l_arr_[0]->get_elt_property ("visibility-lambda"); + if (gh_procedure_p (v)) + spanbar_p_->set_elt_property ("visibility-lambda",v); spanbar_p_->set_parent (bar_l_arr_[0], X_AXIS); announce_element (Score_element_info (spanbar_p_,0)); diff --git a/lily/sustain-pedal.cc b/lily/sustain-pedal.cc new file mode 100644 index 0000000000..a6388d658e --- /dev/null +++ b/lily/sustain-pedal.cc @@ -0,0 +1,62 @@ +/* + sustain-pedal.cc -- implement Sustain_pedal + + source file of the GNU LilyPond music typesetter + + (c) 2000 Han-Wen Nienhuys + + */ + +#include "sustain-pedal.hh" +#include "side-position-interface.hh" +#include "molecule.hh" +#include "lookup.hh" +#include "staff-symbol-referencer.hh" + +void +Sustain_pedal::after_line_breaking () +{ + /* + UGH. Should work automatically via offset callback. + */ + Side_position_interface i (this); + Direction d = i.get_direction (); + i.set_direction (d); +} + +Molecule +Sustain_pedal::do_brew_molecule () const +{ + Molecule mol; + SCM glyph = get_elt_property ("text"); + if (glyph == SCM_UNDEFINED) + return mol; + String text = ly_scm2string (glyph); + + for (int i = 0; i < text.length_i (); i++) + { + String idx = String ("pedal-") + String (&text.byte_C ()[i], 1); + Molecule m = lookup_l ()->afm_find (idx); + if (m.empty_b ()) + continue; + Real kern = 0; + if (i) + { + SCM s = scm_eval (gh_list (ly_symbol2scm ("pedal-kerning"), + ly_str02scm (String (&text.byte_C ()[i - 1], 1).ch_C ()), + ly_str02scm (String (&text.byte_C ()[i], 1).ch_C ()), + SCM_UNDEFINED)); + if (gh_number_p (s)) + { + Staff_symbol_referencer_interface st (this); + Real staff_space = st.staff_space (); + kern = gh_scm2double (s) * staff_space; + } + } + mol.add_at_edge (X_AXIS, RIGHT, m, kern); + } + + return mol; +} + + diff --git a/lily/text-engraver.cc b/lily/text-engraver.cc index 0f222daab1..c0ab613937 100644 --- a/lily/text-engraver.cc +++ b/lily/text-engraver.cc @@ -104,8 +104,10 @@ Text_engraver::do_process_music () SCM empty = get_property ("textNonEmpty"); if (!to_boolean (empty)) - text->set_extent_callback (0, X_AXIS); - + { + text->set_elt_property ("no-spacing-rods" , SCM_BOOL_T); + text->set_extent_callback (0, X_AXIS); + } announce_element (Score_element_info (text, r)); texts_.push (text); } diff --git a/lily/translator-ctors.cc b/lily/translator-ctors.cc index acb9523cc0..8c72758890 100644 --- a/lily/translator-ctors.cc +++ b/lily/translator-ctors.cc @@ -15,6 +15,9 @@ should delete these after exit. */ +/* + UGH. Dictionary is deprecated + */ Dictionary *global_translator_dict_p=0; void diff --git a/scm/generic-property.scm b/scm/generic-property.scm index 57ef8859ba..ac38879b55 100644 --- a/scm/generic-property.scm +++ b/scm/generic-property.scm @@ -1,7 +1,7 @@ ; ; Format: -; (cons "Type name" +; (cons 'Type name ; (list PROPERTYDESCRIPTIONS)) ; ; where @@ -15,7 +15,7 @@ (define generic-beam-properties - (cons "Beam" + (cons 'Beam (list (list 'beamSlopeDamping number? 'damping) (list 'autoKneeGap number? 'auto-knee-gap) @@ -29,7 +29,7 @@ (define generic-stem-properties - (cons "Stem" + (cons 'Stem (list (list 'stemVerticalDirection dir? 'direction) (list 'verticalDirection dir? 'direction) @@ -42,14 +42,15 @@ ) (define generic-dot-properties - (cons "Dots" (list + (cons 'Dots + (list (list 'dotDirection dir? 'direction) (list 'verticalDirection dir? 'direction) ) )) (define generic-script-properties - (cons "Script" (list + (cons 'Script (list (list 'articulationScriptVerticalDirection dir? 'direction) (list 'articulationScriptPadding number? 'padding) @@ -59,7 +60,7 @@ (define generic-text-properties - (cons "Text_item" (list + (cons 'Text_item (list (list 'textStyle string? 'style) (list 'textScriptPadding number? 'padding) (list 'textVerticalAlignment dir? 'self-alignment-Y) @@ -69,18 +70,18 @@ )) (define generic-sustain-pedal-properties - (cons "Sustain_pedal" (list + (cons 'Sustain_pedal (list (list 'textScriptPadding number? 'padding) (list 'sustainPedalPadding number? 'padding)))) (define generic-chord-name-properties - (cons "Chord_name" (list + (cons 'Chord_name (list (list 'textScriptWordSpace number? 'word-space) (list 'chordNameWordSpace number? 'word-space) (list 'chordNameStyle string? 'style)))) (define generic-crescendo-properties - (cons "Crescendo" (list + (cons 'Crescendo (list (list 'dynamicDirection dir? 'direction) (list 'verticalDirection dir? 'direction) (list 'dynamicPadding number? 'padding) @@ -88,7 +89,7 @@ ))) (define generic-dynamic-line-spanner-properties - (cons "Dynamic_line_spanner" (list + (cons 'Dynamic_line_spanner (list (list 'dynamicDirection dir? 'direction) (list 'verticalDirection dir? 'direction) (list 'dynamicPadding number? 'padding) @@ -96,75 +97,78 @@ ))) (define generic-volta-spanner-properties - (cons "Volta_spanner" (list + (cons 'Volta_spanner (list (list 'voltaVerticalDirection dir? 'direction) (list 'voltaPadding number? 'padding) (list 'voltaMinimumSpace number? 'minimum-space) ))) (define generic-bar-properties - (cons "Staff_bar" (list + (cons 'Staff_bar (list (list 'barSize number? 'bar-size)) ) ) ; don't do this yet. Depends on whennn the staff is really announced (define generic-staff-symbol-properties - (cons "Staff_symbol" (list + (cons 'Staff_symbol (list ) ) ) (define generic-breathing-sign-properties - (cons "Breathing_sign" + (cons 'Breathing_sign (list (list 'breathingSignVerticalDirection dir? 'direction) (list 'verticalDirection dir? 'direction) ))) (define generic-clef-properties - (cons "Clef_item" + (cons 'Clef_item (list (list 'clefStyle string? 'style)) ) ) (define generic-All-properties - (cons "all" (list (list 'fontSize number? 'fontsize)))) + (cons 'all (list (list 'fontSize number? 'fontsize)))) (define generic-notehead-properties - (cons "Note_head" (list (list 'noteHeadStyle symbol? 'style)))) + (cons 'Note_head + (list (list 'noteHeadStyle symbol? 'style)))) (define generic-rest-properties - (cons "Rest" (list (list 'restStyle string? 'reststyle)))) + (cons 'Rest + (list (list 'restStyle string? 'reststyle)))) (define generic-rest-collision-properties - (cons "Rest_collision" (list (list 'maximumRestCount number? 'maximum-rest-count)))) + (cons 'Rest_collision + (list (list 'maximumRestCount number? 'maximum-rest-count)))) (define generic-tie-properties - (cons "Tie" (list + (cons 'Tie (list (list 'tieVerticalDirection dir? 'direction) (list 'verticalDirection dir? 'direction) (list 'tieDash number? 'dashed) ))) (define generic-tie-column-properties - (cons "Tie_column" (list + (cons 'Tie_column (list (list 'tieVerticalDirection dir? 'direction) (list 'verticalDirection dir? 'direction) ))) (define generic-note-column-properties - (cons "Note_column" + (cons 'Note_column (list (list 'horizontalNoteShift number? 'horizontal-shift) (list 'forceHorizontalShift number? 'force-hshift) ))) (define generic-collision-properties - (cons "Collision" + (cons 'Collision (list (list 'collisionMergeDotted boolean? 'merge-differently-dotted) ) @@ -172,14 +176,14 @@ ) (define generic-slur-properties - (cons "Slur" + (cons 'Slur (list (list 'slurVerticalDirection dir? 'direction) (list 'verticalDirection dir? 'direction) (list 'slurDash number? 'dashed)))) (define generic-timesig-properties - (cons "Time_signature" + (cons 'Time_signature (list (list 'timeSignatureStyle string? 'style)))) @@ -187,8 +191,9 @@ (or (boolean? s) (symbol? s))) (define generic-tuplet-spanner-properties - (cons "Tuplet_spanner" + (cons 'Tuplet_spanner (list + (list 'tupletDirection dir? 'direction) (list 'tupletNumberVisibility symbol-or-boolean? 'tuplet-number-visibility) (list 'tupletBracketVisibility symbol-or-boolean? 'tuplet-bracket-visibility) )) diff --git a/scm/lily.scm b/scm/lily.scm index d2e5b83c01..fec2be9cfe 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -7,7 +7,7 @@ ; ; This file contains various routines in Scheme that are easier to -; do here than in C++. At present it is a unorganised mess. Sorry. +; do here than in C++. At present it is an unorganised mess. Sorry. ; @@ -90,9 +90,6 @@ (define (end-of-line-invisible d) (if (= d -1) '(#t . #t) '(#f . #f))) -;; Score_span_bars are only visible at start of line -;; i.e. if break_dir == RIGHT == 1 -(define Span_bar_engraver-visibility begin-of-line-invisible) (define mark-visibility end-of-line-invisible) ;; Spacing constants for prefatory matter. @@ -937,31 +934,7 @@ (define (scm-as-output) (eval (as-scm 'all-definitions))) - -; Russ McManus, -; -; I use the following, which should definitely be provided somewhere -; in guile, but isn't, AFAIK: -; -; - -(define (hash-table-for-each fn ht) - (do ((i 0 (+ 1 i))) - ((= i (vector-length ht))) - (do ((alist (vector-ref ht i) (cdr alist))) - ((null? alist) #t) - (fn (car (car alist)) (cdr (car alist)))))) - -(define (hash-table-map fn ht) - (do ((i 0 (+ 1 i)) - (ret-ls '())) - ((= i (vector-length ht)) (reverse ret-ls)) - (do ((alist (vector-ref ht i) (cdr alist))) - ((null? alist) #t) - (set! ret-ls (cons (fn (car (car alist)) (cdr (car alist))) ret-ls))))) - - - + (define (index-cell cell dir) (if (equal? dir 1) (cdr cell) @@ -992,14 +965,3 @@ ) ) - -(define (slur-ugly ind ht) - (if (and -; (< ht 4.0) - (< ht (* 4 ind)) - (> ht (* 0.4 ind)) - (> ht (+ (* 2 ind) -4)) - (< ht (+ (* -2 ind) 8))) - #f - (cons ind ht) - )) diff --git a/scripts/mudela-book.py b/scripts/mudela-book.py index a78822588d..ca4b70f8ad 100644 --- a/scripts/mudela-book.py +++ b/scripts/mudela-book.py @@ -19,6 +19,13 @@ dep_prefix = '' # BUG: does not handle \verb|\begin{verbatim}\end{verbatim}| correctly. # Should make a joint RE for \verb and \begin, \end{verbatim} + +# TODO: add an option to read the .ly files from a previous run and dump +# the .tex file, so you can do +# +# * mudela-book file.tex +# * convert-mudela *.ly +# * mudela-book --read-lys *.ly # default_music_fontsize = 16