]> git.donarmstrong.com Git - lilypond.git/commitdiff
* Documentation/user/refman.itely (More stanzas): document slur
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Fri, 6 Feb 2004 22:38:47 +0000 (22:38 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Fri, 6 Feb 2004 22:38:47 +0000 (22:38 +0000)
deficiency.

* lily/melisma-performer.cc (try_music): new file. Handle
melismata to help lyrics.

* lily/beam-performer.cc (try_music): new file. Handle beam events
to help lyrics.

* lily/score-performer.cc (one_time_step): reinstate
process_music().

* lily/performer.cc (process_music): add to interface.

* lily/performer-group-performer.cc (process_music): new function.

* lily/dot-column.cc (do_shifts): do collision resolution before
dot positioning.

16 files changed:
ChangeLog
Documentation/user/refman.itely
lily/beam-engraver.cc
lily/beam-performer.cc [new file with mode: 0644]
lily/dot-column.cc
lily/include/performer-group-performer.hh
lily/include/performer.hh
lily/include/translator.hh
lily/melisma-engraver.cc
lily/melisma-performer.cc [new file with mode: 0644]
lily/performer-group-performer.cc
lily/performer.cc
lily/score-performer.cc
lily/translator.cc
ly/performer-init.ly
make/ly-rules.make

index 6d8affe3e82a01a67db207708322aa0d12f18470..fe7ae09503b56db71fa3c01546eaf61512e8ae5d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,25 @@
 2004-02-06  Han-Wen Nienhuys   <hanwen@xs4all.nl>
 
+       * Documentation/user/refman.itely (More stanzas): document slur
+       deficiency.
+
+       * lily/melisma-performer.cc (try_music): new file. Handle
+       melismata to help lyrics.
+
+       * lily/beam-performer.cc (try_music): new file. Handle beam events
+       to help lyrics.
+
+       * lily/score-performer.cc (one_time_step): reinstate
+       process_music().
+       
+
+       * lily/performer.cc (process_music): add to interface.
+
+       * lily/performer-group-performer.cc (process_music): new function.
+
+       * lily/dot-column.cc (do_shifts): do collision resolution before
+       dot positioning.
+       
        * scripts/lilypond-book.py (Snippet.output_print_filename): new
        file, process printfilename option.
        (Snippet.__init__): rewrite: do not use global variables h or
index ace7cf0593e905084a20d46566bfc0fa55f5872d..2d5b1003349361f3051c6436457986976d8884e2 100644 (file)
@@ -3540,7 +3540,8 @@ making or a music identifier @code{\foo} containing the syllable
   foo = \lyrics bar4
 @end example
 
-
+The MIDI version of @code{\lyricsto} doesn't detect melismata caused
+by slurs.
 
 
 @node Ambitus
index cad222eef8241063e50fb94884bfb34b45539e63..868ddcbfc9824d8693696711474404990fc3d719 100644 (file)
@@ -22,7 +22,7 @@
 class Beam_engraver : public Engraver
 {
 protected:  
-  Drul_array<Music*> evs_drul_;
+  Music * start_ev_;
   
   Spanner *finished_beam_;
   Spanner *beam_;
@@ -87,7 +87,7 @@ Beam_engraver::Beam_engraver ()
   finished_beam_info_=0;
   beam_info_ =0;
   now_stop_ev_ = 0;
-  evs_drul_[LEFT] = evs_drul_[RIGHT] =0;
+  start_ev_ = 0;
   prev_start_ev_ =0;
 }
 
@@ -104,7 +104,7 @@ Beam_engraver::try_music (Music *m)
 
       if (d == START)
        {
-         evs_drul_[d] = m;
+         start_ev_ = m;
        }
       else if (d==STOP)
        {
@@ -126,31 +126,21 @@ Beam_engraver::set_melisma (bool ml)
 void
 Beam_engraver::process_music ()
 {
-  if (evs_drul_[STOP])
-    {
-      prev_start_ev_ =0;
-      finished_beam_ = beam_;
-      finished_beam_info_ = beam_info_;
-
-      beam_info_ =0;
-      beam_ = 0;
-    }
-
   if (beam_ && !to_boolean (get_property ("allowBeamBreak")))
     {
       top_engraver ()->forbid_breaks ();
     }
 
-  if (evs_drul_[START])
+  if (start_ev_)
     {
       if (beam_)
        {
-         evs_drul_[START]->origin ()->warning (_ ("already have a beam"));
+         start_ev_->origin ()->warning (_ ("already have a beam"));
          return;
        }
 
       set_melisma (true);
-      prev_start_ev_ = evs_drul_[START];
+      prev_start_ev_ = start_ev_;
       beam_ = make_spanner ("Beam");
       SCM smp = get_property ("measurePosition");
       Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0);
@@ -161,7 +151,7 @@ Beam_engraver::process_music ()
       beam_info_ = new Beaming_info_list;
       
       /* urg, must copy to Auto_beam_engraver too */
-      announce_grob (beam_, evs_drul_[START]->self_scm());
+      announce_grob (beam_, start_ev_->self_scm());
     }
 
 }
@@ -184,8 +174,7 @@ Beam_engraver::typeset_beam ()
 void
 Beam_engraver::start_translation_timestep ()
 {
-  evs_drul_ [START] =0;
-  evs_drul_[STOP] = 0;
+  start_ev_ = 0;
   
   if (beam_)
     {
@@ -209,7 +198,7 @@ Beam_engraver::stop_translation_timestep ()
       beam_ = 0;
       beam_info_ = 0;
       typeset_beam();
-         set_melisma (false);
+      set_melisma (false);
     }
 }
 
diff --git a/lily/beam-performer.cc b/lily/beam-performer.cc
new file mode 100644 (file)
index 0000000..24662aa
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+  beam-performer.cc -- implement Beam_performer
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1996--2004 Jan Nieuwenhuizen <janneke@gnu.org>
+ */
+
+#include "performer.hh"
+#include "event.hh"
+#include "audio-item.hh"
+#include "audio-column.hh"
+#include "global-translator.hh"
+#include "warn.hh"
+
+/**
+Convert evs to audio beams.
+*/
+class Beam_performer : public Performer {
+public:
+  TRANSLATOR_DECLARATIONS(Beam_performer);
+  
+protected:
+  virtual bool try_music (Music *ev) ;
+  virtual void start_translation_timestep ();
+  virtual void process_music ();
+  void set_melisma (bool);
+private:
+  Music *start_ev_;
+  Music *now_stop_ev_;
+  bool beam_;
+};
+
+void 
+Beam_performer::process_music ()
+{
+  if (now_stop_ev_)
+    {
+      beam_ = false;
+    }
+
+  if (start_ev_)
+    {
+      if (beam_)
+       {
+         start_ev_->origin ()->warning (_ ("already have a beam"));
+         return;
+       }
+      
+      beam_ = true;
+      set_melisma (true);
+    }
+}
+
+
+void
+Beam_performer::set_melisma (bool ml)
+{
+  SCM b = get_property ("autoBeaming");
+  if (!to_boolean (b))
+    daddy_trans_->set_property ("beamMelismaBusy", ml ? SCM_BOOL_T :SCM_BOOL_F);
+}
+
+
+void
+Beam_performer::start_translation_timestep ()
+{
+  if (beam_)
+    {
+      set_melisma (true);
+    }
+  
+  start_ev_ = 0;
+  now_stop_ev_ = 0;
+}
+
+
+bool
+Beam_performer::try_music (Music *m)
+{
+  if (m->is_mus_type ("beam-event"))
+    {
+      Direction d = to_dir (m->get_mus_property ("span-direction"));
+
+      if (d == START)
+       {
+         start_ev_ = m;
+       }
+      else if (d==STOP)
+       {
+         now_stop_ev_ = m;
+       }
+      return true;
+    }
+  return false;
+}
+
+ENTER_DESCRIPTION(Beam_performer,"","",
+                 "beam-event","","","");
+
+Beam_performer::Beam_performer()
+{
+  beam_ = false;
+}
index 0f3d4f98dc1ae316dbf4cf829793e33e6b50bfcb..4cb993c719295870709b475e224c6411c299b120 100644 (file)
@@ -231,6 +231,26 @@ Dot_column::do_shifts (Grob*me)
 {
   Link_array<Grob> dots =
     Pointer_group_interface__extract_grobs (me, (Grob*)0, "dots");
+
+  { /*
+      Trigger note collision resolution first, since that may kill off
+      dots when merging.
+     */
+    Grob * c = 0;
+    for (int i = dots.size (); i-- ; )
+      {
+       Grob * n = dots[i]->get_parent (Y_AXIS);
+       if (c)
+         c = n->common_refpoint (c, X_AXIS);
+       else
+         c = n;
+      }
+    for (int i = dots.size (); i-- ; )
+      {
+       Grob * n = dots[i]->get_parent (Y_AXIS);
+       n->relative_coordinate (c ,  X_AXIS);
+      }
+  }
   
   dots.sort (compare_position);
   for (int i = dots.size (); i--;)
index 0bf2ae4e2dede0df56b3f29fa0933586472d9b59..4a5227735167d34bae4df8e2e1a6adcf9a0d8bbe 100644 (file)
@@ -22,6 +22,7 @@ public:
   TRANSLATOR_DECLARATIONS(Performer_group_performer);
   
   virtual void do_announces ();
+  virtual void process_music ();
   virtual void announce_element (Audio_element_info);
 protected:
   Array<Audio_element_info> announce_infos_;
index 961769ba4a65bad1a3bab7a54de35536a231e9ae..de5731a207337c10dda154c9ad8447819b778d45 100644 (file)
@@ -31,6 +31,7 @@ protected:
   virtual void create_audio_elements ();
   virtual int get_tempo () const;
   virtual void play_element (Audio_element * elem );
+  virtual void process_music ();
 };
 
 
index 16a77c6beefbb33829fec7c90d0cf478d000bd00..7b17db61b97d19e9f9b195749ece6af8a0e933ac 100644 (file)
@@ -44,9 +44,6 @@ public:
   
   Translator_group * daddy_trans_ ;
   void removal_processing ();
-  /**
-    ask daddy for a feature
-    */
   Music_output_def *get_output_def () const;
 
   SCM internal_get_property (SCM symbol) const;
index 6fa0653071faf5180e5d7ddca6b359a2d79183f8..7513fb4e22d4735dede3cbb02a85cdfb1255ed4f 100644 (file)
@@ -7,6 +7,9 @@
   
  */
 
+/*
+  duplicated in melisma-performer
+ */
 #include "engraver.hh"
 #include "event.hh"
 #include "grob.hh"
@@ -15,7 +18,7 @@
 /**
    Signal existence of melismas.
  */
-class Melisma_engraver:public Engraver
+class Melisma_engraver : public Engraver
 {
 public:
   TRANSLATOR_DECLARATIONS(Melisma_engraver);
diff --git a/lily/melisma-performer.cc b/lily/melisma-performer.cc
new file mode 100644 (file)
index 0000000..2ad44ba
--- /dev/null
@@ -0,0 +1,49 @@
+
+/*   
+  melisma-performer.cc --  implement Melisma_performer
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+/*
+  copy of melisma-engraver - see there.
+ */
+#include "performer.hh"
+#include "event.hh"
+#include "grob.hh"
+#include "translator-group.hh"
+
+/**
+   Signal existence of melismas.
+ */
+class Melisma_performer : public Performer
+{
+public:
+  TRANSLATOR_DECLARATIONS(Melisma_performer);
+  bool try_music (Music *);
+};
+
+
+bool
+Melisma_performer::try_music (Music *) 
+{
+  /*
+    This can only be melisma-playing-event.
+   */
+  return melisma_busy (this);
+}
+
+Melisma_performer::Melisma_performer()
+{
+}
+
+ENTER_DESCRIPTION(Melisma_performer,
+/* descr */       "This performer collects melisma information about ties, beams, and user settings (@code{melismaBusy}, and signals it to the @code{\addlyrics} code.  ",
+/* creats*/       "",
+/* accepts */     "melisma-playing-event",
+/* acks  */      "",
+/* reads */       "melismaBusy melismaBusyProperties slurMelismaBusy tieMelismaBusy beamMelismaBusy",
+/* write */       "");
index f6dbca818f502d49fc32f26596710ef492877407..55776074c00c61d4e60ce672ed57b8e10db26961 100644 (file)
@@ -90,4 +90,31 @@ Performer_group_performer::do_announces ()
     }
 }
 
-Performer_group_performer::Performer_group_performer(){}
+Performer_group_performer::Performer_group_performer()
+{
+}
+
+/*
+  C & P from Engraver.
+
+  Should move into Translator ? 
+ */
+void
+Performer_group_performer::process_music ()
+{
+   for (SCM p = get_simple_trans_list (); gh_pair_p (p); p =ly_cdr (p))
+    {
+      Translator * t = unsmob_translator (ly_car (p));
+      Performer * eng = dynamic_cast<Performer*> (t);
+
+      if (eng)
+       eng->process_music ();
+    }
+   for (SCM p = trans_group_list_; gh_pair_p (p); p =ly_cdr (p))
+    {
+      Translator * t = unsmob_translator (ly_car (p));
+      Performer*eng = dynamic_cast<Performer*> (t);
+      if (eng)
+       eng->process_music ();
+    }
+}
index 42d365de00c1f7d0be06395e10c952722f6e5fe3..6d618346eaf452f11d74c009185584a7449baeca 100644 (file)
@@ -49,3 +49,10 @@ Performer::announce_element (Audio_element_info i)
     i.origin_trans_= this;
   get_daddy_perf ()->announce_element (i);
 }
+
+
+void
+Performer::process_music ()
+{
+  
+}
index a3b1abf6c6ba04eccdf9442dabfb5c19c67785db..c8aaaa13d7ea2d6465c71666a3daa48b42c345bd 100644 (file)
@@ -75,8 +75,7 @@ Score_performer::prepare (Moment m)
 void 
 Score_performer::one_time_step ()
 {
-  // fixme: put this back.
-  // process_music ();
+  process_music ();
   do_announces ();
   stop_translation_timestep ();
   check_removal ();
index f4bcc566ae94b303eeb0628b7aa59c80ac9ba261..d71a73fb9890c707126c547c66c3f6348883f117 100644 (file)
@@ -85,7 +85,7 @@ Translator::internal_get_property (SCM sym) const
 }
 
 void
-Translator:: stop_translation_timestep ()
+Translator::stop_translation_timestep ()
 {
 }
 
index 9255018689bc8ab9e52083f997822e12fb66a842..a356de36027871012ad5b50065ea10f960f5ba7d 100644 (file)
@@ -40,6 +40,8 @@
     \type "Performer_group_performer"
     \name Voice
     \consists "Note_performer"
+    \consists "Beam_performer"
+    \consists "Melisma_performer"
 }
 
 \translator {
@@ -84,6 +86,7 @@
 
     \name Score
     \alias Timing
+    melismaBusyProperties = #default-melisma-properties
     instrument = #"bright acoustic"
     \accepts Staff
     \accepts DrumStaff
index 8eef1448100cfcc859a5ff307c7a2efbc71a852e..d513ae3dcf9422c65e3facea28a7d9b40f9f7198 100644 (file)
@@ -15,8 +15,6 @@ $(outdir)/%.texi: %.tely
 
 $(outdir)/%.texi: $(outdir)/%.tely
        if [ -f $@ ]; then chmod a+w $@; fi
-# debugging:
-#      set|egrep '(TEX|LILY)'
        $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND) $(LILYPOND_BOOK_INCLUDES)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) --verbose $(LILYPOND_BOOK_FLAGS) $<
 #
 # DON'T REMOVE SOURCE FILES, otherwise the .TEXI ALWAYS OUT OF DATE.
@@ -27,7 +25,7 @@ $(outdir)/%.texi: $(outdir)/%.tely
 # for plain info doco: don't run lily
 $(outdir)/%.nexi: %.tely
        if [ -f $@ ]; then chmod a+w $@; fi
-       time $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) --verbose $(LILYPOND_BOOK_FLAGS) --process='true' $<
+       $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) --verbose $(LILYPOND_BOOK_FLAGS) --process='true' $<
        mv $(outdir)/$*.texinfo $@ 2>/dev/null || mv $(outdir)/$*.texi $@
        chmod -w $@