From: Han-Wen Nienhuys Date: Tue, 26 Aug 2003 11:47:36 +0000 (+0000) Subject: * scm/define-music-types.scm (music-descriptions): idem. X-Git-Tag: release/1.9.1~8 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=679d99a7ce5c6f07e8e6c15b22ed8a3cb0d57126;p=lilypond.git * scm/define-music-types.scm (music-descriptions): idem. * lily/beam-engraver.cc: move new-beam-event to beam-event * lily/tie-engraver.cc (class Tie_engraver): move New_tie_engraver to Tie_engraver * lily/parser.yy (Composite_music): add \newcontext * lily/text-item.cc: remove old-style markups. (interpret_markup): C++ version of markup function (brew_molecule): idem. --- diff --git a/ChangeLog b/ChangeLog index d0604419e6..98566424ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2003-08-26 Han-Wen Nienhuys + * scm/define-music-types.scm (music-descriptions): idem. + + * lily/beam-engraver.cc: move new-beam-event to beam-event + + * lily/tie-engraver.cc (class Tie_engraver): move New_tie_engraver + to Tie_engraver + * input/regression/bar-number.ly: remove unnecessary old-relative options. diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc index a00668d785..6bd0be9e63 100644 --- a/lily/beam-engraver.cc +++ b/lily/beam-engraver.cc @@ -104,29 +104,6 @@ Beam_engraver::try_music (Music *m) beam_ = 0; } else if (m->is_mus_type ("beam-event")) - { - Direction d = to_dir (m->get_mus_property ("span-direction")); - - if (d == STOP && !valid_end_moment()) - return false; - - if (d == START && !valid_start_moment ()) - return false; - - if (d == STOP) - { - SCM m = get_property ("automaticMelismata"); - SCM b = get_property ("autoBeaming"); - if (to_boolean (m) && !to_boolean (b)) - { - set_melisma (false); - } - } - - evs_drul_[d ] = m; - return true; - } - else if (m->is_mus_type ("new-beam-event")) { Direction d = to_dir (m->get_mus_property ("span-direction")); if (d == START && !valid_start_moment ()) @@ -330,7 +307,7 @@ ENTER_DESCRIPTION(Beam_engraver, /* descr */ "Handles Beam events by engraving Beams. If omitted, then notes will be " "printed with flags instead of beams.", /* creats*/ "Beam", -/* accepts */ "beam-event new-beam-event abort-event", +/* accepts */ "beam-event abort-event", /* acks */ "stem-interface rest-interface", /* reads */ "beamMelismaBusy beatLength subdivideBeams", /* write */ ""); @@ -373,7 +350,7 @@ ENTER_DESCRIPTION(Grace_beam_engraver, " are at grace points in time. " , /* creats*/ "Beam", -/* accepts */ "beam-event abort-event new-beam-event", +/* accepts */ "beam-event abort-event", /* acks */ "stem-interface rest-interface", /* reads */ "beamMelismaBusy beatLength allowBeamBreak subdivideBeams", /* write */ ""); diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index 63a6c83a0a..f91a24d07e 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -300,9 +300,9 @@ New_fingering_engraver::New_fingering_engraver() } ENTER_DESCRIPTION(New_fingering_engraver, -/* descr */ "Create fingering-scripts for notes in a New Chord.", +/* descr */ "Create fingering-scripts for notes in a new chord.", /* creats*/ "Fingering", -/* accepts */ "text-script-event", +/* accepts */ "", /* acks */ "rhythmic-head-interface stem-interface", /* reads */ "fingerHorizontalDirection", /* write */ ""); diff --git a/lily/new-tie-engraver.cc b/lily/new-tie-engraver.cc index 11b414cc46..e69de29bb2 100644 --- a/lily/new-tie-engraver.cc +++ b/lily/new-tie-engraver.cc @@ -1,190 +0,0 @@ -/* - new-tie-engraver.cc -- implement Tie_engraver - - source file of the GNU LilyPond music typesetter - - (c) 1998--2003 Han-Wen Nienhuys - - */ - -#include "event.hh" -#include "tie.hh" -#include "translator-group.hh" -#include "spanner.hh" -#include "tie-column.hh" -#include "engraver.hh" -#include "item.hh" -#include "grob-pitch-tuple.hh" -#include "warn.hh" -#include "note-head.hh" - -/** - Manufacture ties. Acknowledge noteheads, and put them into a - priority queue. If we have a TieEvent, connect the notes that finish - just at this time, and note that start at this time. - - TODO: Remove the dependency on musical info. We should tie on the - basis of position and duration-log of the heads (not of the events). - - TODO: support sparseTies. - - TODO: melismata will fuck up now: - - < { c8 ~ c8 } - { c16 c c c } > - - melisma is after the 2nd 8th note, but will now be signaled as - lasting till the 3rd 16th. -*/ -class New_tie_engraver : public Engraver -{ - Music *event_; - Music *last_event_; - Link_array now_heads_; - Link_array heads_to_tie_; - Link_array ties_; - - Spanner * tie_column_; - - -protected: - virtual void stop_translation_timestep (); - virtual void acknowledge_grob (Grob_info); - virtual bool try_music (Music*); - virtual void process_acknowledged_grobs (); - void typeset_tie (Grob*); -public: - TRANSLATOR_DECLARATIONS(New_tie_engraver); -}; - - - -New_tie_engraver::New_tie_engraver () -{ - event_ = 0; - last_event_ = 0; - tie_column_ = 0; -} - - -bool -New_tie_engraver::try_music (Music *mus) -{ - if (mus->is_mus_type ("new-tie-event")) - { - event_ = mus; - } - - if (event_) - { - SCM m = get_property ("automaticMelismata"); - bool am = gh_boolean_p (m) &&gh_scm2bool (m); - if (am) - { - daddy_trans_->set_property ("tieMelismaBusy", m ? SCM_BOOL_T : SCM_BOOL_F); - } - } - return true; -} - -void -New_tie_engraver::acknowledge_grob (Grob_info i) -{ - if (Note_head::has_interface (i.grob_)) - { - Grob * h = i.grob_; - now_heads_.push (h); - for (int i=heads_to_tie_.size (); i--;) - { - Grob *th = heads_to_tie_[i]; - int staff_pos = gh_scm2int (h->get_grob_property ("staff-position")); - int left_staff_pos = gh_scm2int (th->get_grob_property ("staff-position")); - if (staff_pos == left_staff_pos) - { - Grob * p = new Spanner (get_property ("Tie")); - Tie::set_interface (p); // cannot remove yet! - - Tie::set_head (p, LEFT, th); - Tie::set_head (p, RIGHT, h); - - ties_.push (p); - announce_grob(p, last_event_->self_scm()); - } - } - } -} - -void -New_tie_engraver::process_acknowledged_grobs () -{ - if (ties_.size () > 1 && !tie_column_) - { - tie_column_ = new Spanner (get_property ("TieColumn")); - - for (int i = ties_.size (); i--;) - Tie_column::add_tie (tie_column_,ties_ [i]); - - announce_grob(tie_column_, SCM_EOL); - } -} - - -void -New_tie_engraver::stop_translation_timestep () -{ - - if (ties_.size ()) - { - heads_to_tie_.clear (); - for (int i=0; i< ties_.size (); i++) - { - typeset_tie (ties_[i]); - } - - ties_.clear(); - last_event_ = 0; - if (tie_column_) - { - typeset_grob (tie_column_); - tie_column_ =0; - } - } - - if (event_) - { - heads_to_tie_ = now_heads_; - last_event_ = event_; - } - event_ = 0; - now_heads_.clear (); -} - -void -New_tie_engraver::typeset_tie (Grob *her) -{ - if (! (Tie::head (her,LEFT) && Tie::head (her,RIGHT))) - warning (_ ("lonely tie")); - - Direction d = LEFT; - Drul_array new_head_drul; - new_head_drul[LEFT] = Tie::head (her,LEFT); - new_head_drul[RIGHT] = Tie::head (her,RIGHT); - do { - if (!Tie::head (her,d)) - new_head_drul[d] = Tie::head (her, (Direction)-d); - } while (flip (&d) != LEFT); - - index_set_cell (her->get_grob_property ("heads"), LEFT, new_head_drul[LEFT]->self_scm ()); - index_set_cell (her->get_grob_property ("heads"), RIGHT, new_head_drul[RIGHT]->self_scm ()); - - typeset_grob (her); -} - - -ENTER_DESCRIPTION(New_tie_engraver, -/* descr */ "Generate ties between noteheads of equal pitch.", -/* creats*/ "Tie TieColumn", -/* accepts */ "new-tie-event", -/* acks */ "rhythmic-head-interface", -/* reads */ "tieMelismaBusy", -/* write */ ""); diff --git a/lily/parser.yy b/lily/parser.yy index 239b8f68f1..fbb7684c9a 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -1524,19 +1524,19 @@ configurable, i.e. (set-articulation '~ "trill") */ - Music * m = MY_MAKE_MUSIC ("NewBeamEvent"); + Music * m = MY_MAKE_MUSIC ("BeamEvent"); m->set_spot (THIS->here_input()); m->set_mus_property ("span-direction" , gh_int2scm (START)); $$ = m; } | ']' { - Music * m = MY_MAKE_MUSIC ("NewBeamEvent"); + Music * m = MY_MAKE_MUSIC ("BeamEvent"); m->set_spot (THIS->here_input()); m->set_mus_property ("span-direction" , gh_int2scm (STOP)); $$ = m; } | '~' { - Music * m = MY_MAKE_MUSIC ("NewTieEvent"); + Music * m = MY_MAKE_MUSIC ("TieEvent"); m->set_spot (THIS->here_input()); $$ = m; } diff --git a/lily/text-item.cc b/lily/text-item.cc index ac80893cf2..0bf318708e 100644 --- a/lily/text-item.cc +++ b/lily/text-item.cc @@ -40,12 +40,19 @@ Text_item::interpret_markup (SCM grob, SCM props, SCM markup) Box b = fm->text_dimension (ly_scm2string (markup)); return Molecule (b, list).smobbed_copy(); } - else + else if (gh_pair_p (markup)) { SCM func = gh_car (markup); SCM args = gh_cdr (markup); + if (!markup_p (markup)) + programming_error ("Markup head has no markup signature."); + return scm_apply_2 (func, grob, props, args); } + else + { + return SCM_EOL; + } } MAKE_SCHEME_CALLBACK(Text_item,brew_molecule,1); diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc index e02eb889de..ad6e6b8859 100644 --- a/lily/tie-engraver.cc +++ b/lily/tie-engraver.cc @@ -1,5 +1,5 @@ /* - tie-engraver.cc -- implement Tie_engraver + new-tie-engraver.cc -- implement Tie_engraver source file of the GNU LilyPond music typesetter @@ -7,7 +7,6 @@ */ - #include "event.hh" #include "tie.hh" #include "translator-group.hh" @@ -27,25 +26,28 @@ TODO: Remove the dependency on musical info. We should tie on the basis of position and duration-log of the heads (not of the events). - New tie event happens at the time of the first note, the + TODO: support sparseTies. + + TODO: melismata will fuck up now: + + < { c8 ~ c8 } + { c16 c c c } > + + melisma is after the 2nd 8th note, but will now be signaled as + lasting till the 3rd 16th. */ class Tie_engraver : public Engraver { - Moment end_mom_; - Moment next_end_mom_; - Music *event_; - + Music *last_event_; Link_array now_heads_; - Link_array stopped_heads_; + Link_array heads_to_tie_; Link_array ties_; - + Spanner * tie_column_; - void set_melisma (bool); protected: - virtual void start_translation_timestep (); virtual void stop_translation_timestep (); virtual void acknowledge_grob (Grob_info); virtual bool try_music (Music*); @@ -60,6 +62,7 @@ public: Tie_engraver::Tie_engraver () { event_ = 0; + last_event_ = 0; tie_column_ = 0; } @@ -71,143 +74,89 @@ Tie_engraver::try_music (Music *mus) { event_ = mus; } - + if (event_) { SCM m = get_property ("automaticMelismata"); bool am = gh_boolean_p (m) &&gh_scm2bool (m); if (am) { - set_melisma (true); + daddy_trans_->set_property ("tieMelismaBusy", m ? SCM_BOOL_T : SCM_BOOL_F); } } return true; } -void -Tie_engraver::set_melisma (bool m) -{ - daddy_trans_->set_property ("tieMelismaBusy", m ? SCM_BOOL_T : SCM_BOOL_F); -} - void Tie_engraver::acknowledge_grob (Grob_info i) { if (Note_head::has_interface (i.grob_)) { - now_heads_.push (i.grob_); + Grob * h = i.grob_; + now_heads_.push (h); + for (int i=heads_to_tie_.size (); i--;) + { + Grob *th = heads_to_tie_[i]; + int staff_pos = gh_scm2int (h->get_grob_property ("staff-position")); + int left_staff_pos = gh_scm2int (th->get_grob_property ("staff-position")); + if (staff_pos == left_staff_pos) + { + Grob * p = new Spanner (get_property ("Tie")); + Tie::set_interface (p); // cannot remove yet! + + Tie::set_head (p, LEFT, th); + Tie::set_head (p, RIGHT, h); + + ties_.push (p); + announce_grob(p, last_event_->self_scm()); + } + } } } -int -head_pitch_compare (Grob *const&a,Grob *const&b) -{ - Music *m1 =unsmob_music (a->get_grob_property ("cause")); - Music *m2 =unsmob_music (b->get_grob_property ("cause")); - - return Pitch::compare (* unsmob_pitch (m1->get_mus_property ("pitch")), - * unsmob_pitch (m2->get_mus_property ("pitch"))); -} - void Tie_engraver::process_acknowledged_grobs () { - if (event_) + if (ties_.size () > 1 && !tie_column_) { - now_heads_.sort (&head_pitch_compare); - /* - We could sort stopped_heads_ as well (and use a linear alg. in - stead of nested loop), but we'd have to use a stable sorting - algorithm, since the ordering of the stopped heads (of the - same pitch) is relevant. - */ - - SCM head_list = SCM_EOL; + tie_column_ = new Spanner (get_property ("TieColumn")); - for (int i = now_heads_.size(); i--;) - { - for (int j = stopped_heads_.size(); j--;) - { - int comp - = head_pitch_compare (now_heads_[i], stopped_heads_[j]); + for (int i = ties_.size (); i--;) + Tie_column::add_tie (tie_column_,ties_ [i]); - if (!comp) - { - head_list = gh_cons (gh_cons (stopped_heads_[j]->self_scm (), - now_heads_[i]->self_scm ()), - head_list); + announce_grob(tie_column_, SCM_EOL); + } +} - now_heads_.del (i); - stopped_heads_.del (j); - break ; - } - } - } - - SCM basic = get_property ("Tie"); - SCM sparse = get_property ("sparseTies"); - if (to_boolean (sparse)) - { - int i = scm_ilength (head_list); - if (!i) - return; - - SCM pair = scm_list_ref (head_list, gh_int2scm (i/2)); - - Spanner * p = new Spanner (basic); +void +Tie_engraver::stop_translation_timestep () +{ - Tie::set_interface (p); // cannot remove. - Tie::set_head (p,LEFT, dynamic_cast (unsmob_grob (ly_car (pair)))); - Tie::set_head (p,RIGHT, dynamic_cast (unsmob_grob (ly_cdr (pair)))); - - ties_.push (p); - announce_grob(p, event_->self_scm()); - } - else for (SCM s = head_list; gh_pair_p (s); s = ly_cdr (s)) + if (ties_.size ()) + { + heads_to_tie_.clear (); + for (int i=0; i< ties_.size (); i++) { - Grob * p = new Spanner (basic); - Tie::set_interface (p); // cannot remove yet! - - Tie::set_head (p, LEFT, dynamic_cast (unsmob_grob (ly_caar (s)))); - Tie::set_head (p, RIGHT, dynamic_cast (unsmob_grob (ly_cdar (s)))); - - ties_.push (p); - announce_grob(p, event_->self_scm()); + typeset_tie (ties_[i]); } - if (ties_.size () > 1 && !tie_column_) + ties_.clear(); + last_event_ = 0; + if (tie_column_) { - tie_column_ = new Spanner (get_property ("TieColumn")); - - for (int i = ties_.size (); i--;) - Tie_column::add_tie (tie_column_,ties_ [i]); - announce_grob(tie_column_, SCM_EOL); + typeset_grob (tie_column_); + tie_column_ =0; } } -} - - -void -Tie_engraver::stop_translation_timestep () -{ - event_ = 0; - now_heads_.clear (); - - /* - we don't warn for no ties, since this happens naturally when you - use skipTypesetting. */ - for (int i=0; i< ties_.size (); i++) - { - typeset_tie (ties_[i]); - } - ties_.clear (); - if (tie_column_) + if (event_) { - typeset_grob (tie_column_); - tie_column_ =0; + heads_to_tie_ = now_heads_; + last_event_ = event_; } + event_ = 0; + now_heads_.clear (); } void @@ -231,60 +180,11 @@ Tie_engraver::typeset_tie (Grob *her) typeset_grob (her); } -void -Tie_engraver::start_translation_timestep () -{ - SCM m = get_property ("automaticMelismata"); - if (to_boolean (m)) - { - set_melisma (false); - } - - SCM grobs = get_property ("busyGrobs"); - Moment now = now_mom(); - stopped_heads_.clear (); - - for (; gh_pair_p (grobs); grobs = gh_cdr (grobs)) - { - Grob * grob = unsmob_grob (gh_cdar (grobs)); - Moment end =*unsmob_moment (gh_caar (grobs)); - - /* - This is slightly ugh: we are now confunding the frontend - (iterators) and the backend (note heads) */ - if (end > now) - break; - else if (end == now - && Note_head::has_interface (grob)) - stopped_heads_.push (grob); - } - - - /* - - The list starts with entries that start earlier. By going through - it, we reverse the order, where as we'd like to use the `last' - heads first. - - This makes a difference for grace notes. If we have - - c4 \grace c8 ~ c4 - - Then busyGrobs will have ((1/4 . gc8) (1/4 . c4)). - - We want stopped_heads_ to contain (c4 gc8), because we start with - it at the top. - */ - stopped_heads_.reverse(); - - event_ = 0; -} - ENTER_DESCRIPTION(Tie_engraver, /* descr */ "Generate ties between noteheads of equal pitch.", /* creats*/ "Tie TieColumn", /* accepts */ "tie-event", /* acks */ "rhythmic-head-interface", -/* reads */ "sparseTies tieMelismaBusy", +/* reads */ "tieMelismaBusy", /* write */ ""); diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 3598f76bcc..065a8e502a 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -189,7 +189,6 @@ VoiceContext = \translator { \consists "Cluster_spanner_engraver" \consists "Slur_engraver" \consists "Tie_engraver" - \consists "New_tie_engraver" \consists "Tuplet_engraver" \consists "A2_engraver" diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index d16085b396..942ad999c5 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -223,10 +223,6 @@ style-sheet's normal size, -1 is smaller, +1 is bigger.") (grob-property-description 'font-series symbol? "partial font definition: medium, bold.") (grob-property-description 'font-shape symbol? "partial font definition: upright or italic.") -(grob-property-description 'font-style symbol? "a precooked set of font -definitions, eg. finger volta timesig mark script large Large -dynamic.") - (grob-property-description 'force-hshift number? "amount of collision_note_width that overides automatic collision settings. This is used by @ref{note-collision-interface}.") @@ -434,7 +430,8 @@ the Nth element of the list gives the amount stem shortening of a note with N fl (grob-property-description 'style symbol? "a string determining what style of glyph is typeset. Valid choices depend on the function that is reading this property. .") (grob-property-description 'support-head ly:grob? "the note head at one end of the stem.") -(grob-property-description 'text markup? "Text markup. See reference manual for more information.") +(grob-property-description 'text markup? "Text markup. See the +notation manual for more information.") (grob-property-description 'thick-thickness number? "thickness, measured in stafflinethickness.") (grob-property-description 'thickness number? "thickness, measured in stafflinethickness.") (grob-property-description 'thin-kern number? "space after a hair-line.") diff --git a/scm/define-music-types.scm b/scm/define-music-types.scm index d981db254e..2bc5bc9a6d 100644 --- a/scm/define-music-types.scm +++ b/scm/define-music-types.scm @@ -87,14 +87,6 @@ is an articulation (such as @code{-.}, @code{->}, @code{\\tenuto}, . ( (description . "Starts or stops a beam. Syntax for manual control: c8-[ c c-] c8") - - (internal-class-name . "Event") - (types . (general-music event beam-event span-event)) - )) - (NewBeamEvent - . ( - (description . "Starts or stops a beam. Syntax for manual control: -c8-[ c c-] c8") (internal-class-name . "Event") (types . (general-music event new-beam-event span-event)) )) @@ -572,12 +564,6 @@ For example, transposed music.") (types . (general-music script-event text-script-event event)) )) (TieEvent - . ( - (description . "A tie. Entered as @code{~}.") - (internal-class-name . "Event") - (types . (general-music tie-event event)) - )) - (NewTieEvent . ( (description . "A tie. Entered as @var{note}-~.") (internal-class-name . "Event")