]> git.donarmstrong.com Git - lilypond.git/commitdiff
patch::: 1.3.132.jcn2
authorJan Nieuwenhuizen <janneke@gnu.org>
Tue, 27 Feb 2001 13:29:35 +0000 (14:29 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Tue, 27 Feb 2001 13:29:35 +0000 (14:29 +0100)
1.3.132.jcn2
============

* Attempt at fixing input/bugs/tie-break-accidental.ly, but no luck.
See comments in Local_key_engraver.

* Removed some cruft from lily/include/.

* Bugfix: tied notes in chords sometimes got stuck in MIDI output
(thanks Mats).

* Added some example bug files, taken from Coriolan; esp. see
input/bugs/tie-break-accidental.ly, I've seen so much discussion on
this, would have thought we had this right by now.

21 files changed:
CHANGES
VERSION
input/bugs/tie-break-accidental.ly [new file with mode: 0644]
lily/include/bar-req-collector-engraver.hh
lily/include/hara-kiri-engraver.hh
lily/include/hara-kiri-line-group-engraver.hh
lily/include/main.hh
lily/include/separating-line-group-engraver.hh
lily/include/span-score-bar-engraver.hh
lily/include/swallow-engraver.hh
lily/include/tie-engraver.hh
lily/include/tuplet-engraver.hh
lily/local-key-engraver.cc
lily/main.cc
lily/midi-item.cc
lily/midi-stream.cc
lily/midi-walker.cc
lily/separating-line-group-engraver.cc
lily/swallow-engraver.cc
lily/tie-engraver.cc
mutopia/Coriolan/header.ly

diff --git a/CHANGES b/CHANGES
index ccc8cca90f87d3f59513786a17186b1a60e4bc65..6e0a021df94f6a095056fb33c63d99b040e85019 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,18 @@
+1.3.132.jcn2
+============
+
+* Attempt at fixing input/bugs/tie-break-accidental.ly, but no luck.
+See comments in Local_key_engraver.
+
+* Removed some cruft from lily/include/.
+
+* Bugfix: tied notes in chords sometimes got stuck in MIDI output
+(thanks Mats).
+
+* Added some example bug files, taken from Coriolan; esp. see
+input/bugs/tie-break-accidental.ly, I've seen so much discussion on
+this, would have thought we had this right by now.
+
 1.3.132.jcn1
 ============
 
diff --git a/VERSION b/VERSION
index 17bc5677b10a3fef71a2f9a1a0aa905a176ada9c..eafe9e8a39a2fb98b92b02574bd60afca5bc659f 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=3
 PATCH_LEVEL=132
-MY_PATCH_LEVEL=jcn1
+MY_PATCH_LEVEL=jcn2
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
diff --git a/input/bugs/tie-break-accidental.ly b/input/bugs/tie-break-accidental.ly
new file mode 100644 (file)
index 0000000..0b2c0e8
--- /dev/null
@@ -0,0 +1,14 @@
+\header {
+texidoc = "First and second bes (tied across line break)
+should get an accidental, but others should not";
+}
+
+\score {
+  \notes {
+    bes1 ~ | \break
+    bes2 ~ bes4 ~ bes4 ~ | bes1
+  }
+  \paper {
+    linewidth = 40*\staffspace;
+  }
+}
index af401e79464cc635fdd64ef374d0beedb84eda50..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,26 +0,0 @@
-/*   
-  bar-req-collect-engraver.hh -- declare 
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#ifndef BAR_REQ_COLLECT_ENGRAVER_HH
-#define BAR_REQ_COLLECT_ENGRAVER_HH
-
-#include "engraver.hh"
-class Bar_req_collect_engraver : public Engraver
-{
-  Bar_req* bar_req_l_;
-public:
-  VIRTUAL_COPY_CONS(Translator);
-  void start_translation_timestep ();
-  bool try_music (Music *);
-};
-
-
-
-#endif /* Bar_Req_COLLECT_ENGRAVER_HH */
-
index c1eb5d444fe247e3df4c028226ca13086912a6b1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,15 +0,0 @@
-/*   
-  hara-kiri-engraver.hh -- declare Hara_kiri_engraver
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#ifndef HARA_KIRI_ENGRAVER_HH
-#define HARA_KIRI_ENGRAVER_HH
-
-#include "axis-group-engraver.hh"
-
-#endif /* HARA_KIRI_ENGRAVER_HH */
index 18c3fb8394b7d5e2d410af485752adef8e5527d0..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,38 +0,0 @@
-/*
-  hara-kiri-line-group-engraver.hh -- declare Hara_kiri_line_group_engraver
-
-  source file of the GNU LilyPond music typesetter
-
-  (c) 1998--2001 Jan Nieuwenhuizen <janneke@gnu.org>
-*/
-
-
-#ifndef HARA_KIRI_LINE_GROUP_GRAV_HH
-#define HARA_KIRI_LINE_GROUP_GRAV_HH
-
-#include "line-group-group-engraver.hh"
-
-/**
-  Just as Line_group_engraver, Find interesting items for
-  Hara_kiri_line_group_engraver.
-
-
-
-  @see
-  Hara_kiri_vertical_group_spanner
-  
-
-  */
-class Hara_kiri_line_group_engraver : public Line_group_engraver_group
-{
-public:
-  VIRTUAL_COPY_CONS (Translator);
-
-protected:
-  virtual void create_line_spanner ();
-  void typeset_grob (Grob*);
-};
-
-
-#endif // HARA_KIRI_LINE_GROUP_GRAV_HH
-
index e495ade889ccf67027d9aa6c8c156ba0bae91b3a..5405857a4b191ad474fb019d033ed5e643fb605d 100644 (file)
@@ -25,6 +25,7 @@ extern void set_inclusion_names (Array<String>);
 extern bool dependency_global_b;
 extern String dependency_prefix_global;
 extern Array<String> dump_header_fieldnames_global;
+extern bool midi_debug_global_b;
 extern bool no_paper_global_b;
 extern bool no_timestamps_global_b;
 extern String output_format_global;
index 5a5f7302cf3c723338b4822aa53c71a52f66c082..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,13 +0,0 @@
-/*   
-  separating-line-group-engraver.hh -- declare Separating_line_group_engraver
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1998--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#ifndef SEPARATING_LINE_GROUP_GRAV_HH
-#define SEPARATING_LINE_GROUP_GRAV_HH
-#endif /* SEPARATING_LINE_GROUP_GRAV_HH */
-
index b36c83fa6948a430a0fd2af376443467cbe7de9c..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,54 +0,0 @@
-/*
-  span-score-bar-engraver.hh -- declare Span_score_bar_engraver
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef SPAN_SCORE_BAR_GRAV_HH
-#define SPAN_SCORE_BAR_GRAV_HH
-
-#include "base-span-bar-engraver.hh"
-
-/** 
-
-  Make the bars that Span the entire score line (system). A
-  Span_bar_engraver which generates a special bar.
-
-  */
-
-class Span_score_bar_engraver : public Base_span_bar_engraver 
-{
-public:
-  VIRTUAL_COPY_CONS (Translator);
-  Span_score_bar_engraver ();
-  virtual Span_bar* get_span_bar_p () const;
-};
-
-/**
-  Make a piano brace.  (No, this doesn't manufacture ``Please don't
-  shoot the piano player.''  signs)
-  */
-class Piano_bar_engraver :  public Span_score_bar_engraver
-{
-public:
-  VIRTUAL_COPY_CONS (Translator);
-  
-  virtual Span_bar * get_span_bar_p () const;
-};
-
-/**
-  Make Choir brackets.
- */
-class Staff_group_bar_engraver :  public Span_score_bar_engraver
-{
-public:
-  VIRTUAL_COPY_CONS (Translator);
-  
-  virtual Span_bar * get_span_bar_p () const;
-  virtual void acknowledge_grob (Grob_info);
-};
-
-#endif // SPAN_SCORE_BAR_GRAV_HH
index 49bc28bc95ee724785da9994bf3168060c80a778..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,26 +0,0 @@
-/*
-  swallow-engraver.hh -- declare Swallow_engraver
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef SWALLOW_GRAV_HH
-#define SWALLOW_GRAV_HH
-
-#include "engraver.hh"
-
-/**
-  This engraver swallows everything given to it silently. The purpose of
-  this is to prevent spurious "request junked" warnings.
- */
-class Swallow_engraver : public Engraver {
-protected:
-  bool try_music (Music*) ;
-public:
-  VIRTUAL_COPY_CONS(Translator);
-  
-};
-#endif // SWALLOW_GRAV_HH
index 089be415bac7f211581b95367beef954d60f8b3d..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,13 +0,0 @@
-/*   
-  ctie-engraver.hh -- declare Tie_engraver
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1998--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#ifndef CTIE_ENGRAVER_HH
-#define CTIE_ENGRAVER_HH
-#endif /* CTIE_ENGRAVER_HH */
-
index 7505980fec09a1d72ff44246bef7e219c91fb6b4..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,12 +0,0 @@
-/*   
-  auto-plet-engraver.hh -- declare Auto_plet_engraver
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1998--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#ifndef AUTO_PLET_ENGRAVER_HH
-#define AUTO_PLET_ENGRAVER_HH
-
index 0337c55b6f2cbf000e43994ade3016dd7342f76e..e473c5a5abb7b463ab66adac05cbe6a373ea5544 100644 (file)
@@ -51,7 +51,7 @@ public:
   Link_array<Note_req> mel_l_arr_;
   Link_array<Grob> support_l_arr_;
   Link_array<Item> forced_l_arr_;
-  Link_array<Grob> tied_l_arr_;
+  Link_array<Grob> tie_l_arr_;
   Local_key_engraver();
 
   Item * grace_align_l_;
@@ -98,9 +98,40 @@ Local_key_engraver::create_grobs ()
          bool different = !gh_equal_p(prev_acc , gh_int2scm(a));
          int p = gh_number_p(prev_acc) ? gh_scm2int(prev_acc) : 0;
 
-         bool tie_changes = tied_l_arr_.find_l (support_l) && different;
-         if ((to_boolean (note_l->get_mus_property ("force-accidental"))
-             || different) && !tie_changes)
+         /*
+           Find if we're
+           a. at right end of a tie -> tie_changes := different
+           b. at right end of broken tie -> tie_broken
+
+           Ugh: we're never case b., even when tie should be broken,
+           are we maybe called *before* line breaking?
+          */
+         bool tie_broken = false;
+         bool tie_changes = false;
+         for (int i=0; i < tie_l_arr_.size (); i++)
+           if (support_l == Tie::head (tie_l_arr_[i], RIGHT))
+             {
+               tie_changes = different;
+               Spanner *sp = dynamic_cast<Spanner*> (tie_l_arr_[i]);
+               if (!Tie::head (tie_l_arr_[i], LEFT)
+                   || (sp && sp->broken_into_l_arr_.size ()
+                       && !Tie::head (sp->broken_into_l_arr_[0], LEFT)))
+                 tie_broken = true;
+               break;
+             }
+
+         /*
+           Some comment here.
+           When do we want ties:
+
+             1. when property force-accidental is set, and not tie_changes
+             2. when different and not tie-changes
+             3. always after a line break -> why doesn't this work?
+           */
+         if (((to_boolean (note_l->get_mus_property ("force-accidental"))
+               || different)
+              && !tie_changes)
+             || tie_broken)
            {
              if (!key_item_p_) 
                {
@@ -138,6 +169,7 @@ Local_key_engraver::create_grobs ()
              /*
                Remember an alteration that is different both from
                that of the tied note and of the key signature.
+
               */
              localsig = scm_assoc_set_x (localsig, gh_cons (gh_int2scm (o),
                                                             gh_int2scm (n)),
@@ -206,7 +238,7 @@ Local_key_engraver::stop_translation_timestep()
   grace_align_l_ = 0;
   mel_l_arr_.clear();
   arpeggios_.clear ();
-  tied_l_arr_.clear();
+  tie_l_arr_.clear ();
   support_l_arr_.clear();
   forced_l_arr_.clear();       
 }
@@ -236,7 +268,7 @@ Local_key_engraver::acknowledge_grob (Grob_info info)
     }
   else if (Tie::has_interface (info.elem_l_))
     {
-      tied_l_arr_.push (Tie::head (info.elem_l_, RIGHT));
+      tie_l_arr_.push (info.elem_l_);
     }
   else if (Arpeggio::has_interface (info.elem_l_))
     {
index 8713c7d74167c2a406697f269ccfd4d78bf95d9d..868dbbd07718e04cc20513ba4bfefab1986bed6b 100644 (file)
@@ -50,6 +50,9 @@ Array<String> dump_header_fieldnames_global;
 /* Name of initialisation file. */
 String init_name_global;
 
+/* Write midi as formatted ascii stream? */
+bool midi_debug_global_b;
+
 /* Do not calculate and write paper output? */
 bool no_paper_global_b = false;
 
@@ -116,6 +119,7 @@ static Long_option_init options_static[] = {
   {0, "version", 'v',  _i ("print version number")},
   {0, "verbose", 'V', _i("verbose")},
   {0, "warranty", 'w',  _i ("show warranty and copyright")},
+  {0, "midi-debug", 'X',  _i ("write midi ouput in formatted ascii")},
   {0,0,0,0}
 };
 
@@ -456,6 +460,9 @@ main (int argc, char **argv)
        case 'T':
          no_timestamps_global_b = true;
          break;
+       case 'X':
+         midi_debug_global_b = true;
+         break;
        default:
          assert (false);
          break;
index a44155c07318cbeb05ae9fbf5436584ab1234a10..64aa262a260c83559f900b3bd26f77499fe80b52 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include "debug.hh"
+#include "main.hh"
 #include "misc.hh"
 #include "string.hh"
 #include "string-convert.hh"
@@ -594,26 +595,16 @@ Midi_track::add (Moment delta_time_mom, Midi_item* midi_p)
   event_p_list_.append (new Killing_cons<Midi_event> (e, 0));
 }
 
-extern bool verbose_global_b;
-
 String
 Midi_track::data_str () const
 {
   String str = Midi_chunk::data_str ();
-#if 0
-  if (flower_dstream && !flower_dstream->silent_b ("Midistrings"))
-#else
-  if (verbose_global_b)
-#endif
+  if (midi_debug_global_b)
     str += "\n";
   for (Cons<Midi_event> *i=event_p_list_.head_; i; i = i->next_) 
     {
       str += i->car_->str ();
-#if 0
-      if (flower_dstream && !flower_dstream->silent_b ("Midistrings"))
-#else  
-      if (verbose_global_b)
-#endif 
+      if (midi_debug_global_b)
         str += "\n";
     }
   return str;
index cdaf316cf898bbd53eab0527a78b998303305443..813694b29e52930482f5be69ec5513a45c83581d 100644 (file)
@@ -34,16 +34,11 @@ Midi_stream::operator << (String str)
   return *this;
 }
 
-extern bool verbose_global_b;
 Midi_stream&
 Midi_stream::operator << (Midi_item const& midi_c_r)
 {
   String str = midi_c_r.str ();
-#if 0
-  if (flower_dstream && !flower_dstream->silent_b ("Midistrings"))
-#else    
-  if (verbose_global_b)
-#endif    
+  if (midi_debug_global_b)
     {
      str = String_convert::bin2hex_str (str) + "\n";
     // ugh, should have separate debugging output with Midi*::print routines
index b99b611c6969155592815a426ad937984d38ad0d..986a58ebdb6ddd68837c404b2686860db22bd822 100644 (file)
@@ -48,26 +48,43 @@ Midi_walker::do_start_note (Midi_note* note_p)
 {
   Audio_item* ptr = (*item_l_arr_l_)[index_];
   Moment stop_mom = note_p->length_mom () + ptr->audio_column_l_->at_mom ();
+
+  bool play_start = true;
   for (int i=0; i < stop_note_queue.size(); i++) 
     {
+      /* if this pith already in queue */
       if (stop_note_queue[i].val->pitch_i() == note_p->pitch_i ()) 
        {
          if (stop_note_queue[i].key < stop_mom)
-           stop_note_queue[i].ignore_b_ = true;
-         else {
-           // skip the stopnote
-           delete note_p;
-           return;
+           {
+             /* let stopnote in queue be ignored,
+              new stop note wins */
+             stop_note_queue[i].ignore_b_ = true;
+             /* don't replay start note, */
+             play_start = false;
+             break;
+           }
+         else
+           {
+             /* skip this stopnote,
+                don't play the start note */
+             delete note_p;
+             note_p = 0;
+             break;
          }
        }
     }
 
-  Midi_note_event e;
-  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);
+  if (note_p)
+    {
+      Midi_note_event e;
+      e.val = new Midi_note_off (note_p);
+      e.key = stop_mom;
+      stop_note_queue.insert (e);
+
+      if (play_start)
+       output_event (ptr->audio_column_l_->at_mom (), note_p);
+    }
 }
 
 /**
@@ -111,8 +128,8 @@ Midi_walker::process()
 
   /*
     THIS IS A MEMORY LEAK. FIXME.
-   */
-  //Midi_item* p = ptr->midi_item_p ();
+    where's the leak?  Everything goet to Midi_track, in a killing_cons.
+ */
   if (Midi_item* midi_p = Midi_item::midi_p (audio_p))
     {
       midi_p->channel_i_ = track_l_->number_i_;
index 0e726c1d4f808b27b887b016fb3855e15508f516..cb3f54040e7071053ae319e42fcf64aaa1b06599 100644 (file)
@@ -1,5 +1,5 @@
 /*   
-  separating-line-group-engraver.cc --  implement Separating_line_group_engraver
+'  separating-line-group-engraver.cc --  implement Separating_line_group_engraver
   
   source file of the GNU LilyPond music typesetter
   
index 26719c84777f00665091e38dfaa16b43f4a3499d..3823f2c1f5dab58547791ceebcf27612c3d18e20 100644 (file)
@@ -5,12 +5,22 @@
 
   (c)  1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
-#include "swallow-engraver.hh"
 
+#include "engraver.hh"
 
+/**
+  This engraver swallows everything given to it silently. The purpose of
+  this is to prevent spurious "request junked" warnings.
+ */
+class Swallow_engraver : public Engraver
+{
+public:
+  VIRTUAL_COPY_CONS (Translator);
+protected:
+  bool try_music (Music*) ;
+};
 
-ADD_THIS_TRANSLATOR(Swallow_engraver);
-
+ADD_THIS_TRANSLATOR (Swallow_engraver);
 
 bool
 Swallow_engraver::try_music (Music*) 
index 75139c817d712f68fd8006f0a1c65dc97de5d3da..2d65a00d02295a24b43cc9e43a9037e0efc621db 100644 (file)
@@ -7,7 +7,6 @@
   
  */
 
-#include "tie-engraver.hh"
 #include "command-request.hh"
 #include "rhythmic-head.hh"
 #include "musical-request.hh"
index 1bab08c7975497e6258cff9e1ad8a26a142dc173..004a4de362f10ae65d3034d37e78d1a6dd956eac 100644 (file)
   mutopiaopus = "O62";
   mutopiainstrument = \instrument;
   date = "1807";
+
+  %{
+
+  From Ouverture Coriolan is no Urtext edition available, although
+  there are Urtext editions of Beethoven's symphonys.  The Eulenburg
+  edition is commonly regarded as the Coriolan Urtext.
+  
+  Edition Eulenburg is the ``first after many years'' that tries to
+  stay as close to the original text as possible.  During the 1900s,
+  it was customary for editors not to respect the original text and
+  make any changes they thought necessary.  Unger made corrections for
+  a few ``small and obvious'' inaccuracies.  This is the only score
+  edition to abbreviate (LilyPond source notation)
+
+      [es16 es g g] [b b c c]
+  
+  using the notation
+  
+      [es8:16 g: b: c:]
+
+  however, editions of individual parts by Breitkopf and Haertel use
+  this common practice abbreviation too.
+  
+  Edition Beethoven's Werke by Breitkopf and Haertel comes without any
+  commentary, copyright mark or date.  There are no significant
+  differences with ed. Unger.  The copy was very old and worn, but is
+  probably younger than ed. Unger.
+
+  Edition Beethoven Werke by G. Henle was a new study based upon the
+  three main sources, the score autograph, the published parts
+  Stimmen-Drucke N.Simrock Bonn (most probably from 1807) and
+  Industriekontor Vienna (1807).  They reinforce the assumptions made
+  by Unger that both published parts were first prints, noting that
+  both must have worked from a different copy of the autograph (and
+  not from the autograph itself), and that Simrock's is a bit closer
+  to the original autograph.  This edition is supposed to deviate from
+  the autograph only in using `modernised notation' for the following
+  cases (LilyPond source notation).
+
+  i. Use dots instead of ties for sustaining of notes when there's no
+  measure break:
+  
+      c4 ~ c8  ->  c4.
+
+  ii. Don't repeat accidentals within the same measure:
   
-  source = "i. Ed. Dr. Max Unger 1936 from and following score autograph and
-  original published parts, ie, Stimmen-Drucke N.Simrock Bonn (most probably
-  from 1807) and Industriekontor Vienna (1807).\\\\
+      \key es \major; b4 c b! c |   ->   \key es \major; b4 c b c
+
+  iii. Start slurring from first tied note, not from second:
+
+      c4 ~ c8 ( d ) e   ->   c4 ( ~ c8 d ) e
+
+  From these deviations, the third is the only one unique to this
+  edition, but these are easy to spot and mostly parenthesed; the
+  other two deviations are standard modern day music notation practice
+  and thus common to all editions.
+
+  %}
+    
+  source = "i. Ed. Eulenburg, edited by dr. Max Unger 1936 from and
+  following score autograph and original published parts, ie,
+  Stimmen-Drucke N.Simrock Bonn (most probably from 1807) and
+  Industriekontor Vienna (1807).\\\\
   ii. Beethoven's Werke -- Ouverturen fuer Orchester; Breitkopf u. Haertel,
   Leipzig (not dated, but very old and worn).\\\\
   iii.  Beethoven Werke II,1 -- Ouverturen und Wellingtons Sieg; G. Henle
@@ -31,7 +90,7 @@
   copyright = "Public Domain";
   maintainer = "Jan Nieuwenhuizen";
   maintainer_email = "janneke@gnu.org";
-  lastupdated =         "2001/Jan/31";
+  lastupdated =         "2001/Feb/27";
   mutopiapublicdomain = "\\parbox{\hsize}{\\thefooter\\quad\\small
     \\\\This music is part of the Mutopia project,
     \\texttt{http://www.mutopiaproject.org/}\\\\It has been typeset