From: fred Date: Tue, 26 Mar 2002 23:09:59 +0000 (+0000) Subject: lilypond-1.3.38 X-Git-Tag: release/1.5.59~1728 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=5dc05d41eea0e9c39e5f458cf68ca1f388e6b5a6;p=lilypond.git lilypond-1.3.38 --- diff --git a/Documentation/user/properties.itely b/Documentation/user/properties.itely index 3b92694c79..ecfcfd0c50 100644 --- a/Documentation/user/properties.itely +++ b/Documentation/user/properties.itely @@ -294,6 +294,9 @@ g''4 \property Voice.stemLength = #14 g4 \property Voice.stemLength = #3 g4 g, note. Overrides automatic beaming. The value is only used once, and then it is erased. + @item @code{tieDash}@indexcode{tieDash} @propertytype{integer} + Set dashing of ties. See also @code{slurDash} + @item @code{tieVerticalDirection}@indexcode{tieVerticalDirection} @propertytype{direction} Set to @code{\free} for free choice of tie direction, set to @code{\up} to force ties up, set to @code{\down} to force ties diff --git a/lily/all-font-metrics.cc b/lily/all-font-metrics.cc index 5a3975fa9a..20b5483348 100644 --- a/lily/all-font-metrics.cc +++ b/lily/all-font-metrics.cc @@ -105,7 +105,10 @@ All_font_metrics::find_font (String name) warning (_ ("Loading default font")); String def_name = default_font_sz_; - SCM l = ly_eval_str ("(style-to-cmr \"default\")"); + SCM l = scm_eval (gh_list (ly_symbol2scm ("style-to-cmr"), + ly_str02scm ("default"), + SCM_UNDEFINED)); + if (l != SCM_BOOL_F) def_name = ly_scm2string (gh_cdr (l)); diff --git a/lily/bar.cc b/lily/bar.cc index 04ea330fb1..70432970ee 100644 --- a/lily/bar.cc +++ b/lily/bar.cc @@ -157,7 +157,10 @@ Bar::staff_brace (Real y) const int idx = int (((maxht - step) ? 0; - SCM l = ly_eval_str ("(style-to-cmr \"brace\")"); + SCM l = scm_eval (gh_list (ly_symbol2scm ("style-to-cmr"), + ly_str02scm ("brace"), + SCM_UNDEFINED)); + String nm = "feta-braces"; if (l != SCM_BOOL_F) nm = ly_scm2string (gh_cdr (l)); diff --git a/lily/base-span-bar-engraver.cc b/lily/base-span-bar-engraver.cc index 78df27dc2e..3993776b42 100644 --- a/lily/base-span-bar-engraver.cc +++ b/lily/base-span-bar-engraver.cc @@ -53,12 +53,11 @@ Base_span_bar_engraver::acknowledge_element (Score_element_info i) /* UGH. UGH UUHGK GUHG G - (ly_eval_str ??) */ String visnam = String(name()) + "-visibility"; - + spanbar_p_->set_elt_property ("visibility-lambda", - ly_eval_str (visnam.ch_C())); + scm_eval (ly_symbol2scm (visnam.ch_C()))); if (use_priority_b_) { diff --git a/lily/beam.cc b/lily/beam.cc index 23a62f4a5c..dfc960c3a4 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -31,7 +31,7 @@ #include "group-interface.hh" #include "staff-symbol-referencer.hh" #include "cross-staff.hh" -#include "lily-guile.icc" + Beam::Beam () { @@ -232,17 +232,19 @@ Beam::set_stem_shorten () return; int multiplicity = get_multiplicity (); + // grace stems? - SCM shorten = ly_eval_str ("beamed-stem-shorten"); + SCM shorten = scm_eval (ly_symbol2scm ("beamed-stem-shorten")); - Array a; - scm_to_array (shorten, &a); - if (!a.size ()) + if (shorten == SCM_EOL) return; + int sz = scm_ilength (shorten); + Staff_symbol_referencer_interface st (this); Real staff_space = st.staff_space (); - Real shorten_f = a[multiplicity a; - scm_to_array (quants, &a); + for (SCM s = scm_eval (ly_symbol2scm ("beam-height-quants")); s !=SCM_EOL; s = gh_cdr (s)) + a.push (gh_scm2double (gh_car (s))); + if (a.size () <= 1) return dy; @@ -543,13 +545,16 @@ Beam::quantise_y_f (Real y, Real dy, int quant_dir) int multiplicity = get_multiplicity (); Staff_symbol_referencer_interface st (this); Real staff_space = st.staff_space (); - SCM quants = scm_eval (gh_list ( - ly_symbol2scm ("beam-vertical-position-quants"), + SCM quants = scm_eval (gh_list (ly_symbol2scm ("beam-vertical-position-quants"), gh_int2scm (multiplicity), gh_double2scm (dy/staff_space), SCM_UNDEFINED)); + Array a; - scm_to_array (quants, &a); + + for (; quants != SCM_EOL; quants = gh_cdr (quants)) + a.push (gh_scm2double (gh_car (quants))); + if (a.size () <= 1) return y; diff --git a/lily/bezier.cc b/lily/bezier.cc index 6b388e1d8f..4cb2b3682e 100644 --- a/lily/bezier.cc +++ b/lily/bezier.cc @@ -56,11 +56,6 @@ translate (Array* arr_p, Offset o) sum_{j=0}^3 (3 over j) z_j (1-t)^(3-j) t^j */ -Bezier::Bezier () - : control_ (CONTROL_COUNT) -{ -} - Real Bezier::get_other_coordinate (Axis a, Real x) const { @@ -177,19 +172,23 @@ Bezier::extent (Axis a)const void Bezier::flip (Axis a) { - ::flip (&control_, a); + for (int i = CONTROL_COUNT; i--;) + control_[i][a] = - control_[i][a]; } void Bezier::rotate (Real phi) { - ::rotate (&control_, phi); + Offset rot (complex_exp (Offset (0, phi))); + for (int i = 0; i < CONTROL_COUNT; i++) + control_[i] = complex_multiply (rot, control_[i]); } void Bezier::translate (Offset o) { - ::translate (&control_, o); + for (int i = 0; i < CONTROL_COUNT; i++) + control_[i] += o; } void diff --git a/lily/breathing-sign.cc b/lily/breathing-sign.cc index 0b9758edc3..2c1f515249 100644 --- a/lily/breathing-sign.cc +++ b/lily/breathing-sign.cc @@ -5,7 +5,7 @@ written for the GNU LilyPond music typesetter -TODO: --> see breathing-sign-engraver.cc + TODO: --> see breathing-sign-engraver.cc */ #include "staff-symbol-referencer.hh" diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc index eb28971785..32419e420c 100644 --- a/lily/chord-name-engraver.cc +++ b/lily/chord-name-engraver.cc @@ -15,7 +15,7 @@ #include "main.hh" #include "dimensions.hh" #include "text-item.hh" -#include "lily-guile.icc" + ADD_THIS_TRANSLATOR (Chord_name_engraver); @@ -81,12 +81,16 @@ Chord_name_engraver::do_process_music () Hmm, why not represent complete chord as list? ((tonic third fifth) (inversion bass)) */ - chord_name_p_->set_elt_property ("pitches", array_to_scm (chord.pitch_arr_)); + SCM plist = SCM_EOL; + for (int i= chord.pitch_arr_.size (); i--; ) + plist = gh_cons (chord.pitch_arr_[i].to_scm (), plist); + + chord_name_p_->set_elt_property ("pitches", plist); if (chord.inversion_b_) chord_name_p_->set_elt_property ("inversion", - to_scm (chord.inversion_pitch_)); + chord.inversion_pitch_.to_scm ()); if (chord.bass_b_) - chord_name_p_->set_elt_property ("bass", to_scm (chord.bass_pitch_)); + chord_name_p_->set_elt_property ("bass", chord.bass_pitch_.to_scm ()); announce_element (Score_element_info (chord_name_p_, 0)); } diff --git a/lily/chord-name.cc b/lily/chord-name.cc index 396909c461..7b94bb1771 100644 --- a/lily/chord-name.cc +++ b/lily/chord-name.cc @@ -13,7 +13,7 @@ #include "molecule.hh" #include "paper-def.hh" #include "lookup.hh" -#include "lily-guile.icc" + /* TODO: move text lookup out of Chord_name @@ -63,7 +63,7 @@ Molecule Chord_name::pitch2molecule (Musical_pitch p) const { SCM name = scm_eval (gh_list (ly_symbol2scm ("user-pitch-name"), - ly_quote_scm (to_scm (p)), + ly_quote_scm (p.to_scm ()), SCM_UNDEFINED)); if (name != SCM_UNSPECIFIED) @@ -116,13 +116,10 @@ Chord_name::user_chord_name (Array pitch_arr, Chord_mol* name_p) Array chord_type = pitch_arr; Chord::rebuild_transpose (&chord_type, diff_pitch (pitch_arr[0], Musical_pitch (0)), false); -#if 0 SCM chord = SCM_EOL; for (int i= chord_type.size (); i--; ) - chord = gh_cons (to_scm (chord_type[i]), chord); -#else - SCM chord = array_to_scm (chord_type); -#endif + chord = gh_cons (chord_type[i].to_scm (), chord); + SCM name = scm_eval (gh_list (ly_symbol2scm ("user-chord-name"), ly_quote_scm (chord), @@ -225,7 +222,10 @@ Molecule Chord_name::do_brew_molecule () const { Array pitch_arr; - scm_to_array (get_elt_property ("pitches"), &pitch_arr); + + for (SCM s = get_elt_property ("pitches"); s != SCM_EOL; s = gh_cdr (s)) + pitch_arr.push (Musical_pitch (gh_car (s))); + Musical_pitch tonic = pitch_arr[0]; Chord_mol name; @@ -265,8 +265,8 @@ Chord_name::do_brew_molecule () const if (s != SCM_UNDEFINED) { name.inversion_mol = lookup_l ()->text ("", "/", paper_l ()); - Musical_pitch p; - p = scm_to (s, &p); + Musical_pitch p (s); + Molecule mol = pitch2molecule (p); name.inversion_mol.add_at_edge (X_AXIS, RIGHT, mol, 0); } @@ -275,8 +275,7 @@ Chord_name::do_brew_molecule () const if (s != SCM_UNDEFINED) { name.bass_mol = lookup_l ()->text ("", "/", paper_l ()); - Musical_pitch p; - p = scm_to (s, &p); + Musical_pitch p (s); Molecule mol = pitch2molecule (p); name.bass_mol.add_at_edge (X_AXIS, RIGHT, mol, 0); } diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc index cffdd3f340..041e3410f5 100644 --- a/lily/clef-engraver.cc +++ b/lily/clef-engraver.cc @@ -199,7 +199,7 @@ Clef_engraver::do_pre_move_processing() { if(to_boolean (clef_p_->remove_elt_property("non-default"))) clef_p_->set_elt_property("visibility-lambda", - ly_eval_str ("all-visible")); + scm_eval (ly_symbol2scm ("all-visible"))); typeset_element (clef_p_); clef_p_ =0; diff --git a/lily/dynamic-performer.cc b/lily/dynamic-performer.cc index 7fbca0dd69..f51ae2beb6 100644 --- a/lily/dynamic-performer.cc +++ b/lily/dynamic-performer.cc @@ -71,10 +71,49 @@ Dynamic_performer::do_process_music () (ly_symbol2scm ("dynamic-absolute-volume"), ly_quote_scm (ly_str02scm (text_script_req_l_->text_str_.ch_C ())), SCM_UNDEFINED)); - int volume = gh_scm2int (ly_eval_str ("dynamic-default-volume")); + Real volume = gh_scm2double (scm_eval (ly_symbol2scm ("dynamic-default-volume"))); if (gh_number_p (s)) - volume = gh_scm2int (s); - + volume = gh_scm2double (s); + + /* + properties override default equaliser setting + */ + SCM min = get_property ("midiMinimumVolume"); + SCM max = get_property ("midiMaximumVolume"); + if (gh_number_p (min) || gh_number_p (max)) + { + Interval iv (0, 1); + if (gh_number_p (min)) + iv[MIN] = gh_scm2double (min); + if (gh_number_p (max)) + iv[MAX] = gh_scm2double (max); + volume = iv[MIN] + iv.length () * volume; + } + else + { + /* + urg, code duplication:: staff_performer + */ + s = get_property ("midiInstrument"); + + if (!gh_string_p(s)) + s = get_property ("instrument"); + + if (!gh_string_p(s)) + s = ly_str02scm ("piano"); + + + s = scm_eval (gh_list (ly_symbol2scm ("instrument-equaliser"), + s, SCM_UNDEFINED)); + if (gh_pair_p (s)) + { + Interval iv; + iv[MIN] = gh_scm2double (gh_car (s)); + iv[MAX] = gh_scm2double (gh_cdr (s)); + volume = iv[MIN] + iv.length () * volume; + } + } + audio_p_ = new Audio_dynamic (volume); Audio_element_info info (audio_p_, text_script_req_l_); announce_element (info); diff --git a/lily/include/bezier.hh b/lily/include/bezier.hh index 3ac97b7170..1f9bd2d252 100644 --- a/lily/include/bezier.hh +++ b/lily/include/bezier.hh @@ -22,8 +22,6 @@ class Bezier { public: - Bezier (); - void assert_sanity () const; void flip (Axis); void reverse (); @@ -38,7 +36,14 @@ public: Offset curve_point (Real t) const; static const int CONTROL_COUNT = 4; - Array control_; + + /* + Bezier curves always have 4 control points. Making this into an + Array<> gives unnecessary overhead, and makes debugging a royal + pain. */ + + + Offset control_[4]; }; void flip (Array* arr_p, Axis a); diff --git a/lily/include/chord.hh b/lily/include/chord.hh index 3075bab0ac..2d13e75deb 100644 --- a/lily/include/chord.hh +++ b/lily/include/chord.hh @@ -12,6 +12,12 @@ #include "array.hh" #include "musical-pitch.hh" #include "lily-proto.hh" + + + +/* + Slightly on the hairy side? In any case COMMENTME. + */ class Chord { public: diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh index 8a8f4c2d02..cb0fb40491 100644 --- a/lily/include/lily-guile.hh +++ b/lily/include/lily-guile.hh @@ -15,17 +15,26 @@ #include #include "direction.hh" +/* + conversion functions follow the GUILE naming convention, i.e. + + A ly_B2A (B b); + */ SCM ly_str02scm (char const*c); -SCM ly_eval_str (String s); SCM ly_symbol2scm (char const *); +String ly_scm2string (SCM s); String ly_symbol2string (SCM); -SCM ly_type (SCM); +SCM ly_offset2scm (Offset); +Offset ly_scm2offset (SCM); -SCM ly_eval (SCM a); SCM ly_parse_scm (char const* s, int* n); SCM ly_quote_scm (SCM s); +SCM ly_type (SCM); + +/* + display and print newline. + */ void ly_display_scm (SCM s); -String ly_scm2string (SCM s); #include "array.hh" @@ -33,8 +42,13 @@ void read_lily_scm_file (String); void init_lily_guile (); bool isdir_b (SCM s); -Direction to_dir (SCM s); +/* + these conversion functions also do a typecheck on the argument, and + return a default value if S has the wrong type. +*/ + +Direction to_dir (SCM s); bool to_boolean (SCM s); void init_ly_protection (); @@ -43,18 +57,6 @@ unsigned int ly_scm_hash (SCM s); SCM index_cell (SCM cellp, Direction d); SCM index_set_cell (SCM cellp, Direction d, SCM val); -templateSCM array_to_scm (Array arr); -templatevoid scm_to_array (SCM s, Array* arr); - -//URG how templates suck! -SCM to_scm (int i); -int scm_to (SCM s, int* i); - -SCM to_scm (Real r); -Real scm_to (SCM s, Real* r); - -SCM to_scm (Offset o); -Offset scm_to (SCM s, Offset* o); /* snarfing. diff --git a/lily/include/musical-pitch.hh b/lily/include/musical-pitch.hh index 7bc94b499f..1c691712da 100644 --- a/lily/include/musical-pitch.hh +++ b/lily/include/musical-pitch.hh @@ -23,6 +23,7 @@ struct Musical_pitch : public Input { Musical_pitch (int notename=0, int accidental=0, int octave=0); + Musical_pitch (SCM); /// 0 is c, 6 is b int notename_i_; @@ -42,11 +43,9 @@ struct Musical_pitch : public Input void down_to (int); String str () const; void print () const; + SCM to_scm () const; }; -SCM to_scm (Musical_pitch p); -Musical_pitch scm_to (SCM s, Musical_pitch* p); - #include "compare.hh" INSTANTIATE_COMPARE(Musical_pitch, Musical_pitch::compare); diff --git a/lily/include/notename-table.hh b/lily/include/notename-table.hh index 2d84a7ead0..f6eab20400 100644 --- a/lily/include/notename-table.hh +++ b/lily/include/notename-table.hh @@ -21,7 +21,6 @@ public: Notename_table (Notename_table const&); Musical_pitch get_pitch(String s) const; void add_note_name (String, Musical_pitch const *p); - String get_name (Musical_pitch) const; bool elem_b (String )const; }; diff --git a/lily/key-engraver.cc b/lily/key-engraver.cc index 88ca9e102c..e81e72c227 100644 --- a/lily/key-engraver.cc +++ b/lily/key-engraver.cc @@ -99,7 +99,7 @@ Key_engraver::acknowledge_element (Score_element_info info) if (!def) { item_p_->set_elt_property ("visibility-lambda", - ly_eval_str ("all-visible")); + scm_eval (ly_symbol2scm ("all-visible"))); } } diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index d8866c3a8e..38a409cb87 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -29,12 +29,14 @@ ly_str02scm (char const*c) return gh_str02scm ((char*)c); } + +#if 0 +/* + this all really sucks, LilyPond should not communicate with GUILE using strings. + */ SCM -ly_eval_str (String s) -{ - // this all really sucks, guile should take char const* arguments! - return gh_eval_str ((char*)s.ch_C ()); -} +ly_eval_str (String s); +#endif /* @@ -134,7 +136,7 @@ read_lily_scm_file (String fn) Simple_file_storage f(s); - ly_eval_str ((char *) f.ch_C()); + gh_eval_str ((char *) f.ch_C()); progress_indication ("]"); } @@ -262,32 +264,7 @@ to_dir (SCM s) } -SCM -to_scm (int i) -{ - return gh_int2scm (i); -} - -/* - UGR. junkme. - */ -int -scm_to (SCM s, int* ) -{ - return gh_number_p (s) ? gh_scm2int (s) : 0; -} - -SCM -to_scm (Real r) -{ - return gh_double2scm (r); -} -Real -scm_to (SCM s, Real* ) -{ - return gh_number_p (s) ? gh_scm2double (s) : 0; -} bool to_boolean (SCM s) @@ -319,13 +296,13 @@ appendable_list_append (SCM l, SCM elt) SCM -to_scm (Offset o) +ly_offset2scm (Offset o) { return gh_cons (gh_double2scm (o[X_AXIS]), gh_double2scm(o[Y_AXIS])); } Offset -scm_to (SCM s, Offset*) +ly_scm2offset (SCM s) { return Offset (gh_scm2double (gh_car (s)), gh_scm2double (gh_cdr (s))); diff --git a/lily/lookup.cc b/lily/lookup.cc index 818ce69e3f..8be036fa78 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -105,10 +105,10 @@ Molecule Lookup::dashed_slur (Bezier b, Real thick, Real dash) { SCM l = SCM_EOL; - // this is silly, we have array_to_scm + for (int i= 4; i -- ;) { - l = gh_cons (to_scm (b.control_[i]), l); + l = gh_cons (ly_offset2scm (b.control_[i]), l); } SCM at = (gh_list (ly_symbol2scm ("dashed-slur"), @@ -246,7 +246,10 @@ Lookup::text (String style, String text, Paper_def *paper_l) /* UGH. */ - SCM l = ly_eval_str (("(style-to-cmr \"" + style + "\")").ch_C()); + SCM l = scm_eval (gh_list (ly_symbol2scm ("style-to-cmr"), + ly_str02scm (style.ch_C()), + SCM_UNDEFINED)); + if (l != SCM_BOOL_F) { style = ly_scm2string (gh_cdr(l)) +to_str ((int)font_h); @@ -327,11 +330,11 @@ Lookup::slur (Bezier curve, Real curvethick, Real linethick) back.control_[2] += curvethick * complex_exp (Offset (0, alpha + M_PI/2)); SCM scontrols[8]; - // this is silly, we have array_to_scm + for (int i=4; i--;) - scontrols[ i ] = to_scm (back.control_[i]); + scontrols[ i ] = ly_offset2scm(back.control_[i]); for (int i=4 ; i--;) - scontrols[i+4] = to_scm (curve.control_[i]); + scontrols[i+4] = ly_offset2scm (curve.control_[i]); /* Need the weird order b.o. the way PS want its arguments diff --git a/lily/molecule.cc b/lily/molecule.cc index ac70426542..db6472b9e5 100644 --- a/lily/molecule.cc +++ b/lily/molecule.cc @@ -63,7 +63,7 @@ Molecule::translate (Offset o) } expr_ = gh_list (ly_symbol2scm ("translate-molecule"), - to_scm (o), + ly_offset2scm (o), expr_, SCM_UNDEFINED); if (!empty_b ()) dim_.translate (o); diff --git a/lily/musical-pitch.cc b/lily/musical-pitch.cc index dc4a5171da..dfc0614e4a 100644 --- a/lily/musical-pitch.cc +++ b/lily/musical-pitch.cc @@ -11,23 +11,20 @@ #include "main.hh" SCM -to_scm (Musical_pitch p) +Musical_pitch::to_scm ()const { - return gh_list (gh_int2scm (p.notename_i_), - gh_int2scm (p.accidental_i_), - gh_int2scm (p.octave_i_), + return gh_list (gh_int2scm (notename_i_), + gh_int2scm (accidental_i_), + gh_int2scm (octave_i_), SCM_UNDEFINED); } -/* - TODO: check -- is_pitch () ? - */ -Musical_pitch -scm_to (SCM s, Musical_pitch* ) + +Musical_pitch::Musical_pitch (SCM s) { - return Musical_pitch (gh_scm2int (gh_car (s)), - gh_scm2int (gh_cadr (s)), - gh_scm2int (gh_caddr (s))); + notename_i_ = gh_scm2int (gh_car (s)); + accidental_i_ = gh_scm2int (gh_cadr (s)); + octave_i_ = gh_scm2int (gh_caddr (s)); } Musical_pitch::Musical_pitch (int n, int a, int o) diff --git a/lily/notename-table.cc b/lily/notename-table.cc index f3a85c1ad6..091f2b7685 100644 --- a/lily/notename-table.cc +++ b/lily/notename-table.cc @@ -11,18 +11,6 @@ #include "dictionary.hh" #include "musical-pitch.hh" -String -Notename_table::get_name (Musical_pitch m) const -{ - for (Dictionary_iter ai (*pitch_dict_); ai.ok (); ai++) - { - if (ai.val () == m) - return ai.key (); - } - return "r"; // rest. -} - - void Notename_table::add_note_name (String s, Musical_pitch const *p) diff --git a/lily/paper-outputter.cc b/lily/paper-outputter.cc index b624b8ea8f..584347bae9 100644 --- a/lily/paper-outputter.cc +++ b/lily/paper-outputter.cc @@ -40,11 +40,14 @@ Paper_outputter::output_header () { if (safe_global_b) { - gh_define ("security-paranoia", SCM_BOOL_T); } - String s = String ("(eval (") + output_global_ch + "-scm 'all-definitions))"; - ly_eval_str (s.ch_C ()); + + SCM exp = gh_list (ly_symbol2scm ((String (output_global_ch) + "-scm").ch_C()), + ly_quote_scm (ly_symbol2scm ("all-definitions")), + SCM_UNDEFINED); + exp = scm_eval (exp); + scm_eval (exp); String creator; if (no_timestamps_global_b) @@ -92,7 +95,7 @@ enter: SCM head =gh_car (expr); if (head == offset_sym) { - o += scm_to (gh_cadr (expr), &o); + o += ly_scm2offset (gh_cadr (expr)); expr = gh_caddr (expr); goto enter; } diff --git a/lily/property-engraver.cc b/lily/property-engraver.cc index 519ca724b3..c0f2887008 100644 --- a/lily/property-engraver.cc +++ b/lily/property-engraver.cc @@ -50,28 +50,48 @@ Property_engraver::acknowledge_element (Score_element_info i) } } + void Property_engraver::apply_properties (SCM p, Score_element *e) { for (; gh_pair_p (p); p = gh_cdr (p)) { + /* + Try each property in order; earlier descriptions take + precedence over later ones, and we don't touch elt-properties if + they're already set. + */ + SCM entry = gh_car (p); SCM prop_sym = gh_car (entry); SCM type_p = gh_cadr (entry); - SCM elt_prop_name = gh_caddr (entry); + SCM elt_prop_sym = gh_caddr (entry); - SCM preset = scm_assq(prop_sym, e->element_property_alist_); + SCM preset = scm_assq(elt_prop_sym, e->element_property_alist_); if (preset != SCM_BOOL_F) continue; SCM val = get_property (prop_sym); + + if (val == SCM_UNDEFINED) - ; + ; // Not defined in context. else if (gh_apply (type_p, scm_listify (val, SCM_UNDEFINED)) - == SCM_BOOL_T) - e->set_elt_property (ly_symbol2string (elt_prop_name), val); + == 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. + + slurDash = #1 [...] slurDash = ##f + + 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); @@ -82,7 +102,6 @@ Property_engraver::apply_properties (SCM p, Score_element *e) scm_puts (" type: ", errport); scm_display (ly_type (val), errport); scm_puts ("\n", errport); - } } } diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc index 5498b5b7f6..846cc192e6 100644 --- a/lily/script-engraver.cc +++ b/lily/script-engraver.cc @@ -60,7 +60,9 @@ Script_engraver::do_process_music() { Articulation_req* l=script_req_l_arr_[i]; - SCM list = ly_eval_str (("(articulation-to-scriptdef \"" + l->articulation_str_ + "\")").ch_C()); + SCM list = scm_eval (gh_list (ly_symbol2scm ("articulation-to-scriptdef"), + ly_str02scm (l->articulation_str_.ch_C()), + SCM_UNDEFINED)); if (list == SCM_BOOL_F) { diff --git a/lily/slur.cc b/lily/slur.cc index 7a0f91f941..a5e4140275 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -29,7 +29,7 @@ #include "cross-staff.hh" #include "group-interface.hh" #include "staff-symbol-referencer.hh" -#include "lily-guile.icc" + class Slur_bezier_bow : public Bezier_bow @@ -668,7 +668,12 @@ Slur::set_control_points () } Bezier b = bb.get_bezier (); - SCM controls = array_to_scm (b.control_); + + + SCM controls = SCM_EOL; + for (int i= 4; i--;) + controls = gh_cons ( ly_offset2scm (b.control_[i]), controls); + set_elt_property ("control-points", controls); } @@ -677,9 +682,12 @@ Bezier Slur::get_curve () const { Bezier b; - Array controls (4); - scm_to_array (get_elt_property ("control-points"), &controls); - b.control_ = controls; + int i = 0; + for (SCM s= get_elt_property ("control-points"); s != SCM_EOL; s = gh_cdr (s)) + { + b.control_[i] = ly_scm2offset (gh_car (s)); + i++; + } Array enc (get_encompass_offset_arr ()); Direction dir = directional_element (this).get (); diff --git a/lily/staff-margin-engraver.cc b/lily/staff-margin-engraver.cc index 88adb28af6..3e3a435856 100644 --- a/lily/staff-margin-engraver.cc +++ b/lily/staff-margin-engraver.cc @@ -188,7 +188,7 @@ Staff_margin_engraver::do_pre_move_processing () make a properly ordered Right_edge_item, if that need arises. */ text_p_->set_elt_property("visibility-lambda", - ly_eval_str ("begin-of-line-visible")); + scm_eval (ly_symbol2scm ("begin-of-line-visible"))); typeset_element (text_p_); text_p_ = 0; assert (left_edge_p_); diff --git a/ly/property.ly b/ly/property.ly index a45c4702c2..306fc176c0 100644 --- a/ly/property.ly +++ b/ly/property.ly @@ -77,7 +77,7 @@ beampostraditional = slurnormal = - \property Voice.slurDash = "" + \property Voice.slurDash = ##f slurdotted = diff --git a/scm/generic-property.scm b/scm/generic-property.scm index 467f9e8c73..358e1f3a71 100644 --- a/scm/generic-property.scm +++ b/scm/generic-property.scm @@ -1,4 +1,19 @@ +; +; Format: +; (cons "Type name" +; (list PROPERTYDESCRIPTIONS)) +; +; where +; PROPERTYDESCRIPTION +; is +; +; (list 'translatorPropertySymbol type-predicate backend-property-symbol) +; +; Descriptions earlier in the list take precedence over later descriptions. +; + + (define generic-beam-properties (cons "Beam" (list @@ -16,8 +31,8 @@ (define generic-stem-properties (cons "Stem" (list - (list 'verticalDirection dir? 'direction) (list 'stemVerticalDirection dir? 'direction) + (list 'verticalDirection dir? 'direction) (list 'stemLength number? 'length) (list 'flagStyle string? 'flag-style) (list 'stemCentered boolean? 'stem-centered) @@ -28,8 +43,8 @@ (define generic-dot-properties (cons "Dots" (list - (list 'verticalDirection dir? 'direction) (list 'dotDirection dir? 'direction) + (list 'verticalDirection dir? 'direction) ) )) @@ -91,8 +106,8 @@ (define generic-breathing-sign-properties (cons "Breathing_sign" (list - (list 'verticalDirection dir? 'direction) (list 'breathingSignVerticalDirection dir? 'direction) + (list 'verticalDirection dir? 'direction) ))) (define generic-clef-properties @@ -113,16 +128,17 @@ (define generic-tie-properties (cons "Tie" (list - (list 'verticalDirection dir? 'direction) (list 'tieVerticalDirection dir? 'direction) + (list 'verticalDirection dir? 'direction) +(list 'tieDash number? 'dashed) ))) + (define generic-tie-column-properties (cons "Tie_column" (list - (list 'verticalDirection dir? 'direction) (list 'tieVerticalDirection dir? 'direction) + (list 'verticalDirection dir? 'direction) ))) - (define generic-note-column-properties (cons "Note_column" (list @@ -141,8 +157,8 @@ (define generic-slur-properties (cons "Slur" (list - (list 'verticalDirection dir? 'direction) (list 'slurVerticalDirection dir? 'direction) + (list 'verticalDirection dir? 'direction) (list 'slurDash number? 'dashed)))) (define generic-timesig-properties diff --git a/scm/lily.scm b/scm/lily.scm index 9933b82133..17b7c45794 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -9,8 +9,6 @@ ; This file contains various routines in Scheme that are easier to ; do here than in C++. At present it is a unorganised mess. Sorry. ; -; - ;(debug-enable 'backtrace) diff --git a/scm/paper.scm b/scm/paper.scm index 9a6b05a8c0..a615f9564f 100644 --- a/scm/paper.scm +++ b/scm/paper.scm @@ -7,6 +7,9 @@ ;;; All dimensions are measured in staff-spaces +; This is a mess : global namespace pollution. We should wait +; till guile has proper toplevel environment support. + ;; Beams should be prevented to conflict with the stafflines, ;; especially at small slopes