Generated with 

	make_patch 0.1.3 0.1.4 lilypond

usage 

	cd lilypond-source-dir; patch -E -p0 < patch-0.1.4
	
Patches do not contain automatically generated files, 
i.e. you should rerun configure
diff -urN ../lilypond-0.1.3/COPYING ./COPYING
--- ../lilypond-0.1.3/COPYING	Sat Jul 26 17:54:25 1997
+++ ./COPYING	Sat Aug  9 16:44:04 1997
@@ -1,8 +1,11 @@
-This license applies to all files except:
 
-	- the included input files which explicitly state a different
-copyright policy
 
+*** NOTE
+
+	This license applies to all files except the included input files
+	(which are in the subdirectory input/
+
+*** END NOTE
 
 		    GNU GENERAL PUBLIC LICENSE
 		       Version 2, June 1991
diff -urN ../lilypond-0.1.3/Documentation/gnu-music.pod ./Documentation/gnu-music.pod
--- ../lilypond-0.1.3/Documentation/gnu-music.pod	Mon Jul 28 15:21:21 1997
+++ ./Documentation/gnu-music.pod	Mon Aug 11 03:15:25 1997
@@ -6,20 +6,31 @@
 
 Random ranting about the GNU Music project. 
 
-=head2 Note
+=head2 History of the GNU Music Project
 
-The GNU Music project was started by a few people (among others Robert Strandh,
-Robert.Strandh@labri.u-bordeaux.fr), who wanted to create free software
-for music printing and composing. After its initiation, its
-development efforts slowed down.
+Please note that this all happened when I wasn't around yet.  If you
+think that I am a biased, unfair, predisposed hypocrite, then don't
+bother flaming me;  I already know that.
+
+The GNU Music project is a project which aims to create free software
+for music printing and composing.  It was started by a few people
+(among others Francois Pinard <pinard@iro.umontreal.ca> and David
+Linn <drl@vuse.vanderbilt.edu>) and grew to quickly to about 100
+volunteers.
+
+After serious disputes with Robert Strandh
+<Robert.Strandh@labri.u-bordeaux.fr>, the project got divided and a
+lot of people left. The development efforts of GMP stopped.
 
-Independently, I started LilyPond. When I showed it to
+Independently, I (HWN) started LilyPond. When I showed it to
 RMS, he was very enthousiastic about having LilyPond in the GNU
 project. I subsequently learned about the GNU Music project, and
-contacted them.  We (the GNU Music project people and us, LilyPond
-people) agreed that cooperation would be desirable. Although merging
-of both efforts is technically infeasible at this point, we did decide
-that LilyPond should also be part of the GNU Music project (when it is
+contacted them.  
+
+We (what was left of the GNU Music project and us, LilyPond people)
+agreed that cooperation would be desirable. Although merging of both
+efforts is technically infeasible at this point, we did decide that
+LilyPond should also be part of the GNU Music project (when it is
 really released).
 
 In summary, LilyPond is part of the GNU project, and part of the (yet
@@ -70,25 +81,12 @@
 
 =back
 
-Music publishers make lots of money out of selling sheet music which
-is in the public domain (the composers died a long time ago). It is
-usually prohibited to xerox the sheet music.  Publishers have two
-arguments to justify this policy: the high prices are there to guarantee
-diversity (keeping lots of stock is expensive), and to encourage new
-work being composed.
-
-LilyPond addresses the first issue: storing mudelas takes up almost no
-space at all.  Other systems should address the other issue:
-encouraging laymen to take up composing, in the same way that GNU
-tools have created a whole new generation of programmers.
-
-The public deserves to get public domain music for free (zero cents). 
+These systems should encourage laymen to take up composing, in the
+same way that GNU tools have created a whole new generation of
+programmers.
 
 The public deserves free tools for composing and printing.
 
-In general, the same arguments as for software hold for music. See
-Stallmans articles on free software.
-
 
 =head1 REQUIREMENTS
 
@@ -180,11 +178,6 @@
 (difficult) A system to generate accompaniments, figured bass,
 automatic accompaniment, etc.
 
-=item An internet archive of free music
-
-The complete works by Bach, Beethoven, and any other ancient composer
-should be electronically retrievable. This might be a separate
-project: the Free Music Project.
 
 =back
 
diff -urN ../lilypond-0.1.3/Documentation/lilyliterature.pod ./Documentation/lilyliterature.pod
--- ../lilypond-0.1.3/Documentation/lilyliterature.pod	Fri Aug  8 14:21:00 1997
+++ ./Documentation/lilyliterature.pod	Sun Aug 10 18:38:58 1997
@@ -250,9 +250,6 @@
 =head2 Other stuff
 
 
-More on GNU Music:
-http://dept-info.labri.u-bordeaux.fr/~strandh/Gsharp
-
 Peter S. Langston, ``Unix music tools at Bellcore''.  Software ---
 Practice and Experience, Vol. 20(S1), S1/47--S1/61, 1990.
 
diff -urN ../lilypond-0.1.3/Documentation/mudela-man.doc ./Documentation/mudela-man.doc
--- ../lilypond-0.1.3/Documentation/mudela-man.doc	Tue Aug  5 23:50:08 1997
+++ ./Documentation/mudela-man.doc	Sun Aug 10 18:16:14 1997
@@ -335,7 +335,7 @@
 Mudela defines the following dynamic identifiers:
 
 \begin{verbatim}
-ppp pp p mp mf df ff fff        % df iso f, f is a notename.
+ppp pp p mp mf f ff fff
 \end{verbatim}
 and the following abbreviations:
 \begin{verbatim}
diff -urN ../lilypond-0.1.3/Documentation/mutopia.pod ./Documentation/mutopia.pod
--- ../lilypond-0.1.3/Documentation/mutopia.pod	Thu Jan  1 01:00:00 1970
+++ ./Documentation/mutopia.pod	Mon Aug 11 02:55:00 1997
@@ -0,0 +1,35 @@
+=head1 NAME 
+
+Mutopia project - manifesto
+
+=head1 DESCRIPTION
+
+Random ranting about the Mutopia project, aka "Music To the People." 
+
+=head1 WHY
+
+Music publishers make lots of money out of selling sheet music which
+is in the public domain (the composers died a long time ago). It is
+usually prohibited to xerox the sheet music.  Publishers have two
+arguments to justify this policy: the high prices are there to guarantee
+diversity (keeping lots of stock is expensive), and to encourage new
+work being composed.
+
+This is bad. The composers have long died, and not having their music
+available only discourages people from experimenting with them.  The
+public deserves to get public domain music for free (zero cents)
+
+=head1 WHAT 
+
+The solution:
+
+An internet archive. For literature, the project Gutenberg does this.
+
+We also need an archive of PD sheet music: The complete works by Bach,
+Beethoven, and any other ancient composer should be electronically
+retrievable. 
+
+This project shall be called The Mutopia Project.
+
+
+
diff -urN ../lilypond-0.1.3/NEWS ./NEWS
--- ../lilypond-0.1.3/NEWS	Fri Aug  8 14:58:48 1997
+++ ./NEWS	Mon Aug 11 02:35:07 1997
@@ -1,4 +1,19 @@
+pl 0.1.4
+	- correction of GNU Music Manifesto
+	- moved lowlevel stuff of Source_file to Mapped_file_storage. 
+Interface via File_storage. (Now using Simple_file_storage)
+	- bf: c4-"A"-"B"
+	- bf: exit status
+	- declarable keys
+	- Engraver_group_engraver::find_simple_engraver()
+	- bf: lily/Makefile
+	- bf: Midi_note_event ctor 
+	- bf: tempo request
+	- popular twinkle twinkle (JV)
+	- mudela: parse tempo requests, \midi{ \tempo 4= 60;}
 
+******
+aug 8
 pl 0.1.3 
 	- don't crash if no Clef_engraver.
 	- PScore -> Paper_score
@@ -7,6 +22,7 @@
 	- bf: don't change original Item while doing making 
 	multiple copies
 	- bf: configure DATADIR
+	- bf: type of spanbar.
 
 pl 0.1.2.jcn2
 	- minor doco fixes
diff -urN ../lilypond-0.1.3/TODO ./TODO
--- ../lilypond-0.1.3/TODO	Fri Aug  8 13:54:11 1997
+++ ./TODO	Mon Aug 11 02:46:44 1997
@@ -24,8 +24,6 @@
 
 	* derive Dstream, texstream from ostream?
 
-	* A typical pop-music example.
-
 	* check libtool, automake
 
 	* have make dist produce tarball in out/ directory.
@@ -97,18 +95,15 @@
 
 LILY BUGS
 
-
 	\score { < 
-	\melodic { \id "Staff" ""; c'4 g'4 }
-	\lyric { \id "Lyric" ""; hello4 bye4 < a chord > }
-	\lyric { \id "Lyric" ""; bye4 hello4 }
-	\melodic { \id "Staff" ""; c'4 g'4 }
-	> 
-
-	*******************
-
+		\melodic { \id "Staff" ""; c'4 g'4 }
+		\lyric {   \id "Lyric" ""; hello4 bye4 < a chord > }
+		\lyric {   \id "Lyric" ""; bye4 hello4 }
+		\melodic { \id "Staff" ""; c'4 g'4 }
+	> }
 
 PROJECTS
+
 	* emacs-mode for mudela
 
 	* input converters
@@ -200,15 +195,19 @@
 	  besides lists of flats/sharps, possibly via declaration
 	- key transposition. 
 	- key undo: \key bes; .. . \key; should print natural	
-	- special key: \key 'b bes bis';
+	- special key: \key bes 'b bis';
 	- spacing, national styles?
 
 
 	* should adjust stemlength for flag number.
 
-BUGS
-
-	* lilypond - -> crash
+	* breaking:
+	- caching breakpoints
+	- saving them
+	- allowing users to set them.
+	- penalties
+	- specify number of lines
+	- set linelength per line
 
 SEVERELY LACKING:
 
@@ -296,8 +295,6 @@
 
 	* centered whole rest
 
-	* caching breakpoints / saving them. 
-
 	* use dstream feature in mi2mu
 
         * qtor, btor, mtor-> tor( QUIET_ver ), tor( DEBUG_ver ), etc.
@@ -407,7 +404,7 @@
 	  % fingering:        footing:
 	    < a-4 c-2 g-1 >   < c-\ltoe e-\lheel >
 
-	* parameterised scripts for fingering and footing:
+	* stackparameterised scripts for fingering and footing:
 
             % toe to bheel   four to five
 	    %   ^_u            4_5  
diff -urN ../lilypond-0.1.3/VERSION ./VERSION
--- ../lilypond-0.1.3/VERSION	Fri Aug  8 14:41:26 1997
+++ ./VERSION	Mon Aug 11 10:04:49 1997
@@ -1,6 +1,6 @@
 TOPLEVEL_MAJOR_VERSION = 0
 TOPLEVEL_MINOR_VERSION = 1
-TOPLEVEL_PATCH_LEVEL = 3
+TOPLEVEL_PATCH_LEVEL = 4
 
 # use to send patches, always empty for released version:
 TOPLEVEL_MY_PATCH_LEVEL = 
diff -urN ../lilypond-0.1.3/bin/convert-mudela.in ./bin/convert-mudela.in
--- ../lilypond-0.1.3/bin/convert-mudela.in	Wed Jul 30 11:55:27 1997
+++ ./bin/convert-mudela.in	Sun Aug 10 17:11:55 1997
@@ -1,4 +1,5 @@
 #!@PERL@ -w
+# -*-perl-*-
 
 =head1 TODO
 
@@ -105,6 +106,10 @@
    
 }
 
+sub convert_0_1_0_to_0_1_1
+{
+    s/\\tempo (.*):(.*);/\\tempo $1 = $2;/g
+}
 ###############################################################
 
 sub    last_conversion
@@ -144,19 +149,22 @@
 			 "0.0.58" => \&convert_0_0_57_to_0_0_58,
 			 "0.0.59" => \&convert_0_0_58_to_0_0_59,
 			 "0.0.60" => \&convert_0_0_59_to_0_0_60,
-			 "0.0.61" => \&convert_0_0_60_to_0_0_61
+			 "0.0.61" => \&convert_0_0_60_to_0_0_61,
+			 "0.1.1" => \&convert_0_1_0_to_0_1_1
 			 );
  
 
 sub versions 
 {
-    return (sort keys %minor_conversions);
+    return (sort { cmpver; } (keys %minor_conversions));
 }
     
 
-sub    show_rules
+sub show_rules
 {
-    print "Rules: ", join(", ", sort keys %minor_conversions), "\n";
+    my (@v) = versions;
+
+    print "Rules: ", join(", ", @v), "\n";
     
 }
 
@@ -167,7 +175,6 @@
     my @applicable_conversion;
     my @mudela_levels;
     
-#    die "This is too old  to convert " if $from < 50;
     my @v = versions;
     foreach $ver (@v) {
 	if (version_compare($ver, $from) > 0 && version_compare($ver,$to) <= 0 ){ 
diff -urN ../lilypond-0.1.3/bin/make-website.in ./bin/make-website.in
--- ../lilypond-0.1.3/bin/make-website.in	Fri Aug  1 02:05:47 1997
+++ ./bin/make-website.in	Mon Aug 11 02:58:22 1997
@@ -1,5 +1,5 @@
 #!@PERL@ -w
-# stupid script to generate WWW site.
+# stupid script to generate WWW site. -*-Perl-*-
 
 use FileHandle;
 use Getopt::Long;
@@ -76,7 +76,7 @@
 
 local $base="lilypond/";
 local @examples=("twinkle", "multi", "wohltemperirt" ,"standchen", "toccata-fuga-E", 
-		 "scsii-menuetto", "collisions", "cadenza", "scales");
+		 "scsii-menuetto", "collisions", "cadenza", "scales", "twinkle-pop");
 
 # rhythm, scales, 
 
diff -urN ../lilypond-0.1.3/configure.in ./configure.in
--- ../lilypond-0.1.3/configure.in	Fri Aug  8 14:24:17 1997
+++ ./configure.in	Sat Aug  9 17:51:36 1997
@@ -8,7 +8,7 @@
   echo Please look in the INSTALL instructions for
   echo directions for multi-architecture building
     
-  AC_MSG_ERROR(This package does not support --srcdir.)
+  AC_LILY_WARN(This package does not support --srcdir!)
 fi
 
 # if given here, these vars are initted at the checking point.
@@ -23,7 +23,6 @@
 debug_b=yes
 optimise_b=no
 profile_b=no
-warn_b=no    
 
 AC_LANG_CPLUSPLUS
 
@@ -226,7 +225,7 @@
     
 END
 
-if test $warn_b = "yes" ; then
+if test x$warn_b = "xyes" ; then
 cat <<EOF
     
     **************************************************
diff -urN ../lilypond-0.1.3/flower/NEWS ./flower/NEWS
--- ../lilypond-0.1.3/flower/NEWS	Sat Aug  2 23:04:17 1997
+++ ./flower/NEWS	Mon Aug 11 01:07:17 1997
@@ -1,4 +1,7 @@
 
+pl 26
+	- Getopt_long : command -- and command - 
+	- Getopt_long: cosmetics
 
 pl 25
 	- unordered_substitute and unordered_del
diff -urN ../lilypond-0.1.3/flower/include/lgetopt.hh ./flower/include/lgetopt.hh
--- ../lilypond-0.1.3/flower/include/lgetopt.hh	Mon May 12 23:09:07 1997
+++ ./flower/include/lgetopt.hh	Mon Aug 11 00:44:55 1997
@@ -14,7 +14,7 @@
     char const * longname;
     char        shortname;
 
-    ostream &printon(ostream &errorout);
+    void printon(ostream &errorout)const ;
 };
 
 
@@ -28,54 +28,56 @@
   argument reordering
   */
 class Getopt_long {
-public:
-    /** errorcodes: no error, argument expected, no argument expected,
-      unknown option, illegal argument (eg. int expected).  */
-    enum Errorcod { E_NOERROR = 0, E_ARGEXPECT, E_NOARGEXPECT, E_UNKNOWNOPTION,
-		E_ILLEGALARG } ;
-
-
-private:
 
     /// the option info.
-    Long_option_init *the_opts;
-    int table_len;
+    const Long_option_init *option_a_;
+    int table_len_i_;
     
-    /// if doing short option, argv[optind][optindind] is processed next.
-    int optindind;
+    /// if doing short option, arg_value_ch_a_a_[optind][optindind] is processed next.
+    int argument_index_i_;
 
     /// the option found
-    Long_option_init *beet;
+    const Long_option_init *found_option_l_;
 
-    /// get ready for processing next error.
-    bool next();
-    Long_option_init *parselong();
-    Long_option_init *parseshort();
-    
-    ostream *errorout;
 
-    /// report an error and abort
-    void report(Errorcod c);
-public:
+public: 
+    /** errorcodes: no error, argument expected, no argument expected,
+      unknown option, illegal argument (eg. int expected).  */
+    enum Errorcod { E_NOERROR = 0, E_ARGEXPECT, E_NOARGEXPECT, E_UNKNOWNOPTION,
+		E_ILLEGALARG } ;
 
     /// argument. Set to 0 if not present
-    char* optarg;
+    char const * optional_argument_ch_C_;
 
     /// current error status
-    Errorcod error;
+    Errorcod error_;
 
-    /// return an integer (with err. detect)
-    long intarg();
-    /// argv[optind] will be processed next.
-    int optind;
+    /// arg_value_ch_a_a_[array_index_i_] will be processed next.
+    int array_index_i_;
 
     /// the arguments
-    char **argv;
+    char **arg_value_ch_a_a_;
 
     /// the arg. count
-    int argc;
-    
-    /* *************** */
+    int argument_count_i_;
+
+    ostream *error_ostream_l_;
+
+public:
+    /// get ready for processing next error.
+    void next();
+    const Long_option_init *parselong();
+    const Long_option_init *parseshort();
+    void OK()const;
+    bool ok() const;
+
+    /// report an error and abort
+    void report(Errorcod c);
+
+
+    /// return an integer (with err. detect)
+    long argument_to_i();
+ 
     
     /**
       What to do with  errors. 
@@ -92,9 +94,9 @@
       @return pointer to next option found.
       0 if error occurred, or next argument is no option.
       */
-    Long_option_init *operator()();
+    const Long_option_init *operator()();
 
-    char *current_arg();
-    char * get_next_arg();
+    char const *current_arg();
+    char const * get_next_arg();
 };
 #endif
diff -urN ../lilypond-0.1.3/flower/lgetopt.cc ./flower/lgetopt.cc
--- ../lilypond-0.1.3/flower/lgetopt.cc	Mon Apr  7 22:47:05 1997
+++ ./flower/lgetopt.cc	Mon Aug 11 01:08:36 1997
@@ -9,64 +9,65 @@
 #include "lgetopt.hh"
 
 long
-Getopt_long::intarg()
+Getopt_long::argument_to_i()
 {
     long l;
-    if (sscanf(optarg, "%ld", &l) != 1)
+    if (!optional_argument_ch_C_ 
+	|| sscanf(optional_argument_ch_C_, "%ld", &l) != 1)
 	report(E_ILLEGALARG);
     
     return l;
 }
 
-Long_option_init *
+const Long_option_init *
 Getopt_long::parselong()
 {
-    char const *optnm = argv[optind] + 2 ;
+    char const *optnm = arg_value_ch_a_a_[array_index_i_] + 2 ;
     assert(*optnm);
     
-    char *endopt = strchr(optnm, '=');
+    char const *endopt = strchr(optnm, '=');
     int searchlen  = (endopt) ? endopt - optnm : strlen(optnm);
     
-    beet=0;
-    for (int i=0; i< table_len; i++) {
-	char const *ln = the_opts[i].longname;
+    found_option_l_=0;
+    for (int i=0; i< table_len_i_; i++) {
+	char const *ln = option_a_[i].longname;
 
 	if (ln && !strncmp(ln, optnm, searchlen)) {
-	    beet = the_opts+i;
+	    found_option_l_ = option_a_+i;
 	    break;
 	}
     }	
 
-    if (!beet) {
+    if (!found_option_l_) {
 	report(E_UNKNOWNOPTION);
 	return 0;
     }
-    optind++;
-    optindind = 0;
+    array_index_i_++;
+    argument_index_i_ = 0;
 
     
-    if (beet->take_arg) {
+    if (found_option_l_->take_arg) {
 	if (endopt)
-	    optarg = endopt +1; // a '='
+	    optional_argument_ch_C_ = endopt +1; // a '='
 	else {
-	    optarg = argv[optind];
-	    optind++;
+	    optional_argument_ch_C_ = arg_value_ch_a_a_[array_index_i_];
+	    array_index_i_++;
 	}
-	if (!optarg)
+	if (!optional_argument_ch_C_)
 	    report(E_ARGEXPECT);
 
     } else {
-	optarg = 0;
+	optional_argument_ch_C_ = 0;
 	if (endopt)
 	    report(E_NOARGEXPECT);
     }
     
-    return beet;
+    return found_option_l_;
 }
 
 
-ostream &
-Long_option_init::printon(ostream &errorout)
+void
+Long_option_init::printon(ostream &errorout)const
 {
     if (shortname)	
 	errorout <<"-" << shortname;
@@ -74,150 +75,164 @@
 	errorout << ", ";
     if (longname)	
 	errorout << "`--" << longname << "'";
-    return errorout;
 }
 
 // report an error, GNU style.
 void
 Getopt_long::report(Errorcod c)
 {
-    error = c;
-    if (!errorout)
+    error_ = c;
+    if (!error_ostream_l_)
 	return;
 
-    *errorout << argv[0] << ": ";
+    *error_ostream_l_ << arg_value_ch_a_a_[0] << ": ";
     switch (c) {
     case E_ARGEXPECT:
-	*errorout<< "option ";
-	beet->printon(*errorout);
-	*errorout << "requires an argument"<<endl;
+	*error_ostream_l_<< "option ";
+	found_option_l_->printon(*error_ostream_l_);
+	*error_ostream_l_ << "requires an argument"<<endl;
 	break;
     case  E_NOARGEXPECT:
-	*errorout << "option `--" <<
-	    beet->longname << "' does not allow an argument"<<endl;
+	*error_ostream_l_ << "option `--" <<
+	    found_option_l_->longname << "' does not allow an argument"<<endl;
 	break;
 	
     case E_UNKNOWNOPTION:
-	*errorout << "unrecognized option ";
-	if (optindind)
-	    *errorout << "-" << argv[optind][optindind] << endl;
+	*error_ostream_l_ << "unrecognized option ";
+	if (argument_index_i_)
+	    *error_ostream_l_ << "-" << arg_value_ch_a_a_[array_index_i_][argument_index_i_] << endl;
 	else
-	    *errorout << argv[optind] << endl;
+	    *error_ostream_l_ << arg_value_ch_a_a_[array_index_i_] << endl;
 
 	break;
     case E_ILLEGALARG:
-	*errorout << "illegal argument `" << optarg << "\'to option ";
-	beet->printon(*errorout);
-	*errorout << '\n';
+	*error_ostream_l_ << "illegal argument `" << optional_argument_ch_C_ << "\'to option ";
+	found_option_l_->printon(*error_ostream_l_);
+	*error_ostream_l_ << '\n';
     default:
 	assert(false);
     }
     exit(2); 
 }
     
-Long_option_init *
+const Long_option_init *
 Getopt_long::parseshort()
 {
-    char c=argv[optind][optindind];
-    beet=0;
+    char c=arg_value_ch_a_a_[array_index_i_][argument_index_i_];
+    found_option_l_=0;
     assert(c);
     
-    for (int i=0; i < table_len; i++)
-	if (the_opts[i].shortname == c) {
-	    beet  = the_opts+i;
+    for (int i=0; i < table_len_i_; i++)
+	if (option_a_[i].shortname == c) {
+	    found_option_l_  = option_a_+i;
 	    break;
 	}
 
-    if (!beet){
+    if (!found_option_l_){
 	report(E_UNKNOWNOPTION);
 	return 0;
     }
 
-    optindind++;
-    if (!beet->take_arg){
-	optarg = 0;
-	return beet;
+    argument_index_i_++;
+    if (!found_option_l_->take_arg){
+	optional_argument_ch_C_ = 0;
+	return found_option_l_;
     }
-    optarg = argv[optind] + optindind;
+    optional_argument_ch_C_ = arg_value_ch_a_a_[array_index_i_] + argument_index_i_;
 
-    optind ++;
-    optindind = 0;
+    array_index_i_ ++;
+    argument_index_i_ = 0;
     
-    if (!optarg[0]) {
-	optarg = argv[optind];
-	optind ++;
+    if (!optional_argument_ch_C_[0]) {
+	optional_argument_ch_C_ = arg_value_ch_a_a_[array_index_i_];
+	array_index_i_ ++;
     }
-    if (!optarg) {
+    if (!optional_argument_ch_C_) {
 	report(E_ARGEXPECT);
     }
     
-    return beet;
+    return found_option_l_;
 }
 
-Long_option_init *
+const Long_option_init *
 Getopt_long::operator()() 
 {
-    if (!next())
+    if (!ok())
 	return 0;
     
-    if (optindind)
-	return parseshort();
+    next();
+    
+    if (argument_index_i_)
+ 	return parseshort();
+    
+    const char * argument_C = arg_value_ch_a_a_[array_index_i_];
     
-    if (argv[optind][0] != '-')
+    if (argument_C[0] != '-')
 	return 0;
 
-    if (argv[optind][1] == '-') {// what to do with "command  --  bla"
-	return parselong();
+    if (argument_C[1] == '-') {// what to do with "command  --  bla"
+	if ( argument_C[2] )
+	    return parselong();
+	else
+	    return 0;
     } else {
-	optindind = 1;
-	return parseshort();
+	if (argument_C[ 1 ]) {
+	    argument_index_i_ = 1;
+	    return parseshort();
+	} else {
+	    return 0;
+	}
     }
 }
 
-Getopt_long::Getopt_long(int c, char **v, Long_option_init *lo)
+Getopt_long::Getopt_long(int c, char  **v, Long_option_init *lo)
 {
-    the_opts = lo;
-    errorout = &cerr;
-    argv = v;
-    argc = c;
-    optind = 1;
-    optindind = 0;
+    option_a_ = lo;
+    error_ostream_l_ = &cerr;
+    arg_value_ch_a_a_ = v;
+    argument_count_i_ = c;
+    array_index_i_ = 1;
+    argument_index_i_ = 0;
 
     //    reached end of option table?
-    int i;
-    for (i = 0;  the_opts[i].longname ||the_opts[i].shortname; i++)
-	;
-    table_len = i;
+    table_len_i_ =0;
+    for (int i = 0;  option_a_[i].longname ||option_a_[i].shortname; i++)
+	table_len_i_ ++;
 }
 
 bool
-Getopt_long::next()
+Getopt_long::ok()const
 {
+    return  array_index_i_ < argument_count_i_;
+}
 
-    error = E_NOERROR;
-    while (optind < argc && !argv[optind][optindind]) {
-	optind++;
-	optindind = 0;
+void
+Getopt_long::next()
+{
+    error_ = E_NOERROR;
+    while (array_index_i_ < argument_count_i_
+	   && !arg_value_ch_a_a_[array_index_i_][argument_index_i_]) {
+	array_index_i_++;
+	argument_index_i_ = 0;
     }
-    return (optind < argc);
 }
    
-char *
+char const *
 Getopt_long::current_arg()
 {
-    if (optind >= argc)
+    if (array_index_i_ >= argument_count_i_)
 	return 0;
-    char * a = argv[optind];
-    return a + optindind;
+    char const * a = arg_value_ch_a_a_[array_index_i_];
+    return a + argument_index_i_;
 }
 
-char *
+char const *
 Getopt_long::get_next_arg()
 {
-    char * a = current_arg();
-    if ( a) {
-	optind ++;
-	optindind = 0;
+    char const * a = current_arg();
+    if (a) {
+	array_index_i_ ++;
+	argument_index_i_= 0;
     }
     return a;
 }
diff -urN ../lilypond-0.1.3/init/dutch.ly ./init/dutch.ly
--- ../lilypond-0.1.3/init/dutch.ly	Mon Jul 28 22:09:37 1997
+++ ./init/dutch.ly	Sun Aug 10 22:13:06 1997
@@ -97,3 +97,7 @@
 
 
 }
+
+
+
+keyCminor =  \key \bes \es \as;
diff -urN ../lilypond-0.1.3/init/midi.ly ./init/midi.ly
--- ../lilypond-0.1.3/init/midi.ly	Mon Jul 28 23:27:29 1997
+++ ./init/midi.ly	Sun Aug 10 17:14:34 1997
@@ -1,6 +1,6 @@
 
 \include "performer.ly"
 default_midi = \midi {
-        \tempo 4:60;
+        \tempo 4=60;
 	\requesttranslator{ \default_midi_perf }
 }
diff -urN ../lilypond-0.1.3/init/symbol.ly ./init/symbol.ly
--- ../lilypond-0.1.3/init/symbol.ly	Mon Jul 28 22:09:37 1997
+++ ./init/symbol.ly	Sun Aug 10 22:47:29 1997
@@ -1,4 +1,4 @@
-\version "0.1.0";
+\version "0.1.1";
 
 \include "dynamic.ly"
 \include "dutch.ly" 
@@ -8,6 +8,7 @@
 % ugh
 \include "midi.ly"
 
+% declarations for standard directions
 left = -1
 right = 1
 up = 1
diff -urN ../lilypond-0.1.3/input/beams.ly ./input/beams.ly
--- ../lilypond-0.1.3/input/beams.ly	Wed Jul 30 20:28:53 1997
+++ ./input/beams.ly	Sat Aug  9 17:00:35 1997
@@ -5,7 +5,7 @@
  description: 
  composer(s): heu
  entered-by: jcn
- copyright: GPL
+ copyright: PD
 
  Tested Features: beams and beamflags
 EndMudelaHeader
diff -urN ../lilypond-0.1.3/input/cadenza.ly ./input/cadenza.ly
--- ../lilypond-0.1.3/input/cadenza.ly	Thu Aug  7 12:37:07 1997
+++ ./input/cadenza.ly	Sun Aug 10 17:13:27 1997
@@ -10,7 +10,7 @@
 EndMudelaHeader
 %}
 
-\version "0.1.0";
+\version "0.1.1";
 
 
 cad = \melodic  {\id "Staff" "french horn";
@@ -61,5 +61,5 @@
 		unitspace= 14.0\mm;
 		geometric= 1.4;
 	}
-	\midi { \tempo 4:90; }
+	\midi { \tempo 4 = 90; }
 }
diff -urN ../lilypond-0.1.3/input/collisions.ly ./input/collisions.ly
--- ../lilypond-0.1.3/input/collisions.ly	Wed Jul 30 20:22:32 1997
+++ ./input/collisions.ly	Sun Aug 10 17:13:27 1997
@@ -10,7 +10,7 @@
  Tested Features:test the Collision resolution 
 EndMudelaHeader
 %}
-\version "0.1.0";
+\version "0.1.1";
 
 
 
diff -urN ../lilypond-0.1.3/input/coriolan-alto.ly ./input/coriolan-alto.ly
--- ../lilypond-0.1.3/input/coriolan-alto.ly	Wed Jul 30 20:24:13 1997
+++ ./input/coriolan-alto.ly	Sun Aug 10 17:13:27 1997
@@ -17,7 +17,7 @@
 % (maybe even sooner :-)
 %
 
-\version "0.0.58";
+\version "0.1.1";
 
 alto = \melodic{ 
 	
diff -urN ../lilypond-0.1.3/input/header.ly ./input/header.ly
--- ../lilypond-0.1.3/input/header.ly	Mon Jul 28 00:34:03 1997
+++ ./input/header.ly	Sun Aug 10 17:13:28 1997
@@ -10,4 +10,4 @@
  Tested Features:
 EndMudelaHeader
 %}
-\version "0.1.0";
+\version "0.1.1";
diff -urN ../lilypond-0.1.3/input/keys.ly ./input/keys.ly
--- ../lilypond-0.1.3/input/keys.ly	Mon Jul 28 00:34:03 1997
+++ ./input/keys.ly	Sun Aug 10 17:13:28 1997
@@ -10,7 +10,7 @@
  Tested Features: local key, key, forced accidentals
 EndMudelaHeader
 %}
-\version "0.1.0";
+\version "0.1.1";
 
 
 blah = \melodic{
diff -urN ../lilypond-0.1.3/input/kortjakje.ly ./input/kortjakje.ly
--- ../lilypond-0.1.3/input/kortjakje.ly	Fri Aug  1 01:27:48 1997
+++ ./input/kortjakje.ly	Sun Aug 10 17:13:28 1997
@@ -5,12 +5,12 @@
  description:  bare bones version. (written down from memory :-)
  composers: Mozart, KV 265
  entered-by: HWN
- copyright: none
+ copyright: PD
 
  Tested Features: example file with comments
 EndMudelaHeader
 %}
-\version "0.1.0";
+\version "0.1.1";
 
 
 % the % is a comment.
diff -urN ../lilypond-0.1.3/input/multi.ly ./input/multi.ly
--- ../lilypond-0.1.3/input/multi.ly	Wed Jul 30 20:22:32 1997
+++ ./input/multi.ly	Sun Aug 10 17:13:28 1997
@@ -12,7 +12,7 @@
 %}
 
 
-\version "0.1.0";
+\version "0.1.1";
 
 \score{
 	\melodic 
diff -urN ../lilypond-0.1.3/input/pedal.ly ./input/pedal.ly
--- ../lilypond-0.1.3/input/pedal.ly	Mon Jul 28 00:34:03 1997
+++ ./input/pedal.ly	Sun Aug 10 17:13:28 1997
@@ -24,7 +24,7 @@
 % \lbheel \lbheel \lfheel \lftoe
 % \rbheel \rbtoe \rfheel \rftoe
 
-\version "0.1.0";
+\version "0.1.1";
 
 \score{
 		\melodic {
diff -urN ../lilypond-0.1.3/input/rhythm.ly ./input/rhythm.ly
--- ../lilypond-0.1.3/input/rhythm.ly	Mon Jul 28 00:34:03 1997
+++ ./input/rhythm.ly	Sun Aug 10 17:13:29 1997
@@ -14,7 +14,7 @@
 
 
 
-\version "0.1.0";
+\version "0.1.1";
 
 ritme = \melodic{ %\octave ;
 	\partial 8;
diff -urN ../lilypond-0.1.3/input/scales.ly ./input/scales.ly
--- ../lilypond-0.1.3/input/scales.ly	Mon Jul 28 00:34:03 1997
+++ ./input/scales.ly	Sun Aug 10 17:13:29 1997
@@ -15,7 +15,7 @@
 % scales with accents.
 %
 
-\version "0.1.0";
+\version "0.1.1";
 blah = 	\melodic {
 		\meter 6/8;	
 		\octave  'c ;
diff -urN ../lilypond-0.1.3/input/scripts.ly ./input/scripts.ly
--- ../lilypond-0.1.3/input/scripts.ly	Mon Jul 28 00:34:03 1997
+++ ./input/scripts.ly	Sun Aug 10 17:13:29 1997
@@ -10,7 +10,7 @@
  Tested Features: scripts, text.
 EndMudelaHeader
 %}
-\version "0.1.0";
+\version "0.1.1";
 
 
 blah = 	\melodic {
diff -urN ../lilypond-0.1.3/input/scsii-menuetto.ly ./input/scsii-menuetto.ly
--- ../lilypond-0.1.3/input/scsii-menuetto.ly	Wed Jul 30 20:22:32 1997
+++ ./input/scsii-menuetto.ly	Sun Aug 10 17:13:29 1997
@@ -13,7 +13,7 @@
 EndMudelaHeader
 %}
 
-\version "0.1.0";
+\version "0.1.1";
 
 %% Stuff from MPP version
 % \lefttitle{Menuetto}
@@ -111,7 +111,7 @@
 		\output "scsii-menuetto.out";
 	}
 	\midi{ 
-		\tempo 4:120;
+		\tempo 4 = 120;
 		\output "scsii-menuetto.midi";
 	}
 }
diff -urN ../lilypond-0.1.3/input/slurs.ly ./input/slurs.ly
--- ../lilypond-0.1.3/input/slurs.ly	Wed Jul 30 20:22:32 1997
+++ ./input/slurs.ly	Sun Aug 10 17:13:29 1997
@@ -5,13 +5,13 @@
  description: 
  composer(s): HWN
  entered-by: HWN
- copyright: GPL
+ copyright: PD
 
  Tested Features: test slurs and ties
 EndMudelaHeader
 %}
 
-\version "0.1.0";
+\version "0.1.1";
 
 \score{
 	\melodic{\octave c';
diff -urN ../lilypond-0.1.3/input/standchen.ly ./input/standchen.ly
--- ../lilypond-0.1.3/input/standchen.ly	Wed Jul 30 20:22:31 1997
+++ ./input/standchen.ly	Sun Aug 10 17:13:30 1997
@@ -13,7 +13,7 @@
 EndMudelaHeader
 %}
 
-\version "0.1.0";
+\version "0.1.1";
 
 commands = \melodic{
 	\skip 2.*4;
@@ -485,6 +485,6 @@
 		\output "standchen.out";
 	}
 	\midi{
-		\tempo 4:54;
+		\tempo 4 = 54;
 	}
 }
diff -urN ../lilypond-0.1.3/input/toccata-fuga-E.ly ./input/toccata-fuga-E.ly
--- ../lilypond-0.1.3/input/toccata-fuga-E.ly	Wed Jul 30 20:22:31 1997
+++ ./input/toccata-fuga-E.ly	Sun Aug 10 17:13:30 1997
@@ -20,7 +20,7 @@
 %}
 
 
-\version "0.1.0";
+\version "0.1.1";
 
 toccata_commands = \melodic{
 	\meter 4/4;
@@ -151,7 +151,7 @@
 	>
 	\paper{}
 	\midi{
-		\tempo 4:96;
+		\tempo 4 = 96;
 	}
 }
 
diff -urN ../lilypond-0.1.3/input/twinkle-pop.ly ./input/twinkle-pop.ly
--- ../lilypond-0.1.3/input/twinkle-pop.ly	Thu Jan  1 01:00:00 1970
+++ ./input/twinkle-pop.ly	Sun Aug 10 17:13:30 1997
@@ -0,0 +1,47 @@
+%{MudelaHeader
+
+ filename: twinkle.ly
+ title: Ah, vous dirais-je, maman 
+ description: twinkle twinkle in pop-song-settings
+ composers: traditional
+
+ entered-by: HWN, chords by Johan Vromans
+ copyright: public domain
+
+ Tested Features: lyrics and chords
+EndMudelaHeader
+%}
+
+\version "0.1.1";
+
+melodie = \melodic {
+        \clef"violin";
+        \meter 2/4 ;
+        \octave  c';
+
+        c4^"C" c |      g     g |       a^"F"  a |      g2^"C"   |
+        f4^"F" f |      e^"C" e |       d^"G7" d |      c2^"C"   |
+        g4^"G" g |      f^"F" f |       e^"C"  e |      d^"G7" d |
+        g^"G"  g |      f^"F" f |       e^"C"  e |      d^"G7" d |
+        c4^"C" c |      g     g |       a^"F"  a |      g2^"C"   |
+        f4^"F" f |      e^"C" e |       d^"G7" d |      c2^"C"   |
+}
+
+texte = \lyric{ 
+         
+        \textstyle "italic";
+        Ah!4 vous dir- ai_- je ma man2
+        Ce4 qui cau- se mon tour- ment2
+        Pa-4 pa veut que je rai- so- nne
+        Comme4 un- e grand- e per- so- nne
+        Moi4 je dis que les bon- bons2
+        Val-4 ent mieux que la rai- son2
+        
+}
+
+\score {
+        <  \melodic <  \id "Piano" "";  \melodie >
+           \lyric   < \id "Lyric" "";  \texte >
+        >
+        \paper { unitspace= 2.5\cm; }
+}
diff -urN ../lilypond-0.1.3/input/twinkle.ly ./input/twinkle.ly
--- ../lilypond-0.1.3/input/twinkle.ly	Mon Jul 28 22:38:49 1997
+++ ./input/twinkle.ly	Sun Aug 10 17:13:30 1997
@@ -7,14 +7,14 @@
   "Altijd is Kortjakje ziek"
   "Twinkle twinkle little star"
 
- composers: ?
+ composers: Traditional
  entered-by: HWN & JCN
  copyright: public domain
 
  Tested Features: lyrics
 EndMudelaHeader
 %}
-\version "0.1.0";
+\version "0.1.1";
 
 melody = \melodic{
 	\clef violin;
@@ -136,7 +136,7 @@
 		unitspace= 2.5\cm;
 	}
 	\midi{ 
-		\tempo 4:120 ;
+		\tempo 4 = 120 ;
 	}
 }
 
diff -urN ../lilypond-0.1.3/input/wohltemperirt.ly ./input/wohltemperirt.ly
--- ../lilypond-0.1.3/input/wohltemperirt.ly	Mon Aug  4 00:23:58 1997
+++ ./input/wohltemperirt.ly	Mon Aug 11 02:02:41 1997
@@ -9,7 +9,7 @@
 
 %}
 
-\version "0.1.0";
+\version "0.1.1";
 
                                     % should add \need{dutch.ini} for
                                     % correct parsing of note names
@@ -17,7 +17,7 @@
 global = 
     \melodic {
          \meter 4/4;                % should be \meter C
-         \key bes es as; 
+         \keyCminor 
     }
   
 dux =
@@ -173,11 +173,9 @@
                  >
              >
 
-    \paper{
-%	castingalgorithm=0.;
-    }
+    \paper{}
     \midi {
-        \tempo 4:84;
+        \tempo 4 = 84;
     }
 }
 
diff -urN ../lilypond-0.1.3/lib/binary-source-file.cc ./lib/binary-source-file.cc
--- ../lilypond-0.1.3/lib/binary-source-file.cc	Fri Apr  4 01:59:48 1997
+++ ./lib/binary-source-file.cc	Mon Aug 11 01:44:24 1997
@@ -34,7 +34,7 @@
 	return "";
 
     char const* begin_ch_c_l = pos_ch_c_l - 8 >? ch_C();
-    char const* end_ch_c_l = pos_ch_c_l + 7 <? ch_C() + length_off();
+    char const* end_ch_c_l = pos_ch_c_l + 7 <? ch_C() + length_i();
 
     String pre_str( (Byte const*)begin_ch_c_l, pos_ch_c_l - begin_ch_c_l );
     pre_str = String_convert::bin2hex_str( pre_str );
diff -urN ../lilypond-0.1.3/lib/duration-convert.cc ./lib/duration-convert.cc
--- ../lilypond-0.1.3/lib/duration-convert.cc	Fri Aug  8 13:52:54 1997
+++ ./lib/duration-convert.cc	Sat Aug  9 16:04:59 1997
@@ -116,9 +116,7 @@
 //	if ( !dur_array_s.length_i() )
 	if ( !dur_array_s.size() )
 		set_array();
-//	assert( dur_array_s.length_i() );
 	assert( dur_array_s.size() );
-//	for ( int i = 0; i < dur_array_s.length_i() - 1; i++ ) {
 	for ( int i = 0; i < dur_array_s.size() - 1; i++ ) {
   		Moment lower_mom = dur2_mom( dur_array_s[ i ] );
 		if ( mom <= lower_mom ) {
@@ -126,22 +124,18 @@
 			// kinda ok
 			if ( i || ( mom / lower_mom > Moment( 3, 4 ) ) )
 				return dur_array_s[ i ];
-			else
-				return Duration( 0 );
+			else {
+			    Duration d;
+			    d.type_i_ = 0;
+			    return d;
+			}
 		}
   		Moment upper_mom = dur2_mom( dur_array_s[ i + 1 ] );
-#if 0  // % deviation of upper/lower from mom, perhaps it's better to use
-		if ( ( mom < upper_mom )
-			 && ( ( mom - lower_mom ) / mom
-				< ( upper_mom - mom ) / mom ) )
-#else // % deviation of mom from lower/upper?
 		if ( ( mom < upper_mom )
 			 && ( ( mom - lower_mom ) / lower_mom
 				< ( upper_mom - mom ) / upper_mom ) )
-#endif
 			return dur_array_s[ i ];
 	}
-//	return dur_array_s[ dur_array_s.length_i() ];
 	return dur_array_s[ dur_array_s.size() - 1 ];
 }
 
diff -urN ../lilypond-0.1.3/lib/duration.cc ./lib/duration.cc
--- ../lilypond-0.1.3/lib/duration.cc	Fri Aug  8 13:52:54 1997
+++ ./lib/duration.cc	Sat Aug  9 15:41:54 1997
@@ -20,12 +20,10 @@
 int Duration::division_1_i_s = 384 * 4;
 
 
-Duration::Duration( int type_i, int dots_i = 0)
+Duration::Duration()
 {
-// this breaks mi2mu quite effectively
-//    assert(duration_type_b(type_i));
-	type_i_ = type_i;
-	dots_i_ = dots_i;
+	type_i_ = 1;
+	dots_i_ = 0;
 	ticks_i_ = 0;
 }
 
diff -urN ../lilypond-0.1.3/lib/file-storage.cc ./lib/file-storage.cc
--- ../lilypond-0.1.3/lib/file-storage.cc	Thu Jan  1 01:00:00 1970
+++ ./lib/file-storage.cc	Mon Aug 11 02:01:49 1997
@@ -0,0 +1,98 @@
+/*
+  file-storage.cc -- implement Mapped_file_storage
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+  Jan Nieuwenhuizen <jan@digicash.com>
+*/
+#include <sys/types.h>		// open, mmap
+#include <sys/stat.h>		// open
+#include <sys/mman.h>		// mmap
+#include <limits.h>		// INT_MAX
+#include <fcntl.h>		// open 
+#include <unistd.h>		// close, stat
+#include <stdio.h>		// fdopen
+#include <string.h>		// strerror
+#include <errno.h>		// errno
+
+
+
+#include "string.hh"
+#include "proto.hh"
+#include "warn.hh"
+#include "file-storage.hh"
+
+Mapped_file_storage::Mapped_file_storage(String s)
+{
+    data_caddr_ = 0;
+    fildes_i_ = 0;
+    size_off_ = 0;
+    open(s);
+}
+
+char const*
+Mapped_file_storage::ch_C()const
+{
+    return (char const*)data_caddr_;
+}
+
+void
+Mapped_file_storage::map()
+{
+    if ( fildes_i_ == -1 )
+	return;
+
+    data_caddr_ = (caddr_t)mmap( (void*)0, size_off_, PROT_READ, MAP_SHARED, fildes_i_, 0 );
+
+    if ( (int)data_caddr_ == -1 )
+	warning( String( "can't map: error no: " ) + strerror( errno ));
+}
+
+
+void
+Mapped_file_storage::open(String name_str)
+{
+    fildes_i_ = ::open( name_str, O_RDONLY );	
+	    
+    if ( fildes_i_ == -1 ) {
+	warning( String( "can't open: " ) + name_str + String( ": " ) + strerror( errno )); 
+        return;
+    }
+
+    struct stat file_stat;
+    fstat( fildes_i_, &file_stat );
+    size_off_ = file_stat.st_size;
+    map();
+}
+
+void
+Mapped_file_storage::unmap()
+{
+    if ( data_caddr_ ) {
+	munmap( data_caddr_, size_off_ );
+    	data_caddr_ = 0;
+	size_off_ = 0;
+    }
+}
+
+void
+Mapped_file_storage::close()
+{
+    unmap();
+    if ( fildes_i_ ) {
+	::close( fildes_i_ );
+	fildes_i_ = 0;
+    }
+}
+
+int
+Mapped_file_storage::length_i()const
+{
+    return size_off_;
+}
+
+Mapped_file_storage::~Mapped_file_storage()
+{
+    close();
+}
diff -urN ../lilypond-0.1.3/lib/include/duration.hh ./lib/include/duration.hh
--- ../lilypond-0.1.3/lib/include/duration.hh	Wed May 14 23:56:34 1997
+++ ./lib/include/duration.hh	Sat Aug  9 15:41:35 1997
@@ -39,7 +39,7 @@
     /**
       Ctor of Duration. type_i should be a power of 2. 
        */
-    Duration( int type_i = 1, int dots_i = 0);
+    Duration();
     /// is the "plet factor" of this note != 1 ?
     bool plet_b();
     String str()const;
diff -urN ../lilypond-0.1.3/lib/include/file-storage.hh ./lib/include/file-storage.hh
--- ../lilypond-0.1.3/lib/include/file-storage.hh	Thu Jan  1 01:00:00 1970
+++ ./lib/include/file-storage.hh	Mon Aug 11 01:59:21 1997
@@ -0,0 +1,62 @@
+/*
+  file-storage.hh -- declare File_storage, Mapped_file_storage, Simple_file_storage
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef FILE_STORAGE_HH
+#define FILE_STORAGE_HH
+
+#include "proto.hh"
+
+/**
+  store a file in-memory.
+ */
+class File_storage
+{
+public:
+    virtual char const* ch_C()const=0;
+    virtual int length_i()const=0;
+    virtual ~File_storage(){}
+};
+
+/**
+  Use mmap to "copy"  a file into memory
+ */
+class Mapped_file_storage:public File_storage
+{
+public:
+    Mapped_file_storage(String);    
+protected:
+    virtual char const* ch_C()const;
+    virtual int length_i()const;
+    virtual ~Mapped_file_storage();
+private:
+    void open(String name);
+    void close();
+
+    void map();
+    void unmap();
+    int fildes_i_;
+    off_t size_off_;
+    caddr_t data_caddr_;
+};
+
+/**
+  read file char by char and copy into a malloc array.
+ */
+class Simple_file_storage  : public File_storage
+{
+    char * data_p_;
+    int len_i_;
+protected:    
+    virtual char const*ch_C()const;
+    virtual int length_i()const;
+    virtual ~Simple_file_storage();
+public:
+    Simple_file_storage(String);
+};
+#endif // FILE_STORAGE_HH
diff -urN ../lilypond-0.1.3/lib/include/proto.hh ./lib/include/proto.hh
--- ../lilypond-0.1.3/lib/include/proto.hh	Wed Jan  1 00:00:00 1997
+++ ./lib/include/proto.hh	Wed Jan  1 00:00:00 1997
@@ -14,4 +14,7 @@
 struct Duration_iterator;
 struct Source_file;
 struct Sources;
+struct File_storage;
+struct Mapped_file_storage;
+struct Simple_file_storage;
 #endif // PROTO_HH
diff -urN ../lilypond-0.1.3/lib/include/source-file.hh ./lib/include/source-file.hh
--- ../lilypond-0.1.3/lib/include/source-file.hh	Mon May 12 23:16:01 1997
+++ ./lib/include/source-file.hh	Mon Aug 11 01:59:21 1997
@@ -5,9 +5,13 @@
 
 #ifndef SOURCE_FILE_HH
 #define SOURCE_FILE_HH
-#include "fproto.hh"
+
+#include "proto.hh"
 #include "string.hh"
+
 class istream;
+
+
 /// class for reading and mapping a file. 
 class Source_file
 {
@@ -17,26 +21,19 @@
     Source_file( String filename_str_r );
     virtual ~Source_file();
 
-    char const* ch_C();
-    virtual String error_str( char const* pos_ch_c_l );
+    char const* ch_C()const;
+    virtual String error_str( char const* pos_ch_c_l )const;
     istream * istream_l();
-    bool in_b( char const* pos_ch_c_l );
-    off_t length_off();
-    virtual int line_i( char const* pos_ch_c_l );
-    String name_str();
-    String file_line_no_str( char const* ch_c_l );
+    bool in_b( char const* pos_ch_c_l )const;
+    int length_i()const;
+    virtual int line_i( char const* pos_ch_c_l )const;
+    String name_str()const;
+    String file_line_no_str( char const* ch_c_l )const;
 
 private:
-    void close();
-    void map();
-    void open();
-    void unmap();
-
-    istream* istream_p_;
-    int fildes_i_;
     String name_str_;
-    off_t size_off_;
-    caddr_t data_caddr_;
+    istream* istream_p_;
+    File_storage * storage_p_;
 };
 
 #endif // SOURCE_FILE_HH //
diff -urN ../lilypond-0.1.3/lib/include/source.hh ./lib/include/source.hh
--- ../lilypond-0.1.3/lib/include/source.hh	Mon May 26 12:04:24 1997
+++ ./lib/include/source.hh	Sun Aug 10 22:52:19 1997
@@ -14,6 +14,7 @@
     void set_path(File_path*p_C);
     Sources();
     void set_binary(bool);
+    ~Sources();
 private:
     const File_path * path_C_;
     void add( Source_file* sourcefile_p );
diff -urN ../lilypond-0.1.3/lib/simple-file-storage.cc ./lib/simple-file-storage.cc
--- ../lilypond-0.1.3/lib/simple-file-storage.cc	Thu Jan  1 01:00:00 1970
+++ ./lib/simple-file-storage.cc	Mon Aug 11 02:08:50 1997
@@ -0,0 +1,58 @@
+/*
+  simple-file-storage.cc -- implement Simple_file_storage
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#include <stdio.h>
+
+#include "file-storage.hh"
+#include "varray.hh"
+#include "string.hh"
+#include "warn.hh"
+
+/**
+  Stupid but foolproof way of opening files.
+
+  TODO 
+  Should use obstack. Should use fread() ? 
+*/
+Simple_file_storage::Simple_file_storage(String s)
+{
+    data_p_ =0;
+    len_i_ =0;
+    Array<char> data; 
+
+    FILE * f = fopen ( s.ch_C(), "r");
+    if ( !f ) {
+	warning("can't open file\n");
+	return ;
+    }
+    int c ;
+    while ((c = fgetc(f)) != EOF) {
+	data.push (char(c));
+    }
+    fclose(f);
+    data_p_ = data.copy_array();
+    len_i_ = data.size();
+}
+
+char const*
+Simple_file_storage::ch_C() const
+{
+    return data_p_;
+}
+
+int
+Simple_file_storage::length_i()const
+{
+    return len_i_;
+}
+    
+
+Simple_file_storage::~Simple_file_storage()
+{
+    delete []data_p_;
+}
diff -urN ../lilypond-0.1.3/lib/source-file.cc ./lib/source-file.cc
--- ../lilypond-0.1.3/lib/source-file.cc	Wed Apr 16 01:56:35 1997
+++ ./lib/source-file.cc	Mon Aug 11 01:51:21 1997
@@ -1,50 +1,40 @@
-//
-// source-file.cc
-//
-
-#include <sys/types.h>		// open, mmap
-#include <sys/stat.h>		// open
-#include <sys/mman.h>		// mmap
-#include <limits.h>		// INT_MAX
-#include <fcntl.h>		// open 
-#include <unistd.h>		// close, stat
-#include <stdio.h>		// fdopen
-#include <string.h>		// strerror
-#include <errno.h>		// errno
+/*
+  source-file.cc -- implement 
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1997 Jan Nieuwenhuizen <jan@digicash.com> 
+  & Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
 #include <assert.h>
 #include <strstream.h>
 
 #include "string.hh"
 #include "proto.hh"
 #include "plist.hh"
-
-
 #include "warn.hh"
 #include "windhoos-suck-suck-suck-thank-you-cygnus.hh"
-
 #include "source-file.hh"
+#include "file-storage.hh"
 
 Source_file::Source_file( String filename_str )
 {
-    data_caddr_ = 0;
-    fildes_i_ = 0;
-    size_off_ = 0;
     name_str_ = filename_str;
     istream_p_ = 0;
-
-    open();
-    if ( fildes_i_ > 0 )
-	map();
+    storage_p_ = new Simple_file_storage(filename_str);
 }
 
 istream*
 Source_file::istream_l()
 {
-    if ( !fildes_i_ )
+    if ( !name_str_.length_i())
     	return &cin;
+    
     if ( !istream_p_ ) {
-	if ( size_off_ ) // can-t this be done without such a hack?
-	    istream_p_ = new istrstream( ch_C(), size_off_ );
+	if ( length_i() ) // can-t this be done without such a hack?
+	    istream_p_ = new istrstream( ch_C(), length_i() );
         else {
 	    istream_p_ = new istrstream( "", 0 );
 	    istream_p_->set(ios::eofbit);
@@ -53,35 +43,29 @@
     return istream_p_;
 }
 
-Source_file::~Source_file()
+String
+Source_file::file_line_no_str(char const *ch_C )const
 {
-    delete istream_p_;
-    istream_p_ = 0;
-    unmap();
-    close();
+    return name_str() + ": "
+	+ String( line_i( ch_C ) );
 }
 
-char const*
-Source_file::ch_C()
+String
+Source_file::name_str()const
 {
-    assert( this );
-    return (char const*)data_caddr_;
+    return name_str_;
 }
-
-void
-Source_file::close()
+Source_file::~Source_file()
 {
-    if ( fildes_i_ ) {
-	::close( fildes_i_ );
-	fildes_i_ = 0;
-    }
+    delete istream_p_;
+    istream_p_ = 0;
+    delete storage_p_;
 }
-
 String
-Source_file::error_str( char const* pos_ch_C )
+Source_file::error_str( char const* pos_ch_C )const
 {
     char const* data_ch_C = ch_C();
-    char const * eof_C_ = data_ch_C + size_off_;
+    char const * eof_C_ = data_ch_C + length_i();
     if ( !in_b( pos_ch_C ) )
 	return "(position unknown)";
 
@@ -121,19 +105,14 @@
 }
 
 bool
-Source_file::in_b( char const* pos_ch_C )
+Source_file::in_b( char const* pos_ch_C )const
 {
-    return ( pos_ch_C && ( pos_ch_C >= ch_C() ) && ( pos_ch_C <= ch_C() + size_off_ ) );
+    return ( pos_ch_C && ( pos_ch_C >= ch_C() ) && ( pos_ch_C <= ch_C() + length_i() ) );
 }
 
-off_t
-Source_file::length_off()
-{
-    return size_off_;
-}
 
 int
-Source_file::line_i( char const* pos_ch_C )
+Source_file::line_i( char const* pos_ch_C )const
 {
     if ( !in_b( pos_ch_C ) )
     	return 0;
@@ -146,56 +125,14 @@
     return i;
 }
 
-void
-Source_file::map()
-{
-    if ( fildes_i_ == -1 )
-	return;
-
-    data_caddr_ = (caddr_t)mmap( (void*)0, size_off_, PROT_READ, MAP_SHARED, fildes_i_, 0 );
-
-    if ( (int)data_caddr_ == -1 )
-	warning( String( "can't map: " ) + name_str_ + String( ": " ) + strerror( errno ));
-}
-
-String
-Source_file::name_str()
-{
-    return name_str_;
-}
-
-void
-Source_file::open()
+int
+Source_file::length_i()const
 {
-    if ( !name_str_.length_i() || ( name_str_ == "-" ) ) {
-    	fildes_i_ = 0;
-	return;
-    }
-
-    fildes_i_ = ::open( name_str_, O_RDONLY );	
-	    
-    if ( fildes_i_ == -1 ) {
-	warning( String( "can't open: " ) + name_str_ + String( ": " ) + strerror( errno )); 
-        return;
-    }
-
-    struct stat file_stat;
-    fstat( fildes_i_, &file_stat );
-    size_off_ = file_stat.st_size;
+    return storage_p_->length_i();
 }
 
-void
-Source_file::unmap()
-{
-    if ( data_caddr_ ) {
-	munmap( data_caddr_, size_off_ );
-    	data_caddr_ = 0;
-	size_off_ = 0;
-    }
-}
-String
-Source_file::file_line_no_str(char const *ch_C )
+char const *
+Source_file::ch_C()const
 {
-    return name_str() + ": "
-	+ String( line_i( ch_C ) );
+    return storage_p_->ch_C();
 }
diff -urN ../lilypond-0.1.3/lib/source.cc ./lib/source.cc
--- ../lilypond-0.1.3/lib/source.cc	Mon May 26 12:05:59 1997
+++ ./lib/source.cc	Sun Aug 10 22:52:33 1997
@@ -72,3 +72,6 @@
 	    return *sourcefile_l_pcur;
     return 0;
 }
+
+Sources::~Sources()
+{}
diff -urN ../lilypond-0.1.3/lily/Makefile ./lily/Makefile
--- ../lilypond-0.1.3/lily/Makefile	Fri Aug  8 14:16:01 1997
+++ ./lily/Makefile	Mon Aug 11 00:52:12 1997
@@ -37,7 +37,7 @@
 
 # list of custom libraries:
 #
-MODULE_LIBDEPS= check-flower-deps check-lib-deps
+MODULE_LIBDEPS= check-flower-deps #check-lib-deps # done with main.o
 MODULE_LIBES= -llily -lflower
 
 #
@@ -73,4 +73,3 @@
 
 # make config.hh. Ugh
 $(outdir)/main.o: check-lib-deps
-	$(MAKE) -C $(depth)/lib configheader
diff -urN ../lilypond-0.1.3/lily/Stable.make ./lily/Stable.make
--- ../lilypond-0.1.3/lily/Stable.make	Fri Aug  8 02:27:19 1997
+++ ./lily/Stable.make	Sun Aug 10 21:48:24 1997
@@ -1,7 +1,7 @@
 # kept in dist bo stripping stable stuff, still to copy...
 
 # a bit of a hack to keep exec size under control.
-stablecc=atom.cc command-request.cc musical-request.cc bar.cc boxes.cc \
+stablecc=atom.cc  bar.cc boxes.cc \
 	keyword.cc leastsquares.cc \
 	lookup.cc meter.cc\
 	parser.cc notename-table.cc lexer.cc\
diff -urN ../lilypond-0.1.3/lily/VERSION ./lily/VERSION
--- ../lilypond-0.1.3/lily/VERSION	Thu Aug  7 21:42:51 1997
+++ ./lily/VERSION	Mon Aug 11 10:04:50 1997
@@ -1,6 +1,6 @@
 MAJOR_VERSION = 0
 MINOR_VERSION = 1
-PATCH_LEVEL = 3
+PATCH_LEVEL = 4
 # use to send patches, always empty for released version:
 # include separator: ".postfix", "-pl" makes rpm barf
 
diff -urN ../lilypond-0.1.3/lily/command-request.cc ./lily/command-request.cc
--- ../lilypond-0.1.3/lily/command-request.cc	Fri Aug  8 13:58:19 1997
+++ ./lily/command-request.cc	Sat Aug  9 17:52:00 1997
@@ -151,6 +151,20 @@
     one_beat_i_=o;
 }
 
+
+Tempo_req::Tempo_req()
+{
+    metronome_i_ = 60;
+    dur_. type_i_ = 4;
+}
+
+void
+Tempo_req::do_print()const
+{
+    mtor << dur_.str() << " = " <<metronome_i_ ;
+}
+IMPLEMENT_IS_TYPE_B1(Tempo_req, Timing_req);
+
 /* *************** */
 
 
diff -urN ../lilypond-0.1.3/lily/engraver-group.cc ./lily/engraver-group.cc
--- ../lilypond-0.1.3/lily/engraver-group.cc	Sat Aug  2 16:30:45 1997
+++ ./lily/engraver-group.cc	Sat Aug  9 16:09:29 1997
@@ -309,3 +309,15 @@
 {
     return !itrans_l_->get_default_itrans_l();
 }
+
+Engraver*
+Engraver_group_engraver::get_simple_engraver(char const *type)const
+{
+    for (int i=0; i < nongroup_l_arr_.size(); i++) {
+	if (nongroup_l_arr_[i]->name() == type )
+	    return nongroup_l_arr_[i];
+    }
+    if ( daddy_grav_l_ )
+	return daddy_grav_l_->get_simple_engraver(type);
+    return 0;
+}
diff -urN ../lilypond-0.1.3/lily/general-script-def.cc ./lily/general-script-def.cc
--- ../lilypond-0.1.3/lily/general-script-def.cc	Mon Jul 28 23:56:54 1997
+++ ./lily/general-script-def.cc	Mon Aug 11 02:31:52 1997
@@ -38,11 +38,11 @@
     if (name() != g.name())
 	return false;
 
-    return do_equal_b(g);
+    return do_equal_b(&g);
 }
 
 bool
-General_script_def::do_equal_b(General_script_def const&)const
+General_script_def::do_equal_b(General_script_def const*)const
 {
     return true;
 }
diff -urN ../lilypond-0.1.3/lily/include/command-request.hh ./lily/include/command-request.hh
--- ../lilypond-0.1.3/lily/include/command-request.hh	Fri Aug  8 13:57:53 1997
+++ ./lily/include/command-request.hh	Sat Aug  9 15:54:01 1997
@@ -12,6 +12,7 @@
 
 #include "request.hh"
 #include "varray.hh"
+#include "duration.hh"
 
 /** Request which are  assumed to be "happening" before the
   musical requests. */
@@ -50,9 +51,20 @@
   Staff_{walker,column} baseclass.  */
 class Timing_req  : public Command_req  {
 public:
-    REQUESTMETHODS(Timing_req, timing);
+        REQUESTMETHODS(Timing_req, timing);
+    virtual Tempo_req * tempo(){return 0; }
+    Tempo_req();
 };
 
+
+class Tempo_req : public Timing_req
+{
+public:
+    Duration dur_;
+    int metronome_i_;
+
+    REQUESTMETHODS(Tempo_req, tempo);
+};
 
 class Partial_measure_req  : public Timing_req  {
 public:
diff -urN ../lilypond-0.1.3/lily/include/engraver-group.hh ./lily/include/engraver-group.hh
--- ../lilypond-0.1.3/lily/include/engraver-group.hh	Wed Jul 30 23:27:32 1997
+++ ./lily/include/engraver-group.hh	Sat Aug  9 16:08:32 1997
@@ -32,10 +32,9 @@
     Array<Score_elem_info> announce_info_arr_;
     
     virtual void do_print()const;
-
     virtual bool removable_b()const;
-
 public:
+    Engraver*get_simple_engraver(char const*typeinfo)const;
     virtual void print() const { Engraver::print(); }
 
     Input_translator * itrans_l_;
@@ -53,7 +52,8 @@
      */
     virtual void terminate_engraver(Engraver * grav_l);
     
-   DECLARE_MY_RUNTIME_TYPEINFO;
+    
+    DECLARE_MY_RUNTIME_TYPEINFO;
     
     /**
       Remove #grav_l# from the list, and return it.
diff -urN ../lilypond-0.1.3/lily/include/general-script-def.hh ./lily/include/general-script-def.hh
--- ../lilypond-0.1.3/lily/include/general-script-def.hh	Wed Jul 30 23:27:32 1997
+++ ./lily/include/general-script-def.hh	Mon Aug 11 02:25:47 1997
@@ -30,7 +30,7 @@
     virtual ~General_script_def() {}
     
 protected:
-    virtual bool do_equal_b(General_script_def const &)const;
+    virtual bool do_equal_b(General_script_def const *)const;
     virtual void do_print()const;
 };
 
diff -urN ../lilypond-0.1.3/lily/include/lily-proto.hh ./lily/include/lily-proto.hh
--- ../lilypond-0.1.3/lily/include/lily-proto.hh	Wed Jan  1 00:00:00 1997
+++ ./lily/include/lily-proto.hh	Wed Jan  1 00:00:00 1997
@@ -195,6 +195,7 @@
 struct Symtables;
 struct Super_elem;
 struct Terminate_voice_req;
+struct Tempo_req;
 struct Tex_stream;
 struct Text_def;
 struct Text_gob;
diff -urN ../lilypond-0.1.3/lily/include/main.hh ./lily/include/main.hh
--- ../lilypond-0.1.3/lily/include/main.hh	Wed Jun  4 22:58:32 1997
+++ ./lily/include/main.hh	Sun Aug 10 18:03:08 1997
@@ -12,6 +12,7 @@
 String get_version_str();
 extern Sources* source_l_g;
 extern bool only_midi;
+extern int exit_status_i_;
 
 extern String default_out_fn;
 
diff -urN ../lilypond-0.1.3/lily/include/midi-walker.hh ./lily/include/midi-walker.hh
--- ../lilypond-0.1.3/lily/include/midi-walker.hh	Fri Aug  8 13:52:54 1997
+++ ./lily/include/midi-walker.hh	Sat Aug  9 14:53:40 1997
@@ -18,6 +18,7 @@
 struct Midi_note_event : PQueue_ent<Moment, Midi_note_off*>
 {
     bool ignore_b_;
+    Midi_note_event();
 };
 
 int compare(Midi_note_event const& left, Midi_note_event const& right );
diff -urN ../lilypond-0.1.3/lily/include/script-def.hh ./lily/include/script-def.hh
--- ../lilypond-0.1.3/lily/include/script-def.hh	Wed Jul 30 23:27:33 1997
+++ ./lily/include/script-def.hh	Mon Aug 11 02:23:50 1997
@@ -37,7 +37,7 @@
     virtual Atom get_atom(Paper_def* p, int dir_i_)const;
     DECLARE_MY_RUNTIME_TYPEINFO;
 
-    virtual bool do_equal_b(General_script_def const &)const;
+    virtual bool do_equal_b(General_script_def const *)const;
     virtual void do_print() const;
     Script_def();
     void set_from_input(String, bool, int, int ,bool,int );
diff -urN ../lilypond-0.1.3/lily/include/text-def.hh ./lily/include/text-def.hh
--- ../lilypond-0.1.3/lily/include/text-def.hh	Wed Aug  6 10:41:09 1997
+++ ./lily/include/text-def.hh	Mon Aug 11 02:23:50 1997
@@ -30,7 +30,7 @@
     
     virtual void do_print() const;
     virtual ~Text_def() {};
-    bool do_equal_b(const Text_def&)const;
+    virtual bool do_equal_b(const General_script_def*)const;
     Text_def();
     virtual void print() const;
     Interval width(Paper_def*) const;
diff -urN ../lilypond-0.1.3/lily/include/timing-grav.hh ./lily/include/timing-grav.hh
--- ../lilypond-0.1.3/lily/include/timing-grav.hh	Thu Jan  1 01:00:00 1970
+++ ./lily/include/timing-grav.hh	Sat Aug  9 16:16:21 1997
@@ -0,0 +1,38 @@
+/*
+  timing-grav.hh -- declare Timing_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef TIMING_GRAV_HH
+#define TIMING_GRAV_HH
+
+#include "engraver.hh"
+#include "time-description.hh"
+#include "grouping.hh"
+#include "parray.hh"
+
+/**
+  Do time bookkeeping
+ */
+class Timing_engraver : public Engraver
+{   
+    Time_description time_;
+    Rhythmic_grouping  default_grouping_;
+    
+    Link_array<Timing_req> timing_req_l_arr_;
+ 
+    virtual void fill_staff_info(Staff_info&);
+    virtual bool do_try_request(Request *req_l);
+    virtual void do_process_requests();
+    virtual void do_pre_move_processing();
+    virtual void do_creation_processing();
+    virtual void do_post_move_processing();
+    Timing_engraver();
+    DECLARE_MY_RUNTIME_TYPEINFO;
+}
+
+#endif // TIMING_GRAV_HH
diff -urN ../lilypond-0.1.3/lily/lexer.l ./lily/lexer.l
--- ../lilypond-0.1.3/lily/lexer.l	Wed Aug  6 22:50:06 1997
+++ ./lily/lexer.l	Sun Aug 10 21:31:04 1997
@@ -335,6 +335,14 @@
 		yylval.id = id;
 		return id->token_code_i_;
 	}
+	if ( YYSTATE != notes ) {
+		Melodic_req * mel_l = lookup_melodic_req_l(str);
+		if (mel_l) {
+		    mtor << "(notename)\n";
+		    yylval.melreq = mel_l;
+		    return NOTENAME_ID;
+		}
+	}
 	LexerError( "Unknown escaped string: `" + str + "'");	
 	mtor << "(string)";
 	String *sp = new String( str);
diff -urN ../lilypond-0.1.3/lily/main.cc ./lily/main.cc
--- ../lilypond-0.1.3/lily/main.cc	Tue Aug  5 17:44:55 1997
+++ ./lily/main.cc	Mon Aug 11 00:46:58 1997
@@ -23,6 +23,7 @@
 Sources* source_l_g = 0;
 bool only_midi = false;
 bool version_ignore_b_ = false;
+int exit_status_i_;
 
 void destill_inname( String &name_str_r);
 
@@ -146,20 +147,20 @@
     cout << get_version_str() << endl;
     String init_str("symbol.ly");
     
-    while (Long_option_init * opt = oparser()) {
+    while (Long_option_init const * opt = oparser()) {
 	switch ( opt->shortname){
 	case 'o':
-	    set_default_output(oparser.optarg);
+	    set_default_output(oparser.optional_argument_ch_C_);
 	    break;
 	case 'w':
 	    notice();
 	    exit(0);
 	    break;
 	case 'I':
-	    path.push(oparser.optarg);
+	    path.push(oparser.optional_argument_ch_C_);
 	    break;
 	case 'i':
-	    init_str = oparser.optarg;
+	    init_str = oparser.optional_argument_ch_C_;
 	    break;
 	case 'h':
 	    usage();
@@ -181,7 +182,7 @@
     }
 
     int p=0;
-    char *arg ;
+    const char *arg ;
     while ( (arg= oparser.get_next_arg()) ) {
 	String f(arg);
 	destill_inname(f);
@@ -192,7 +193,7 @@
 	do_one_file(init_str, "");	
     }
 
-    return 0;
+    return exit_status_i_;
 }
 
 /// make input file name: add default extension. "" is stdin.
diff -urN ../lilypond-0.1.3/lily/musical-request.cc ./lily/musical-request.cc
--- ../lilypond-0.1.3/lily/musical-request.cc	Mon Jul 28 23:56:53 1997
+++ ./lily/musical-request.cc	Sun Aug 10 22:07:49 1997
@@ -261,11 +261,15 @@
     scriptdef_p_ = s.scriptdef_p_ ? s.scriptdef_p_->clone() : 0;
 }
 
+/*
+  don't check dirs?
+  
+  (d1.dir_i_ == d2.dir_i_ )
+ */
 int
 Script_req::compare(Script_req const &d1, Script_req const &d2)
 {
-    return !(d1.dir_i_ == d2.dir_i_ &&
-	d1.scriptdef_p_->equal_b(*d2.scriptdef_p_));
+    return ! d1.scriptdef_p_->equal_b(*d2.scriptdef_p_);
 }
 
 Script_req::Script_req()
diff -urN ../lilypond-0.1.3/lily/parser.y ./lily/parser.y
--- ../lilypond-0.1.3/lily/parser.y	Sat Aug  2 21:30:08 1997
+++ ./lily/parser.y	Sun Aug 10 18:15:10 1997
@@ -12,7 +12,7 @@
 #include <iostream.h>
 
 // mmm
-#define MUDELA_VERSION "0.1.0"
+#define MUDELA_VERSION "0.1.1"
 
 #include "script-def.hh"
 #include "symtable.hh"
@@ -77,6 +77,7 @@
     Symtable * symtable;
     Symtables * symtables;
     Text_def * textdef;
+    Tempo_req *tempo;
     char c;
     const char *consstr;
     int i;
@@ -168,7 +169,7 @@
 %token <id>	VOICE_IDENTIFIER
 %token <id>	POST_REQUEST_IDENTIFIER
 %token <id>	SCRIPT_IDENTIFIER
-%token <id>	STAFF_IDENTIFIER
+%token <id>	COMMAND_IDENTIFIER
 %token <id>	REAL_IDENTIFIER
 %token <id>	INPUT_TRANS_IDENTIFIER
 %token <id>	INT_IDENTIFIER
@@ -217,6 +218,7 @@
 %type <symbol>	symboldef
 %type <symtable>	symtable symtable_body
 %type <itrans>	input_translator_spec input_translator_spec_body
+%type <tempo> 	tempo_request
 
 %left PRIORITY
 
@@ -338,6 +340,9 @@
 		$$ = new Input_translator_id ( *$1, $3, INPUT_TRANS_IDENTIFIER);
 		delete $1;
 	}
+	| declarable_identifier '=' command_req {
+		$$ = new Request_id ( *$1, $3, COMMAND_IDENTIFIER);
+	}
 	;
 
 
@@ -461,15 +466,16 @@
 	'{' midi_body '}' 	{ $$ = $3; }
 	;
 
-midi_body: /* empty */		 	{
-		$$ = THIS->default_midi(); // midi / audio / perform
+midi_body: /* empty */ 		{
+		$$ = THIS->default_midi();
 	}
 	| midi_body OUTPUT STRING ';'	{ 
 		$$->outfile_str_ = *$3; 
 		delete $3; 
 	}
-	| midi_body TEMPO notemode_duration ':' int ';' {
-		$$->set_tempo( $3->length(), $5 );
+	| midi_body tempo_request ';' {
+		$$->set_tempo( $2->dur_.length(), $2->metronome_i_ );
+		delete $2;
 	}
 	| midi_body input_translator_spec	{
 		$$->set( $2 );
@@ -479,6 +485,15 @@
 	}
 	;
 
+tempo_request:
+	TEMPO notemode_duration '=' int 	{
+		$$ = new Tempo_req;
+		$$->dur_ = *$2;
+		delete $2;
+		$$-> metronome_i_ = $4;
+	}
+	;
+
 /*
 	MUSIC
 */
@@ -577,7 +592,7 @@
 		$$-> set_spot( THIS->here_input());
 	}
 /* cont: */
-	command_req {
+command_req {
 		$2-> set_spot( THIS->here_input());
 		((Chord*)$$) ->add($2);//ugh
 
@@ -600,6 +615,9 @@
 	 '|'				{ 
 		$$ = new Barcheck_req;
 	}
+	| COMMAND_IDENTIFIER	{
+		$$ = $1->request(true);
+	}
 	;
 
 verbose_command_req:
@@ -620,13 +638,15 @@
 	}
 	| SKIP duration_length {
 		Skip_req * skip_p = new Skip_req;
-		skip_p->duration_ = Duration(1,0);
 		skip_p->duration_.set_plet($2->numerator().as_long(), 
 			$2->denominator().as_long());
 		
 		delete $2;
 		$$ = skip_p;
 	}
+	| tempo_request {
+		$$ = $1;
+	}
 	| CADENZA int	{
 		$$ = new Cadenza_req($2);
 	}
@@ -653,7 +673,6 @@
 	| GROUPING intastint_list {
 		$$ = get_grouping_req(*$2); delete $2;
 	}
-	
 	;
 
 post_requests:
diff -urN ../lilypond-0.1.3/lily/scores.cc ./lily/scores.cc
--- ../lilypond-0.1.3/lily/scores.cc	Wed Aug  6 21:24:43 1997
+++ ./lily/scores.cc	Sun Aug 10 18:03:54 1997
@@ -28,6 +28,7 @@
 	
 	if (is_p->errorlevel_i_) {
 	    is_p->warning("Score contains errors. Will not process it. ");
+	    exit_status_i_ |= 1;
 	} else { 
 	    is_p->print ();
 	    is_p->process();
diff -urN ../lilypond-0.1.3/lily/script-def.cc ./lily/script-def.cc
--- ../lilypond-0.1.3/lily/script-def.cc	Mon Jul 28 23:56:53 1997
+++ ./lily/script-def.cc	Mon Aug 11 02:23:49 1997
@@ -44,13 +44,13 @@
 }
 
 bool
-Script_def::do_equal_b(General_script_def const &g)const 
+Script_def::do_equal_b(General_script_def const *g)const 
 {
-    Script_def const & c = (Script_def const&) g;
-    return (symidx_str_ == c.symidx_str_ &&
-	     rel_stem_dir_i_ == c.rel_stem_dir_i_&&
-	     staff_dir_i_ == c.staff_dir_i_&&
-	     invertsym_b_ == c.invertsym_b_);
+    Script_def const * c = (Script_def const*) g;
+    return (symidx_str_ == c->symidx_str_ &&
+	     rel_stem_dir_i_ == c->rel_stem_dir_i_&&
+	     staff_dir_i_ == c->staff_dir_i_&&
+	     invertsym_b_ == c->invertsym_b_);
 }
 
 int
diff -urN ../lilypond-0.1.3/lily/script-grav.cc ./lily/script-grav.cc
--- ../lilypond-0.1.3/lily/script-grav.cc	Tue Aug  5 18:37:01 1997
+++ ./lily/script-grav.cc	Sun Aug 10 21:48:24 1997
@@ -21,11 +21,11 @@
     if (!r_l->musical() || ! r_l->musical()->musicalscript())
 	return false ;
     
-    for (int i=0; i < script_req_l_arr_.size(); i++)
+    for (int i=0; i < script_req_l_arr_.size(); i++) {
 	if ( !Script_req::compare(*script_req_l_arr_[i], *r_l->script())) {
 	    return true;
 	}
-	
+    }
     script_req_l_arr_.push( r_l->script());
     
     return true;
diff -urN ../lilypond-0.1.3/lily/text-def.cc ./lily/text-def.cc
--- ../lilypond-0.1.3/lily/text-def.cc	Wed Aug  6 18:50:55 1997
+++ ./lily/text-def.cc	Mon Aug 11 02:32:17 1997
@@ -39,10 +39,11 @@
 }
 
 bool
-Text_def::do_equal_b(Text_def const &def)const
+Text_def::do_equal_b(General_script_def const *gdef) const
 {
-    return align_i_ == def.align_i_ && text_str_ == def.text_str_
-	&& style_str_ == def.style_str_;
+    Text_def const *def= (Text_def*)gdef;
+    return align_i_ == def->align_i_ && text_str_ == def->text_str_
+	&& style_str_ == def->style_str_;
 }
 
 Atom
diff -urN ../lilypond-0.1.3/lily/timing-grav.cc ./lily/timing-grav.cc
--- ../lilypond-0.1.3/lily/timing-grav.cc	Thu Jan  1 01:00:00 1970
+++ ./lily/timing-grav.cc	Sat Aug  9 16:54:25 1997
@@ -0,0 +1,27 @@
+/*
+  timing-grav.cc -- implement Timing_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+#if 0
+
+#include "timing-grav.hh"
+#include "command-request.hh"
+
+
+Timing_engraver::Timing_engraver()
+{
+    default_grouping_ = Rhythmic_grouping(MInterval(0,4),4); // ugh
+}
+
+void
+Timing_engraver::fill_staff_info(Staff_info &inf)
+{
+    inf.time_C_ = &time_;
+    inf.rhythmic_C_ = &default_grouping_;
+}
+
+
+#endif
