]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.1.54
authorfred <fred>
Tue, 26 Mar 2002 22:14:47 +0000 (22:14 +0000)
committerfred <fred>
Tue, 26 Mar 2002 22:14:47 +0000 (22:14 +0000)
61 files changed:
Documentation/tex/engraving.bib
Documentation/topdocs/INSTALL.yo
Documentation/topdocs/index.yo
input/test/chord-table.ly
input/test/notemode-chords.ly
input/test/perform-grace.fly [new file with mode: 0644]
input/test/perform-tie.fly
input/test/rhythm-lyric.ly [new file with mode: 0644]
input/test/rhythm-melody.fly [new file with mode: 0644]
input/test/rhythm.ly [new file with mode: 0644]
input/twinkle.ly
lily/audio-element.cc
lily/audio-item.cc
lily/auto-beam-engraver.cc
lily/chord-name-engraver.cc
lily/grace-iterator.cc
lily/grace-performer-group.cc
lily/grace-position-performer.cc [new file with mode: 0644]
lily/include/audio-element.hh
lily/include/audio-item.hh
lily/include/grace-iterator.hh
lily/include/lily-proto.hh
lily/include/midi-item.hh
lily/include/midi-walker.hh
lily/include/music-iterator.hh
lily/include/music-list-iterator.hh
lily/include/music-list.hh
lily/include/music-wrapper-iterator.hh
lily/include/music-wrapper.hh
lily/include/music.hh
lily/include/my-lily-parser.hh
lily/include/new-repeated-music.hh
lily/include/note-performer.hh
lily/include/re-rhythmed-music.hh [new file with mode: 0644]
lily/include/relative-music.hh
lily/include/request-iterator.hh
lily/include/sequential-music-iterator.hh
lily/include/transposed-music.hh
lily/midi-item.cc
lily/midi-walker.cc
lily/music-iterator.cc
lily/music-list-iterator.cc
lily/music-list.cc
lily/music-sequence.cc
lily/music-wrapper-iterator.cc
lily/music-wrapper.cc
lily/music.cc
lily/my-lily-lexer.cc
lily/my-lily-parser.cc
lily/note-performer.cc
lily/re-rhythmed-music.cc [new file with mode: 0644]
lily/relative-octave-music.cc
lily/repeated-music.cc
lily/request-iterator.cc
lily/sequential-music-iterator.cc
lily/tie-performer.cc
lily/transposed-music.cc
ly/performer.ly
mutopia/E.Satie/gnossienne-4.ly
mutopia/F.Schubert/standchen.ly
scripts/abc-2-ly.py

index ab4099acceda023def6712db7472737181181ad7..bfa65238d343f7f5d1ce5cbf6c2e3ddc2a328463 100644 (file)
@@ -79,6 +79,16 @@ work for music notation issues as one is likely to get. MB},
   isbn = {ISBN 3-7957-2886-x},
 }
 
+{willemze,
+  note = {A comprehensive overview of music theory;
+the (Dutch) authority on general music theory},
+  year =  {1964-1993},
+  title = {Algemene muziekleer},
+  author = {Theo Willemze},
+  publisher = {Aula, Het Spectrum},
+  address = {Utrecht},
+  isbn = {ISBN 90-274-1817-9},
+}
 
 
 @Book {hader48,
index 0c9e54d424020845048a3774938f8ec58c8322ef..e4d9dc3412ffac11f08d59a36b576662eca57fbd 100644 (file)
@@ -100,19 +100,18 @@ conversion tools.
 itemize(
 it()xpmtoppm (from the Portable Bitmap Utilities) (For RedHat Linux
             users: it is included within the package libgr-progs).
-it()Bib2html lurl(http://pertsserver.cs.uiuc.edu/~hull/bib2html.)
-    Which, in turn depends on man2html for proper installation.
-man2html can be had from lurl(http://askdonald.ask.uni-karlsruhe.de/hppd/hpux/Networking/WWW/Man2html-1.05).
+       the original is at
+lurl(ftp://ftp.x.org/contrib/utilities/netpbm-1mar1994.p1.tar.gz)
 
-    TeTeX users should not forget to rerun texhash.
-)
+it()pnmtopng, which is also in libgr-progs for RedHat. The original is
+at
+lurl(ftp://swrinde.nde.swri.edu/pub/png/applications/pnmtopng-2.37.2.tar.gz).i
 
-Building the website requires pnmtopng.  The version of file(pnmtopng)
-that is distributed with RedHat 5.1 and 5.2 contains a bug: pnmtopng
-is dynamically linked to the wrong version of libpng.  Recompile it
-from source, and make sure that the pnmtopng binary is linked
-statically to the libpng that is included in libgr.   RedHat 6.0 does
-not have this problem.
+The version of file(pnmtopng) that is distributed with RedHat 5.1 and
+5.2 contains a bug: pnmtopng is dynamically linked to the wrong
+version of libpng.  Recompile it from source, and make sure that the
+pnmtopng binary is linked statically to the libpng that is included in
+libgr.  RedHat 6.0 does not have this problem.
 
 verb( tar xzf libgr-2.0.13.tar.gz
       make
@@ -123,6 +122,17 @@ verb( tar xzf libgr-2.0.13.tar.gz
 
 You can then install the new pnmtopng into /usr/local/bin/
 
+it()Bib2html lurl(http://pertsserver.cs.uiuc.edu/~hull/bib2html.)
+    Which, in turn depends on man2html for proper installation.
+man2html can be had from lurl(http://askdonald.ask.uni-karlsruhe.de/hppd/hpux/Networking/WWW/Man2html-1.05).
+
+    TeTeX users should not forget to rerun texhash.
+)
+
+You also have to install file(buildscripts/out/ps-to-gifs) in a
+directory that is in the path.
+
+
 sect(CONFIGURING and COMPILING)
 
 to install GNU LilyPond, simply type:
@@ -292,7 +302,7 @@ verb(
        rpm -i /usr/src/redhat/RPMS/i386/lilypond-x.y.z
 )
 
-Precompiled i386 eRedHat RPMS are available from
+Precompiled i386 RedHat RPMS are available from
 lurl(http://linux.umbc.edu/software/lilypond/rpms/).
 
 
index 804d96aeb93556a3e320fc28fc79cb6a4259d63f..7cc1afc560ed96b5d20adb0ba5e3f3e280851f5c 100644 (file)
@@ -71,7 +71,7 @@ it()url(FAQ)(DOEXPAND(docdir)/DOEXPAND(outdir)/faq.html)
 it()url(Mailing Lists)(DOEXPAND(docdir)/DOEXPAND(outdir)/mail.html)
 it()url(All of the LilyPond documentation)(DOEXPAND(docdir)/DOEXPAND(outdir)/index.html)
 it()url(The DOC++ documentation of the C++ sources.)(DOEXPAND(depth)/docxx/index.html)
-it()url(The installation instructions)(DOEXPAND(tops)/INSTALL.html)
+it()url(The installation instructions)(INSTALL.html)
 )
 
 nsect(Sites)
index 907782915f533ecc9ae523775490fbd026b31ee2..c2b30c2c920cc074c322dacf3a0feef46ac64479 100644 (file)
@@ -5,7 +5,7 @@ enteredby =     "jcn";
 }
 
 tab = \notes\transpose c'''\chords{
-       c1 c-m c-4 c-m4 c-5+ c-5- c-m5- c-5-.5+ c-6\break %c-m6\break
+       c1 c-m c-4 c-m.4 c-5+ c-5- c-m.5- c-5-.5+ c-6\break %c-m6\break
 }
 
 \score{
index 5b26d4c1c2f5379b50fd90a547e8ea30dcb3de0f..a096409a42a5d76b90a203adf270d7b5b1516b2b 100644 (file)
@@ -2,7 +2,10 @@
 
 \score{
        \notes \transpose c''{
-               @c1@ @c-7@ @c-7^5@-1-3
+% 1.1.53: @x@ syntax dropped
+% if you want fingering, write chord explicitily; eg < c1-1 e-2 g-3 >
+%              @c1@ @c-7@ @c-7^5@-1-3
+               \chords { c1 c-7 c-7^5 }
        }
 
 }
diff --git a/input/test/perform-grace.fly b/input/test/perform-grace.fly
new file mode 100644 (file)
index 0000000..c24ded8
--- /dev/null
@@ -0,0 +1,5 @@
+\context Voice=VoiceOne
+\property Voice.graceFraction = "1/4"
+\grace c8 d4 d d d d
+\property Voice.graceFraction = "1/2"
+\grace { e16 f e f } d4 d d d d 
index 484f1368c53c90a62d05e5af11733044a9356e56..5bd1eca9aae315f1ad90587177692786286a6672 100644 (file)
@@ -1,2 +1,2 @@
-c8 c c ~ c c c c ~ c ~ c ~ c ~ c c c
+c8 c c ~ c c c c ~ c ~ c ~ c c c
 %\grace { d16 c16 d16 } c8
diff --git a/input/test/rhythm-lyric.ly b/input/test/rhythm-lyric.ly
new file mode 100644 (file)
index 0000000..b9413ec
--- /dev/null
@@ -0,0 +1,12 @@
+text = \lyrics { Feel the rhy- thm }
+
+melody = \notes { 
+       e4. d8 e4. c8
+}
+
+\score{
+       <
+               \context Voice \notes\relative c'' \melody
+               \context Lyrics \rhythm \melody \text
+       >
+}
diff --git a/input/test/rhythm-melody.fly b/input/test/rhythm-melody.fly
new file mode 100644 (file)
index 0000000..7365625
--- /dev/null
@@ -0,0 +1 @@
+\rhythm { 4. 8 8. 16 } { c'' d e f }
diff --git a/input/test/rhythm.ly b/input/test/rhythm.ly
new file mode 100644 (file)
index 0000000..c4125e2
--- /dev/null
@@ -0,0 +1,5 @@
+\score{
+       \context Voice \notes\relative c''{
+               c4. 8 4. 8
+       }
+}
index 1f5c15fa1b59ecdc90c9efe36afa56e915f7dfdc..168558215f75f5300ec51f91286bbb99a129d54f 100644 (file)
@@ -16,7 +16,8 @@ traditional song in various languages.
 %}
 
 %{
-Tested Features: lyrics, interleaving lyrics and staffs, repeats
+Tested Features: lyrics, interleaving lyrics and staffs, repeats,
+       auto beaming, applying new rhythm on lyrics
 %}
 
 \version "1.1.52";
@@ -52,12 +53,12 @@ global = \notes {
 }
 
 tekst = \lyrics{ 
-       Al-4 tijd is Kort- jak- je ziek,2
-       midden4 "in de" week maar "'s zon-" dags niet.2
-       "'s Zon-"4 dags gaat ze naar de kerk,2
-       met4 een boek vol zil- ver werk.2
-       Al-4 tijd is Kort- jak- je ziek,2
-       mid-8 den  in de week4 maar "'s zon-" dags niet.2
+       Al- tijd is Kort- jak- je ziek, " "
+       midden "in de" week maar "'s zon-" dags  " " niet.
+       "'s Zon-" dags gaat ze naar de kerk, " "
+       met een boek vol zil- ver  " " werk. " "
+       Al- tijd is Kort- jak- je ziek, " "
+       midden  "in de" week maar "'s zon-" dags  " " niet.
 }
 
 
@@ -67,64 +68,73 @@ tekst. Mogen wij ook af en toe ergens op afgeven?
 %}
 
 hegedraagjetekst = \lyrics{ 
-       Al-4 tijd zuigt Bill Gates mijn piek,2
-       "\TeX"4 is slecht- ser dan mu- ziek.2
-       "'s Zon-"4 dags gaat het door een raam,2
-       Weet4 dat ik me er- voor schaam.2
-       Al-4 tijd zuigt Bill Gates mijn piek,2
-       "\TeX"4 is slecht- ser dan mu- ziek.2
+       Al- tijd zuigt Bill Gates mijn piek, " "
+       "\TeX" is slecht- ser dan mu-  " " ziek.
+       "'s Zon-" dags gaat het door een raam, " "
+       Weet dat ik me er- voor  " " schaam.
+       Al- tijd zuigt Bill Gates mijn piek, " "
+       "\TeX" is slecht- ser dan mu-  " " ziek.
 }
 
 texte = \lyrics{ 
        \property Lyrics . textStyle" =  "italic" 
 %      \property Lyrics . textStyle" =  "roman" 
-       Ah!4 vous dir- ai- je ma- man2
-       Ce4 qui cau- se mon tour- ment2
-       Pa-4 pa veut que je rai- son- ne
-       Comm' u- ne gran- de per- son- ne
-       Moi je dis que les bon- bons2
-       Va-4 lent mieux que la rai- son2
+       Ah! vous dir- ai- je ma- man " "
+       Ce qui cau- se mon tour-  " " ment
+       Pa- pa veut que je rai- son- ne
+       Comm' u- ne gran- de per- " " son- ne
+       Moi je dis que les bon- bons " "
+       Va- lent mieux que la rai-  " " son
 }
 
 texti = \lyrics{
        \property "Lyrics"."textStyle" =  "roman"
-       Twin-4 kle, twin- kle, lit- tle star,2
-       How4 I won- der what you are.2
-       Up4 a- bove the world so high,2
-       Like4 a dia- mond in the sky.2
-       Twin-4 kle, twin- kle, lit- tle star,2
-       How4 I won- der what you are!2
+       Twin- kle, twin- kle, lit- tle star, " "
+       How I won- der what you  " " are.
+       Up a- bove the world so high, " "
+       Like a dia- mond in the  " " sky. " "
+       Twin- kle, twin- kle, lit- tle star, " "
+       How I won- der what you  " " are!
 }
 
 textii = \lyrics{
-       When4 the bla- zing sun is gone,2
-       When4 he no- thing shines up- on,2
-       Then4 you show your lit- tle light,2
-       Twin-4 kle, twin- kle, all the night.2
-       Twin-4 kle, twin- kle, lit- tle star,2
-       How4 I won- der what you are!2
-       
+       When the bla- zing sun is gone, " "
+       When he no- thing shines up-  " " on,
+       Then you show your lit- tle light, " "
+       Twin- kle, twin- kle, all the  " " night. " "
+       Twin- kle, twin- kle, lit- tle star, " "
+       How I won- der what you  " " are!
 }
 
 textiii = \lyrics{
-       Then4 the tra- veler in the dark2
-       Thanks4 you for your ti- ny spark;2
-       He4 could not see which way8 to8 go,2
-       If4 you did not twin- kle so.2
-       Twin-4 kle, twin- kle, lit- tle star,2
-       How4 I won- der what you are!2
+       Then the tra- veler in the dark " "
+       Thanks you for your ti- ny  " " spark;
+       He could not see which way to go,
+       If you did not twin- kle  " " so. " "
+       Twin- kle, twin- kle, lit- tle star, " "
+       How I won- der what you  " " are!
 }
 
 \score{
        <
                \context Staff=i \repeat semi 2 < \global\melody >
-               \context Lyrics=top \context LyricVoice \repeat fold 2 {} \alternative { \tekst \texte }
+               \context Lyrics=top \context LyricVoice 
+                       \repeat fold 2 {} 
+                       \alternative { 
+                               \rhythm \melody \tekst 
+                               \rhythm \melody \texte 
+                       }
                \context GrandStaff <
                        \context Staff=ii \repeat semi 2 < \global\melody >
                        \context Staff=iii \repeat semi 2 < \global\accompany >
                >
-               \context Lyrics =bottom \context LyricVoice \repeat fold 3 {} 
-                       \alternative { \texti \textii \textiii }
+               \context Lyrics =bottom \context LyricVoice 
+                       \repeat fold 3 {} 
+                       \alternative { 
+                               \rhythm \melody \texti 
+                               \rhythm \melody \textii 
+                               \rhythm \melody \textiii 
+                       }
        >
        \paper{
                gourlay_maxmeasures = 14.0;
index 717e2b0ea11d0786ea220e6cae35b335a159bddb..b815918423ba5ceb4266ad474dd1828cecaa34a9 100644 (file)
@@ -11,6 +11,7 @@
 
 Audio_element::Audio_element ()
 {
+  grace_b_ = false;
 }
 
 Audio_element::~Audio_element()
index f48f92179c2b23c16015742e32a75e75535120fa..2e4e98747ce00bdcc46f86178face423c62a6021 100644 (file)
@@ -24,9 +24,22 @@ Audio_note::Audio_note (Musical_pitch p, Moment m, int transposing_i)
 {
   pitch_ = p;
   length_mom_ = m;
+  tied_ = 0;
   transposing_i_ = transposing_i;
 }
 
+void
+Audio_note::tie_to (Audio_note* t)
+{
+  tied_ = t;
+  Audio_note* first = t;
+  while (first->tied_)
+    first = first->tied_;
+  first->length_mom_ += length_mom_;
+  length_mom_ = 0;
+}
+
+                   
 Audio_key::Audio_key (Key_def const& k)
 {
   key_ = k;
index acca44ad5a2a2e2c14a6fcdee86c97a451dea40b..f80d36ec651f5de949ea5fffa7347a2f05b52119 100644 (file)
@@ -311,6 +311,8 @@ Auto_beam_engraver::acknowledge_element (Score_element_info info)
                    {
                      shortest_mom_ = mom;
                      consider_end_and_begin ();
+                     if (!stem_l_arr_p_)
+                       return;
                    }
                  shortest_mom_ = mom;
                }
index e730763fcf20a843b37e8019853c1929924d0cb4..487514ff26d4d89e8308fc9af1162e3e43c50b96 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--1999, 1999 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--1999 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "chord-name-engraver.hh"
index f93e13e942990681a7a6d6d987de3bfa5654bc43..b291cf29d7f798aeb29710bacf40783bded491ae 100644 (file)
 #include "global-translator.hh"
 #include "warn.hh"
 
+Grace_iterator::~Grace_iterator () 
+{
+  //  child_iter_p_ = 0;
+}
+
 void
 Grace_iterator::construct_children () 
 {
@@ -41,7 +46,13 @@ Grace_iterator::do_process_and_next (Moment m)
 }
 
 Moment
-Grace_iterator::next_moment ()  const
+Grace_iterator::next_moment () const
+{
+  return 0;
+}
+
+Music*
+Grace_iterator::next_music_l ()
 {
   return 0;
 }
index 65d4cdef7f0095709f6295c9cbc861d902c42205..004c7a4923e21fd4abc57a97b88a116ab5c68fec 100644 (file)
@@ -45,13 +45,14 @@ Grace_performer_group::do_removal_processing ()
 }
 
 void
-Grace_performer_group::announce_element (Audio_element_info inf)
+Grace_performer_group::announce_element (Audio_element_info info)
 {
-  announce_info_arr_.push (inf);
+  announce_info_arr_.push (info);
   // do not propagate to top
-  announce_to_top_.push (inf);
+  announce_to_top_.push (info);
 
   //inf.elem_l_->set_elt_property (grace_scm_sym, SCM_BOOL_T);
+  info.elem_l_->grace_b_ = true;
 }
 
 void
diff --git a/lily/grace-position-performer.cc b/lily/grace-position-performer.cc
new file mode 100644 (file)
index 0000000..41cee80
--- /dev/null
@@ -0,0 +1,124 @@
+/*   
+  grace-position-performer.cc --  implement Grace_position_performer
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ */
+
+#include "performer.hh"
+#include "audio-item.hh"
+#include "global-translator.hh"
+
+class Grace_position_performer : public Performer
+{
+public:
+  Grace_position_performer ();
+
+protected:
+  Link_array<Audio_note> graces_;
+  Link_array<Audio_note> notes_;
+
+  VIRTUAL_COPY_CONS (Translator);
+  virtual void acknowledge_element (Audio_element_info);
+  virtual void process_acknowledged ();
+  virtual void do_post_move_processing ();
+  Global_translator* global_translator_l ();
+};
+
+ADD_THIS_TRANSLATOR (Grace_position_performer);
+
+Grace_position_performer::Grace_position_performer ()
+{
+}
+
+void
+Grace_position_performer::acknowledge_element (Audio_element_info i)
+{
+  if (Audio_note * n = dynamic_cast <Audio_note*> (i.elem_l_))
+    {
+      if (i.elem_l_->grace_b_)
+       graces_.push (n);
+      else
+       notes_.push (n);
+    }
+}
+
+void
+Grace_position_performer::process_acknowledged ()
+{
+  if (graces_.size ())
+    {
+      // we're above grace-engraver-group, so we cannot tell
+      // grace-iterator.  note-performer should add moments.
+      //Global_translator* global_l = global_translator_l ();
+      Moment delay_mom = Moment (1, 8);
+      if (notes_.size ())
+       {
+         Moment shortest_mom = notes_[0]->length_mom_;
+         for (int i=1; i < notes_.size (); i++)
+           shortest_mom = shortest_mom <? notes_[i]->length_mom_;
+         
+         Rational grace_fraction_rat (1, 2);
+         Scalar prop = get_property ("graceFraction", 0);
+         if (prop.length_i ())
+           grace_fraction_rat = prop.to_rat ();
+
+         delay_mom = shortest_mom * grace_fraction_rat;
+         for (int i=0; i < notes_.size (); i++)
+           {
+             Audio_note* n = notes_[i];
+             n->length_mom_ -= delay_mom;
+             n->delayed_mom_ = delay_mom;
+             n->delayed_until_mom_ = now_mom () + delay_mom;
+             //global_l->add_moment_to_process (n->delayed_until_mom_);
+           }
+         notes_.clear ();
+       }
+      
+      Moment grace_length_mom;
+      for (int i=0; i < graces_.size (); i++)
+       grace_length_mom += graces_[i]->length_mom_;
+
+      Rational grace_factor_rat = delay_mom / grace_length_mom;
+
+      for (int i=0; i < graces_.size (); i++)
+       {
+         Audio_note* n = graces_[i];
+         n->length_mom_ *= grace_factor_rat;
+         if (i)
+           {
+             Audio_note* p = graces_[i-1];
+             n->delayed_mom_ = p->delayed_mom_ + p->length_mom_;
+             n->delayed_until_mom_ = now_mom () + n->delayed_mom_;
+             //global_l->add_moment_to_process (n->delayed_until_mom_);
+           }
+       }
+      graces_.clear ();
+    }
+}
+
+Global_translator*
+Grace_position_performer::global_translator_l ()
+{
+  Translator *t = this;
+  Global_translator *global_l =0;
+  do
+    {
+      t = t->daddy_trans_l_ ;
+      global_l = dynamic_cast<Global_translator*> (t);
+    }
+  while (!global_l);
+
+  return global_l;
+}
+
+
+void
+Grace_position_performer::do_post_move_processing ()
+{
+  graces_.clear ();
+  notes_.clear ();
+}
+
index 16955f40279c55b566d7291a71ed3724687010e3..c629bcd2b15c4b9a5a3c2c6c7ae9e630ada997a9 100644 (file)
@@ -19,6 +19,9 @@ public:
   virtual ~Audio_element ();
 
   void print () const;
+
+  // should we use a scm list?
+  bool grace_b_;
   
 protected:
   virtual void do_print () const;
index 5c4f8ebce6f79c6a5492be6d52b2c28a0ac397c5..1c0dac33d34486395fbe5df0b62b51c3ac3310bb 100644 (file)
@@ -57,9 +57,14 @@ class Audio_note : public Audio_item
 public:  
   Audio_note (Musical_pitch p, Moment m, int transposing_i = 0);
 
+  void tie_to (Audio_note*);
+
   Musical_pitch pitch_;
   Moment length_mom_;
+  Moment delayed_mom_;
+  Moment delayed_until_mom_;
   int transposing_i_;
+  Audio_note* tied_;
 };
 
 class Audio_text : public Audio_item
index 5d63bcf603df420967f7c3e3565f122fd75adfc9..77d5cd75b7d12c05963b68cffc4d22cce02c8537 100644 (file)
 class Grace_iterator : public Music_wrapper_iterator
 {
 public:
+  ~Grace_iterator ();
   virtual void construct_children () ;
   virtual void do_process_and_next (Moment);
   Moment next_moment () const;
+  Music* next_music_l ();
 };
 
 
index e78946882cf2773c1f6ed5fcc9f5a38407ffde48..a4cbf4e77b00449a0ea126d66657b21892dc96a4 100644 (file)
@@ -62,6 +62,7 @@ struct Change_iterator;
 struct Change_translator;
 struct Chord;
 struct Chord_name_engraver;
+struct CHyphen_req;
 struct Clef_change_req;
 struct Clef_item;
 struct Clef_engraver;
@@ -197,6 +198,7 @@ struct Rational;
 struct Request;
 struct Request_column;
 struct Relative_octave_music;
+struct Re_rhythmed_music;
 struct Repeat_engraver;
 struct Repeated_music;
 struct Repeated_music_iterator;
index 6a64b0b93d2ac67131f9037dc9a8fe58ae9f75e0..f24322e107bc9aaec162bac4d84e267d5105d0f5 100644 (file)
@@ -134,12 +134,11 @@ public:
 /**
   Turn a note off 
  */
-class Midi_note_off : public Midi_item
+class Midi_note_off : public Midi_note
 {
 public:
   Midi_note_off (Midi_note*); 
 
-  int pitch_i () const;
   virtual String str () const;
 
   Midi_note* on_l_;
index 20d1f95ff93f756f0b2b8c1b717e2fb06eff0229..f732324ece165c5e4c0528a43490702d0a254c00 100644 (file)
@@ -13,7 +13,7 @@
 #include "lily-proto.hh"
 #include "moment.hh"
 
-struct Midi_note_event : PQueue_ent<Moment, Midi_note_off*>
+struct Midi_note_event : PQueue_ent<Moment, Midi_note*>
 {
   bool ignore_b_;
   Midi_note_event();
index c6a8e9a7d8fd1e9efbdb8ea38c9e06148179b9c4..9d2a68f68903b36faba3c3053dc7f8e51edfa1e9 100644 (file)
@@ -74,6 +74,9 @@ public:
   ///  Find the next interesting point in time.
   virtual Moment next_moment() const;
 
+  ///  Return next Music item
+  virtual Music* next_music_l ();
+
   ///Are we finished with this piece of music?
   virtual bool ok() const;
 
index 341b103608ed833e7cbbd50556a059bc1fbe7d0c..7385230fcf3819de857eeef44575e9479e0b9ec1 100644 (file)
@@ -21,6 +21,7 @@ public:
 
   virtual void construct_children ();
   virtual Moment next_moment () const;
+  virtual Music* next_music_l ();
   virtual bool ok () const;
 
 protected:
index 5f40c5dc6b2d2ff6ca1cd4da353c3a3255c3790d..e00d9633ecb3afebb2a4e69a274deab239833912 100644 (file)
@@ -19,6 +19,7 @@ class Music_list : public Cons_list<Music>
 {
 public:
   Musical_pitch do_relative_octave (Musical_pitch, bool); 
+  Music_iterator* do_rhythm (Music_iterator*); 
   void add_music (Music*);
   Music_list (Music_list const&);
   Music_list ();
@@ -38,6 +39,7 @@ public:
   
   VIRTUAL_COPY_CONS(Music);
   Musical_pitch do_relative_octave (Musical_pitch p, bool b);
+  Music_iterator* do_rhythm (Music_iterator*);
   virtual void transpose (Musical_pitch );
   virtual void compress (Moment);
   void add_music (Music *music_p);
@@ -48,6 +50,7 @@ public:
   
 protected:
   virtual Musical_pitch to_relative_octave (Musical_pitch);
+  virtual Music_iterator* to_rhythm (Music_iterator*);
   virtual void do_print() const;
 };
 
@@ -62,6 +65,7 @@ public:
   
   Simultaneous_music(Music_list *);
   virtual Musical_pitch to_relative_octave (Musical_pitch);
+  virtual Music_iterator* to_rhythm (Music_iterator*);
   virtual Moment length_mom () const;
 };
 
@@ -76,6 +80,7 @@ public:
   VIRTUAL_COPY_CONS(Music);
   
   virtual Musical_pitch to_relative_octave (Musical_pitch);
+  virtual Music_iterator* to_rhythm (Music_iterator*);
   Request_chord();
 };
 
index f691270056e24374d377c4cec4cae9f47f2e89c6..deee35091331e7d1518e23e63a213bb647b2d6b6 100644 (file)
@@ -26,6 +26,7 @@ public:
 
   virtual void construct_children  () ;
   virtual Moment next_moment () const;
+  virtual Music* next_music_l ();
   virtual bool ok () const;
 
 protected:
index f01a39ff9aa055caa4e57f68b5c40fae02f8921b..7e87040acf417e6f214bff9f3ae8da4db47f5a03 100644 (file)
@@ -33,6 +33,7 @@ public:
   virtual Moment length_mom () const;
   virtual ~Music_wrapper ();
   virtual Musical_pitch to_relative_octave (Musical_pitch);
+  virtual Music_iterator* to_rhythm (Music_iterator*);
   virtual void compress (Moment);
 };
 
index 0bd1e966d07330c1a066670649d844c5a3be10b5..30ae02fddb30a2f5510993f5846760c9ec024f39 100644 (file)
@@ -33,6 +33,7 @@ public:
     
 
   virtual Musical_pitch to_relative_octave (Musical_pitch);
+  virtual Music_iterator* to_rhythm (Music_iterator*);
 
   /// The duration of this piece of music
   virtual Moment length_mom () const;
index 520797808765d6275556132295b96046c0c22938..ddd55c75171b247bd759f84f4342badeff8d5ac3 100644 (file)
@@ -15,6 +15,7 @@
 #include "lily-proto.hh"
 #include "lily-proto.hh"
 #include "duration.hh"
+#include "musical-pitch.hh"
 #include "string.hh"
 #include "array.hh"
 #include "input.hh"
@@ -36,6 +37,7 @@ public:
 
 public:
   Duration default_duration_;
+  Musical_pitch default_pitch_;
   Scope *default_header_p_;
   bool first_b_;
   int fatal_error_i_;
@@ -69,6 +71,7 @@ private:
   Simultaneous_music* get_word_element (String, Duration*);
   String notename_str (Melodic_req* melodic);
   void set_last_duration (Duration const *);
+  void set_last_pitch (Musical_pitch const *);
   friend int yyparse (void*);
 };
 
index 5cf2ff31669a6324cb2de84e764d90f98cd0430a..0f4caed5bd713e8a29b35ac390bfff258ac73013 100644 (file)
@@ -61,6 +61,7 @@ public:
   Music_sequence * alternatives_p_;
 
   virtual Musical_pitch to_relative_octave (Musical_pitch);
+  virtual Music_iterator* to_rhythm (Music_iterator*);
 
   /// The duration of this piece of music
   virtual Moment length_mom () const;
index bfd49375c133f4aead8cbb4b21e67d6a227f3143..0536786d8145b504ba732393404b61ad442bc380 100644 (file)
@@ -25,10 +25,13 @@ protected:
   virtual bool do_try_music (Music *req_l) ;
   virtual void do_print () const;
   virtual void do_pre_move_processing ();
+  virtual void process_acknowledged ();
+  Global_translator* global_translator_l ();
 
 private:
   Array<Note_req*> note_req_l_arr_;
   Array<Audio_note*> note_p_arr_;
+  Array<Audio_note*> delayed_p_arr_;
 };
 
 #endif // NOTE_PERFORMER_HH
diff --git a/lily/include/re-rhythmed-music.hh b/lily/include/re-rhythmed-music.hh
new file mode 100644 (file)
index 0000000..4c258a7
--- /dev/null
@@ -0,0 +1,27 @@
+/*   
+  re-rhythmed-music.hh -- declare Re_rhythmed_music
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Jan Nieuwenhuizen <janneke@gnu.org>
+  
+ */
+
+#ifndef RE_RHYTHMED_MUSIC_HH
+#define RE_RHYTHMED_MUSIC_HH
+
+#include "music-wrapper.hh"
+
+class Re_rhythmed_music : public Music_wrapper
+{
+public:
+  void do_print () const;
+  Re_rhythmed_music (Music*, Music*);
+  
+  VIRTUAL_COPY_CONS(Music);
+  virtual Music_iterator* to_rhythm (Music_iterator*);
+};
+
+
+#endif /* RE_RHYTHMED_MUSIC_HH */
+
index 2d7cff937bb2d318458f0e91361c492386e18de7..179362c59349efd081c803b12edcd39985a1bd24 100644 (file)
@@ -22,6 +22,7 @@ public:
   
   VIRTUAL_COPY_CONS(Music);
   virtual Musical_pitch to_relative_octave (Musical_pitch);
+  virtual Music_iterator* to_rhythm (Music_iterator*);
 };
 
 
index bbc1a522d910ed2bf0015bf59e53967a3ce8c975..0b35c447d62c6a3d4107d141029ee607337f2822 100644 (file)
@@ -22,6 +22,7 @@ class Request_chord_iterator : public Music_iterator {
    */
   Moment elt_length_mom_;
   bool last_b_;
+  Cons<Music>* cursor_;
 
 public:
   Request_chord_iterator ();
@@ -30,6 +31,7 @@ public:
 protected:
   virtual void do_process_and_next (Moment);
   virtual Moment next_moment() const;
+  virtual Music* next_music_l ();
   virtual void construct_children();
   virtual bool ok() const;
   virtual void do_print() const;
index f4810c836ca546a352fc0aeb5090ecec9d4b1c72..bfab2b805fe1f44205192fdb199363848467521a 100644 (file)
@@ -23,6 +23,7 @@ public:
 
   virtual void construct_children ();
   virtual Moment next_moment () const;
+  virtual Music* next_music_l ();
   virtual bool ok () const;
 
 protected:
index f6c1e130217a192a03d886d9b98789c02c229bbc..ce1314a78dfc2122cf6302a22a2c94498c103e1e 100644 (file)
@@ -23,6 +23,7 @@ public:
   
   VIRTUAL_COPY_CONS(Music);
   virtual Musical_pitch to_relative_octave (Musical_pitch);
+  virtual Music_iterator* to_rhythm (Music_iterator*);
 };
 
 #endif /* TRANSPOSED_MUSIC_HH */
index b52ca3cf16db5ba645fa1bfa84dbf929d76a0b68..703a66ff21f0a624b610a1b8cac92a44286cfcd8 100644 (file)
@@ -431,6 +431,7 @@ Midi_note::str () const
 }
 
 Midi_note_off::Midi_note_off (Midi_note* n)
+  : Midi_note (n->audio_l_)
 {
   on_l_ = n;
   channel_i_ = n->channel_i_;
@@ -445,12 +446,6 @@ Midi_note_off::Midi_note_off (Midi_note* n)
   i += 0x10;
 }
 
-int
-Midi_note_off::pitch_i () const
-{
-  return on_l_->pitch_i ();
-}
-
 String
 Midi_note_off::str () const
 {
index c0afd12f1504ba410e6cf03ca740e6825956481c..48c408aaa76a2c4309e0da79396db896e5328745 100644 (file)
@@ -66,7 +66,7 @@ Midi_walker::do_start_note (Midi_note* note_p)
   e.val = new Midi_note_off (note_p);
   e.key = stop_mom;
   stop_note_queue.insert (e);
-  
+      
   output_event (ptr->audio_column_l_->at_mom (), note_p);
 }
 
@@ -86,7 +86,7 @@ Midi_walker::do_stop_notes (Moment max_mom)
        }
       
       Moment stop_mom = e.key;
-      Midi_note_off* note_p = e.val;
+      Midi_note* note_p = e.val;
        
       output_event (stop_mom, note_p);
     }
index e975d300a9a10184bb079553c315e1da1e977e34..b3e99c8f63c8a57a123bd0086c49d4315937f299 100644 (file)
@@ -90,6 +90,11 @@ Music_iterator::next_moment() const
   return 0;
 }
 
+Music*
+Music_iterator::next_music_l ()
+{
+  return 0;
+}
 
 void
 Music_iterator::process_and_next (Moment m)
index d5e4bbff61fe76eeccc0817104cee5521205de5e..2be250faea8762acabd28fe62911c3687d773169 100644 (file)
@@ -38,6 +38,12 @@ Music_list_iterator::next_moment () const
   return 0;
 }
 
+Music*
+Music_list_iterator::next_music_l ()
+{
+  return 0;
+}
+
 bool
 Music_list_iterator::ok () const
 {
index 36087d65c4cd31f2acbd9ecb4bab785dead207fb..3b9c830fbaac781242709085aa0b4244d0740ed0 100644 (file)
@@ -7,9 +7,11 @@
 */
 
 #include "music-list.hh"
+#include "music-wrapper.hh"
 #include "musical-pitch.hh"
 #include "request.hh"
 #include "musical-request.hh"
+#include "music-iterator.hh"
 #include "main.hh"
 #include "killing-cons.tcc"
 
@@ -44,19 +46,30 @@ Sequential_music::length_mom () const
   return cumulative_length ();
 }
 
-
 Musical_pitch
 Simultaneous_music::to_relative_octave (Musical_pitch p)
 {
   return do_relative_octave (p, true);
 }
 
+Music_iterator*
+Simultaneous_music::to_rhythm (Music_iterator* r)
+{
+  return do_rhythm (r);
+}
+
 Musical_pitch
 Music_sequence::do_relative_octave (Musical_pitch p, bool b)
 {
   return music_p_list_p_->do_relative_octave (p, b);  
 }
 
+Music_iterator*
+Music_sequence::do_rhythm (Music_iterator* r)
+{
+  return music_p_list_p_->do_rhythm (r);
+}
+
 Musical_pitch 
 Music_list::do_relative_octave (Musical_pitch last, bool ret_first)
 {
@@ -75,6 +88,15 @@ Music_list::do_relative_octave (Musical_pitch last, bool ret_first)
   return retval;
 }
 
+Music_iterator*
+Music_list::do_rhythm (Music_iterator* r)
+{
+  for (Cons<Music> *i = head_; i ; i = i->next_)
+    {
+      r = i->car_->to_rhythm (r);
+    }
+  return r;
+}
 
 Music_list::Music_list (Music_list const &s)
   : Cons_list<Music> (s)
@@ -114,6 +136,34 @@ Request_chord::to_relative_octave (Musical_pitch last)
   return last;
 }
 
+Music_iterator*
+Request_chord::to_rhythm (Music_iterator* it)
+{
+  for (Cons<Music>* i = music_p_list_p_->head_; i ; i = i->next_)
+    {
+      if (Rhythmic_req* r= dynamic_cast <Rhythmic_req*> (i->car_))
+       {
+         for (Music*m = it->next_music_l (); m; m = it->next_music_l ())
+           {
+#if 0
+             // is it sane to assume we don't want rests on lyrics/in rhythm?
+             if (dynamic_cast <Rest_req*> (r)
+                 || dynamic_cast <Multi_measure_rest_req*> (r)
+                 || dynamic_cast <Skip_req*> (r))
+                 {
+                   continue;
+                 }
+#endif
+             if (Rhythmic_req* d= dynamic_cast <Rhythmic_req*> (m))
+               {
+                 r->duration_ = d->duration_;
+                 return it;
+               }
+           }
+       }
+    }
+  return it;
+}
 
 Music_list::Music_list ()
 {
index 60e6459a20f7e850ce1a4a4ca5186c239ff91694..6b074c5b16367fa4a6ec28e7147aba7d4b8d8363 100644 (file)
@@ -63,6 +63,11 @@ Music_sequence::to_relative_octave (Musical_pitch p)
   return do_relative_octave (p, false);
 }
 
+Music_iterator*
+Music_sequence::to_rhythm (Music_iterator* r)
+{
+  return do_rhythm (r);
+}
 
 Moment
 Music_sequence::maximum_length () const
index f25dd82f3969ba8a739b1411099b74921c660c06..03fefdd44e90269c69b986a16a206b7ce2dd2de8 100644 (file)
@@ -56,3 +56,9 @@ Music_wrapper_iterator::next_moment () const
   return child_iter_p_->next_moment ();
 }
 
+Music*
+Music_wrapper_iterator::next_music_l ()
+{
+  return child_iter_p_->next_music_l ();
+}
+
index dff9d1fc8776d99f303b4edc2a59eb3070820666..4512e26fc2033bbb0b9ff8df701cc871dbc95ed1 100644 (file)
@@ -50,13 +50,18 @@ Music_wrapper::length_mom () const
   return element_p_->length_mom ();
 }
 
-
 Musical_pitch
 Music_wrapper::to_relative_octave (Musical_pitch p)
 {
   return element_p_->to_relative_octave (p);
 }
 
+Music_iterator*
+Music_wrapper::to_rhythm (Music_iterator* r)
+{
+  return element_p_->to_rhythm (r);
+}
+
 Music*
 Music_wrapper::element_l () const
 {
index c7bd75a435ecec314b057217db7210ab4ee8c09d..1d137e4524233a4160f2fcbf7705c9376c140e5c 100644 (file)
@@ -54,6 +54,12 @@ Music::to_relative_octave (Musical_pitch m)
   return m;
 }
 
+Music_iterator*
+Music::to_rhythm (Music_iterator* r)
+{
+  return r;
+}
+
 void
 Music::transpose (Musical_pitch )
 {
index d0521d2240521b015420ed6ac6e7d04f307ad521..1da40f6b55c38e25b3d6499740234a2962449a8a 100644 (file)
@@ -60,6 +60,7 @@ static Keyword_ent the_key_tab[]={
   {"remove", REMOVE},
   {"repeat", REPEAT},
   {"repetitions", REPETITIONS},
+  {"rhythm", RHYTHM},
   {"scm", SCM_T},
   {"scmfile", SCMFILE},
   {"score", SCORE},
index b787e2a8d528e533b311522084b2787d6facace4..46f09be71109b2950376e7a4f8ca50c7030e0ed8 100644 (file)
@@ -28,6 +28,7 @@ My_lily_parser::My_lily_parser (Sources * source_l)
   source_l_ = source_l;
   lexer_p_ = 0;
   default_duration_.durlog_i_ = 2;
+  default_pitch_ = Musical_pitch (5*7, 0);
   error_level_i_ = 0;
 
   fatal_error_i_ = 0;
@@ -95,14 +96,18 @@ My_lily_parser::parser_error (String s)
   exit_status_i_ = 1;
 }
 
-
-
 void
 My_lily_parser::set_last_duration (Duration const *d)
 {
   default_duration_ = *d;
 }
 
+void
+My_lily_parser::set_last_pitch (Musical_pitch const* p)
+{
+  default_pitch_ = *p;
+}
+
 // junk me
 Simultaneous_music*
 My_lily_parser::get_word_element (String s, Duration * duration_p)
index 5542c8e693a2919c63038e1078c834f4c1ca5ea9..1f88de4aadaf59dd8e42689887810ea079a37bab 100644 (file)
@@ -9,6 +9,8 @@
 #include "note-performer.hh"
 #include "musical-request.hh"
 #include "audio-item.hh"
+#include "audio-column.hh"
+#include "global-translator.hh"
 #include "debug.hh"
 
 
@@ -39,7 +41,7 @@ Note_performer::do_process_requests ()
       if (!prop.empty_b () && prop.isnum_b ()) 
        transposing_i = prop;
 
-      while(note_req_l_arr_.size ())
+      while (note_req_l_arr_.size ())
        {
          Note_req* n = note_req_l_arr_.pop ();
          Audio_note* p = new Audio_note (n->pitch_, n->length_mom (), transposing_i);
@@ -50,15 +52,65 @@ Note_performer::do_process_requests ()
     }
 }
 
+void
+Note_performer::process_acknowledged ()
+{
+}
+
+Global_translator*
+Note_performer::global_translator_l ()
+{
+  Translator *t = this;
+  Global_translator *global_l =0;
+  do
+    {
+      t = t->daddy_trans_l_ ;
+      global_l = dynamic_cast<Global_translator*> (t);
+    }
+  while (!global_l);
+
+  return global_l;
+}
+
+
 void
 Note_performer::do_pre_move_processing ()
 {
+
+  // why don't grace notes show up here?
+  // --> grace notes effectively do not get delayed
+  Global_translator* global_l = global_translator_l ();
+  for (int i=0; i < note_p_arr_.size (); i++)
+    {
+      Audio_note* n = note_p_arr_[i];
+      if (Moment m= n->delayed_until_mom_)
+       {
+         global_l->add_moment_to_process (m);
+         delayed_p_arr_.push (n);
+         note_p_arr_[i] = 0;
+         note_p_arr_.del (i);
+         i--;
+       }
+    }
+
+  Moment now = now_mom ();
   for (int i=0; i < note_p_arr_.size (); i++)
     {
       play_element (note_p_arr_[i]);
     }
   note_p_arr_.clear ();
   note_req_l_arr_.clear ();
+  for (int i=0; i < delayed_p_arr_.size (); i++)
+    {
+      Audio_note* n = delayed_p_arr_[i];
+      if (n->delayed_until_mom_ <= now)
+       {
+         play_element (n);
+         delayed_p_arr_[i] = 0;
+         delayed_p_arr_.del (i);
+         i--;
+       }
+    }
 }
  
 bool
diff --git a/lily/re-rhythmed-music.cc b/lily/re-rhythmed-music.cc
new file mode 100644 (file)
index 0000000..e2ba452
--- /dev/null
@@ -0,0 +1,41 @@
+/*   
+  re-rhythmed-music.cc --  implement Re_rhythmed_music
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ */
+
+#include "re-rhythmed-music.hh"
+#include "music-iterator.hh"
+#include "global-translator.hh"
+
+// urg
+class Foo_translator : public Global_translator 
+{
+};
+
+Music_iterator*
+Re_rhythmed_music::to_rhythm (Music_iterator* r)
+{
+  return r;
+}
+
+Re_rhythmed_music::Re_rhythmed_music (Music* m, Music* r)
+  : Music_wrapper (m)
+{
+  Music_iterator* i = Music_iterator::static_get_iterator_p (r);
+  Global_translator*t = new Foo_translator ();
+  i->init_translator (r, t);
+  i->construct_children ();
+  element_l ()->to_rhythm (i);
+}
+
+void
+Re_rhythmed_music::do_print () const
+{
+  Music_wrapper::do_print ();
+}
+
+
index 7f66ab6a6b8b8a51d5ecf8d91da5c19cf8ad0643..dc0fc9906c006e15bc69658ce65c6fe4693235b7 100644 (file)
@@ -16,11 +16,16 @@ Relative_octave_music::to_relative_octave (Musical_pitch)
   return last_pitch_;
 }
 
+Music_iterator*
+Relative_octave_music::to_rhythm (Music_iterator* r)
+{
+  return element_l ()->to_rhythm (r);
+}
 
 Relative_octave_music::Relative_octave_music(Music*p,Musical_pitch def)
   : Music_wrapper (p)
 {
-  last_pitch_ = element_l()->to_relative_octave (def);
+  last_pitch_ = element_l ()->to_relative_octave (def);
 }
 
 void
index d00a93210718b6d931fcdf93166e0846b8a027eb..6436be9bfa7adaea4d34997cece84660e3866b0e 100644 (file)
@@ -66,6 +66,17 @@ Repeated_music::to_relative_octave (Musical_pitch p)
   return p;
 }
 
+Music_iterator*
+Repeated_music::to_rhythm (Music_iterator* r)
+{
+  if (repeat_body_p_)
+    r = repeat_body_p_->to_rhythm (r);
+
+  if (alternatives_p_)
+    r = alternatives_p_->do_rhythm (r);
+  return r;
+}
+
 
 void
 Repeated_music::transpose (Musical_pitch p)
index ca103ee062132c131563a3ef012a7c02301d67a1..9cbf798a4b3fa71b6995ddd86c216c75cb6d4966 100644 (file)
@@ -30,6 +30,8 @@ Request_chord_iterator::elt_l () const
 Request_chord_iterator::Request_chord_iterator ()
 {
   last_b_ = false;
+  //  cursor_ = elt_l ()->music_p_list_p_->head_;
+  cursor_ = 0;
 }
 
 
@@ -39,8 +41,6 @@ Request_chord_iterator::ok() const
   return (elt_length_mom_ && !last_b_) || first_b_;
 }
 
-
-
 Moment
 Request_chord_iterator::next_moment() const
 {
@@ -50,6 +50,25 @@ Request_chord_iterator::next_moment() const
   return m;
 }
 
+Music*
+Request_chord_iterator::next_music_l ()
+{
+  if (first_b_)
+    {
+      cursor_ = elt_l ()->music_p_list_p_->head_;
+      first_b_ = false;
+    }
+  else
+    {
+      if (cursor_)
+       cursor_ = cursor_->next_;
+    }
+  if (cursor_)
+    return cursor_->car_;
+  else
+    return 0;
+}
+
 void
 Request_chord_iterator::do_print() const
 {
index a50a0de9a5b7e4aeea2b4b301b7e5adcf5d197d2..a6602b7709da149979392255fb0871179d7d0526 100644 (file)
@@ -127,6 +127,40 @@ Sequential_music_iterator::next_moment() const
   return iter_p_->next_moment() + here_mom_;
 }
 
+Music*
+Sequential_music_iterator::next_music_l ()
+{
+  if (!iter_p_)
+    return 0;
+
+  while (1) 
+    {
+      if (Music* m = iter_p_->next_music_l ())
+       {
+         return m;
+       }
+      else
+       {
+         // urg FIXME: grace-iterator::next_music_l () fools me!
+         if (dynamic_cast<Grace_iterator*> (iter_p_))
+           iter_p_ = 0;
+         leave_element ();
+         
+         if (cursor_)
+           {
+             start_next_element ();
+             set_sequential_music_translator ();
+           }
+         else 
+           {
+             delete iter_p_;
+             iter_p_ = 0;
+             return 0;
+           }
+       }
+    }
+}
+
 bool
 Sequential_music_iterator::ok() const
 {
index 0d7d5a0257dbe76a66dfbb0ba9383b357c1c196e..f33e9efaac2fa1fa29dc96450d97d346a58636ac 100644 (file)
@@ -121,14 +121,8 @@ Tie_performer::do_pre_move_processing ()
   for (int i=0; i<  tie_p_arr_.size (); i++)
    {
      //play_element (tie_p_arr_[i]);
-     /*
-       urg.
-       doesn't work for c ~ c ~ c
-      */
-     tie_p_arr_[i]->note_l_drul_[LEFT]->length_mom_ +=
-       tie_p_arr_[i]->note_l_drul_[RIGHT]->length_mom_;
-     tie_p_arr_[i]->note_l_drul_[RIGHT]->length_mom_ = 0;
-    }
+     tie_p_arr_[i]->note_l_drul_[RIGHT]->tie_to (tie_p_arr_[i]->note_l_drul_[LEFT]);
+   }
   tie_p_arr_.clear ();
 }
 
index 2445dc80c323310ddbcc15edc3e3304ee44c9c5e..f6de2eb3b3cce299bb76d23ba5976d0fca3218a8 100644 (file)
@@ -17,8 +17,6 @@ Transposed_music::Transposed_music (Music *p, Musical_pitch pit)
   p->transpose (pit);
 }
 
-
-
 void
 Transposed_music::do_print () const
 {
@@ -35,4 +33,10 @@ Transposed_music::to_relative_octave (Musical_pitch p)
   return p;
 }
 
+Music_iterator*
+Transposed_music::to_rhythm (Music_iterator* r)
+{
+  return r;
+}
+
 
index f9eafe68e2f3053412df202f56d0ab894c09e7a7..184f18144f814c93f3fe0d6f1e6a7c2615827922 100644 (file)
@@ -1,7 +1,7 @@
 %
 % setup for Request->Element conversion. Guru-only
 %
-\translator {
+StaffContext = \translator {
        \type "Staff_performer";
        \name Staff;
        \accepts Voice;
@@ -13,7 +13,8 @@
 
        \consists "Key_performer";
        \consists "Time_signature_performer";
-}
+};
+\translator { \StaffContext }
 
 %% urg, why (needs praeludium-*.ly) these?
 \translator
        \consists "Note_performer";
        \name VoiceThree;
 }
-\translator
-{
+\translator {
        \type "Performer_group_performer";
        \consists "Note_performer";
         \name VoiceOne;
 }
 
-\translator
-{
+VoiceContext = \translator {
        \type "Performer_group_performer";
        \name Voice;
+% All notes fall to Grace if you leave Thread out (huh?)
+       \consists "Grace_position_performer";
+       \accepts Thread;
+       \accepts Grace;
+};
+\translator { \VoiceContext }
+
+GraceContext = \translator {
+       \type "Performer_group_performer";
+       \name Thread;
        \consists "Note_performer";
        \consists "Tie_performer";
-%      \accepts Grace;
-}
+};
+\translator { \GraceContext }
 
 \translator {
        \type "Grace_performer_group";
-       \name "Grace";
+       \name Grace;
        \consists "Note_performer";
        \consists "Tie_performer";
         weAreGraceContext = "1";
 
 }
 
-\translator
-{
+GrandStaffContext = \translator {
        \type "Performer_group_performer";
-       \accepts Staff;
        \name GrandStaff;
-}
+       \accepts Staff;
+};
+\translator { \GrandStaffContext }
 
-\translator {\type "Performer_group_performer";
-       \accepts Staff; \name "PianoStaff";}
+PianoStaffContext = \translator {
+        \type "Performer_group_performer";
+       \name "PianoStaff";
+       \accepts Staff;
+};
+\translator { \PianoStaffContext }
 
 \translator {
        \type "Performer_group_performer";
        \consists "Lyric_performer";
-\name LyricVoice;
+       \name LyricVoice;
 }
 
 \translator{
        \name Lyrics;
        \consists "Time_signature_performer";
 }
-\translator
-{
+\translator {
        \type Performer_group_performer;
 
        \name StaffGroup;
        \accepts Staff;
 }
-\translator {
-       \type "Score_performer";
 
+ScoreContext = \translator {
+       \type "Score_performer";
 
        \name Score;
        instrument = "bright acoustic";
        \accepts StaffGroup;
        \accepts ChoirStaff;
        \consists "Swallow_performer";
-}
+};
+\translator { \ScoreContext }
 
index ca23359ef7d9f4b20b59534844598920b03b924f..d9d499c9b35bc6b789f538f8814302b7250a9cf8 100644 (file)
@@ -26,6 +26,7 @@ global = \notes {
 melody = \notes\relative c''{
   \clef violin;
   \property Voice.verticalDirection = 1
+  \property Voice.graceFraction = "1/4"
   r2 r r 
   r2 r r
   r4 a'8--(\< a--  a-- a-- c-- \!b-- a--\> gis f \!e 
@@ -112,9 +113,9 @@ accompany = \notes \relative c{
         \property Voice.verticalDirection = 1
         \property Voice.scriptVerticalDirection = 1
         \melody 
-       }
+      }
       \context AutoSwitchContext \accompany
-      >
+    >
   }
   \paper {
     gourlay_maxmeasures = 4.;
@@ -138,8 +139,8 @@ accompany = \notes \relative c{
     }
     \translator { 
       \ScoreContext
-      \accepts AutoSwitchGrandStaff;
-      }
+      \accepts "AutoSwitchGrandStaff";
+    }
     \translator{
       \type "Engraver_group_engraver";
       \name AutoSwitchGrandStaff;
@@ -158,14 +159,31 @@ accompany = \notes \relative c{
       slurVerticalDirection = 1;
       verticalDirection = -1;
       beamAutoEnd = "1/2";
-      }
+    }
     \translator {
       \type "Engraver_group_engraver";
-      \name "AutoSwitchContext";
+      \name AutoSwitchContext;
       \consists "Staff_switching_translator";
-      }
     }
+  }
   \midi {
     \tempo 4 = 54;
+    \translator {
+      \ScoreContext
+      \accepts "AutoSwitchGrandStaff";
+    }
+    \translator {
+      \type "Performer_group_performer";
+      \name AutoSwitchGrandStaff;
+      \accepts "AutoSwitchContext";
+      \accepts "Staff";
+    }
+    \translator {
+      \type "Staff_performer";
+      \name AutoSwitchContext;
+      \accepts "Voice";
+      \consists "Key_performer";
+      \consists "Time_signature_performer";
+    }
   }
 }
index c12411366841ebb25570097c0a9c955bb1c8b202..46aabb538bfa4c06a79015f400ac2e25902bc101 100644 (file)
@@ -11,7 +11,7 @@ copyright =    "public domain";
 } 
 
 %{
- Tested Features@ multivoice accents lyrics chords piano music
+ Tested Features: multivoice accents lyrics chords piano music
 multiple \paper{}s in one \score 
 Note: Original key F.
 %}
@@ -69,104 +69,62 @@ vocalThrough = \notes\relative c{
        e2 r4 |
 }
 
-lyricVerse1 = \lyrics{
-% 5
-       \times 2/3 {  Lei-4 se8 } fleh-4. en8 |
-       \times 2/3 {  mei-4 ne8 } Lie-4 der8 " "8 |
-       Durch4. die8 \times 2/3 {  Nacht4 zu8 } |
-       dir;2 " "4 |
-       " "2.*2
-%{     " "4 " " " " |
-       " " " " " " |%}
-% 11
-       \times 2/3 {  In4 den8 } stil-4. len8 |
-       \times 2/3 {  Hain4 her-8 } nie-4. der8 |
-       Lieb-4. chen,8 \times 2/3 {  komm4 zu8 } |
-       mir!2 " "4 |
-               " "2.*2
-%{     " "4 " " " " |
-       " " " " " " |%}
-% 17
-       Fl\"us-8. ternd16 schlan-4. ke8 |
-       Wip-8. fel16 rau-4. schen8 |
-       \times 2/3 {  In4 des8 } Mon-4. des8 |
-       Licht;2. |
-       \times 2/3 {  In4 des8 } Mon-4. des8 |
-       Licht;2. |
-% 23 
-       Des8. Ver-16 r\"a-4. thers8 |
-       feind-8. lich16 Lau-4. schen8 |
-       \times 2/3 {  F\"urch-4 te8 } Hol-4. de8 |
-       nicht2. |
-       \times 2/3 {  f\"urch-4 te8 } Hol-4. de8 |
-       nicht.2. |
+lyricVerseOne = \lyrics{
+       Lei- " " se fleh- en mei- " " ne Lie- der " "
+       Durch die Nacht " " zu dir; " "
+       " "
+       " "
+       In " " den stil- len Hain " " her- nie- der
+       Lieb- chen, komm " " zu mir! " "
+       " "
+       " "
+       Fl\"us- ternd schlan- ke Wip- fel rau- schen
+       In " " des Mon- des Licht,
+       In " " des Mon- des Licht;
+
+       Des Ver- r\"a- ters feind- lich Lau- schen
+       F\"urch- " " te, Hol- de, nicht,
+       f\"urch- " " te, Hol- de, nicht.
 }
        
-lyricVerse2 = \lyrics{
-% 5
-       \times 2/3 {  H\"orst4 die8 } Nach-4. ti-8 
-       \times 2/3 {  gal-4 len8 } schla-4 gen?8 " "8
-       ach!4. sie8 \times 2/3 {  fleh-4 en8 } 
-       dich,2 " "4
-       " "2.*2
-%{     " "4 " " " " 
-       " "4" " " "
-%}
-% 11
-       \times 2/3 {  Mit4 der8 } T\"o-4. ne8
-       \times 2/3 {  s\"u-4 "\ss en"8 } Kla-4. gen8
-       Fleh-4. en8 \times 2/3 {  sie4 f\"ur8 }
-       mich2 " "4
-       " "2.*2
-%{     " "4" " " " 
-       " "4" " " "
-%}
-% 17
-       Sie-8. ver-16 stehn4. des8
-       Bus-8. ens16 Seh-4. nen8
-       \times 2/3 {  Ken-4 nen8 } Lieb-4. es-8 
-       schmerz,2.
-       \times 2/3 {  Ken-4 nen8 } Lieb-4. es-8 
-       schmerz.2.
+lyricVerseTwo = \lyrics{
+       H\"orst " " die Nach- ti- gal- " " len schla- gen? " "
+       Ach! sie fleh- " " en dich, " "
+       " "
+       " "
+       Mit " " der T\"o- ne s\"u- " " "\ss en" Kla- gen
+       Fleh- en sie " " f\"ur mich. " "
+       " "
+       " "
+       Sie- ver- "steh'n" des Bus- ens Seh- nen
+       Ken- " " nen Lieb- es- schmerz,
+       Ken- " " nen Lieb- es- schmerz.
 
-% 23
-       R\"uh-8. ren16 mit4. den8 
-       Sil-8. ber-16 t\"o-4. nen8
-       \times 2/3 {  jed-4 es8 } wei-4. che8 
-       Herz,2.
-       \times 2/3 {  jed-4 es8 } wei-4. che8 
-       Herz.2.
+       R\"uh- ren mit den Sil- ber- t\"o- nen
+       Jed- " " es wei- che Herz,
+       Jed- " " es wei- che Herz.
 }
 
 lyricThrough = \lyrics{
-% 37
-       La\ss8. auch16 dir8. die16 Brust8. be-16 |
-       we-4 gen " " |
-       Lieb-4. chen,8 h\"o-8. re16 |
-       mich!2 " "4 |
-       Be-4. bend8 \times 2/3 {  harr'4 ich8} |
-       dir8. ent-16 ge-4 gen!8 " "8 |
-       " "2. |
-       " "2. |
-       \times 2/3 {  Komm4 be-8 } gl\"u4. cke8 |
-       mich!2. |
-       \times 2/3 {  Komm4 be-8 } gl\"u4. cke8 |
-       mich,2. __ |
-       " "2 be-4 |
-       gl\"u-2. |
-       cke2. |
-       mich!2 " "4 |
+       La\ss auch dir die Brust be- we- gen " "
+       Lieb- chen, h\"o- re mich! " "
+       Be- bend harr' " " ich dir ent- ge- gen! " "
+       " "
+       " "
+       Komm, " " be- "gl\"uk-" ke mich!
+       Komm, " " be- "gl\"uk-" ke mich, __ " "  " "
+       Be- "gl\"uk-" ke mich!
 }
 
 trebleIntro = \notes\relative c{
-       r8^"\bf m\\\"a\\\ss ig"\pp <g'-. c-.> <c-. es-.> <g-. c-.> <c-. es-.> <g-. c-.> |
+       r8^"\bf M\\\"a\\ss ig"\pp <g'-. c-.> <c-. es-.> <g-. c-.> <c-. es-.> <g-. c-.> |
        r8 <as-. c-.> <c-. es-.> <as-. c-.> <c-. es-.> <as-. c-.> |
        r8 <as-. c-.> <c-. d-.> <as-. c-.> <c-. d-.> <as-. c-.> |
        r8 <g-. b-.> <b-. d-.> <g-. b-.> <b-. d-.> <g-. b-.> |
        \break
 }
 
-trebleVerse1 = \notes\relative c{
+trebleVerseOne = \notes\relative c{
        %5
        r8 <g' c> <c es> <g c> <c es> <g c> |
        r8 <f c'> <c' d> <f, c'> <c' d> <f, c'> |
@@ -274,7 +232,7 @@ bassIntro = \notes\relative c{
        <g2 g'> r4 |
 }
 
-bassVerse1 = \notes\relative c{
+bassVerseOne = \notes\relative c{
 %      \clef bass;
        \property Voice.dynamicDir=1
 %5
@@ -362,24 +320,13 @@ global = \notes{
 }
 
 
-lyricFour = \lyrics{
-       " "2.*4
-%{     " "4 " " " "
-       " " " " " "
-       " " " " " "
-       " " " " " "%}
-}
-allLyrics = {
-       \time 3/4; 
-%      \skip 4 * 12; 
-       \lyricFour
-       \lyricVerse1
-%      \skip 4 * 24; 
-       \lyricFour
-       \lyricFour
-       \lyricVerse2
-       \lyricThrough
+allLyrics = \lyrics {
+       " "4 * 12
+       \rhythm \vocalVerse \lyricVerseOne
+       " "4 * 12
+       " "4 * 12
+       \rhythm \vocalVerse \lyricVerseTwo
+       \rhythm \vocalThrough \lyricThrough
 }
 
 lyricStaff = \context Lyrics = lyric<
@@ -390,7 +337,6 @@ vocals = \notes{
        \clef treble;
        % certainly no auto-beaming for vocals
        \property Voice.beamAuto=0
 
        \property Voice.dynamicDir = \up
        \skip 4 * 12; 
@@ -410,9 +356,9 @@ treble = {
        \clef treble;
        \property Voice.beamAutoBegin=0
        \trebleIntro 
-       \trebleVerse1 
+       \trebleVerseOne 
        \trebleEentje
-       \trebleVerse1 
+       \trebleVerseOne 
        \trebleThrough
 }
 
@@ -424,9 +370,9 @@ trebleStaff = \context Staff = treble<
 bass = {
        \clef bass;
        \bassIntro 
-       \bassVerse1 
+       \bassVerseOne 
        \bassEentje
-       \bassVerse1 
+       \bassVerseOne 
        \bassThrough
 }
 
@@ -455,12 +401,9 @@ grandStaff = \context PianoStaff <
                { \notes { \grandStaff } }
        >
        \paper { 
-%              \translator { \OrchestralScoreContext }
-%              \translator { \OrchestralPartStaffContext }
                \translator { \HaraKiriStaffContext }
        }
-%broken 1.1.51
-%      \midi{
-%              \tempo 4 = 54;
-%      }
+       \midi{
+               \tempo 4 = 54;
+       }
 }
index 342b3d2d2cf8b2db0e2fac7beea260c9991ab7a4..dd4bcf263766dec2bdb03eb79e49c928b403006f 100644 (file)
@@ -23,9 +23,12 @@ except:
 
 
 header = {}
+lyrics = []
+voices = []
 global_voice_stuff = []
 default_len = 4
 global_key = [0] * 7                   # UGH
+names = ["One", "Two", "Three"]
 DIGITS='0123456789'
 HSPACE=' \t'
 
@@ -51,6 +54,12 @@ class Rational:
                pass
        
 
+def dump_global ():
+       print ("global = \\notes{")
+       for i in global_voice_stuff:
+               print (i);
+       print ("}")
+
 
 def dump_header (hdr):
        print '\\header {'
@@ -58,6 +67,36 @@ def dump_header (hdr):
                print '%s = "%s";\n'% (k,hdr[k])
        print '}'
 
+def dump_lyrics ():
+       for i in range (len (lyrics)):
+               print ("verse%s = \\lyrics {" % names [i])
+               print (lyrics [i])
+               print ("}")
+
+def dump_voices ():
+       for i in range (len (voices)):
+               print ("voice%s = \\notes {" % names [i])
+               print (voices [i])
+               print ("}")
+       
+def dump_score ():
+       print ("\\score{")
+       print ("        \\notes<")
+       print ("                \\global")
+       for i in range (len (voices)):
+               print ("        \\context Staff=%s \\voice%s" %
+                       (names [i], names [i]))
+       for i in range (len (lyrics)):
+               j = i
+               if j >= len (voices):
+                       j = len (voices) - 1
+               print ("        \\context Lyrics=%s \\rhythm \\voice%s \\verse%s" % 
+                       (names [i], names [j], names [i]))
+       print ("    >")
+       dump_header (header)
+       #print "%%%s" % global_voice_stuff, 1
+       print ("}")
+
 def set_default_length (s):
        m =  re.search ('1/([0-9]+)', s)
        if m:
@@ -70,11 +109,11 @@ def gulp_file(f):
                n = i.tell ()
                i.seek (0,0)
        except:
-               print 'can\'t open file: ' + f + '\n'
+               sys.stderr.write ("can't open file: %s\n" % f)
                return ''
        s = i.read (n)
        if len (s) <= 0:
-               print 'gulped empty file: ' + f + '\n'
+               sys.stderr.write ("gulped emty file: %s\n" % f)
        i.close ()
        return s
 
@@ -191,7 +230,7 @@ def try_parse_tuplet_begin (str, state):
                str = str[1:]
                state.parsing_tuplet = 1
                
-               print '\\times %s {' % tup_lookup[dig]
+               voices_append ("\\times %s {" % tup_lookup[dig])
        return str
 
 def  try_parse_group_end (str, state):
@@ -199,14 +238,30 @@ def  try_parse_group_end (str, state):
                str = str[1:]
                if state.parsing_tuplet:
                        state.parsing_tuplet = 0
-                       print '}'
+                       voices_append ("}")
        return str
 
 def header_append (key, a):
        s = ''
        if header.has_key (key):
                s = header[key] + "\n"
-       header [key ] = s + a
+       header [key] = s + a
+
+def lyrics_append (a):
+       i = len (lyrics) - 1
+       if i < 0:
+               i = 0
+       if len (lyrics) <= i:
+               lyrics.append ('')
+       lyrics [i] = lyrics [i] + a + "\n"
+
+def voices_append (a):
+       i = len (voices) - 1
+       if i < 0:
+               i = 0
+       if len (voices) <= i:
+               voices.append ('')
+       voices [i] = voices [i] + a + "\n"
 
 def try_parse_header_line (ln):
        m = re.match ('^(.): *(.*)$', ln)
@@ -239,8 +294,11 @@ def try_parse_header_line (ln):
                        header ['subtitle'] = a
                if g == 'L':
                        set_default_length (ln)
-       
-
+               if g == 'W':
+                       if not len (a):
+                               lyrics.append ('')
+                       else:
+                               lyrics_append (a);
        return m
 
 def pitch_to_mudela_name (name, acc):
@@ -369,9 +427,10 @@ def try_parse_note (str, parser_state):
        
                
        
-       print '%s%s%s' %  (pitch_to_mudela_name(notename, acc + global_key[notename]) , octave_to_mudela_quotes (octave),
-                          duration_to_mudela_duration ((num,den), default_len, current_dots))
-
+       voices_append ("%s%s%s" %
+               (pitch_to_mudela_name (notename, acc + global_key[notename]),
+                                       octave_to_mudela_quotes (octave),
+                duration_to_mudela_duration ((num,den), default_len, current_dots)))
        slur_end =0
        if str[0] == ')':
                slur_begin = 1
@@ -434,22 +493,22 @@ def try_parse_bar (str):
                                sys.stderr.write ("warning: repeat kludge\n")
                                bs = '|:'
                if bs:
-                       print '\\bar "%s";' % bs
+                       voices_append ('\\bar "%s";' % bs)
                        str = str[1:]
 
        if str and str[:2] == '[|':
                sys.stderr.write ("warning: thick-thin bar kludge\n")
-               print '\\bar "||";'
+               voices_append ('\\bar "||";')
                str = str[2:]
 
        if str and str[:2] == ':|':
                sys.stderr.write ("warning: repeat kludge\n")
-               print '\\bar ":|:";'
+               voices_append ('\\bar ":|:";')
                str = str[2:]
 
        if str and str[:2] == '::':
                sys.stderr.write ("warning: repeat kludge\n")
-               print '\\bar ":|:";'
+               voices_append ('\\bar ":|:";')
                str = str[2:]
 
        return str
@@ -458,11 +517,11 @@ def try_parse_bar (str):
 def try_parse_chord_delims (str):
        if str and str[0] == '[':
                str = str[1:]
-               print '<'
+               voices_append ('<')
 
        if str and str[0] == ']':
                str = str[1:]
-               print '>'
+               voices_append ('>')
 
        return str
 
@@ -470,11 +529,11 @@ def try_parse_chord_delims (str):
 def try_parse_grace_delims (str):
        if str and str[0] == '{':
                str = str[1:]
-               print '\\grace { '
+               voices_append ('\\grace { ')
 
        if str and str[0] == '}':
                str = str[1:]
-               print '}'
+               voices_append ('}')
 
        return str
 
@@ -548,14 +607,11 @@ for opt in options:
 for f in files:
        if f == '-':
                f = ''
-       
-       print ("\\score{")
-       print ("    <")
-       print ("        \\context Staff=one \\notes {")
        parse_file (f)
-       print ("        }")
-       print ("    >")
-       dump_header (header)
-       print "%%%s" % global_voice_stuff, 1
-       print ("}")
+
+       dump_global ()
+       dump_lyrics ()
+       dump_voices ()
+       dump_score ()
+