]> git.donarmstrong.com Git - lilypond.git/commitdiff
release: 1.3.77 release/1.3.77
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 8 Aug 2000 14:14:36 +0000 (16:14 +0200)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 8 Aug 2000 14:14:36 +0000 (16:14 +0200)
======

* Midi2ly bugfix: handle durations longer than longa.  These can occur
  because of lengthened notes when using --no-rests.

* Midi2ly: output `new' \key syntax, and updated version number.

* Midi2ly bugfix: don't correct quantised durations, don't use tuplets,
  double dots etc. when user doesn't want them.  It probably used to
  work like this, a long time ago.  For some unknown reason, all
  corrections made by Duration_convert were junked if the corrected
  duration != exact duration.  Duh.

* Midi2ly: added a new option: --no-rests.

* Update of mudela-book (Tom Cato Amundsen)
 - --read-lys option, now you can do:
  mudela-book file.texi
convert-mudela
mudela-book --read-lys
 - --outdir=DIR will put ALL output into DIR
 - @mudela[filename="myfilename"]{c d e f g}
 - --force-mudela-fontsize
 - ignore mudela inside @ignore @end ignore

1.3.76.

16 files changed:
CHANGES
Documentation/regression-test.tely
Documentation/user/refman.itely
VERSION
aclocal.m4
input/scarlatti-edited.ly [deleted file]
input/scarlatti-test.ly [new file with mode: 0644]
input/test/lyric-phrasing.ly.orig [deleted file]
lily/all-font-metrics.cc
lily/lyric-phrasing-engraver.cc
lily/moment.cc
lily/scm-hash.cc
lily/score-element.cc
make/out/lilypond.lsm
make/out/lilypond.spec
scripts/mudela-book.py

diff --git a/CHANGES b/CHANGES
index 4fcc87ed5bebea58fccd1dadf0bb3066b65ead6e..75f8ff55c06d1a46ccca05f3b23788268c582b59 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,22 +1,11 @@
---- ../lilypond-1.3.76.jcn1/CHANGES    Tue Aug  8 13:56:35 2000
-++ b/CHANGES   Tue Aug  8 14:46:46 2000
-@@ -1,3 +1,11 @@
-1.3.76.jcn2
-===========
+1.3.77
+======
 
 * Midi2ly bugfix: handle durations longer than longa.  These can occur
   because of lengthened notes when using --no-rests.
 
 * Midi2ly: output `new' \key syntax, and updated version number.
 
- 1.3.76.jcn1
- ===========
- --- ../lilypond-1.3.76/CHANGES        Thu Aug  3 20:29:02 2000
-++ b/CHANGES   Tue Aug  8 13:56:35 2000
-@@ -1,3 +1,14 @@
-1.3.76.jcn1
-===========
-
 * Midi2ly bugfix: don't correct quantised durations, don't use tuplets, 
   double dots etc. when user doesn't want them.  It probably used to
   work like this, a long time ago.  For some unknown reason, all
 
 * Midi2ly: added a new option: --no-rests.
 
- 1.3.76
- ======
- --- ../lilypond-1.3.76/CHANGES        Fri Aug  4 02:29:02 2000
-++ b/CHANGES   Mon Aug  7 00:19:35 2000
-@@ -1,3 +1,12 @@
+* Update of mudela-book (Tom Cato Amundsen)
+ - --read-lys option, now you can do:
+       mudela-book file.texi
+       convert-mudela
+       mudela-book --read-lys
+ - --outdir=DIR will put ALL output into DIR
+ - @mudela[filename="myfilename"]{c d e f g}
+ - --force-mudela-fontsize
+ - ignore mudela inside @ignore @end ignore
+
 1.3.76.gp1
 ==========
+
 * Lyric_phrasing_engraver now catches lyric extenders and correctly
   terminates them under the last note of a melisma.
 
@@ -39,9 +34,7 @@
 
 * Other minor tidying up of Lyric_phrasing_engraver and related code.
 
- 1.3.76
- ======
- 1.3.76
+1.3.76
 ======
 
 * Lyric_phrasing_engraver now adjusts for melisma.  (Glenn Prideaux).
index e07ea7dfb995e82ccc80740068038fe9c03ba218..92e800117b4fdb3a9a8d820d5b98fb129ffade99 100644 (file)
@@ -353,6 +353,10 @@ Fonts are  available in a default set of sizes: 11, 13, 16, 20, 23 and
 26pt staffheight.  Sizes of the text fonts and symbol fonts are made
 to match the staff dimensions.    
 
+FIXME
+
+@ignore
+@c nofly broken 
 @mudelafile[nofly]{size11.ly}
 
 @mudelafile[nofly]{size13.ly}
@@ -364,7 +368,7 @@ to match the staff dimensions.
 @mudelafile[nofly]{size23.ly}
 
 @mudelafile[nofly]{size26.ly}
-
+@end ignore
 
 @section Clefs and Time Signatures
 
index 2ca219cde254eb44b68dabdfa7cb1fffea63d7c8..3d98430b1a00c691f9a24707552e3223ca82ed36 100644 (file)
@@ -2487,6 +2487,13 @@ Nevertheless, here are some variables you may want to use or change:
   @item @code{interscoreline}@indexcode{interscoreline}  
     Sets the spacing between the score lines. Defaults to 16 pt.
 
+  @item @code{textheight}@indexcode{textheight}  
+    Sets the total height of the music on each page. Only used by
+    ly2dvi.
+
+  @item @code{interscoreline}@indexcode{interscoreline}  
+    Sets the spacing between the score lines. Defaults to 16 pt.
+
   @item @code{output}@indexcode{output}  
     Specifies an alternate name for the the output @file{s}.
     A @file{.tex}, @file{.midi} or @file{.ps} extension will be 
diff --git a/VERSION b/VERSION
index 04429a4b9efdfdc68e8377a10f56e243c9c47c9e..ea79fa155e6b7ee2dd1910e7db29e59704dd6393 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,8 +1,8 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=3
-PATCH_LEVEL=76
-MY_PATCH_LEVEL=jcn2
+PATCH_LEVEL=77
+MY_PATCH_LEVEL=
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
index 6bca70dc7739e4e541628c7ac47692d1c631b888..122038c7f77b83270523f7a46a12682904d3df5c 100644 (file)
@@ -1,3 +1,5 @@
+dnl WARNING WARNING WARNING WARNING
+dnl do not edit! this is aclocal.m4, generated from stepmake/aclocal.m4
 dnl aclocal.m4   -*-shell-script-*-
 dnl StepMake subroutines for configure.in
 
diff --git a/input/scarlatti-edited.ly b/input/scarlatti-edited.ly
deleted file mode 100644 (file)
index 1fe6454..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-% test.ly LilyPond 1.3.70 -- 6 July 2000
-
-\header {
-       title = "Scarlatti test";
-       composer = "D. Scarlatti and J. D. S. Sankey";
-}
-
-\include "scarlatti-properties.ly"
-\include "scarlatti-paper.ly"
-
-forceStaffDown = \translator "Staff" = "down"
-forceStaffUp = \translator "Staff" = "up"
-
-
-\score{
-       \notes \context PianoStaff <
-       \context Staff=up <
-       \key d \major ;
-       \time 3/8;
-       \clef treble;
-       \autochange Staff
-       \context Voice=va< \zs
-       \su
-       \context Thread=ta{ \n
-               \rh \sm [ \times 2/3{a'32 d'' fis''}\n a''16] a'8 g'|
-               %a2
-               \times 2/3{\lh d'16 \rh fis' g' a' b' cis'' d'' fis'' g''}|
-               %a3
-               a''8 a' g'|
-               %a4
-               a'8 s \lh d''|
-               %a5
-               s8 \rh fis'' s|
-               %a6
-               a''32 s fis'' s d'' s a' s d' s a s|
-               %a7
-               \forceStaffUp r16 a' fis'8. d'16~
-               %a8
-               d'16 g' e'8. cis'16|
-               %a9
-               r16 a' fis'8. d'16~
-               %a10
-               d'16 g' e'8. cis'16|
-               %a11
-               r16 fis' d'8. g'16~
-               %a12
-               g'16 fis'8 e' b'16~
-               %a13
-               b'16 a' fis'8. d''16~
-               %a14
-               d''16 cis'' a'8. fis''16~
-               %a15
-               \sd fis''16 e''8 cis'' a'16~
-               %a16
-               \su a'8 d'' b''16 s|
-               %a17
-               \lh \sd r16 e''8 cis'' a'16~
-               %a18
-               \su a'8 d'' b''16 s|
-               %a19
-               s8 a''^"M" s4
-               %a20
-               a''8 s4
-               %a21
-               fis''8 s4
-               %a22
-               b''8^"M" a''|
-               %a23
-               gis''8 \rh[b' c'']|
-               %a24
-               gis'8 f''32 d'' ais' b' e'' c'' gis' a'|
-               %a25
-               d''32 b' fis' gis' c'' a' dis' e' b' gis' dis' e'|
-               %a26
-               a'8~a'32 gis' a' b' c'' gis' a' b'|
-               %a27
-               r8 a'4~
-               %a28
-               a'8 a'4~
-               %a29
-               a'8 cis''4^\prall~
-               %a30
-               cis''4.^\prall~
-               %a31
-               cis''4._\prall~
-               %a32
-               cis''4._\prall
-               %a33
-               \times 12/15{a''16 \sm gis''32 fis'' e'' d'' cis'' b' a' gis' fis' e' d' cis' b \n}
-               %a34
-               \lh a32 \rh[e' cis' a]\lh cis' \rh[a' e' cis']\lh e' \rh[cis'' a' e']|
-               %a35
-               \lh a'32 \rh[e'' cis'' a']\lh cis'' \rh[a'' e'' cis'']\lh a' \rh[e'' cis'' a']|
-               %a36
-               \lh e'32 \rh[cis'' a' e']\lh cis' \rh[a' e' cis']\lh a \rh[e' cis' a]|
-               %a37
-               \lh a,16 d32 e \rh a4 \bar "||";
-       }
-        \context Thread=tb{ \n
-                \rh s8 fis' e'|
-                s4.
-                %a3
-                s8 fis' e'|
-                %a4
-                fis'8 s \lh a'|
-                %a5
-                s8 \rh d'' s|
-                \skip \longa*35/64;
-                %a11
-                e'16~
-                %a12
-                e'16 s s4|
-                s4.*10
-                %a23
-                s8 gis' a'|
-                %a24
-                b'8 s4|
-                s4.*6
-                %a31
-                s8 e''4^\prall~e''4.^\prall
-        }
-         \context Thread=tc{ \n
-         \rh s8 d' cis'|
-         s4.
-         %a3
-         s8 d' cis'
-         %a4
-         d'8 s \lh fis'|
-         %a5
-         s8 \rh a'
-         }>
-       \autochange Staff
-       \context Voice=vb< \zs
-       \sd
-       \context Thread=td{ \n
-               \lh \sm
-               %
-               % WARNING: interface still subject to change!
-               %
-               \property Voice. beamHeight = 5
-               [\times 2/3{d32 fis a}\n d'16]a8 a|
-               \property Voice.beamHeight = ##f
-               %b2
-               d4 s8|
-               %b3
-               s8 a a|
-               %b4
-               r32[d fis a][d' fis' a' d'']r \rh[d fis a]
-               %b5
-               [d'32 fis' a' d''] \forceStaffDown r32 \lh[d fis a][d' fis' a' d'']
-               %b6
-               s a''32 s fis'' s d'' s a' s d' s a|
-               %b7
-               \su r8. fis16 b8|
-               %b8
-               r8. g16 a8~
-               %b9
-               a16 r8 fis16 b8|
-               %b10
-               r8. g16 b8|
-               s4.
-               %b12
-               r8 a b|
-               %b13
-               \sd r8 d'4|
-               %b14
-               e'8 fis'4|
-               %b15
-               \su s8 a''^"M" s|
-               %b16
-               \sd b8 d' gis'|
-               %b17
-               \rh \su s8 a'' s|
-               %b18
-               \sd b8 d' gis'|
-               %b19
-               \times 2/3{a'16 c'' b' a' c'' d'' e'' c'' b'}|
-               %b20
-               \times 2/3{a'16 c'' b' a' c'' d'' e'' c'' b'}|
-               %b21
-               \times 2/3{a'16 c'' b' a' b' c''}dis''32 c'' b' a'|
-               %b22
-               b'32 gis' dis' e' d''8 cis''|
-               %b23
-               b'32 gis' dis' e' s4|
-               %b24
-               s8 \lh d' cis'|
-               %b25
-               b8 a gis|
-               %b26
-               a32 d' c' b c' \rs f' \zs e' d' c' e' fis' gis'|
-               %b27
-               [\su a8 \sd a' \su b]|
-               %b28
-               [a8 \sd a' \su b]|
-               %b29
-               [a8 \sd a' \su b]|
-               %b30
-               [a8 \sd a' \su b]|
-               %b31
-               [a8 \sd a' \su b]|
-               %b32
-               [a8 \sd a' \su b]|
-               }
-        \context Thread=te{ \n
-                \lh s4.*24
-                %b25
-                b,8 a, gis,|
-                s4.
-                %b27
-                s4 d'8|
-                %b28
-                cis'8 s d'|
-                %b29
-                cis'8 s d'|
-                %b30
-                cis'8 s d'|
-                %b31
-                cis'8 s d'|
-                %b32
-                cis'8
-        }>
-       \autochange Staff
-       \context Voice=vc< \zs
-       \sd
-       \context Thread=tf{ \n
-               \lh s4.*6
-               %c7
-               d4.|
-               %c8
-               e4.|
-               %c9
-               d4.|
-               %c10
-               e4.|
-               %c11
-               d8 fis cis|
-               %c12
-               d4 g8|
-               %c13
-               fis4 b8|
-               %c14
-               a4 d'8|
-               %c15
-               a8 s a_"M"|
-               %c16
-               s4 s16 \rh e|
-               %c17
-               a8 s a|
-               %c18
-               s4 s16 \lh e|
-               %c19
-               a8_"M" s a|
-               %c20
-               g8 s g|
-               %c21
-               dis8 s dis|
-               %c22
-               e8 s4|
-               %c23
-               s8 e dis|
-               %c24
-               e8 d cis
-               }
-        \context Thread=tg{ \n
-                \lh s4.*10
-        %c11
-        s4 a8
-        }>
-        >
-       \context Staff=down<
-       \clef bass;
-       \key d \major;
-       s4.*37
-       >>
-       \paper { 
-               %sonata-specific settings
-               \translator{\VoiceContext beamAutoBegin=0;beamAutoEnd_8="3/8";
-               beamAutoEnd_16="3/8";beamAutoEnd_24="1/8";beamAutoEnd_32="1/8";}
-       }
-}
-
diff --git a/input/scarlatti-test.ly b/input/scarlatti-test.ly
new file mode 100644 (file)
index 0000000..3638bc3
--- /dev/null
@@ -0,0 +1,341 @@
+%K000.ly LilyPond 1.2.16
+\include "scarlatti-properties.ly"
+\include "scarlatti-paper.ly"
+%sonata-specific settings
+\paper {
+\translator{\VoiceContext
+  beamAutoBegin=0;
+  beamAutoEnd_8=#(make-moment 3  8)
+  beamAutoEnd_16=#(make-moment 3 8)
+  beamAutoEnd_24=#(make-moment 1 8)
+  beamAutoEnd_32=#(make-moment 1 8)
+}
+}
+
+%{
+%standard properties list
+rh={\property Thread.noteHeadStyle=""}
+lh={\property Thread.noteHeadStyle="diamond"}
+n={\property Thread.fontSize="0"}
+sm={\property Thread.fontSize="-1"}
+su={\property Voice.verticalDirection="1"}
+sd={\property Voice.verticalDirection="-1"}
+zs={\property Voice.forceHorizontalShift="0.0"}
+ls={\property Voice.forceHorizontalShift="-0.6"}
+sls={\property Voice.forceHorizontalShift="-0.22"}
+rs={\property Voice.forceHorizontalShift="0.6"}
+srs={\property Voice.forceHorizontalShift="0.22"}
+ab={\property Voice.noAutoBeaming="0"}
+xb={\property Voice.noAutoBeaming="1"}
+%}
+
+
+\score{
+\context PianoStaff \notes<
+\context Staff=up<
+  \key d \major ;
+\time 3/8;
+\clef treble;
+\autochange Staff
+\context Voice=va< \zs
+\su
+\context Thread=ta{ \n
+\rh \sm[\times 2/3{a'32_"John's Scarlatti quotes" d'' fis''}\n a''16]a'8 g'~
+%a2
+g'8 _"1 Aug 2000" \times 2/3{a'16 b' cis'' d'' fis'' g''}|
+%a3
+a''8 a' a'|
+%a4
+a'8 s \lh d''|
+%a5
+s8 \rh fis'' s|
+%a6
+a''32 s fis'' s d'' s a' s d' s a s \bar "||";
+\key f \major; 
+%a7
+r16 a' f'8. d'16~
+%a8
+d'16 g' e'8. cis'16|
+%a9
+r16 a' f'8. d'16~
+%a10
+d'16 g' e'8. cis'16 \bar "||";
+\key d \major;
+%a11
+r16 fis' d'8. g'16~
+%a12
+g'16 fis'8 e' b'16~
+%a13
+b'16 a' fis'8. d''16~
+%a14
+d''16 cis'' a'8. fis''16~
+%a15
+\sd fis''16 e''8 cis'' a'16~
+%a16
+\su a'8 d'' b''16 s|
+%a17
+\lh \sd r16 e''8 cis'' a'16~
+%a18
+\su a'8 d'' b''16 s|
+%a19
+s8 a''^"M" s|
+%a20
+\rh e''4.|
+%a21
+\lh s8 fis'' s|
+%a22
+s8 b''^"M" a''|
+%a23
+gis''8 \rh[b' c'']|
+%a24
+gis'8_\prall f''32 d'' ais' b' e'' c'' gis' a'|
+%a25
+d''32 b' fis' gis' c'' a' dis' e' b' gis' dis' e'|
+%a26
+a'8~a'32 gis' a' b' c'' gis' a' b'|
+%a27
+c''8 b'4~
+%a28
+b'8 a' gis'|
+%a29
+r8 a'4~
+%a30
+a'8 cis''4^\prall~
+%a31
+cis''4._\prall~
+%a32
+cis''4._\prall
+%a33
+s8 gis''4|
+%a34
+\times 12/15{a''16 \sm gis''32 fis'' e'' d'' cis'' b' a' gis' fis' e' d' cis' b \n}
+%a35
+s32 e' cis' a s a' e' cis' s cis'' a' e'|
+%a36
+\lh a'32 \rh[e'' cis'' a']\lh cis'' \rh[a'' e'' cis'']\lh a' \rh[a cis' e']\bar "||";
+\time 6/8;
+%a37
+gis''8 a'' gis'' a'' gis'' a''|
+}
+ \context Thread=tb{ \n
+ \rh s8 fis' e'~
+ %a2
+ e'8 s4|
+ %a3
+ s8 fis' g'|
+ %a4
+ fis'8 s \lh a'|
+ %a5
+ s8 \rh d'' s|
+ s4.*3
+ %a9
+ s8 \sm g' \n s|
+ %a10
+ s8 \sm fis' \n s|
+ %a11
+ s4 s16 e'~
+ %a12
+ e'16 s8 cis' s16|
+ s4.*8
+ %a21
+ s8 \lh a' \rh s|
+ s4.
+ %a23
+ s8 gis' a'|
+ %a24
+ b'8^\prall s4|
+ s4.*3
+ %a28
+ s4 e'8|
+ s4.*2
+ %a31
+ s8 e''4^\prall~
+ %a32
+ e''4.^\prall|
+ s4.*4
+ %a37
+ s4. c''8 b' c''
+ }
+  \context Thread=tc{ \n
+  \rh s8 d' a'~
+  %a2
+  a'8 s4|
+  %a3
+  s8 d' dis'
+  %a4
+  d'8 s \lh fis'|
+  %a5
+  s8 \rh a'
+  }>
+\autochange Staff
+\context Voice=vb< \zs
+\sd
+\context Thread=td{ \n
+\lh \sm[\times 2/3{d32 fis a}\n d'16]a8 a|
+%b2
+d4 r8|
+%b3
+r8 a a|
+%b4
+r32[d fis a][d' fis' a' d'']r \rh[d fis a]
+%b5
+[d'32 fis' a' d'']r32 \lh[d fis a][d' fis' a' d'']
+%b6
+s a''32 s fis'' s d'' s a' s d' s a|
+%b7
+\su r8. f16 bes8|
+%b8
+r8. g16 a8~
+%b9
+a16 r8 f16 bes8|
+%b10
+bes8 r16 g bes8|
+s4.
+%b12
+r8 a b|
+%b13
+\sd r8 d'4|
+%b14
+e'8 fis'4|
+%b15
+\su s8 a''^"M" s|
+%b16
+\sd b8 d' gis'|
+%b17
+\rh \su s8 a'' s|
+%b18
+\sd b8 d' gis'|
+%b19
+\times 2/3{a'16 c'' b' a' c'' d'' e'' c'' b'}|
+%b20
+\ls c''8^\prall \zs b'4|
+%b21
+\times 2/3{s16 c'' b' s b' c''}dis''32 c'' b' a'|
+%b22
+b'32 gis' dis' e' d''8 cis''|
+%b23
+b'32 gis' dis' e' s4|
+%b24
+s8 \lh d' cis'|
+%b25
+b8 a gis|
+%b26
+a32 d' c' b c' \rs f' \zs e' d' c' e' fis' gis'|
+%b27
+\su a8 b \sd d'~
+%b28
+d'8 c' \su b|
+%b29
+a8 s b|
+%b30
+[a8 \sd a' \su b]|
+%b31
+[a8 \sd a' \su b]|
+%b32
+[a8 \sd a' \su fis]|
+%b33
+gis'8 \sd e'' \su gis'|
+\sd a'8 s4|
+%b35
+\xb a8 cis' e' \ab|
+s4.
+%b37
+\rh \su \srs e''16 dis'' e'' dis'' e'' dis'' \lh \sd \sls e''16 dis'' e'' dis'' e'' dis'' \zs|
+}
+ \context Thread=te{ \n
+ \lh s4.*24
+ %b25
+ b,8 a, gis,|
+ s4.*3
+ %b29
+ s4 d'8|
+ %b30
+ cis'8 s d'|
+ %b31
+ cis'8 s d'|
+ %b32
+ cis'8
+ }>
+\autochange Staff
+\context Voice=vc< \zs
+\sd
+\context Thread=tf{ \n
+\lh s4.*2
+%c3
+s4 \rs c'8 \zs|
+s4.*3
+%c7
+d4.|
+%c8
+e4.|
+%c9
+d4.|
+%c10
+e4.|
+%c11
+d8 fis cis|
+%c12
+d4 g8|
+%c13
+fis4 b8|
+%c14
+a4 d'8|
+%c15
+a8 s a_"M"|
+%c16
+s4 s16 \rh e|
+%c17
+a8 s a|
+%c18
+s4 s16 \lh e|
+%c19
+a8_"M" s a|
+%c20
+a'4 gis'8|
+%c21
+dis8 s dis|
+%c22
+e8 s4|
+%c23
+s8 e dis|
+%c24
+e8 d cis|
+s4.*2
+%c27
+e4.|
+%c28
+d8 e4|
+s4.*4
+%c33
+e8 e' e|
+s4.*3
+%c37
+b'8 c'' b' e' e' e'
+}
+ \context Thread=tg{ \n
+ \lh s4.*10
+ %c11
+ s4 a8|
+ s4.*25
+ %c37
+ e'8 e' e'
+ }>
+\autochange Staff
+\context Voice=vd< \zs
+\sd
+\context Thread=th{ \n
+\rh s4.*20
+%d21
+a'4 s8|
+s4.*6
+%d28
+\su \srs f'4 \zs
+}>
+>
+\context Staff=down<
+\clef bass;
+\key d \major;
+s4.*38
+>>
+} 
+
diff --git a/input/test/lyric-phrasing.ly.orig b/input/test/lyric-phrasing.ly.orig
deleted file mode 100644 (file)
index 2edfa2d..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-\header{
-filename =      "twinkle-pop.ly";
-%title =        "Ah, vous dirais-je, maman ";
-description =   "twinkle twinkle in pop-song-settings";
-composer =      "traditional";
-enteredby =     "HWN, chords by Johan Vromans";
-copyright =     "public domain";
-}
-
-\version "1.3.59";
-
-m =\notes  \relative c'' {
-       \property Staff.automaticMelismata = ##t
-       \autoBeamOff
-       g4  r8 \times 2/3 { g'8( f )e } r8 \grace { [d16 c b] } e4
-       \emptyText
-       d8.^"melisma"   \melisma c16
-       \melismaEnd
-       b c d e }
-
-textI =  \lyrics  { la4 __ la -- la  I, la dargh la dargh.  }
-textII =  \lyrics  { dar -- dargh __ dargh dargh; dargh la dargh loo.  }
-textIII =  \lyrics  { la -- da __ doo dah; dargh la dargh loo.  }
-
-\score {
-
-    \notes < \context Staff = SA \context Voice = VA { s1 }
-      \context LyricVoice = "VA-1" { s1 }
-      \context LyricVoice = "VA-2" { s1 }
-      
-      \addlyrics
-         \context Staff = SA \m
-         < \context LyricVoice = "VA-1" \textI
-           \context LyricVoice = "VA-2" \textII
-           \context LyricVoice = "VA-3" \textIII
-         >
-         
-    >
-
-  \paper {
-    \translator {
-      \ScoreContext
-      \consists "Lyric_phrasing_engraver";
-      automaticPhrasing = ##t;
-    }
-  }
-
-}
\ No newline at end of file
index 23d709d9282a92315ef2893efdca0aebecca33a2..8c286e428d368b6cd569c6edb41da303dc4f32ba 100644 (file)
@@ -50,7 +50,7 @@ All_font_metrics::find_afm (String name)
     {
       String path;
 
-#if KPATHSEA && HAVE_KPSE_FIND_FILE
+#if (KPATHSEA && HAVE_KPSE_FIND_FILE)
       if (path.empty_b ())
        {
          char  * p = kpse_find_file (name.ch_C(), kpse_afm_format, true);
index f8e74fce9dc7f66ac866ad7ba70d14fcb3beee19..b9a33c0c2bb5ff9c48e5ada9ce791c31eae75fe1 100644 (file)
 #include "note-head.hh"
 #include "translator-group.hh"
 #include "side-position-interface.hh"
+#include "ly-smobs.icc"
 #include "spanner.hh"
 #include "paper-def.hh"
 
+
 String get_context_id(Translator_group * ancestor, const char * type);
 String trim_suffix(String &id);
 
@@ -505,7 +507,7 @@ Voice_alist_entry::next_lyric()
 
 /* SMOB */
 
-#include "ly-smobs.icc"
+
 
 SCM
 Voice_alist_entry::mark_smob (SCM)
index a224da0a1ca4a58ac7ec2012d0d3a7e0a791fe3b..da3ed2483177cbcbceb55992df80b9ee49b3ddc2 100644 (file)
@@ -11,7 +11,6 @@
 #include "lily-guile.hh"
 #include "moment.hh"
 #include "warn.hh"
-
 #include "ly-smobs.icc"
 
 IMPLEMENT_UNSMOB(Moment,moment);
index c6a922d07dd9681765b8b8cde64ff8af0b878ee7..598c64fc209f0a7e984ca3f2a98ed7ec84b65aee 100644 (file)
@@ -6,10 +6,11 @@
   (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
   
  */
-
 #include <stdio.h>
-#include "ly-smobs.icc"
+
 #include "scm-hash.hh"
+#include "ly-smobs.icc"
+
 
 Scheme_hash_table::Scheme_hash_table ()
 {
@@ -115,6 +116,7 @@ Scheme_hash_table::to_alist () const
 }
 
 
+
 IMPLEMENT_UNSMOB(Scheme_hash_table,scheme_hash);
 IMPLEMENT_SMOBS(Scheme_hash_table);
 IMPLEMENT_DEFAULT_EQUAL_P(Scheme_hash_table);
index e1c218d1bf4440dbd66ae30e4b1772dda7fde75a..c39624b53b3ff422e43625e387c567a487f3e6f2 100644 (file)
@@ -31,6 +31,8 @@
 #include "side-position-interface.hh"
 #include "item.hh"
 
+#include "ly-smobs.icc"
+
 /*
 TODO:
 
@@ -706,7 +708,6 @@ Score_element::fixup_refpoint (SCM smob)
   SMOB funcs
  ****************************************************/
 
-#include "ly-smobs.icc"
 
 IMPLEMENT_UNSMOB(Score_element, element);
 IMPLEMENT_SMOBS(Score_element);
index 4ad037ff7d42a9ae60103d6940e107dbc6a54673..5090147999523e98921468df5e6b9ea01cbcc79b 100644 (file)
@@ -1,15 +1,15 @@
 Begin3
 Title: LilyPond
-Version: 1.3.76
-Entered-date: 03AUG00
+Version: 1.3.77
+Entered-date: 08AUG00
 Description: 
 Keywords: music notation typesetting midi fonts engraving
 Author: hanwen@cs.uu.nl (Han-Wen Nienhuys)
        janneke@gnu.org (Jan Nieuwenhuizen)
 Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
 Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
-       1000k lilypond-1.3.76.tar.gz 
+       1000k lilypond-1.3.77.tar.gz 
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
-       1000k lilypond-1.3.76.tar.gz 
+       1000k lilypond-1.3.77.tar.gz 
 Copying-policy: GPL
 End
index 5ec5d049545a48ecb63dddc2fe0f57e7dc77a225..8488b4b3a30cfebdcdac22617d02a86a6b6ff448 100644 (file)
@@ -1,9 +1,9 @@
 Name: lilypond
-Version: 1.3.76
+Version: 1.3.77
 Release: 1
 Copyright: GPL
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.76.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.77.tar.gz
 Summary: A program for printing sheet music.
 URL: http://www.cs.uu.nl/~hanwen/lilypond
 # Icon: lilypond-icon.gif
index d82d949dfe2580997f4dde889b21b7b6feec85f3..71542b2e39954eb401e5d8fe08da33afd781f5c5 100644 (file)
@@ -1,20 +1,31 @@
 #!@PYTHON@
+# vim: set noexpandtab:
+import time
+t1 = time.clock()
 
-import os
-import string
-import re
-import getopt
-import sys
-import __main__
-
-
-initfile = ''
-program_version = '@TOPLEVEL_VERSION@'
-
-cwd = os.getcwd ()
-include_path = [cwd]
-dep_prefix = ''
-
+# support bruk av convert-mudela
+#
+# option:
+# 11pt, 13pt, 16pt, 20pt, 26pt
+# singleline
+# multiline
+# fragment  (used when a comment containg \score confuses mudela-book)
+# nonfragment (probably not needed)
+# verbatim
+
+# latex only options:
+# eps
+# 
+
+# command line options
+# --defalt-mudela-fontsize
+# --force-mudela-fontsize
+# --outname
+# --force-verbatim make all mudela verbatim. Maybe not that useful
+# --dependencies
+# --dep-prefix
+# --no-pictures
+# --no-lily
 # TODO: Figure out clean set of options.
 
 # BUG: does not handle \verb|\begin{verbatim}\end{verbatim}| correctly.
@@ -28,6 +39,31 @@ dep_prefix = ''
 # * mudela-book --read-lys *.ly
 #
 
+import os
+import stat
+import string
+import re
+import getopt
+import sys
+import __main__
+
+
+initfile = ''
+program_version = '1.3.69-very-unstable'
+
+include_path = [os.getcwd()]
+
+g_dep_prefix = ''
+g_outdir = ''
+g_force_mudela_fontsize = 0
+g_read_lys = 0
+g_do_pictures = 1
+g_num_cols = 1
+format = ''
+g_run_lilypond = 1
+g_use_hash = 1
+no_match = 'a\ba'
+
 default_music_fontsize = 16
 default_text_fontsize = 12
 
@@ -48,33 +84,44 @@ latex_linewidths = {
         'legal':{10: 167, 11: 175, 12: 190},
         'executive':{10: 167, 11: 175, 12: 184}}}
 
+texi_linewidths = {
+       'a4': {12: 455},
+       'a4wide': {12: 470},
+       'smallbook': {12: 361},
+       'texidefault': {12: 433}}
+
+
+def get_linewidth(cols, paper, fontsize):
+       if __main__.format == 'latex':
+               return latex_linewidths[cols][paper][fontsize]
+       elif __main__.format == 'texi':
+               return texi_linewidths[paper][fontsize]
+       raise "never here"
 
 option_definitions = [
-  ('DIM',  '', 'default-mudela-fontsize', 'default fontsize for music.  DIM is assumed to in points'),
   ('EXT', 'f', 'format', 'set format.  EXT is one of texi and latex.'),
+  ('DIM',  '', 'default-music-fontsize', 'default fontsize for music.  DIM is assumed to in points'),
+  ('DIM',  '', 'default-mudela-fontsize', 'deprecated, use --default-music-fontsize'),
   ('', 'h', 'help', 'print help'),
   ('DIR', 'I', 'include', 'include path'),
   ('', '', 'init', 'mudela-book initfile'),
-#  ('DIM', '', 'force-mudela-fontsize', 'force fontsize for all inline mudela. DIM is assumed to in points'),
+  ('DIM', '', 'force-music-fontsize', 'force fontsize for all inline mudela. DIM is assumed to in points'),
+  ('DIM', '', 'force-mudela-fontsize', 'deprecated, use --force-music-fontsize'),
   ('', '', 'force-verbatim', 'make all mudela verbatim'),
   ('', 'M', 'dependencies', 'write dependencies'),
   ('', 'n', 'no-lily', 'don\'t run lilypond'),
   ('', '', 'no-pictures', "don\'t generate pictures"),
+  ('', '', 'read-lys', "don't write ly files."),
   ('FILE', 'o', 'outname', 'prefix for filenames'),
   ('', 'v', 'version', 'print version information' ),
-  ('PREF', '',  'dep-prefix', 'prepend PREF before each -M dependency')
+  ('PREF', '',  'dep-prefix', 'prepend PREF before each -M dependency'),
+  ('FILE', '', 'outdir', "where to place generated files"),
   ]
 
-format = ''
-run_lilypond = 1
-use_hash = 1
-no_match = 'a\ba'
-do_pictures = 1
-
 # format specific strings, ie. regex-es for input, and % strings for output
 output_dict= {
        'latex': {
-               'output-mudela-fragment' : r"""\begin[eps,fragment%s]{mudela}
+               'output-mudela-fragment' : r"""\begin[eps,singleline,%s]{mudela}
   \context Staff <
     \context Voice{
       %s
@@ -87,13 +134,18 @@ output_dict= {
                'output-verbatim': r"""\begin{verbatim}%s\end{verbatim}""",
                'output-default-post': r"""\def\postMudelaExample{}""",
                'output-default-pre': r"""\def\preMudelaExample{}""",
-               'output-eps': '\\noindent\\parbox{\\mudelaepswidth{%s.eps}}{\includegraphics{%s.eps}}',
-               'output-tex': '\\preMudelaExample \\input %s.tex \\postMudelaExample\n'
+               'output-eps': '\\noindent\\parbox{\\mudelaepswidth{%(fn)s.eps}}{\includegraphics{%(fn)s.eps}}',
+               'output-tex': '\\preMudelaExample \\input %(fn)s.tex \\postMudelaExample\n',
+               'pagebreak': r'\pagebreak',
                },
        'texi' : {'output-mudela': """@mudela[%s]
 %s
-@end mudela
+@end mudela 
 """,
+                 'output-mudela-fragment': """@mudela[%s]
+\context Staff\context Voice{ %s }
+@end mudela """,
+                 'pagebreak': None,
                  'output-verbatim': r"""@example
 %s
 @end example
@@ -110,51 +162,62 @@ output_dict= {
 \catcode`\@=12
 \input lilyponddefs
 \def\EndLilyPondOutput{}
-\input %s.tex
+\input %(fn)s.tex
 \catcode`\@=0
 @end tex
 @html
 <p>
-<img src=%s.png>
+<img src=%(fn)s.png>
 @end html
 """,
                }
        }
 
-def output_verbatim (body):
+def output_verbatim (body):#ugh .format
+       if __main__.format == 'texi':
+               body = re.sub ('([@{}])', '@\\1', body)
+       return get_output ('output-verbatim') % body
+
+def output_mbverbatim (body):#ugh .format
        if __main__.format == 'texi':
                body = re.sub ('([@{}])', '@\\1', body)
        return get_output ('output-verbatim') % body
 
 re_dict = {
        'latex': {'input': '\\\\mbinput{?([^}\t \n}]*)',
-                 'include': '\\\\mbinclude{([^}]+)}',
+                 'include': '\\\\mbinclude{(?P<filename>[^}]+)}',
                 
-                 'comma-sep' : ', *',
+                 'option-sep' : ', *',
                  'header': r"""\\documentclass(\[.*?\])?""",
                  'preamble-end': '\\\\begin{document}',
-                 'verbatim': r"""(?s)\\begin{verbatim}(.*?)\\end{verbatim}""",
-                 'verb': r"""\\verb(.)(.*?)\1""",
-                 'mudela-file': '\\\\mudelafile(\[[^\\]]+\])?{([^}]+)}',
-                 'mudela' : '\\\\mudela(\[.*?\])?{(.*?)}',
-                 'mudela-block': r"""(?s)\\begin(\[.*?\])?{mudela}(.*?)\\end{mudela}""",
+                 'verbatim': r"""(?s)\\begin{verbatim}(?P<code>.*?)\\end{verbatim}""",
+                 'verb': r"""\\verb(.)(?P<code>.*?)\1""",
+                 'mudela-file': r'\\mudelafile(\[(?P<options>.*?)\])?\{(?P<filename>.+)}',
+                 'mudela' : '\\\\mudela(\[(?P<options>.*?)\])?{(?P<code>.*?)}',
+                 'mudela-block': r"""(?s)\\begin(\[(?P<options>.*?)\])?{mudela}(?P<code>.*?)\\end{mudela}""",
                  'interesting-cs': '\\\\(chapter|section|twocolumn|onecolumn)',
                  'def-post-re': r"""\\def\\postMudelaExample""",
                  'def-pre-re': r"""\\def\\preMudelaExample""",           
+                 'intertext': r',?\s*intertext=\".*?\"',
+                 'ignore': no_match,
+                 'numcols': r"(?P<code>\\(?P<num>one|two)column)",
                  },
        
        'texi': {
-                'input':  '@mbinclude[ \n\t]+([^\t \n]*)',# disabled
-                'include': no_match,
+                'include':  '@mbinclude[ \n\t]+(?P<filename>[^\t \n]*)',
+                'input': no_match,
                 'header': no_match,
                 'preamble-end': no_match,
-                'verbatim': r"""(?s)@example(.*?)@end example$""",
-                'verb': r"""@code{(.*?)}""",
-                'mudela-file': '@mudelafile(\[[^\\]]+\])?{([^}]+)}',
-                'mudela' : '@mudela(\[.*?\])?{(.*?)}',
-                'mudela-block': r"""(?s)@mudela(\[.*?\])?(.*?)@end mudela""",
+                'verbatim': r"""(?s)(?P<code>@example\s.*?@end example\s)""",
+                'verb': r"""@code{(?P<code>.*?)}""",
+                'mudela-file': '@mudelafile(\[(?P<options>.*?)\])?{(?P<filename>[^}]+)}',
+                'mudela' : '@mudela(\[(?P<options>.*?)\])?{(?P<code>.*?)}',
+                'mudela-block': r"""(?s)@mudela(\[(?P<options>.*?)\])?\s(?P<code>.*?)@end mudela\s""",
                 'interesting-cs': r"""[\\@](chapter|section)""",
-                 'comma-sep' : ', *',           
+                 'option-sep' : ', *',
+                 'intertext': r',?\s*intertext=\".*?\"',
+                 'ignore': r"(?s)@ignore\s(.*?)@end ignore\s",
+                 'numcols': no_match,
                 }
        }
 
@@ -183,7 +246,6 @@ def get_output (name):
 def get_re (name):
        return  re_dict[format][name]
 
-
 def bounding_box_dimensions(fname):
        try:
                fd = open(fname)
@@ -198,167 +260,96 @@ def bounding_box_dimensions(fname):
                return (0,0)
 
 
-
-read_files = []
-def find_file (name):
-       f = None
-       for a in include_path:
-               try:
-                       nm = os.path.join (a, name)
-                       f = open (nm)
-                       __main__.read_files.append (nm)
-                       break
-               except IOError:
-                       pass
-
-
-       if f:
-               return f.read ()
-       else:
-               error ("File not found `%s'\n" % name)
-               return ''
-
 def error (str):
        sys.stderr.write (str + "\n  Exiting ... \n\n")
        raise 'Exiting.'
 
 
 def compose_full_body (body, opts):
-       "Construct the text of an input file: add stuff to BODY using OPTS as options."
-       paper = 'a4'
+       """Construct the mudela code to send to Lilypond.
+       Add stuff to BODY using OPTS as options."""
+       if __main__.format == 'texi':
+               paper = 'texidefault'
+       else:
+               paper = 'letter' # yes, latex use letter as default, at least
+                                # my tetex distro
        music_size = default_music_fontsize
        latex_size = default_text_fontsize
-
-       cols = 1
        for o in opts:
                m = re.search ('^(.*)paper$', o)
                if m:
                        paper = m.group (1)
                
-
-               m = re.match ('([0-9]+)pt', o)
-               if m:
-                       music_size = string.atoi(m.group (1))
+               if g_force_mudela_fontsize:
+                       music_size = g_force_mudela_fontsize
+               else:
+                       m = re.match ('([0-9]+)pt', o)
+                       if m:
+                               music_size = string.atoi(m.group (1))
 
                m = re.match ('latexfontsize=([0-9]+)pt', o)
                if m:
                        latex_size = string.atoi (m.group (1))
 
+       if re.search ('\\\\score', body):
+               is_fragment = 0
+       else:
+               is_fragment = 1
+       if 'fragment' in opts:
+               is_fragment = 1
+       if 'nonfragment' in opts:
+               is_fragment = 0
 
-
-       if 'twocolumn' in opts:
-               cols = 2
-               
-
-       # urg: breaks on \include of full score
-       # Use nofly option if you want to \include full score.
-       if 'nofly'  not in opts and not re.search ('\\\\score', body):
-               opts.append ('fragment')
-
-       if 'fragment' in opts and 'nosingleline' not in opts:
-               opts.append ('singleline')
-
+       if is_fragment and not 'multiline' in opts:
+               opts.append('singleline')
        if 'singleline' in opts:
                l = -1.0;
        else:
-               l = latex_linewidths[cols][paper][latex_size]
-
-
-       if 'relative' in opts:
+               l = get_linewidth(g_num_cols, paper, latex_size)
+       
+       if 'relative' in opts:#ugh only when is_fragment
                body = '\\relative c { %s }' % body
-
        
-       if 'fragment' in opts:
+       if is_fragment:
                body = r"""\score { 
 \notes { %s }
+ \notes { %s }
   \paper { }  
 }""" % body
 
-        opts = uniq (opts)
-        optstring = string.join (opts, ' ')
+       opts = uniq (opts)
+       optstring = string.join (opts, ' ')
        optstring = re.sub ('\n', ' ', optstring)
        
        body = r"""
-%% Generated by mudela-book.py; options are %s
+%% Generated by mudela-book.py; options are %s  %%ughUGH not original options
 \include "paper%d.ly"
 \paper  { linewidth = %f \pt; } 
 """ % (optstring, music_size, l) + body
-
        return body
 
-def find_inclusion_chunks (regex, surround, str):
-       chunks = []
-       while str:
-               m = regex.search (str)
-
-               if m == None:
-                       chunks.append (('input', str))
-                       str = ''
-                       break
-
-               chunks.append (('input', str[: m.start (0)]))
-               chunks.append (('input', surround))
-               chunks = chunks +  read_doc_file (m.group (1))
-
-               chunks.append (('input', surround))
-
-               str = str [m.end (0):]
-       return chunks
-
-def find_include_chunks (str):
-       return find_inclusion_chunks (get_re ('include'), '\\newpage', str)
-
-def find_input_chunks (str):
-       return find_inclusion_chunks (get_re ('input'), '', str)        
-
-def read_doc_file (filename):
-       """Read the input file, substituting for \input, \include, \mudela{} and \mudelafile"""
-       str = ''
-       str = find_file(filename)
-
-       if __main__.format == '':
-               latex =  re.search ('\\\\document', str[:200])
-               texinfo =  re.search ('@node', str[:200])
-               if (texinfo and latex) or not (texinfo or latex):
-                       error("error: can't determine format, please specify")
-               if texinfo:
-                       __main__.format = 'texi'
-               else:
-                       __main__.format = 'latex'
-                       
-       chunks = [('input', str)]
-
-       for func in (find_verbatim_chunks, find_verb_chunks, find_include_chunks, find_input_chunks):
-               newchunks = []
-               for c in chunks:
-                       if c[0] == 'input':
-                               newchunks = newchunks + func (c[1])
-                       else:
-                               newchunks.append (c)
-               chunks = newchunks
-       
-       return chunks
-
-
 
 def scan_preamble (str):
        options = []
+       if __main__.format == 'texi':
+               x = 250
+               if string.find(str[:x], "@afourpaper") != -1:
+                       options = ['a4paper']
+               elif string.find(str[:x], "@afourwide") != -1:
+                       options = ['a4widepaper']
+               elif string.find(str[:x], "@smallbook") != -1:
+                       options = ['smallbookpaper']
        m = get_re ('header').search( str)
-
        # should extract paper & fontsz.
        if m and m.group (1):
                options = options + re.split (',[\n \t]*', m.group(1)[1:-1])
 
        def verbose_fontsize ( x):
-               # o ??
-               #if o.match('[0-9]+pt'):
                if re.match('[0-9]+pt', x):
                        return 'latexfontsize=' + x
                else:
                        return x 
                        
        options = map (verbose_fontsize, options)
-
        return options
 
 
@@ -382,148 +373,150 @@ def completize_preamble (str):
 
        return preamble + str
 
-def find_verbatim_chunks (str):
-       """Chop STR into a list of tagged chunks, ie. tuples of form
-       (TYPE_STR, CONTENT_STR), where TYPE_STR is one of 'input' and 'verbatim'
 
-       """
+read_files = []
+def find_file (name):
+       f = None
+       for a in include_path:
+               try:
+                       nm = os.path.join (a, name)
+                       f = open (nm)
+                       __main__.read_files.append (nm)
+                       break
+               except IOError:
+                       pass
+       if f:
+               return f.read ()
+       else:
+               error ("File not found `%s'\n" % name)
+               return ''
 
-       chunks = []
-       while str:
-               m = get_re ('verbatim').search( str)
-               if m == None:
-                       chunks.append( ('input', str))
-                       str = ''
-               else:
-                       chunks.append (('input', str[:m.start (0)]))
-                       chunks.append (('verbatim', m.group (0)))
-               
-                       str = str [m.end(0):]
-               
-       return chunks
+def do_ignore(match_object):
+       return []
 
-def find_verb_chunks (str):
+def make_verbatim(match_object):
+       return [('verbatim', match_object.group('code'))]
 
-       chunks = []
-       while str:
-               m = get_re ("verb").search(str)
-               if  m == None:
-                       chunks.append (('input', str))
-                       str = ''
-               else:
-                       chunks.append (('input', str[:m.start (0)]))
-                       chunks.append (('verbatim', m.group (0)))
-                       str = str [m.end(0):]
+def make_verb(match_object):
+       return [('verb', match_object.group('code'))]
 
-       return chunks
-                       
+def do_include_file(m):
+       "m: MatchObject"
+       return [('input', get_output ('pagebreak'))] \
+            + read_doc_file(m.group('filename')) \
+            + [('input', get_output ('pagebreak'))] 
 
+def do_input_file(m):
+       return read_doc_file(m.group('filename'))
 
-def find_mudela_shorthand_chunks (str):
-       return [('input', find_mudela_shorthands(str))]
-       
-def find_mudela_shorthands (b):
-       def mudela_short (match):
-               "Find \mudela{}, and substitute appropriate \begin / \end blocks."
-               opts = match.group (1)
-               if opts:
-                       opts = ',' + opts[1:-1]
-               else:
-                       opts = ''
-               return get_output ('output-mudela-fragment')  % (opts, match.group (2))
-
-       def mudela_file (match):
-               "Find \mudelafile, and substitute appropriate \begin / \end blocks."
-               fn = match.group (2)
-               str = find_file (fn)
-               opts = match.group (1)
-               if opts:
-                       opts = opts[1:-1]
-                       opts = re.split (',[ \n\t]*', opts)
-               else:
-                       opts = []
-
-               if re.search ('.fly$', fn):
-                       opts.append ('fly')
-               elif re.search ('.sly$', fn):
-                       opts = opts + [ 'fly','fragment']
-               elif re.search ('.ly$', fn):
-                       opts .append ('nofly')
-                       
-               str_opts = string.join (opts, ',')
-
-               str = ("%% copied from file `%s'\n" % fn) + str 
-               return get_output ('output-mudela') % (str_opts, str)
-  
-       b = get_re('mudela-file').sub (mudela_file, b)
-       b = get_re('mudela').sub (mudela_short, b)
-       return b
+def make_mudela(m):
+       if m.group('options'):
+               options = m.group('options')
+       else:
+               options = ''
+       return [('input', get_output('output-mudela-fragment') % 
+                       (options, m.group('code')))]
+
+def make_mudela_file(m):
+       if m.group('options'):
+               options = m.group('options')
+       else:
+               options = ''
+       return [('input', get_output('output-mudela') %
+                       (options, find_file(m.group('filename'))))]
+
+def make_mudela_block(m):
+       if m.group('options'):
+               options = get_re('option-sep').split (m.group('options'))
+       else:
+           options = []
+       options = filter(lambda s: s != '', options)
+       if 'mbverbatim' in options:#ugh this is ugly and only for texi format
+               s  = m.group()
+               im = get_re('intertext').search(s)
+               if im:
+                       s = s[:im.start()] + s[im.end():]
+               im = re.search('mbverbatim', s)
+               if im:
+                       s = s[:im.start()] + s[im.end():]
+               if s[:9] == "@mudela[]":
+                       s = "@mudela" + s[9:]
+               return [('mudela', m.group('code'), options, s)]
+       return [('mudela', m.group('code'), options)]
+
+def do_columns(m):
+       if __main__.format != 'latex':
+               return []
+       if m.group('num') == 'one':
+               return [('numcols', m.group('code'), 1)]
+       if m.group('num') == 'two':
+               return [('numcols', m.group('code'), 2)]
        
-def find_mudela_chunks (str):
-       """Find mudela blocks, while watching for verbatim. Returns
-       (STR,MUDS) with  substituted for the blocks in STR,
-       and the blocks themselves MUDS"""
-  
-       chunks = []
-       while str:
-               m = get_re ("mudela-block").search( str)
-               if not m:
-                       chunks.append (('input', str))
-                       str = ''
-                       break
+def chop_chunks(chunks, re_name, func):
+    newchunks = []
+    for c in chunks:
+        if c[0] == 'input':
+            str = c[1]
+            while str:
+                m = get_re (re_name).search (str)
+                if m == None:
+                    newchunks.append (('input', str))
+                    str = ''
+                else:
+                    newchunks.append (('input', str[:m.start (0)]))
+                    newchunks.extend(func(m))
+                    str = str [m.end(0):]
+        else:
+            newchunks.append(c)
+    return newchunks
 
-               chunks.append (('input', str[:m.start (0)]))
-               
-               opts = m.group (1)
-               if opts:
-                       opts = opts[1:-1]
-               else:
-                       opts = ''
-               optlist = get_re('comma-sep').split (opts)
-               
-               body = m.group (2)
-               chunks.append (('mudela', body, optlist))
-  
-               str = str [m.end (0):]
-  
+def read_doc_file (filename):
+       """Read the input file, find verbatim chunks and do \input and \include
+       """
+       str = ''
+       str = find_file(filename)
+
+       if __main__.format == '':
+               latex =  re.search ('\\\\document', str[:200])
+               texinfo =  re.search ('@node|@setfilename', str[:200])
+               if (texinfo and latex) or not (texinfo or latex):
+                       error("error: can't determine format, please specify")
+               if texinfo:
+                       __main__.format = 'texi'
+               else:
+                       __main__.format = 'latex'
+       chunks = [('input', str)]
+       # we have to check for verbatim before doing include,
+       # because we don't want to include files that are mentioned
+       # inside a verbatim environment
+       chunks = chop_chunks(chunks, 'ignore', do_ignore)
+       chunks = chop_chunks(chunks, 'verbatim', make_verbatim)
+       chunks = chop_chunks(chunks, 'verb', make_verb)
+       #ugh fix input
+       chunks = chop_chunks(chunks, 'include', do_include_file)
+       chunks = chop_chunks(chunks, 'input', do_input_file)
        return chunks
-  
-  
-  
-def advance_counters (counter, opts, str):
+
+
+def advance_counters (counter, str):
        """Advance chap/sect counters,
-       revise OPTS. Return the new counter tuple"""
-       
+       Return the new counter tuple
+       """
        (chapter, section, count) = counter
-       done = ''
-       while str:
+       while str:
                m = get_re ('interesting-cs').search(str)
                if not m:
-                       done = done + str
-                       str = ''
                        break
-               
-               done = done + str[:m.end (0)]
                str = str[m.end(0):]
                g = m.group (1)
-
-               if g == 'twocolumn':
-                       opts.append ('twocolumn')
-               elif g  == 'onecolumn':
-                       try:
-                               opts.remove ('twocolumn')
-                       except IndexError:
-                               pass
-               elif g == 'chapter':
+               if g == 'chapter':#ugh use dict
                        (chapter, section, count)  = (chapter + 1, 0, 0)
                elif g == 'section':
                        (section, count)  = (section + 1, 0)
-                       
-
        return (chapter, section, count)
 
-
-def schedule_mudela_block (base, chunk, extra_opts):
+taken_file_names = []
+def schedule_mudela_block (basename, chunk, extra_opts):
        """Take the body and options from CHUNK, figure out how the
        real .ly should look, and what should be left MAIN_STR (meant
        for the main file).  The .ly is written, and scheduled in
@@ -534,130 +527,86 @@ def schedule_mudela_block (base, chunk, extra_opts):
        TODO has format [basename, extension, extension, ... ]
        
        """
-
-       (type, body, opts) = chunk
+       if len(chunk) == 3:
+               (type, body, opts) = chunk
+               complete_body = None
+       else:# mbverbatim
+               (type, body, opts, complete_body) = chunk
        assert type == 'mudela'
        opts = opts +  extra_opts
-       
+       file_body = compose_full_body (body, opts)
+       if __main__.g_use_hash:
+               basename = `abs(hash (file_body))`
+       for o in opts:
+               m = re.search ('filename="(.*?)"', o)
+               if m:
+                       basename = m.group (1)#ugh add check if more than
+                       #one file has the same name
+                       assert basename not in taken_file_names
+                       taken_file_names.append(basename)
+       # writes the file if necessary, returns true if it was written
+       if not g_read_lys:
+               update_file(file_body, os.path.join(g_outdir, basename) + '.ly')
+       needed_filetypes = ['tex']
+
+       if format  == 'texi':
+               needed_filetypes.append('eps')
+               needed_filetypes.append('png')
+       if 'eps' in opts and not ('eps' in needed_filetypes):
+               needed_filetypes.append('eps')
+       outname = os.path.join(g_outdir, basename)
+       if not os.path.isfile(outname + '.tex') \
+               or os.stat(outname+'.ly')[stat.ST_MTIME] > \
+                       os.stat(outname+'.tex')[stat.ST_MTIME]:
+               todo = needed_filetypes
+       else:
+               todo = []
+               
        newbody = ''
        if 'verbatim' in opts:
                newbody = output_verbatim (body)
-
-       file_body = compose_full_body (body, opts)
-       basename = base
-       if __main__.use_hash:
-               basename = `abs(hash (file_body))`
-       updated = update_file (file_body, basename + '.ly')
-       todo = [basename]                       # UGH.
-
-       if not os.path.isfile (basename + '.tex') or updated:
-               todo.append ('tex')
-               updated = 1
+       elif 'mbverbatim' in opts:
+               newbody = output_mbverbatim (complete_body)
 
        for o in opts:
                m = re.search ('intertext="(.*?)"', o)
                if m:
                        newbody = newbody  + m.group (1)
-
-       if format == 'texi':
-               opts.append ('png')
-
-       if 'png' in opts:
-               opts.append ('eps')
-
-       if 'eps' in opts and ('tex' in todo or
-                             not os.path.isfile (basename + '.eps')):
-               todo.append ('eps')
-
-       if 'png' in opts and ('eps' in todo or
-                             not os.path.isfile (basename + '.png')):
-               todo.append ('png')
-
        if format == 'latex':
-               if 'eps' in opts :
-                       newbody = newbody + get_output ('output-eps') %  (basename, basename)
+               if 'eps' in opts:
+                       s = 'output-eps'
                else:
-                       newbody = newbody + get_output ('output-tex') % basename
-
-       elif format == 'texi':
-               newbody = newbody + get_output ('output-all') % (basename, basename) 
-
-       return ('mudela', newbody, opts, todo, base)
-
-
-def find_eps_dims (match):
-       "Fill in dimensions of EPS files."
-       
-       fn =match.group (1)
-       dims = bounding_box_dimensions (fn)
-
-       return '%ipt' % dims[0]
-
-
-def print_chunks (ch):
-       for c in ch:
-               print '-->%s\n%s' % (c[0], c[1])
-               if len (c) > 2:
-                       print '==>%s' % list (c[2:])
-       print foo
-
-
-def transform_input_file (in_filename, out_filename):
-       """Read the input, and deliver a list of chunks
-       ready for writing.
-
-       """
-
-       chunks = read_doc_file (in_filename)
+                       s = 'output-tex'
+       else: # format == 'texi'
+               s = 'output-all'
+       newbody = newbody + get_output(s) % {'fn': basename }
+       return ('mudela', newbody, opts, todo, basename)
 
-       #.  Process \mudela and \mudelafile.
-       for func in [find_mudela_shorthand_chunks,
-                    find_mudela_chunks]:
-               newchunks = []
-               for c in chunks:
-                       if c[0] == 'input':
-                               newchunks = newchunks + func (c[1])
-                       else:
-                               newchunks.append (c)
-               chunks = newchunks
-
-       opts = []
-       if chunks:
-               opts = scan_preamble (chunks[0][1]) 
-       
+def process_mudela_blocks(outname, chunks, global_options):#ugh rename
        (chap,sect,count) = (0,0,0)
        newchunks = []
        # Count sections/chapters.
        for c in chunks:
                if c[0] == 'input':
-                       (chap,sect,count) = advance_counters((chap,sect,count), opts, c[1])
+                       (chap,sect,count) = advance_counters((chap,sect,count), c[1])
                elif c[0] == 'mudela':
-                       base = '%s-%d.%d.%d' % (out_filename, chap, sect, count)
+                       base = '%s-%d.%d.%d' % (outname, chap, sect, count)
                        count = count + 1
-                       c = schedule_mudela_block (base, c, opts)
-                       
+                       c = schedule_mudela_block (base, c, global_options)
+               elif c[0] == 'numcols':
+                       __main__.g_num_cols = c[2]
                newchunks.append (c)
+       return newchunks
 
-       chunks = newchunks
-       newchunks = []
 
-       # Do It.
-       if __main__.run_lilypond:
-               compile_all_files (chunks)
-               
-               # finishing touch.
-               for c in chunks:
-                       if c[0] == 'mudela' and 'eps' in c[2]:
-                               body = re.sub (r"""\\mudelaepswidth{(.*?)}""", find_eps_dims, c[1])
-                               newchunks.append (('mudela', body))
-                       else:
-                               newchunks.append (c)
-               chunks = newchunks
-               
-       if chunks and chunks[0][0] == 'input':
-               chunks[0] = ('input', completize_preamble (chunks[0][1]))
+def find_eps_dims (match):
+       "Fill in dimensions of EPS files."
+       
+       fn =match.group (1)
+       dims = bounding_box_dimensions (fn)
+
+       return '%ipt' % dims[0]
 
-       return chunks
 
 def system (cmd):
        sys.stderr.write ("invoking `%s'\n" % cmd)
@@ -670,64 +619,42 @@ def compile_all_files (chunks):
        eps = []
        tex = []
        png = []
-       hash_dict = {}
 
        for c in chunks:
                if c[0] <> 'mudela':
                        continue
-               base  = c[3][0]
-               exts = c[3][1:]
+               base  = c[4]
+               exts = c[3]
                for e in exts:
                        if e == 'eps':
                                eps.append (base)
                        elif e == 'tex':
                                tex.append (base + '.ly')
-                       elif e == 'png' and do_pictures:
+                       elif e == 'png' and g_do_pictures:
                                png.append (base)
-
-               if __main__.use_hash:
-                       hash_dict[c[4]] = c[3][0]
-
+       d = os.getcwd()
+       if g_outdir:
+               os.chdir(g_outdir)
        if tex:
                lilyopts = map (lambda x:  '-I ' + x, include_path)
                lilyopts = string.join (lilyopts, ' ' )
                texfiles = string.join (tex, ' ')
                system ('lilypond %s %s' % (lilyopts, texfiles))
-
        for e in eps:
-               if os.environ.has_key('OS') and \
-                   os.environ['OS'] == 'Windows_95':
-                       cmd = r"""ash -c 'tex " \nonstopmode \input %s " ; dvips -E -o %s %s ' """ % \
-                     (e, e + '.eps', e)
-                else:
-                       cmd = r"""tex '\nonstopmode \input %s' ;  dvips -E -o %s %s""" % \
-                     (e, e + '.eps', e)
-               system (cmd)
-
+               system(r"tex '\nonstopmode \input %s'" % e)
+               system(r"dvips -E -o %s %s" % (e + '.eps', e))
        for g in png:
                cmd = r"""gs -sDEVICE=pgm  -dTextAlphaBits=4 -dGraphicsAlphaBits=4  -q -sOutputFile=- -r90 -dNOPAUSE %s -c quit | pnmcrop | pnmtopng > %s"""
-
                cmd = cmd % (g + '.eps', g + '.png')
                system (cmd)
+       if g_outdir:
+               os.chdir(d)
 
-       if __main__.use_hash:
-               name = ''
-               last_name = ''
-               f = 0
-               ks = hash_dict.keys ()
-               ks.sort ()
-               for i in ks:
-                       name = re.sub ("(.*)-[0-9]+\.[0-9]+\.[0-9]+", "\\1", i)
-                       name = name + '.mix'
-                       if name != last_name:
-                               if last_name:
-                                       f.close ()
-                               f = open (name, 'w')
-                               last_name = name
-                       f.write ("%s:%s\n" % (i, hash_dict[i]))
 
-       
 def update_file (body, name):
+       """
+       write the body if it has changed
+       """
        same = 0
        try:
                f = open (name)
@@ -740,12 +667,10 @@ def update_file (body, name):
                f = open (name , 'w')
                f.write (body)
                f.close ()
-
        
        return not same
 
 
-
 def getopt_args (opts):
        "Construct arguments (LONG, SHORT) for getopt from  list of options."
        short = ''
@@ -813,7 +738,7 @@ Options:
 
 Report bugs to bug-gnu-music@gnu.org.
 
-Written by Tom Cato Amundsen <tomcato@xoommail.com> and
+Written by Tom Cato Amundsen <tca@gnu.org> and
 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 """)
 
@@ -821,11 +746,9 @@ Han-Wen Nienhuys <hanwen@cs.uu.nl>
 
 
 def write_deps (fn, target):
-       sys.stdout.write('writing `%s\'\n' % fn)
-
-       f = open (fn, 'w')
-       
-       f.write ('%s%s: ' % (dep_prefix, target))
+       sys.stdout.write('writing `%s\'\n' % os.path.join(g_outdir, fn))
+       f = open (os.path.join(g_outdir, fn), 'w')
+       f.write ('%s%s: ' % (g_dep_prefix, target))
        for d in __main__.read_files:
                f.write ('%s ' %  d)
        f.write ('\n')
@@ -842,6 +765,49 @@ Distributed under terms of the GNU General Public License. It comes with
 NO WARRANTY.
 """)
 
+def do_file(input_filename):
+       file_settings = {}
+       if outname:
+               my_outname = outname
+       else:
+               my_outname = os.path.basename(os.path.splitext(input_filename)[0])
+       my_depname = my_outname + '.dep'                
+
+       chunks = read_doc_file(input_filename)
+       chunks = chop_chunks(chunks, 'mudela', make_mudela)
+       chunks = chop_chunks(chunks, 'mudela-file', make_mudela_file)
+       chunks = chop_chunks(chunks, 'mudela-block', make_mudela_block)
+       chunks = chop_chunks(chunks, 'numcols', do_columns)
+       #for c in chunks: print c, "\n"
+       global_options = scan_preamble(chunks[0][1])
+       chunks = process_mudela_blocks(my_outname, chunks, global_options)
+       # Do It.
+       if __main__.g_run_lilypond:
+               compile_all_files (chunks)
+               newchunks = []
+               # finishing touch.
+               for c in chunks:
+                       if c[0] == 'mudela' and 'eps' in c[2]:
+                               body = re.sub (r"""\\mudelaepswidth{(.*?)}""", find_eps_dims, c[1])
+                               newchunks.append (('mudela', body))
+                       else:
+                               newchunks.append (c)
+               chunks = newchunks
+
+       if chunks and chunks[0][0] == 'input':
+               chunks[0] = ('input', completize_preamble (chunks[0][1]))
+
+       foutn = os.path.join(g_outdir, my_outname + '.' + format)
+       sys.stderr.write ("Writing `%s'\n" % foutn)
+       fout = open (foutn, 'w')
+       for c in chunks:
+               #if c[1] is not None:
+                       fout.write (c[1])
+       fout.close ()
+
+       if do_deps:
+               write_deps (my_depname, foutn)
+
 
 outname = ''
 try:
@@ -873,42 +839,44 @@ for opt in options:
        elif o == '--help' or o == '-h':
                help ()
        elif o == '--no-lily' or o == '-n':
-               __main__.run_lilypond = 0
+               __main__.g_run_lilypond = 0
        elif o == '--dependencies':
                do_deps = 1
+       elif o == '--default-music-fontsize':
+               default_music_fontsize = string.atoi (a)
        elif o == '--default-mudela-fontsize':
+               print "--default-mudela-fontsize is deprecated, use --default-music-fontsize"
                default_music_fontsize = string.atoi (a)
+       elif o == '--force-music-fontsize':
+               g_force_mudela_fontsize = string.atoi(a)
+       elif o == '--force-mudela-fontsize':
+               print "--force-mudela-fontsize is deprecated, use --default-mudela-fontsize"
+               g_force_mudela_fontsize = string.atoi(a)
+
        elif o == '--init':
                initfile =  a
        elif o == '--dep-prefix':
-               dep_prefix = a
+               g_dep_prefix = a
        elif o == '--no-pictures':
-               do_pictures = 0
+               g_do_pictures = 0
+       elif o == '--read-lys':
+               g_read_lys = 1
+       elif o == '--outdir':
+               g_outdir = a
 
 identify()
-
+if g_outdir:
+       if os.path.isfile(g_outdir):
+               error ("outdir is a file: %s" % g_outdir)
+       if not os.path.exists(g_outdir):
+               os.mkdir(g_outdir)
 for input_filename in files:
-       file_settings = {}
-       if outname:
-               my_outname = outname
-       else:
-               my_outname = os.path.basename(os.path.splitext(input_filename)[0])
-       my_depname = my_outname + '.dep'                
-
-       chunks = transform_input_file (input_filename, my_outname)
-
-       foutn = my_outname + '.' + format
-       sys.stderr.write ("Writing `%s'\n" % foutn)
-       fout = open (foutn, 'w')
-       for c in chunks:
-               fout.write (c[1])
-       fout.close ()
-
-       if do_deps:
-               write_deps (my_depname, foutn)
-
+       do_file(input_filename)
+       
 
 
+t2 = time.clock()
+print "Time:", t2-t1
 #
 # Petr, ik zou willen dat ik iets zinvoller deed,
 # maar wat ik kan ik doen, het verandert toch niets?