From: Han-Wen Nienhuys Date: Tue, 8 Aug 2000 14:14:36 +0000 (+0200) Subject: release: 1.3.77 X-Git-Tag: release/1.3.77 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=dcfa22970cd4949748039835b38ed3f508472327;p=lilypond.git release: 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. * 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. --- diff --git a/CHANGES b/CHANGES index 4fcc87ed5b..75f8ff55c0 100644 --- 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 @@ -25,13 +14,19 @@ * 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). diff --git a/Documentation/regression-test.tely b/Documentation/regression-test.tely index e07ea7dfb9..92e800117b 100644 --- a/Documentation/regression-test.tely +++ b/Documentation/regression-test.tely @@ -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 diff --git a/Documentation/user/refman.itely b/Documentation/user/refman.itely index 2ca219cde2..3d98430b1a 100644 --- a/Documentation/user/refman.itely +++ b/Documentation/user/refman.itely @@ -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 04429a4b9e..ea79fa155e 100644 --- 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. diff --git a/aclocal.m4 b/aclocal.m4 index 6bca70dc77..122038c7f7 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -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 index 1fe6454278..0000000000 --- a/input/scarlatti-edited.ly +++ /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 index 0000000000..3638bc3da1 --- /dev/null +++ b/input/scarlatti-test.ly @@ -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 index 2edfa2dbeb..0000000000 --- a/input/test/lyric-phrasing.ly.orig +++ /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 diff --git a/lily/all-font-metrics.cc b/lily/all-font-metrics.cc index 23d709d928..8c286e428d 100644 --- a/lily/all-font-metrics.cc +++ b/lily/all-font-metrics.cc @@ -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); diff --git a/lily/lyric-phrasing-engraver.cc b/lily/lyric-phrasing-engraver.cc index f8e74fce9d..b9a33c0c2b 100644 --- a/lily/lyric-phrasing-engraver.cc +++ b/lily/lyric-phrasing-engraver.cc @@ -11,9 +11,11 @@ #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) diff --git a/lily/moment.cc b/lily/moment.cc index a224da0a1c..da3ed24831 100644 --- a/lily/moment.cc +++ b/lily/moment.cc @@ -11,7 +11,6 @@ #include "lily-guile.hh" #include "moment.hh" #include "warn.hh" - #include "ly-smobs.icc" IMPLEMENT_UNSMOB(Moment,moment); diff --git a/lily/scm-hash.cc b/lily/scm-hash.cc index c6a922d07d..598c64fc20 100644 --- a/lily/scm-hash.cc +++ b/lily/scm-hash.cc @@ -6,10 +6,11 @@ (c) 1999--2000 Han-Wen Nienhuys */ - #include -#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); diff --git a/lily/score-element.cc b/lily/score-element.cc index e1c218d1bf..c39624b53b 100644 --- a/lily/score-element.cc +++ b/lily/score-element.cc @@ -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); diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 4ad037ff7d..5090147999 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -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 diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index 5ec5d04954..8488b4b3a3 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -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 diff --git a/scripts/mudela-book.py b/scripts/mudela-book.py index d82d949dfe..71542b2e39 100644 --- a/scripts/mudela-book.py +++ b/scripts/mudela-book.py @@ -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

- + @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[^}]+)}', - '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.*?)\\end{verbatim}""", + 'verb': r"""\\verb(.)(?P.*?)\1""", + 'mudela-file': r'\\mudelafile(\[(?P.*?)\])?\{(?P.+)}', + 'mudela' : '\\\\mudela(\[(?P.*?)\])?{(?P.*?)}', + 'mudela-block': r"""(?s)\\begin(\[(?P.*?)\])?{mudela}(?P.*?)\\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\\(?Pone|two)column)", }, 'texi': { - 'input': '@mbinclude[ \n\t]+([^\t \n]*)',# disabled - 'include': no_match, + 'include': '@mbinclude[ \n\t]+(?P[^\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@example\s.*?@end example\s)""", + 'verb': r"""@code{(?P.*?)}""", + 'mudela-file': '@mudelafile(\[(?P.*?)\])?{(?P[^}]+)}', + 'mudela' : '@mudela(\[(?P.*?)\])?{(?P.*?)}', + 'mudela-block': r"""(?s)@mudela(\[(?P.*?)\])?\s(?P.*?)@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 and +Written by Tom Cato Amundsen and Han-Wen Nienhuys """) @@ -821,11 +746,9 @@ Han-Wen Nienhuys 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?