]> git.donarmstrong.com Git - lilypond.git/commitdiff
*** empty log message ***
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 18 Oct 2006 10:07:10 +0000 (10:07 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 18 Oct 2006 10:07:10 +0000 (10:07 +0000)
ChangeLog
input/test/engraver-one-by-one.ly
lily/piano-pedal-align-engraver.cc [new file with mode: 0644]
lily/piano-pedal-bracket.cc
lily/piano-pedal-engraver.cc
ly/engraver-init.ly
ly/paper-defaults.ly
scm/define-grobs.scm
scm/page.scm
scm/paper.scm
scripts/lilypond-book.py

index 2e4dccb2a80fc7bd2163f1cf3957ccbf87310c52..502cf6dd62c275214eb77a01b9864dc8c30329a1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2006-10-18  Bertalan Fodor  <lilypondtool@organum.hu>
+
+       * scripts/lilypond-book.py: DocBook support.
+
+2006-10-18  Han-Wen Nienhuys  <hanwen@lilypond.org>
+
+       * 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  <hjunes@gmail.com>
 
        * po/fi.po: Update Finnish translation (before the next release).
@@ -16,6 +35,8 @@
 
 2006-10-17  Han-Wen Nienhuys  <hanwen@lilypond.org>
 
+       * scm/paper.scm: only use left-margin if defined.
+
        * scm/define-grob-interfaces.scm (stroke-finger-interface): typo.
 
        * ly/engraver-init.ly (AncientRemoveEmptyStaffContext): idem.
index af0f289f2592342639a285ebbc2e631e1f1e5998..da657ea895e54438cf7135bba42932582c544a7c 100644 (file)
@@ -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 (file)
index 0000000..6b1fc5b
--- /dev/null
@@ -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 <hanwen@lilypond.org>
+  
+*/
+
+
+#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<Grob *> 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 */ "");
index b0caa70f123bef7096fa74472ab017d7ab88f8c5..baffc8fe98aee8d763fa225b99d1185fda3f998b 100644 (file)
@@ -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");
index 621ad79c6370ab110b41b707f3e3d67809652b31..25c486f9e6361bfb3e094c0822d668dfa3ce94cd 100644 (file)
 #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<Spanner*> 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<Item *> (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 */ "");
index 07ca63ac04de01bbe63f36667aa77f1995b32316..ffa0c245a54eb83a3743a2dca764ab9414407797 100644 (file)
@@ -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"
index 8b211581cf158319c872c28227db73a772bd5a36..357692c44a7aa3dd1cc91202cea72671b5c7fda3 100644 (file)
     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
   }
index 14eb7e17966fc49d7258675023798c4374dee963..f54664c87d73e4d074470f4c1a5f982fcc854027 100644 (file)
        (meta . ((class . Item)
                 (interfaces . (text-interface
                                self-alignment-interface
+                               piano-pedal-script-interface
                                font-interface))))))
 
     (SostenutoPedalLineSpanner
                                line-spanner-interface
                                text-interface
                                self-alignment-interface
+                               piano-pedal-script-interface
                                font-interface))))))
 
     (SustainPedalLineSpanner
        (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))))))
 
index 83bcb40097d99ce941dae27a4a875b86c393b91b..40fd537557f0ad6b5c8f91d03e97c52f5620308e 100644 (file)
   (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
index b729b996e524578740aaac41cea052e2fedceb2c..6c0c031c02aa1ccb905dac3d9fddc358eb37afe1 100644 (file)
@@ -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))
 
index 3f306560d6e2d2a89be6969257a0599685a35e76..bb0407956304ee6d9aae4196efcec072ba2f6598 100644 (file)
@@ -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<match>
+          <(?P<inline>(inline)?)mediaobject>\s*<textobject.*?>\s*<programlisting\s+language="lilypond".*?(role="(?P<options>.*?)")?>(?P<code>.*?)</programlisting\s*>\s*</textobject\s*>\s*</(inline)?mediaobject>)''',
+
+        'lilypond_block':
+         r'''(?smx)
+          (?P<match>
+          <(?P<inline>(inline)?)mediaobject>\s*<textobject.*?>\s*<programlisting\s+language="lilypond".*?(role="(?P<options>.*?)")?>(?P<code>.*?)</programlisting\s*>\s*</textobject\s*>\s*</(inline)?mediaobject>)''',
+
+        'lilypond_file':
+         r'''(?smx)
+          (?P<match>
+          <(?P<inline>(inline)?)mediaobject>\s*<imageobject.*?>\s*<imagedata\s+fileref="(?P<filename>.*?\.ly)"\s*(role="(?P<options>.*?)")?\s*(/>|>\s*</imagedata>)\s*</imageobject>\s*</(inline)?mediaobject>)''',
+
+        'multiline_comment':
+         r'''(?smx)
+          (?P<match>
+          \s*(?!@c\s+)
+          (?P<code><!--\s.*?!-->)
+          \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'''<mediaobject><textobject><programlisting language="lilypond" role="%(options)s">%(code)s</programlisting></textobject></mediaobject>''', 
+    
+        OUTPUT: r'''
+        <imageobject role="latex">
+               <imagedata fileref="%(base)s.pdf" format="PDF"/>
+               </imageobject>
+               <imageobject role="html">
+               <imagedata fileref="%(base)s.png" format="PNG"/></imageobject>''',
+    
+        VERBATIM: r'''<programlisting>%(verb)s</programlisting>''',
+    
+        PRINTFILENAME: '<textobject><simpara><ulink url="%(base)s.ly"><filename>%(filename)s</filename></ulink></simpara></textobject>'
+    },
     ##
     HTML: {
         FILTER: r'''<lilypond %(options)s>
@@ -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 = '<inlinemediaobject>' + str + '</inlinemediaobject>'
+            else:
+                str = '<mediaobject>' + str + '</mediaobject>'
+        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'