From 22c694d0c1eabc17fbe314edc1ecaebb808a3c03 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Wed, 18 Oct 2006 10:07:10 +0000 Subject: [PATCH] *** empty log message *** --- ChangeLog | 21 +++ input/test/engraver-one-by-one.ly | 213 +++++++++++------------ lily/piano-pedal-align-engraver.cc | 266 +++++++++++++++++++++++++++++ lily/piano-pedal-bracket.cc | 15 +- lily/piano-pedal-engraver.cc | 173 ++++--------------- ly/engraver-init.ly | 1 + ly/paper-defaults.ly | 3 - scm/define-grobs.scm | 3 + scm/page.scm | 3 +- scm/paper.scm | 4 +- scripts/lilypond-book.py | 84 ++++++++- 11 files changed, 527 insertions(+), 259 deletions(-) create mode 100644 lily/piano-pedal-align-engraver.cc diff --git a/ChangeLog b/ChangeLog index 2e4dccb2a8..502cf6dd62 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2006-10-18 Bertalan Fodor + + * scripts/lilypond-book.py: DocBook support. + +2006-10-18 Han-Wen Nienhuys + + * lily/piano-pedal-engraver.cc (struct Pedal_info): remove + Y-alignment code. + (stop_translation_timestep): set bound to currentMusicalColumn if + not set yet. Fixes #102 + + * lily/piano-pedal-bracket.cc: formatting. + + * input/test/engraver-one-by-one.ly (MyStaff): reformat. + + * lily/piano-pedal-align-engraver.cc: new class + Piano_pedal_align_engraver. Handle side-positioning Y-alignment + for piano pedals. + 2006-10-18 Heikki Junes * po/fi.po: Update Finnish translation (before the next release). @@ -16,6 +35,8 @@ 2006-10-17 Han-Wen Nienhuys + * scm/paper.scm: only use left-margin if defined. + * scm/define-grob-interfaces.scm (stroke-finger-interface): typo. * ly/engraver-init.ly (AncientRemoveEmptyStaffContext): idem. diff --git a/input/test/engraver-one-by-one.ly b/input/test/engraver-one-by-one.ly index af0f289f25..da657ea895 100644 --- a/input/test/engraver-one-by-one.ly +++ b/input/test/engraver-one-by-one.ly @@ -1,8 +1,8 @@ \version "2.7.39" \header { - -texidoc = "The notation problem, creating a certain symbol, + + texidoc = "The notation problem, creating a certain symbol, is handled by plugins. Each plugin is called Engraver. In this example, engravers are switched on one by one, in the following order: @@ -21,7 +21,7 @@ Staff context. " - } +} \layout { ragged-right = ##t } \include "engraver-example.ily" @@ -32,51 +32,53 @@ Staff context. % MyStaff =\context { - \type "Engraver_group" - \name Staff + \type "Engraver_group" + \name Staff - \description "Handles clefs, bar lines, keys, accidentals. It can contain + \description "Handles clefs, bar lines, keys, accidentals. It can contain @code{Voice} contexts." - - \consists "Output_property_engraver" - - \consists "Font_size_engraver" + + \consists "Output_property_engraver" + + \consists "Font_size_engraver" + + \consists "Volta_engraver" + \consists "Separating_line_group_engraver" + \consists "Dot_column_engraver" - \consists "Volta_engraver" - \consists "Separating_line_group_engraver" - \consists "Dot_column_engraver" + \consists "Ottava_spanner_engraver" + \consists "Rest_collision_engraver" + \consists "Piano_pedal_engraver" + \consists "Piano_pedal_align_engraver" + \consists "Instrument_name_engraver" + \consists "Grob_pq_engraver" + \consists "Forbid_line_break_engraver" + \consists "Axis_group_engraver" - \consists "Ottava_spanner_engraver" - \consists "Rest_collision_engraver" - \consists "Piano_pedal_engraver" - \consists "Instrument_name_engraver" - \consists "Grob_pq_engraver" - \consists "Forbid_line_break_engraver" - \consists "Axis_group_engraver" -\consists "Pitch_squash_engraver" + \consists "Pitch_squash_engraver" - \override VerticalAxisGroup #'minimum-Y-extent = #'(-6 . 6) - extraVerticalExtent = ##f - verticalExtent = ##f - localKeySignature = #'() + \override VerticalAxisGroup #'minimum-Y-extent = #'(-6 . 6) + extraVerticalExtent = ##f + verticalExtent = ##f + localKeySignature = #'() - % explicitly set instrument, so we don't get - % weird effects when doing instrument names for - % piano staves + % explicitly set instrument, so we don't get + % weird effects when doing instrument names for + % piano staves - instrumentName = #'() - shortInstrumentName = #'() - - \accepts "Voice" + instrumentName = #'() + shortInstrumentName = #'() + + \accepts "Voice" } MyVoice = \context { - \type "Engraver_group" - \name Voice + \type "Engraver_group" + \name Voice -\description " + \description " Corresponds to a voice on a staff. This context handles the conversion of dynamic signs, stems, beams, super- and subscripts, slurs, ties, and rests. @@ -84,54 +86,54 @@ MyVoice = \context { You have to instantiate this explicitly if you want to have multiple voices on the same staff." - localKeySignature = #'() - \consists "Font_size_engraver" - - % must come before all - \consists "Output_property_engraver" - \consists "Arpeggio_engraver" - \consists "Multi_measure_rest_engraver" - \consists "Text_spanner_engraver" - \consists "Grob_pq_engraver" - \consists "Note_head_line_engraver" - \consists "Glissando_engraver" - \consists "Ligature_bracket_engraver" - \consists "Breathing_sign_engraver" - % \consists "Rest_engraver" - \consists "Grace_beam_engraver" - \consists "New_fingering_engraver" - \consists "Chord_tremolo_engraver" - \consists "Percent_repeat_engraver" - \consists "Slash_repeat_engraver" - \consists "Melisma_translator" + localKeySignature = #'() + \consists "Font_size_engraver" + + % must come before all + \consists "Output_property_engraver" + \consists "Arpeggio_engraver" + \consists "Multi_measure_rest_engraver" + \consists "Text_spanner_engraver" + \consists "Grob_pq_engraver" + \consists "Note_head_line_engraver" + \consists "Glissando_engraver" + \consists "Ligature_bracket_engraver" + \consists "Breathing_sign_engraver" + % \consists "Rest_engraver" + \consists "Grace_beam_engraver" + \consists "New_fingering_engraver" + \consists "Chord_tremolo_engraver" + \consists "Percent_repeat_engraver" + \consists "Slash_repeat_engraver" + \consists "Melisma_translator" %{ - Must come before text_engraver, but after note_column engraver. + Must come before text_engraver, but after note_column engraver. %} - \consists "Text_engraver" - \consists "Dynamic_engraver" - \consists "Fingering_engraver" + \consists "Text_engraver" + \consists "Dynamic_engraver" + \consists "Fingering_engraver" - \consists "Script_column_engraver" - \consists "Rhythmic_column_engraver" - \consists "Cluster_spanner_engraver" - \consists "Tie_engraver" - \consists "Tie_engraver" - \consists "Tuplet_engraver" - \consists "Note_heads_engraver" - \consists "Rest_engraver" + \consists "Script_column_engraver" + \consists "Rhythmic_column_engraver" + \consists "Cluster_spanner_engraver" + \consists "Tie_engraver" + \consists "Tie_engraver" + \consists "Tuplet_engraver" + \consists "Note_heads_engraver" + \consists "Rest_engraver" - \consists "Skip_event_swallow_translator" + \consists "Skip_event_swallow_translator" } \score { \topVoice \layout { - \context { \MyStaff } - \context { \MyVoice } - } + \context { \MyStaff } + \context { \MyVoice } + } } @@ -150,84 +152,83 @@ MyStaff = \context { MyStaff = \context { \MyStaff - \consists "Clef_engraver" + \consists "Clef_engraver" \remove "Pitch_squash_engraver" } \score { \topVoice \layout { - \context { \MyStaff } - \context { \MyVoice } - } + \context { \MyStaff } + \context { \MyVoice } + } } MyVoice = \context { - \MyVoice - \consists "Stem_engraver" - } + \MyVoice + \consists "Stem_engraver" +} \score { \topVoice \layout { - \context { \MyStaff } - \context { \MyVoice } - } + \context { \MyStaff } + \context { \MyVoice } + } } MyVoice = \context { - \MyVoice - \consists "Beam_engraver" + \MyVoice + \consists "Beam_engraver" } \score { \topVoice \layout { - \context { \MyStaff } - \context { \MyVoice } - } + \context { \MyStaff } + \context { \MyVoice } + } } MyVoice= \context { - \MyVoice - \consists "Phrasing_slur_engraver" - \consists "Slur_engraver" - \consists "Script_engraver" + \MyVoice + \consists "Phrasing_slur_engraver" + \consists "Slur_engraver" + \consists "Script_engraver" } \score { \topVoice \layout { - \context { \MyStaff } - \context { \MyVoice } - } + \context { \MyStaff } + \context { \MyVoice } + } } MyStaff = \context { - \MyStaff - \consists "Bar_engraver" - \consists "Time_signature_engraver" - + \MyStaff + \consists "Bar_engraver" + \consists "Time_signature_engraver" } \score { \topVoice \layout { - \context { \MyStaff } - \context { \MyVoice } - } + \context { \MyStaff } + \context { \MyVoice } + } } MyStaff = \context { - \MyStaff - \consists "Accidental_engraver" - \consists "Key_engraver" + \MyStaff + \consists "Accidental_engraver" + \consists "Key_engraver" } \score { \topVoice \layout { - \context { \MyStaff } - \context { \MyVoice } - } + \context { \MyStaff } + \context { \MyVoice } + } } diff --git a/lily/piano-pedal-align-engraver.cc b/lily/piano-pedal-align-engraver.cc new file mode 100644 index 0000000000..6b1fc5b29d --- /dev/null +++ b/lily/piano-pedal-align-engraver.cc @@ -0,0 +1,266 @@ +/* + piano-pedal-align-engraver.cc -- implement Piano_pedal_align_engraver + + source file of the GNU LilyPond music typesetter + + (c) 2006 Han-Wen Nienhuys + +*/ + + +#include "engraver.hh" + +#include "spanner.hh" +#include "item.hh" +#include "side-position-interface.hh" +#include "stream-event.hh" +#include "warn.hh" +#include "axis-group-interface.hh" + + +/* + TODO: + + + * Detach from pedal specifics, + + * Also use this engraver for dynamics. + +*/ + + +struct Pedal_align_info +{ + Spanner *line_spanner_; + Grob *carrying_item_; + Spanner *carrying_spanner_; + Spanner *finished_carrying_spanner_; + + Pedal_align_info () + { + clear (); + + } + void clear () + { + line_spanner_ = 0; + carrying_spanner_ = 0; + carrying_item_ = 0; + finished_carrying_spanner_ = 0; + } + bool is_finished () + { + bool do_continue = carrying_item_; + + do_continue |= (carrying_spanner_ && !finished_carrying_spanner_); + do_continue |= (carrying_spanner_ && finished_carrying_spanner_ != carrying_spanner_); + + return !do_continue; + } +}; + +class Piano_pedal_align_engraver : public Engraver +{ +public: + TRANSLATOR_DECLARATIONS (Piano_pedal_align_engraver); + +protected: + virtual void finalize (); + + DECLARE_ACKNOWLEDGER (piano_pedal_script); + DECLARE_ACKNOWLEDGER (piano_pedal_bracket); + DECLARE_ACKNOWLEDGER (note_column); + + DECLARE_END_ACKNOWLEDGER (piano_pedal_bracket); + + void stop_translation_timestep (); + void start_translation_timestep (); + +private: + enum Pedal_type { + SOSTENUTO, + SUSTAIN, + UNA_CORDA, + NUM_PEDAL_TYPES + }; + Pedal_align_info pedal_info_[NUM_PEDAL_TYPES]; + vector supports_; + + Pedal_type get_grob_pedal_type (Grob_info g); + Spanner *make_line_spanner (Pedal_type t, SCM); +}; + +Piano_pedal_align_engraver::Piano_pedal_align_engraver () +{ +} + +void +Piano_pedal_align_engraver::start_translation_timestep () +{ + supports_.clear (); +} + +void +Piano_pedal_align_engraver::stop_translation_timestep () +{ + for (int i = 0; i < NUM_PEDAL_TYPES; i ++) + { + if (pedal_info_[i].line_spanner_) + { + + if (pedal_info_[i].carrying_item_) + { + if (!pedal_info_[i].line_spanner_->get_bound (LEFT)) + pedal_info_[i].line_spanner_->set_bound (LEFT, + pedal_info_[i].carrying_item_); + + pedal_info_[i].line_spanner_->set_bound (RIGHT, + pedal_info_[i].carrying_item_); + } + else if (pedal_info_[i].carrying_spanner_ + || pedal_info_[i].finished_carrying_spanner_ + ) + { + if (!pedal_info_[i].line_spanner_->get_bound (LEFT) + && pedal_info_[i].carrying_spanner_->get_bound (LEFT)) + pedal_info_[i].line_spanner_->set_bound (LEFT, + pedal_info_[i].carrying_spanner_->get_bound (LEFT)); + + + if (pedal_info_[i].finished_carrying_spanner_) + pedal_info_[i].line_spanner_->set_bound (RIGHT, + pedal_info_[i].finished_carrying_spanner_->get_bound (RIGHT)); + } + + for (vsize j = 0; j < supports_.size (); j++) + { + Side_position_interface::add_support (pedal_info_[i].line_spanner_, supports_[j]); + } + + if (pedal_info_[i].is_finished ()) + { + announce_end_grob (pedal_info_[i].line_spanner_, SCM_EOL); + pedal_info_[i].clear (); + } + } + + pedal_info_[i].carrying_item_ = 0; + } +} + +Piano_pedal_align_engraver::Pedal_type +Piano_pedal_align_engraver::get_grob_pedal_type (Grob_info g) +{ + if (g.event_cause ()->in_event_class ("sostenuto-event")) + return SOSTENUTO; + if (g.event_cause ()->in_event_class ("sustain-event")) + return SUSTAIN; + if (g.event_cause ()->in_event_class ("una-corda-event")) + return UNA_CORDA; + + programming_error ("Unknown piano pedal type. Defaulting to sustain"); + return SUSTAIN; +} + + +Spanner * +Piano_pedal_align_engraver::make_line_spanner (Pedal_type t, SCM cause) +{ + Spanner *sp = pedal_info_[t].line_spanner_; + if (!sp) + { + switch (t) + { + case (SOSTENUTO): + sp = make_spanner ("SostenutoPedalLineSpanner", cause); + break; + case (SUSTAIN): + sp = make_spanner ("SustainPedalLineSpanner", cause); + break; + case (UNA_CORDA): + sp = make_spanner ("UnaCordaPedalLineSpanner", cause); + break; + default: + programming_error ("No pedal type fonud!") ; + return sp; + } + + pedal_info_[t].line_spanner_ = sp; + } + + return sp; +} + +void +Piano_pedal_align_engraver::acknowledge_note_column (Grob_info gi) +{ + supports_.push_back (gi.grob ()); +} + +void +Piano_pedal_align_engraver::acknowledge_piano_pedal_bracket (Grob_info gi) +{ + Pedal_type type = get_grob_pedal_type (gi); + Grob *sp = make_line_spanner (type, gi.grob ()->self_scm ()); + + Axis_group_interface::add_element (sp, gi.grob ()); + pedal_info_[type].carrying_spanner_ = gi.spanner (); +} + +void +Piano_pedal_align_engraver::acknowledge_end_piano_pedal_bracket (Grob_info gi) +{ + Pedal_type type = get_grob_pedal_type (gi); + pedal_info_[type].finished_carrying_spanner_ = gi.spanner (); +} + +void +Piano_pedal_align_engraver::acknowledge_piano_pedal_script (Grob_info gi) +{ + Pedal_type type = get_grob_pedal_type (gi); + + Grob *sp = make_line_spanner (type, gi.grob ()->self_scm ()); + Axis_group_interface::add_element (sp, gi.grob ()); + pedal_info_[type].carrying_item_ = gi.grob (); +} + + +void +Piano_pedal_align_engraver::finalize () +{ + for (int i = 0; i < NUM_PEDAL_TYPES; i ++) + { + if (pedal_info_[i].line_spanner_) + { + SCM cc = get_property ("currentCommandColumn"); + Item *c = unsmob_item (cc); + pedal_info_[i].line_spanner_->set_bound (RIGHT, c); + + pedal_info_[i].clear (); + } + } +} + +#include "translator.icc" + +ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, note_column); +ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket); +ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_script); + +ADD_END_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket); + + +ADD_TRANSLATOR (Piano_pedal_align_engraver, + + /* doc */ + "Align piano pedal symbols and brackets.", + + /* create */ + "SostenutoPedalLineSpanner " + "SustainPedalLineSpanner " + "UnaCordaPedalLineSpanner ", + + /* read */ + "currentCommandColumn ", + + /* write */ ""); diff --git a/lily/piano-pedal-bracket.cc b/lily/piano-pedal-bracket.cc index b0caa70f12..baffc8fe98 100644 --- a/lily/piano-pedal-bracket.cc +++ b/lily/piano-pedal-bracket.cc @@ -89,7 +89,16 @@ Piano_pedal_bracket::print (SCM smob) return m.smobbed_copy (); } -ADD_INTERFACE (Piano_pedal_bracket, "piano-pedal-bracket-interface", - "The bracket of the piano pedal. It can be tuned through the regular " +ADD_INTERFACE (Piano_pedal_bracket, + "piano-pedal-bracket-interface", + + "The bracket of the piano pedal. " + "It can be tuned through the regular " "bracket properties.", - "bound-padding edge-height shorten-pair bracket-flare pedal-text"); + + /* props */ + "bound-padding " + "edge-height " + "shorten-pair " + "bracket-flare " + "pedal-text"); diff --git a/lily/piano-pedal-engraver.cc b/lily/piano-pedal-engraver.cc index 621ad79c63..25c486f9e6 100644 --- a/lily/piano-pedal-engraver.cc +++ b/lily/piano-pedal-engraver.cc @@ -27,11 +27,22 @@ #include "translator.icc" /* - Urgh. This engraver is too complex. rewrite. --hwn + TODO: + + * Junk hardcoded sustain/sostenuto/una_corda distinction; + Softcode using (list (sustain-event SustainPedal PianoPedalBracket) ... ) + + * Try to use same engraver for dynamics. + */ /* Ugh: This declaration is duplicated in piano-pedal-performer */ -typedef enum Pedal_type {SOSTENUTO, SUSTAIN, UNA_CORDA, NUM_PEDAL_TYPES}; +typedef enum Pedal_type { + SOSTENUTO, + SUSTAIN, + UNA_CORDA, + NUM_PEDAL_TYPES +}; /* Static precalculated data (symbols and strings) for the different @@ -44,7 +55,6 @@ struct Pedal_type_info SCM style_sym_; SCM strings_sym_; - const char *pedal_line_spanner_c_str_; const char *pedal_c_str_; Pedal_type_info () @@ -52,7 +62,6 @@ struct Pedal_type_info event_class_sym_ = SCM_EOL; style_sym_ = SCM_EOL; strings_sym_ = SCM_EOL; - pedal_line_spanner_c_str_ = 0; pedal_c_str_ = 0; } void protect () @@ -87,12 +96,6 @@ struct Pedal_info Item *item_; Spanner *bracket_; // A single portion of a pedal bracket Spanner *finished_bracket_; - - /* - This grob contains all the pedals of the same type on the same staff - */ - Spanner *line_spanner_; - Spanner *finished_line_spanner_; }; static Pedal_type_info pedal_types_[NUM_PEDAL_TYPES]; @@ -101,33 +104,26 @@ class Piano_pedal_engraver : public Engraver { public: TRANSLATOR_DECLARATIONS (Piano_pedal_engraver); - ~Piano_pedal_engraver (); + protected: virtual void initialize (); virtual void finalize (); DECLARE_TRANSLATOR_LISTENER (sustain); DECLARE_TRANSLATOR_LISTENER (una_corda); DECLARE_TRANSLATOR_LISTENER (sostenuto); - void stop_translation_timestep (); DECLARE_ACKNOWLEDGER (note_column); + void stop_translation_timestep (); void process_music (); private: Pedal_info info_list_[NUM_PEDAL_TYPES + 1]; - /* - Record a stack of the current pedal spanners, so if more than one pedal - occurs simultaneously then extra space can be added between them. - */ - - vector previous_; - void del_linespanner (Spanner *); - void create_text_grobs (Pedal_info *p, bool); void create_bracket_grobs (Pedal_info *p, bool); void typeset_all (Pedal_info *p); }; + static void init_pedal_types () { @@ -161,7 +157,6 @@ init_pedal_types () info.style_sym_ = scm_str2symbol (("pedal" + base_name + "Style").c_str ()); info.strings_sym_ = scm_str2symbol (("pedal" + base_name + "Strings").c_str ()); - info.pedal_line_spanner_c_str_ = strdup ((base_name + "PedalLineSpanner").c_str ()); info.base_name_ = name; info.pedal_c_str_ = strdup ((base_name + "Pedal").c_str ()); @@ -170,6 +165,7 @@ init_pedal_types () pedal_types_[i] = info; } } + ADD_SCM_INIT_FUNC (Piano_pedal_engraver_init_pedal_types_, init_pedal_types); Piano_pedal_engraver::Piano_pedal_engraver () @@ -188,8 +184,6 @@ Piano_pedal_engraver::initialize () info->item_ = 0; info->bracket_ = 0; info->finished_bracket_ = 0; - info->line_spanner_ = 0; - info->finished_line_spanner_ = 0; info->current_bracket_ev_ = 0; info->event_drul_[START] = 0; info->event_drul_[STOP] = 0; @@ -198,9 +192,6 @@ Piano_pedal_engraver::initialize () info_list_[NUM_PEDAL_TYPES].type_ = 0; } -Piano_pedal_engraver::~Piano_pedal_engraver () -{ -} /* Urg: Code dup @@ -211,11 +202,6 @@ Piano_pedal_engraver::acknowledge_note_column (Grob_info info) { for (Pedal_info *p = info_list_; p->type_; p++) { - if (p->line_spanner_) - { - Side_position_interface::add_support (p->line_spanner_, info.grob ()); - add_bound_item (p->line_spanner_, info.grob ()); - } if (p->bracket_) add_bound_item (p->bracket_, info.grob ()); if (p->finished_bracket_) @@ -254,13 +240,6 @@ Piano_pedal_engraver::process_music () { if (p->event_drul_[STOP] || p->event_drul_[START]) { - if (!p->line_spanner_) - { - const char *name = p->type_->pedal_line_spanner_c_str_; - Stream_event *rq = (p->event_drul_[START] ? p->event_drul_[START] : p->event_drul_[STOP]); - p->line_spanner_ = make_spanner (name, rq->self_scm ()); - } - /* Choose the appropriate grobs to add to the line spanner These can be text items or text-spanners */ @@ -337,18 +316,7 @@ Piano_pedal_engraver::create_text_grobs (Pedal_info *p, bool mixed) { p->start_ev_ = p->event_drul_[START]; s = scm_car (strings); - if (!mixed) - { - /* - Code dup?! see below. - */ - if (previous_.size ()) - // add extra space below the previous already-occuring pedal - Side_position_interface::add_support (p->line_spanner_, - previous_.back ()); - previous_.push_back (p->line_spanner_); - } - } + } if (scm_is_string (s)) { @@ -359,7 +327,6 @@ Piano_pedal_engraver::create_text_grobs (Pedal_info *p, bool mixed) : p->event_drul_[STOP])->self_scm ()); p->item_->set_property ("text", s); - Axis_group_interface::add_element (p->line_spanner_, p->item_); } if (!mixed) @@ -396,12 +363,16 @@ Piano_pedal_engraver::create_bracket_grobs (Pedal_info *p, bool mixed) if (!p->event_drul_[START]) { SCM flare = p->bracket_->get_property ("bracket-flare"); - p->bracket_->set_property ("bracket-flare", scm_cons (scm_car (flare), - scm_from_double (0))); + if (scm_is_pair (flare)) + p->bracket_->set_property ("bracket-flare", scm_cons (scm_car (flare), + scm_from_double (0))); } p->finished_bracket_ = p->bracket_; p->bracket_ = 0; + + announce_end_grob (p->finished_bracket_, p->event_drul_[STOP]->self_scm ()); + p->current_bracket_ev_ = 0; } @@ -441,36 +412,6 @@ Piano_pedal_engraver::create_bracket_grobs (Pedal_info *p, bool mixed) if (p->item_) p->bracket_->set_object ("pedal-text", p->item_->self_scm ()); } - - /* - We do not use currentMusicalColumn for the left span-point. - If the column as accidentals (eg on a different stave), the - currentMusicalColumn is too wide, making the bracket too big. - - TODO: - - Hmm. What do we do when there are no notes when the spanner starts? - - TODO: - - what about the right span point? - - */ - Axis_group_interface::add_element (p->line_spanner_, p->bracket_); - - if (!p->event_drul_[STOP]) - { - - /* - code dup. --hwn. - - // position new pedal spanner below the current one - */ - if (previous_.size ()) - Side_position_interface::add_support (p->line_spanner_, previous_.back ()); - - previous_.push_back (p->line_spanner_); - } } p->event_drul_[START] = 0; @@ -482,13 +423,6 @@ Piano_pedal_engraver::finalize () { for (Pedal_info *p = info_list_; p->type_; p++) { - /* - suicide? - */ - if (p->line_spanner_ - && !p->line_spanner_->is_live ()) - p->line_spanner_ = 0; - if (p->bracket_ && !p->bracket_->is_live ()) p->bracket_ = 0; @@ -497,46 +431,30 @@ Piano_pedal_engraver::finalize () { SCM cc = get_property ("currentCommandColumn"); Item *c = unsmob_item (cc); - if (p->line_spanner_) - p->line_spanner_->set_bound (RIGHT, c); p->bracket_->set_bound (RIGHT, c); p->finished_bracket_ = p->bracket_; p->bracket_ = 0; - p->finished_line_spanner_ = p->line_spanner_; - p->line_spanner_ = 0; typeset_all (p); } - if (p->line_spanner_) - { - p->finished_line_spanner_ = p->line_spanner_; - typeset_all (p); - } } } -void -Piano_pedal_engraver::del_linespanner (Spanner *g) -{ - vsize idx = find (previous_, g) - previous_.begin (); - if (idx != VPOS && idx < previous_.size ()) - previous_.erase (previous_.begin () + idx); -} - void Piano_pedal_engraver::stop_translation_timestep () { for (Pedal_info *p = info_list_; p->type_; p++) { - if (!p->bracket_) + + typeset_all (p); + if (p->bracket_ && !p->bracket_->get_bound (LEFT)) { - p->finished_line_spanner_ = p->line_spanner_; - p->line_spanner_ = 0; - del_linespanner (p->finished_line_spanner_); - } + Grob *cmc = unsmob_grob (get_property ("currentMusicalColumn")); - typeset_all (p); + if (!p->bracket_->get_bound (LEFT)) + p->bracket_->set_bound (LEFT, cmc); + } } for (Pedal_info *p = info_list_; p->type_; p++) @@ -552,9 +470,6 @@ Piano_pedal_engraver::typeset_all (Pedal_info *p) /* Handle suicide. */ - if (p->finished_line_spanner_ - && !p->finished_line_spanner_->is_live ()) - p->finished_line_spanner_ = 0; if (p->finished_bracket_ && !p->finished_bracket_->is_live ()) p->finished_bracket_ = 0; @@ -570,25 +485,6 @@ Piano_pedal_engraver::typeset_all (Pedal_info *p) p->finished_bracket_ = 0; } - - if (p->finished_line_spanner_) - { - Grob *l = p->finished_line_spanner_->get_bound (LEFT); - Grob *r = p->finished_line_spanner_->get_bound (RIGHT); - if (!r && l) - p->finished_line_spanner_->set_bound (RIGHT, l); - else if (!l && r) - p->finished_line_spanner_->set_bound (LEFT, r); - else if (!r && !l) - { - Grob *cc = unsmob_grob (get_property ("currentMusicalColumn")); - Item *ci = dynamic_cast (cc); - p->finished_line_spanner_->set_bound (RIGHT, ci); - p->finished_line_spanner_->set_bound (LEFT, ci); - } - - p->finished_line_spanner_ = 0; - } } ADD_ACKNOWLEDGER (Piano_pedal_engraver, note_column); @@ -599,12 +495,10 @@ ADD_TRANSLATOR (Piano_pedal_engraver, "Engrave piano pedal symbols and brackets.", /* create */ + "PianoPedalBracket " "SostenutoPedal " - "SostenutoPedalLineSpanner " "SustainPedal " - "SustainPedalLineSpanner " - "UnaCordaPedal " - "UnaCordaPedalLineSpanner ", + "UnaCordaPedal ", /* read */ "currentCommandColumn " @@ -614,4 +508,5 @@ ADD_TRANSLATOR (Piano_pedal_engraver, "pedalSustainStyle " "pedalUnaCordaStrings " "pedalUnaCordaStyle", + /* write */ ""); diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 07ca63ac04..ffa0c245a5 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -35,6 +35,7 @@ \consists "Rest_collision_engraver" \consists "Accidental_engraver" \consists "Piano_pedal_engraver" + \consists "Piano_pedal_align_engraver" \consists "Instrument_name_engraver" \consists "String_number_engraver" \consists "Axis_group_engraver" diff --git a/ly/paper-defaults.ly b/ly/paper-defaults.ly index 8b211581cf..357692c44a 100644 --- a/ly/paper-defaults.ly +++ b/ly/paper-defaults.ly @@ -122,9 +122,6 @@ head-separation = 4 \mm foot-separation = 4 \mm - left-margin = 10 \mm - right-margin = 10 \mm - first-page-number = #1 print-first-page-number =##f } diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 14eb7e1796..f54664c87d 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1381,6 +1381,7 @@ (meta . ((class . Item) (interfaces . (text-interface self-alignment-interface + piano-pedal-script-interface font-interface)))))) (SostenutoPedalLineSpanner @@ -1591,6 +1592,7 @@ line-spanner-interface text-interface self-alignment-interface + piano-pedal-script-interface font-interface)))))) (SustainPedalLineSpanner @@ -1889,6 +1891,7 @@ (X-offset . ,ly:self-alignment-interface::x-aligned-on-self) (meta . ((class . Item) (interfaces . (text-interface + piano-pedal-script-interface self-alignment-interface font-interface)))))) diff --git a/scm/page.scm b/scm/page.scm index 83bcb40097..40fd537557 100644 --- a/scm/page.scm +++ b/scm/page.scm @@ -221,8 +221,7 @@ (let* ((paper-height (ly:output-def-lookup layout 'paper-height)) (paper-width (ly:output-def-lookup layout 'paper-width)) - - (lmargin (ly:output-def-lookup layout 'left-margin)) + (lmargin (ly:output-def-lookup layout 'left-margin #f)) (left-margin (if lmargin lmargin (/ (- paper-width diff --git a/scm/paper.scm b/scm/paper.scm index b729b996e5..6c0c031c02 100644 --- a/scm/paper.scm +++ b/scm/paper.scm @@ -95,8 +95,8 @@ (module-define! m 'paper-width w) (module-define! m 'paper-height h) (module-define! m 'line-width (- w - (ly:modules-lookup (list m) 'left-margin) - (ly:modules-lookup (list m) 'right-margin))) + (ly:modules-lookup (list m) 'left-margin (* 10 mm)) + (ly:modules-lookup (list m) 'right-margin (* 10 mm)))) (module-define! m 'indent (/ w 14)) diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index 3f306560d6..bb04079563 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -67,7 +67,7 @@ original_dir = os.getcwd () backend = 'ps' help_summary = _ ( -'''Process LilyPond snippets in hybrid HTML, LaTeX, or texinfo document. +'''Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document. Example usage: @@ -132,7 +132,7 @@ def get_option_parser (): help=_ ("pipe snippets through FILTER [convert-ly -n -]"), default=None) p.add_option ('-f', '--format', - help=_('''use output format FORMAT (texi [default], texi-html, latex, html)'''), + help=_('''use output format FORMAT (texi [default], texi-html, latex, html, docbook)'''), action='store') p.add_option ("-I", '--include', help=_('add DIR to include path'), @@ -191,6 +191,7 @@ default_ly_options = { 'alt': "[image of music]" } # AFTER = 'after' BEFORE = 'before' +DOCBOOK = 'docbook' EXAMPLEINDENT = 'exampleindent' FILTER = 'filter' FRAGMENT = 'fragment' @@ -239,6 +240,43 @@ no_options = { # (?x) -- Ignore whitespace in patterns. no_match = 'a\ba' snippet_res = { + ## + DOCBOOK: { + 'include': + no_match, + + 'lilypond': + r'''(?smx) + (?P + <(?P(inline)?)mediaobject>\s*\s*.*?)")?>(?P.*?)\s*\s*)''', + + 'lilypond_block': + r'''(?smx) + (?P + <(?P(inline)?)mediaobject>\s*\s*.*?)")?>(?P.*?)\s*\s*)''', + + 'lilypond_file': + r'''(?smx) + (?P + <(?P(inline)?)mediaobject>\s*\s*.*?\.ly)"\s*(role="(?P.*?)")?\s*(/>|>\s*)\s*\s*)''', + + 'multiline_comment': + r'''(?smx) + (?P + \s*(?!@c\s+) + (?P) + \s)''', + + 'singleline_comment': + no_match, + + 'verb': + no_match, + + 'verbatim': + no_match, + + }, ## HTML: { 'include': @@ -436,6 +474,10 @@ snippet_res = { format_res = { + DOCBOOK: { + 'intertext': r',?\s*intertext=\".*?\"', + 'option_sep': '\s*', + }, HTML: { 'intertext': r',?\s*intertext=\".*?\"', 'option_sep': '\s*', @@ -505,6 +547,21 @@ ly_options = { } output = { + ## + DOCBOOK: { + FILTER: r'''%(code)s''', + + OUTPUT: r''' + + + + + ''', + + VERBATIM: r'''%(verb)s''', + + PRINTFILENAME: '%(filename)s' + }, ## HTML: { FILTER: r''' @@ -1104,6 +1161,22 @@ class Lilypond_snippet (Snippet): images = tuple (images) return images + def output_docbook (self): + str = '' + base = self.basename () + for image in self.get_images (): + (base, ext) = os.path.splitext (image) + str += output[DOCBOOK][OUTPUT] % vars () + str += self.output_print_filename (DOCBOOK) + if (self.substring('inline') == 'inline'): + str = '' + str + '' + else: + str = '' + str + '' + if VERBATIM in self.option_dict: + verb = verbatim_html (self.substring ('code')) + str = output[DOCBOOK][VERBATIM] % vars () + str + return str + def output_html (self): str = '' base = self.basename () @@ -1371,7 +1444,8 @@ def process_snippets (cmd, ly_snippets, texstr_snippets, png_snippets): if global_options.format in (HTML, TEXINFO): cmd += ' --formats=png ' - + if global_options.format in (DOCBOOK): + cmd += ' --formats=png,pdf ' # UGH # the --process=CMD switch is a bad idea # it is too generic for lilypond-book. @@ -1465,6 +1539,7 @@ ext2format = { '.texi': TEXINFO, '.texinfo': TEXINFO, '.xml': HTML, + '.lyxml': DOCBOOK } format2ext = { @@ -1472,6 +1547,7 @@ format2ext = { # TEXINFO: '.texinfo', TEXINFO: '.texi', LATEX: '.tex', + DOCBOOK: '.xml' } class Compile_error: @@ -1701,7 +1777,7 @@ def main (): global_options.format = guess_format (files[0]) formats = 'ps' - if global_options.format in (TEXINFO, HTML): + if global_options.format in (TEXINFO, HTML, DOCBOOK): formats += ',png' -- 2.39.5