]> git.donarmstrong.com Git - lilypond.git/commitdiff
release: 1.3.0 release/1.3.0
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 26 Oct 1999 20:10:16 +0000 (22:10 +0200)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 26 Oct 1999 20:10:16 +0000 (22:10 +0200)
189 files changed:
CHANGES
Documentation/GNUmakefile
Documentation/bibliography/GNUmakefile
Documentation/faq.texi
Documentation/footer.html.in
Documentation/index.texi
Documentation/metadoc/GNUmakefile [deleted file]
Documentation/metadoc/feta20.sty [deleted file]
Documentation/metadoc/fonts.doc [deleted file]
Documentation/metadoc/hacking.texi [deleted file]
Documentation/metadoc/lilypond-overview.doc [deleted file]
Documentation/metadoc/musicnotes.sty [deleted file]
Documentation/metadoc/regression-test.tely [deleted file]
Documentation/misc/CHANGES-1.2 [new file with mode: 0644]
Documentation/misc/GNUmakefile
Documentation/misc/NEWS-1.2
Documentation/misc/NEWS-1.2~ [deleted file]
Documentation/pictures/lelie-icon.xpm [new file with mode: 0644]
Documentation/pictures/lelie-logo.xpm [new file with mode: 0644]
Documentation/pictures/lelie_icon.xpm [deleted file]
Documentation/pictures/lelie_logo.xpm [deleted file]
Documentation/programmer/1086342053.tex [new file with mode: 0644]
Documentation/programmer/GNUmakefile [new file with mode: 0644]
Documentation/programmer/feta20.sty [new file with mode: 0644]
Documentation/programmer/fonts.doc [new file with mode: 0644]
Documentation/programmer/hacking.texi [new file with mode: 0644]
Documentation/programmer/lilypond-overview.doc [new file with mode: 0644]
Documentation/programmer/musicnotes.sty [new file with mode: 0644]
Documentation/programmer/regression-test.tely [new file with mode: 0644]
Documentation/programs.texi
Documentation/topdocs/INSTALL.texi
Documentation/topdocs/README.texi
Documentation/topdocs/index.tely
INSTALL.txt
NEWS
README.txt
TODO
VERSION
buildscripts/set-lily.sh
flower/dstream.cc
flower/include/dstream.hh
flower/include/rational.hh
flower/include/real.hh
flower/include/scalar.hh
flower/include/string.hh
flower/scalar.cc
input/praeludium-fuga-E.ly
input/star-spangled-banner.ly
input/test/beam-cross-staff.ly [new file with mode: 0644]
input/test/beam-interstaff.ly [deleted file]
input/test/embedded-scm.ly [new file with mode: 0644]
input/test/no-stem-extend.fly [new file with mode: 0644]
input/test/slur-cross-staff.ly [new file with mode: 0644]
input/test/slur-interstaff.ly [deleted file]
input/test/uniform-breaking.ly [new file with mode: 0644]
input/twinkle.ly
lib/duration-convert.cc
lib/duration-iter.cc
lib/duration.cc
lib/include/duration-convert.hh
lib/include/duration.hh
lib/include/moment.hh [deleted file]
lib/include/plet.hh
lib/moment.cc [deleted file]
lib/plet.cc
lily/align-note-column-engraver.cc
lily/auto-beam-engraver.cc
lily/bar-engraver.cc
lily/bar-script-engraver.cc
lily/beam-engraver.cc
lily/breathing-sign-engraver.cc
lily/breathing-sign.cc
lily/change-iterator.cc
lily/chord-name-engraver.cc
lily/clef-engraver.cc
lily/column-x-positions.cc
lily/dynamic-engraver.cc
lily/font-size-engraver.cc
lily/gourlay-breaking.cc
lily/grace-position-performer.cc
lily/identifier.cc
lily/includable-lexer.cc
lily/include/clef-engraver.hh
lily/include/global-translator.hh
lily/include/header.hh
lily/include/identifier.hh
lily/include/key.hh
lily/include/lily-guile.hh
lily/include/lily-proto.hh
lily/include/ly-smobs.icc [new file with mode: 0644]
lily/include/ly-symbols.hh
lily/include/midi-stream.hh
lily/include/moment.hh [new file with mode: 0644]
lily/include/music-iterator.hh
lily/include/music-output-def.hh
lily/include/paper-stream.hh
lily/include/property-inspect.hh [new file with mode: 0644]
lily/include/scm-hash.hh [new file with mode: 0644]
lily/include/score-element.hh
lily/include/smobs.hh [new file with mode: 0644]
lily/include/translation-property.hh
lily/include/translator-group.hh
lily/include/translator.hh
lily/key-engraver.cc
lily/lexer.ll
lily/lily-guile.cc
lily/local-key-engraver.cc
lily/local-key-item.cc
lily/lookup.cc
lily/ly-symbols.cc
lily/lyric-engraver.cc
lily/melisma-engraver.cc
lily/moment.cc [new file with mode: 0644]
lily/music-iterator.cc
lily/music-output-def.cc
lily/my-lily-lexer.cc
lily/my-lily-parser.cc
lily/note-heads-engraver.cc
lily/note-performer.cc
lily/paper-def.cc
lily/paper-outputter.cc
lily/paper-score.cc
lily/paper-stream.cc
lily/parser.yy
lily/property-inspect.cc [new file with mode: 0644]
lily/protected-scm.cc
lily/repeat-engraver.cc
lily/rest-engraver.cc
lily/rhythmic-column-engraver.cc
lily/scm-hash.cc [new file with mode: 0644]
lily/scope.cc
lily/score-element.cc
lily/score-engraver.cc
lily/score.cc
lily/scores.cc
lily/script-engraver.cc
lily/separating-line-group-engraver.cc
lily/simultaneous-music-iterator.cc
lily/slur-engraver.cc
lily/slur.cc
lily/staff-margin-engraver.cc
lily/staff-performer.cc
lily/staff-switching-translator.cc [deleted file]
lily/staff-sym-engraver.cc
lily/stem-engraver.cc
lily/stem-info.cc
lily/stem.cc
lily/text-engraver.cc
lily/tie-engraver.cc
lily/time-signature-engraver.cc
lily/time-signature.cc
lily/timing-engraver.cc
lily/timing-translator.cc
lily/translation-property.cc
lily/translator-group.cc
lily/translator.cc
lily/tuplet-engraver.cc
lily/tuplet-spanner.cc
lily/unfolded-repeat-iterator.cc
lily/vertical-align-engraver.cc
ly/accordion-defs.ly
ly/auto-beam-settings.ly
ly/declarations.ly
ly/engraver.ly
ly/nederlands.ly
ly/params.ly
ly/property.ly
ly/script.ly
make/lilypond.spec.in
make/mutopia-targets.make
make/out/lilypond.lsm
make/out/lilypond.spec
mutopia/J.S.Bach/Solo-Cello-Suites/allemande-cello.ly
po/GNUmakefile
scm/lily.scm
scripts/mudela-book.py
stepmake/bin/package-diff.py
stepmake/bin/release.py
stepmake/stepmake/documentation-targets.make
stepmake/stepmake/documentation-vars.make
stepmake/stepmake/generic-targets.make
stepmake/stepmake/metapost-rules.make
stepmake/stepmake/pod-vars.make [new file with mode: 0644]
stepmake/stepmake/texinfo-rules.make
stepmake/stepmake/texinfo-targets.make
stepmake/stepmake/texinfo-vars.make
stepmake/stepmake/yodl-vars.make [new file with mode: 0644]
stepmake/stepmake/yolily-toplevel-targets.make
tex/titledefs.tex

diff --git a/CHANGES b/CHANGES
index 604f59c4aa561ba5f293fc0e3bea1db2c2c39902..661f51cdb554f5c9887c810baa39c4a41d1f9d58 100644 (file)
--- a/CHANGES
+++ b/CHANGES
-pl 15  (Oct 18)
+1.3.0:
 
 
-14.jcn1
-       - Kludge for accented chars (thanks, Mats)
-       - bf: don't fail on error in doco package
-       - doco package: noarch
-       - bf: standchen: mutopia prep
+pl 15.hwn2
+       - loads of bfs.
 
 
-14.hwn1
-       - move some misc stuff into Documentation/misc/
-       - cleanups: slur & beam.
-       - junked Encompass_info
-       - Smobs -- simplifies sc_elt memory management
-       - Timing_engraver collects bar reqs
-       - unfold all if doing MIDI.
-       - bfs: do something sensible if it doesn't fit.
-       - penalties for break stuff supported.
+pl x.jcn3
+       - another workaround: reset buffer state for scm_ftell ()
+       - workaround for broken scm_ftell ()
 
 
-*******
-13.jcn2,3
-       - mutopia/J.S.Bach/Petites-Preludes: bf's and mutopia preraration
-       - separate documentation package
+pl 15.hwn1
+       - \properties are now SCM s, junk Scalar type
+       - use SCM for strings in parser.
+       - Moment derived from Rational. Moment may be smobified.
 
 
-13.hwn2
-       - mutopia: scs2, horn-concerto-3
-       - junked Line_spacer baseclass.
-       - removed gourlay complications
-       - use force iso. energy for minimisation. Add uniformity term
-to demerits.
-
-13.jcn1
-       - bf: mudela-book
-
-*******
-12.jcn1
-       - auto-knees, input/test/auto-knee.ly
-
-pl 12.rrr2
-       - voltaSpannerDuration may be a rational
-       - .ly files corrected, Voice.dynamicDir to Voice.dynamicDirection
-
-pl 12.rrr1
-       - key (K:) with clef, bug fix for abc2ly
-       - voltaSpannerDuration code added to lilypond
-
-pl 12.hwn1
-       - junked wordwrap
-       - bf: use position (not pitch) for autochange
-       - mudela-book fixes: --dependencies, --dep-prefix
-       - mudela.tely more updates.  Now absorbed LilyPond manpage. 
-       - BUGS now in INSTALL.texi
-
-*******
-pl 11.uu1
-       - changed debug init code.
-
-pl 11.jcn2
-       - bf: LDFLAGS=foo CFLAGS=bar ./configure
-       - bf: configure (--disable-printing = default) -DNPRINT
-       - bf: mf-to-xpms / make -C mf xpms; feta-accordion is broken,
-         see mf/README
-
-pl 11.jcn1
-       - gnossiene with new \autochange
-
-pl 11.jbr1
-        - Tried to get rid of path and switch dependencies in mf
-          build process.
-
-pl 11.hwn1
-       - doco reorganisation: folded glossary and tutorial into manual.
-       - move mudela-book-doc to texinfo
-       - feta.tex to mf/
-       - release.py, package-diff.py now dump into out/
-
-
-****
-pl 10.hwn1
-       - Auto_change_music, Auto_change_iterator: auto staff
-switching. 2nd try.  See input/test/auto-change.ly
-
-pl 10.uu1
-       - doc restructure: hacking.texi
-       - make & install .pfas
-       - updates: faq.texi
-       - rpm fixes.
-       - Windows fixes (9.jbr)
-
-******
-pl 9.rrr1
-       - abc2ly bug fixes and extensions
-       - volta spanner given height to avoid collisions
-
-pl 9.jcn2
-       - 2.95 fixes
-       - input/test/different-time-signatures.ly (wasn't this in refman?)
-
-pl 9.hwn1
-       - fixes for mi2mu
-       - bf: staff-side with empty parent.
-       - bf:
-Hara_kiri_vertical_group_spanner::do_substitute_element_pointer has to
-call Axis_group_spanner::do_substitute_element_pointer.  Fixes
-harakiri & barline problem.
-       - junk: Spring_spacer, Ineq_constrained_qp, Mixed_qp,
-Active_constraints, Inactive_iter, Matrix, Vector,
-Choleski_decomposition, Full_storage
-
-
-pl 9.jcn1
-       - included last Localisation.texi
-       - set-lily: de catalog too
-
-*******
-pl 8.hwn1
-       - Erwin Dieterich: german translation.
-       - dependency helper funcs simplified.
-       - junk breaking stats.
-       - cleanups: Line_of_score also is X_AXIS group. Score_columns
-are put into Line_of_score of score.
-
-pl 8.jcn2
-       - scripts/mudela-book.py: use hash of full .ly contents (by default)
-       - bf: footify html doc upon creation too
-
-pl 8.jcn1
-       - Documentation/Localisation.texi: still some issues
-       - Uniformised locale strings
-       - marked some errors/warnings without _/_f markings
-       - added programming_warning (): not to be localised warnings
-         (none identified as yet)
-       - Update of po/nl.po
-
-*******
-pl 7.hwn1
-       - website fixes.
-       - spacer cleanups
-       - Simple_spacer: a simpler constraint solver. Enabled by default.
-pl 7.jcn1
-       - fixes to nl.po
-
-********
-
-pl 6.uu1
-       - website fixes.
-
-*******
-pl 5.hwn1
-       - more .texi; yodl completely removed.
-       - rm'd several doc stuff: engraving.yo, gnu-page.yo, translated blurbs (leave it to translation project)
-       - sm: help2man-*make
-       - mcgrain bib entry.
-       - debian updates.
-       - gcc 2.95 const fixes. (hopefully)
-       - sm: rm'd Documentation/tex/ directory.  everything in stepmake/INSTALL.texi
-
-pl 5.jcn1
-       - lily.scm: don't use regex-substitute/global 
-       - website/doco fixes
-       - bf: package-diff.py
-
-************
-
-pl 4.hwn1
-       - bf: repeats.
-       - bf: mmrests
-       - bf: simpler guile detection.
-       - use texinfo for reference manual.
-       - inline lily.ps from lilypond.
-       - texi for doco: converted directory Documentation/tex/
-
-
-pl 3.hwn1
-       - mudela-book tweaks for surviving texinfo
-       - include feta  command seqs. in .tex 
-       - guile 1.3.2 fixes.
-       - include  config.h directly.
-       - bf: mudela-book.  Now linear in size of document.
-       - scriptHorizontal property; more or less works.
-       - changes in Graphical_element, Graphical_axis_group
-offset removed from public interface, now use relative_coordinate ().
-extent () is given relative to this.
-       - removed Rhythmic_head::dots_i_
-       - bf: Rhythmic_head::do_substitute_element_pointer ()
-       - Direct access to dim_cache_ replaced by methods in
-Graphical_element.
-
-**********
-
-
-pl 2.mk1
-       - bf, tie.cc: handle postbreak left align correctly
-pl 2.lec1
-       - abc2ly fixes.
-
-pl 2.hwn1
-       - rewrite of mudela-book.  Now uses chunks, and you can put
-\input, \include and \mudelagraphics  in verbatim sections. 
-
-
-pl 2.jcn2
-       - bf: auto-beamer: don't junk beam if manual beam shows up
-
-pl 2.jcn1
-       - add-html-footer.py, ls-latex.py .tely updates and fixes
-       - tely (texinfo-lily) rules and test Documentation/metadoc/foo.tely
-
-*************
-
-pl 1.uu2
-       - complete rewrite of mudela-book. Much cleaner now.
-Support for texinfo.
-       - convert-mudela now per file, add \version if not present.
-
-pl 1.uu1.jcn1
-       - internationalization fixes for getopt-long help
-
-pl 1.uu1
-       - rewrite --help messages for help2man:
-       * lilypond
-       * mi2mu
-       * mudela-book
-       * convert-mudela
-       - cleanup: mf-to-table.py
-       - Getopt_long: support for --help msg.
-
-pl 1.mb1
-       - bf, scalar.cc: ".3" now detected as numerical
-
-********
-       
-pl 0.uu1
-       - refman updates by Werner & Mats
-       - now use ChangeLog for changes.
-       
-pl 0.jcn2
-       - po fixes
-
-pl 0.jcn1
-       - gcc-2.95 nitpicks
-       - added pointers to mailing lists in toplevel docs
-
-0.mb2
-       - configure: more robust detection of Guile
-       - Midi_note_off: revert to fixed note-off velocity. Fixes
-         problem with notes that never stop.
-       - Decreased breakable_column_space_strength
-       - Added a few TODO
-       - bf: "harmonic" and "cross" note heads also for half and 
-         whole notes.
-       - linewidth and textheight set independent of the font size.
-       - bf, titledefs.tex: opus and piece are not repeated for 
-         every piece unless they are explicitly set again.
-
-0.mb1
-       - Changed dynamicDir to dynamicDirection.
-       - refman and tutorial corrections.
+pl 15.jcn4
+       - direct #... to scm parser  (Thanks to Gary Houston)
index 1d6e86f54e0207151fe53ead4204fc2a9db8a60d..b3fda3a8218aafd20d75470be342b133b64533f3 100644 (file)
@@ -1,10 +1,10 @@
 depth = ..
 
 NAME = documentation
 depth = ..
 
 NAME = documentation
-SUBDIRS= user metadoc bibliography pictures topdocs ntweb misc
+SUBDIRS= user programmer bibliography pictures topdocs ntweb misc
 STEPMAKE_TEMPLATES=documentation  texinfo
 
 STEPMAKE_TEMPLATES=documentation  texinfo
 
-README_TOP_FILES=NEWS DEDICATION CHANGES
+README_TOP_FILES=NEWS DEDICATION CHANGES TODO
 EXTRA_DIST_FILES = 
 
 include $(depth)/make/stepmake.make 
 EXTRA_DIST_FILES = 
 
 include $(depth)/make/stepmake.make 
index 899251880a0319ced1b970e95067b7dd1d88d5d2..ca0c7ae4a4beeb41bec90cf85921cccb09351d81 100644 (file)
@@ -2,23 +2,9 @@
 
 depth=../..
 
 
 depth=../..
 
-DATA_FILES = $(wildcard *.data)
-datafiles = $(addprefix $(outdir)/,$(DATA_FILES:.data=.html))
-TEX_FILES = $(wildcard *.tex)
-DOC_FILES = $(wildcard *.doc)
-DVI_FILES = $(addprefix $(outdir)/,$(DOC_FILES:.doc=.dvi) $(YO_FILES:.yo=.dvi))
 OUT_BIB_FILES = $(addprefix $(outdir)/, $(BIB_FILES))
 OUT_BIB_FILES = $(addprefix $(outdir)/, $(BIB_FILES))
-
-# just include me
-YO_URG_FILES = $(wildcard *.yo-urg)
-
-OUTTEX_FILES = $(addprefix $(outdir)/, $(TEX_FILES))
-OUTDOC_FILES = $(addprefix $(outdir)/, $(DOC_FILES))
-EL_FILES = $(wildcard *.el)
 BIB_FILES= $(wildcard *.bib)
 BIB_FILES= $(wildcard *.bib)
-EXTRA_DIST_FILES= $(BIB_FILES) $(DOC_FILES) $(DATA_FILES) $(EL_FILES) $(YO_URG_FILES) $(TEX_FILES) $(wildcard *.sty) 
-HTML_FILES = $(addprefix $(outdir)/, $(YO_FILES:.yo=.html))
-PS_FILES = $(DVI_FILES:.dvi=.ps)
+EXTRA_DIST_FILES= $(BIB_FILES)
 
 STEPMAKE_TEMPLATES=tex documentation
 LOCALSTEPMAKE_TEMPLATES=lilypond mudela
 
 STEPMAKE_TEMPLATES=tex documentation
 LOCALSTEPMAKE_TEMPLATES=lilypond mudela
@@ -26,12 +12,7 @@ LOCALSTEPMAKE_TEMPLATES=lilypond mudela
 export BIBINPUTS:=$(shell pwd)//$(PATHSEP)$(BIBINPUTS)
 include $(depth)/make/stepmake.make 
 
 export BIBINPUTS:=$(shell pwd)//$(PATHSEP)$(BIBINPUTS)
 include $(depth)/make/stepmake.make 
 
-
-
-
-
-
-dvi: $(OUT_BIB_FILES) $(DVI_FILES)
+dvi: $(DVI_FILES) $(OUT_BIB_FILES)
 
 ps: $(PS_FILES)
 
 
 ps: $(PS_FILES)
 
@@ -41,18 +22,7 @@ default:
 GENHTMLS = engraving colorado  computer-notation
 OUTGENHTMLS = $(addprefix $(outdir)/, $(GENHTMLS:%=%.html))
 
 GENHTMLS = engraving colorado  computer-notation
 OUTGENHTMLS = $(addprefix $(outdir)/, $(GENHTMLS:%=%.html))
 
-#urg should generalise and move Lilypond -> StepMake
-# URG.  Lilypond specific. Move out. 
-$(outdir)/%.html: %.data $(depth)/VERSION
-       $(PYTHON) $(step-bindir)/table-to-html.py --columns=7 --linesep='\r' -o $@ $<
-       $(PYTHON) $(step-bindir)/add-html-footer.py  $@
-
-$(outdir)/%.tex: %.data $(depth)/VERSION
-       $(PYTHON) $(step-bindir)/table-to-html.py --columns=7 --linesep='\r'  -o $@ --latex $<
-
-
-
-local-WWW: $(HTML_FILES) $(OUTTEX_FILES:.tex=.ps.gz) $(OUTYO_FILES:.yo=.latex) $(OUTYO_FILES:.yo=.ps.gz) $(addprefix $(outdir)/, $(BIB_FILES:.bib=.html)) $(datafiles)
+local-WWW: $(addprefix $(outdir)/, $(BIB_FILES:.bib=.html))
        $(PYTHON) $(step-bindir)/ls-latex.py  --title 'References on Music Notation' \
          $(YO_FILES) $(OUTYO_FILES:.yo=.latex) $(BIB_FILES) $(DOC_FILES) $(TEX_FILES) \
          | sed "s!$(outdir)/!!g" > $(outdir)/index.html
        $(PYTHON) $(step-bindir)/ls-latex.py  --title 'References on Music Notation' \
          $(YO_FILES) $(OUTYO_FILES:.yo=.latex) $(BIB_FILES) $(DOC_FILES) $(TEX_FILES) \
          | sed "s!$(outdir)/!!g" > $(outdir)/index.html
@@ -63,12 +33,7 @@ $(outdir)/%.bib: %.bib
 # ignore result since bib2html is nonstandard. Errors would halt the RPM build.j  
 $(outdir)/%.html: %.bib
        -bib2html $< $@
 # ignore result since bib2html is nonstandard. Errors would halt the RPM build.j  
 $(outdir)/%.html: %.bib
        -bib2html $< $@
+#      $(footify) $@
 
 
-# Yeah right: 
-# make -k out/mudela.dvi => cp -f out/vocabulary.tex out/mudela.dvi
-
-#out/%: $(outdir)/%
-#      cp -f $< $@
-
-locamlclean:
+localclean:
        rm -f fonts.aux fonts.log feta*.tfm feta*.*pk
        rm -f fonts.aux fonts.log feta*.tfm feta*.*pk
index da64d5cc5203e08226d9a6bfa8c11d3310c14c4a..b8dbb3078733437846b97c937f21c8c4292b1709 100644 (file)
@@ -77,7 +77,7 @@ yourself:
 
 @subsubsection Some of your neat scripts fail, what directories do you use:
 
 
 @subsubsection Some of your neat scripts fail, what directories do you use:
 
-[This only applies if you don't do @code{make install}, and develop out
+[This only applies if you don't do @code{make install}, and run out
 of the source directory]
 
 I have a directory which contains all our development projects
 of the source directory]
 
 I have a directory which contains all our development projects
@@ -100,16 +100,13 @@ which looks like @file{/usr/}
  
 @end example 
 
  
 @end example 
 
-
-       
-
-~/usr/src/bin is in the PATH, and contains symbolic links to the
-compiled executables.
+@file{~/usr/src/bin/} is in the variable PATH, and contains symbolic
+links to the compiled executables.
 
 @subsubsection Is there an emacs mode?
 
 Yes.  It is included with the source archive as mudela-mode.el.  If
 
 @subsubsection Is there an emacs mode?
 
 Yes.  It is included with the source archive as mudela-mode.el.  If
-you have an rpm it is in /usr/doc/lilypond-X/.  You have to install it
+you have an rpm it is in @file{/usr/doc/lilypond-X/}.  You have to install it
 yourself.
 
 @subsubsection How do I create the @file{.tfm} files?
 yourself.
 
 @subsubsection How do I create the @file{.tfm} files?
@@ -124,12 +121,12 @@ be used by LilyPond, not by any other programs.
 
 @subsubsection Why is the documentation/website/etc. so lousy?
 
 
 @subsubsection Why is the documentation/website/etc. so lousy?
 
-LilyPond development is moving quite fast, documentation will often
-lag a bit behind.  We must always make a choice between writing more
-doco, writing more code and answering email.
+LilyPond development is moving quite fast, documentation will often lag
+a bit behind.  We must always make a choice between writing more
+documentation, writing HTML, writing more code and answering email.
 
 
-If you think you can make a correction, or devised a solution that 
-should be documented, please do so and send in a patch.
+If you think you can make a correction, or devised a solution that
+should be documented, please write it up, and us a diff.
 
 @node Language- mudela, Do you support -, Documentation, FAQ - GNU LilyPond FAQs
 @section Language: mudela
 
 @node Language- mudela, Do you support -, Documentation, FAQ - GNU LilyPond FAQs
 @section Language: mudela
@@ -195,20 +192,20 @@ notation.  We would welcome anyone who could give this a try.
 
 @subsubsection Do you support TAB notation?
 
 
 @subsubsection Do you support TAB notation?
 
-No. The same as for the previous subsubsection goes, but TAB is a lot
-more work than diagrams (TAB needs modification of Parser, Lexer,
-Staff, Notehead, Stem code and all the code that creates these graphic
-elements.)
+No. The same as for the previous subsubsection goes.
+
 
 @subsubsection Do you support multiple staff-sizes?
 
 
 @subsubsection Do you support multiple staff-sizes?
 
-Yes.  At this time you can choose between 11, 13, 16, 19, 20, 23 and
-20 pt staff-size.  Use the staffLineLeading property for setting the
-size of the staff, and fontSize for setting the size of the glyphs.
+Yes.  At this time you can choose between 11, 13, 16, 19, 20, 23 and 20
+pt staff-size.  Use the @code{staffLineLeading} property for setting the
+size of the staff, and @code{fontSize} for setting the size of the
+glyphs.
 
 @subsubsection Do you support Gregorian chant notation?
 
 
 @subsubsection Do you support Gregorian chant notation?
 
-No.  Go ahead.
+No.
+
 
 @subsubsection Do you support grace notes?
 
 
 @subsubsection Do you support grace notes?
 
@@ -318,38 +315,34 @@ to get a bit less frivolous tagging.
 
 @subsubsection Could you implement feature XXXX? It is really easy, just extend the syntax to allow YYYY!
 
 
 @subsubsection Could you implement feature XXXX? It is really easy, just extend the syntax to allow YYYY!
 
-If it is reasonable, I'll add XXXX to the TODO list. In general
-finding a cute syntax (such as YYYY) isn't very hard. The complicated
-issue how to adapt the internals to do XXXX. The parser is really a
-simple front end to the complicated internals. 
+In general finding a cute syntax (such as YYYY) isn't very hard. The
+complicated issue how to adapt the internals to do XXXX. The parser is
+really a simple front end to the complicated internals.
 
 @subsubsection Can I join in on LilyPond development?  How do I do this?
 
 
 @subsubsection Can I join in on LilyPond development?  How do I do this?
 
-LilyPond development is open for anyone who wants to join.  We do
-frequent releases, you are welcome to send in a patch or do suggestions.
-Join the gnu-music-discuss mailing list to participate.
+Yes, we do frequent releases, you are welcome to send in a patch or do
+suggestions.  Join the list @email{gnu-music-discuss@@gnu.org} to
+participate.
 
 
 
 
-@subsubsection I want to implement XXXX!  Should I do this?
-
-Yes.
-
-But since there might be better ways of doing XXXX, so it's a good thing to
-ask about this before you start hacking.  If you want to keep in touch
-with current developments, you should subscribe to the mailing list
-
 @subsubsection Is there a GUI frontend?  Should I start building one?
 
 @subsubsection Is there a GUI frontend?  Should I start building one?
 
-LilyPond currently has no graphical interface.  The authors seriously
-doubt if a simple-minded approach (dragging and dropping notes) is any
-easier or quicker to use than mudela.  But for composing a graphical
-environment probably is indispensable.
+LilyPond currently has no graphical interface.  We (LilyPond authors)
+don't feel the need to write a GUI, but several others do:
 
 Matthew Hiller has extended Midiscore and Koobase to handle mudela.
 
 Matthew Hiller has extended Midiscore and Koobase to handle mudela.
-Check out @uref{http://zoo.cs.yale.edu/~meh25/}.
+Check out @uref{http://zoo.cs.yale.edu/~meh25/}.  He is now working on
+`Denemo', a GTK based notation program (which is still being developed).
 
 
-If you want to work on this, please send e-mail to the mailing list
-@email{gnu-music-discuss@@gnu.org}.
+Federico Mena-Quintero and Elliot Lee of RedHat Advanced Development
+labs have plans to write a GNOME based Music notation program. However,
+there is no code, only plans.
+
+Chris Cannam is working a rewrite of Rosegarden.  The new design should
+be more modular, and could conceivably be used to output
+mudela. However, the not much seems to have happened the past year. See
+@uref{http://www.all-day-breakfast.com/rosegarden/development.html}.
 
 
 @subsubsection I want to implement XXXX!  How should I do this?
 
 
 @subsubsection I want to implement XXXX!  How should I do this?
@@ -360,32 +353,20 @@ Your best bet of getting us to include code, is to present it as a
 Please use the diff command to generate a patch, and don't send complete
 files, even if the diff is larger than the whole file.
 
 Please use the diff command to generate a patch, and don't send complete
 files, even if the diff is larger than the whole file.
 
-Don't forget to put your name and e-mail address
-in the @file{AUTHORS.pod} file, or you won't get credits :-]
+Don't forget to put your name and e-mail address in the file
+@file{Documentation/topdocs/AUTHORS.texi}, or you won't get credits
+:-)
 
 
 @subsubsection Your make system does not adhere to GNU coding standards, could you please fix it?
 
 No.  We have evaluated the standard GNU combination for compiling
 
 
 @subsubsection Your make system does not adhere to GNU coding standards, could you please fix it?
 
 No.  We have evaluated the standard GNU combination for compiling
-programs (autoconf, automake, libtool) and found to be inadequate in
-several respects.  More detailed argumentation is included with
-LilyPond's generic make package @code{StepMake} 
-(see @file{stepmake-x.x.x/Documentation/automake.urgh})
-
-LilyPond already compiles into a different directory ((the different
-directory is called out/, there is one in every source directory).
-make distclean essentially reduces to @file{rm -f out/*} in every directory
+programs (autoconf, automake, libtool) and found to be inadequate for
+our needs.
 
 @subsubsection gdb crashes when I debug!
 
 
 @subsubsection gdb crashes when I debug!
 
-Upgrade to 4.17.
-
-@subsubsection Why do I need g++ >= 2.8 / EGCS-1.1 ?
-
-Supporting more compilers than EGCS/G++ 2.8 is unlikely to make
-LilyPond run on more platforms.  It would give us an enormous headache
-in detecting and catering for every variant of every compiler: not
-having to support other compilers saves us a @emph{lot} of trouble.
+Upgrade/downgrade to 4.17.
 
 @node Running, Copyright, Development, FAQ - GNU LilyPond FAQs
 @section Running
 
 @node Running, Copyright, Development, FAQ - GNU LilyPond FAQs
 @section Running
@@ -466,24 +447,6 @@ output, use TeX and @code{dvips}.
 The beams and slurs are done in PostScript.  XDvi doesn't show
 PostScript in the magnifying glass.  Complain to the XDvi maintainers.
 
 The beams and slurs are done in PostScript.  XDvi doesn't show
 PostScript in the magnifying glass.  Complain to the XDvi maintainers.
 
-@subsubsection I don't get midi-output, even if I use @strong{-m}!
-
-Your \score should include a \midi block, eg.
-@example 
-
-       \score @{
-               \melodic @{ c4 c g g @}
-               \paper @{@}     
-               \midi @{
-                       output = "myfile.midi";
-                       \tempo 4=70;
-               @}
-       @}
-@end example 
-
-The @strong{-m} option was added to LilyPond to suppress paper output,
-because processing the \paper block is so slow.
 
 @subsubsection A lot of musical stuff doesn't make it to the MIDI file, eg.  dynamics, articulation, etc.
 
 
 @subsubsection A lot of musical stuff doesn't make it to the MIDI file, eg.  dynamics, articulation, etc.
 
index 4b99be2c585861054cf3daa34abff02c5dc24efd..50bcaf5b2d0a30fed5803ed7cfa6bc1e5ff92618 100644 (file)
@@ -11,7 +11,7 @@ footer substitutions:
  * ENV:WEBMASTER,
  * ENV:WEBMASTER
 
  * ENV:WEBMASTER,
  * ENV:WEBMASTER
 
->
+-->
 
 <hr>
 Go <a href=%s>back</a> to index of LilyPond.
 
 <hr>
 Go <a href=%s>back</a> to index of LilyPond.
@@ -23,7 +23,7 @@ Please send GNU LilyPond questions and comments to
 <em>gnu-music-discuss@gnu.org</em></a>.
 <p>
 
 <em>gnu-music-discuss@gnu.org</em></a>.
 <p>
 
-<!-- package %s %s >
+<!-- package %s %s -->
 
 Please send comments on these web pages to 
 <a href="mailto:%s"><em>%s</em></a>
 
 Please send comments on these web pages to 
 <a href="mailto:%s"><em>%s</em></a>
index 31afd58918931e48a4ca9f5b611d19b8aa72a262..0187a0a409b5249d063ee4b0336228646a3f0917 100644 (file)
 @item @uref{faq.html,Frequently asked questions}, with answers
 @item @uref{programs.html,`Manual pages'}
 @item @uref{../user/out-www/index.html,User documentation}
 @item @uref{faq.html,Frequently asked questions}, with answers
 @item @uref{programs.html,`Manual pages'}
 @item @uref{../user/out-www/index.html,User documentation}
-@item @uref{../metadoc/out-www/index.html,Hacker documentation}
-@item @uref{../bibliography/out-www/,Bibliography}
+@item @uref{../programmer/out-www/index.html,Programmer's documentation}
+@item @uref{../bibliography/out-www/index.html,Bibliography}
 @item @uref{../misc/out-www/index.html,Miscellaneous texts}
 @end itemize
 
 
 @item @uref{../misc/out-www/index.html,Miscellaneous texts}
 @end itemize
 
 
-@unnumberedsubsec{Status}
+@unnumberedsubsec Status
+
 @itemize
 @item @uref{TODO.txt, Thing to do}
 @item @uref{CHANGES.txt, Things recently done}
 @itemize
 @item @uref{TODO.txt, Thing to do}
 @item @uref{CHANGES.txt, Things recently done}
@@ -43,7 +44,8 @@
 @unnumberedsubsec Logo:
 @itemize
 @item @uref{../pictures/out-www/lelieblond.png,  logo} in large size
 @unnumberedsubsec Logo:
 @itemize
 @item @uref{../pictures/out-www/lelieblond.png,  logo} in large size
-@item @uref{../pictures/out-www/lelie_logo.png, logo} in medium size
+@item @uref{../pictures/out-www/lelie-logo.png, logo} in medium size
+@item @uref{../pictures/out-www/lelie-icon.png, logo} in small size
 @end itemize
 
 @bye
 @end itemize
 
 @bye
diff --git a/Documentation/metadoc/GNUmakefile b/Documentation/metadoc/GNUmakefile
deleted file mode 100644 (file)
index 25b42ee..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-# Documentation/tex/Makefile
-
-depth=../..
-
-TEX_FILES = $(wildcard *.tex)
-DOC_FILES = $(wildcard *.doc)
-DVI_FILES = $(addprefix $(outdir)/,$(DOC_FILES:.doc=.dvi)  $(TELY_FILES:.tely=.dvi))
-
-OUTTEX_FILES = $(addprefix $(outdir)/, $(TEX_FILES))
-OUTDOC_FILES = $(addprefix $(outdir)/, $(DOC_FILES))
-
-EXTRA_DIST_FILES= $(DOC_FILES) $(TEX_FILES) $(wildcard *.sty) 
-HTML_FILES = $(addprefix $(outdir)/,  $(TEXI_FILES:.texi=.html) $(TELY_FILES:.tely=.html))
-PS_FILES = $(DVI_FILES:.dvi=.ps)
-
-STEPMAKE_TEMPLATES=tex documentation texinfo
-LOCALSTEPMAKE_TEMPLATES=lilypond mudela
-
-export BIBINPUTS:=$(shell pwd)//$(PATHSEP)$(BIBINPUTS)
-include $(depth)/make/stepmake.make 
-
-dvi: $(DVI_FILES)
-
-ps: $(PS_FILES)
-
-# urg
-default:
-
-
-localclean:
-       rm -f fonts.aux fonts.log feta*.tfm feta*.*pk
-
-local-WWW: $(HTML_FILES)
-       $(PYTHON) $(step-bindir)/ls-latex.py --title 'Hacker documentation' \
-          $(DOC_FILES) $(TEXI_FILES) $(TELY_FILES) \
-         | sed "s!$(outdir)/!!g" > $(outdir)/index.html
diff --git a/Documentation/metadoc/feta20.sty b/Documentation/metadoc/feta20.sty
deleted file mode 100644 (file)
index 0dbfcf9..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-% Creator: mf-to-table.py version 0.7
-% Automatically generated on
-% Do not edit
-% input from out/feta20.log
-% name
-% rests
-\fetdef\wholerest{0}
-\fetdef\halfrest{1}
-\fetdef\outsidewholerest{2}
-\fetdef\outsidehalfrest{3}
-\fetdef\breverest{4}
-\fetdef\longarest{5}
-\fetdef\multirest{6}
-\fetdef\quartrest{7}
-\fetdef\eighthrest{8}
-\fetdef\sixteenthrest{9}
-\fetdef\thirtysecondrest{10}
-\fetdef\sixtyfourthrest{11}
-\fetdef\hundredtwentyeighthrest{12}
-
-% accidentals
-\fetdef\sharp{13}
-\fetdef\natural{14}
-\fetdef\flat{15}
-\fetdef\flatflat{16}
-\fetdef\sharpsharp{17}
-\fetdef\rightparen{18}
-\fetdef\leftparen{19}
-
-% dots
-\fetdef\dot{20}
-\fetdef\repeatcolon{21}
-
-% balls
-\fetdef\brevisball{22}
-\fetdef\brevisledger{23}
-\fetdef\longaball{24}
-\fetdef\longaledger{25}
-\fetdef\wholeball{26}
-\fetdef\wholeledger{27}
-\fetdef\halfball{28}
-\fetdef\halfledger{29}
-\fetdef\quartball{30}
-\fetdef\quartledger{31}
-
-% scripts
-\fetdef\ufermata{32}
-\fetdef\dfermata{33}
-\fetdef\thumb{34}
-\fetdef\sforzatoaccent{35}
-\fetdef\staccato{36}
-\fetdef\ustaccatissimo{37}
-\fetdef\dstaccatissimo{38}
-\fetdef\tenuto{39}
-\fetdef\umarcato{40}
-\fetdef\dmarcato{41}
-\fetdef\ouvert{42}
-\fetdef\plusstop{43}
-\fetdef\upbow{44}
-\fetdef\downbow{45}
-\fetdef\reverseturn{46}
-\fetdef\turn{47}
-\fetdef\trill{48}
-\fetdef\upedalheel{49}
-\fetdef\dpedalheel{50}
-\fetdef\upedaltoe{51}
-\fetdef\dpedaltoe{52}
-\fetdef\flageolet{53}
-\fetdef\trilelement{54}
-\fetdef\prall{55}
-\fetdef\mordent{56}
-\fetdef\prallprall{57}
-\fetdef\prallmordent{58}
-\fetdef\upprall{59}
-\fetdef\downprall{60}
-\fetdef\accDiscant{61}
-\fetdef\accDiscantF{62}
-\fetdef\accDiscantEh{63}
-\fetdef\accDiscantE{64}
-\fetdef\accDiscantFE{65}
-\fetdef\accDiscantFEh{66}
-\fetdef\accDiscantEE{67}
-\fetdef\accDiscantFEE{68}
-\fetdef\accDiscantEEE{69}
-\fetdef\accDiscantFEEE{70}
-\fetdef\accDiscantS{71}
-\fetdef\accDiscantFS{72}
-\fetdef\accDiscantES{73}
-\fetdef\accDiscantEhS{74}
-\fetdef\accDiscantFES{75}
-\fetdef\accDiscantFEhS{76}
-\fetdef\accDiscantEES{77}
-\fetdef\accDiscantFEES{78}
-\fetdef\accDiscantEEES{79}
-\fetdef\accDiscantFEEES{80}
-\fetdef\accDiscantSS{81}
-\fetdef\accDiscantESS{82}
-\fetdef\accDiscantEESS{83}
-\fetdef\accDiscantEEESS{84}
-\fetdef\accFreebass{85}
-\fetdef\accFreebassF{86}
-\fetdef\accFreebassE{87}
-\fetdef\accFreebassFE{88}
-\fetdef\accStdbass{89}
-\fetdef\accStdbassM{90}
-\fetdef\accStdbassBp{91}
-\fetdef\accStdbassT{92}
-\fetdef\accStdbassTp{93}
-\fetdef\accBayanbass{94}
-\fetdef\accBayanbassT{95}
-\fetdef\accBayanbassE{96}
-\fetdef\accBayanbassTE{97}
-\fetdef\accBayanbassEE{98}
-\fetdef\accBayanbassTEE{99}
-\fetdef\accSB{100}
-\fetdef\accBB{101}
-\fetdef\accOldEE{102}
-\fetdef\accOldEES{103}
-
-% flags
-\fetdef\eighthflag{104}
-\fetdef\sixteenthflag{105}
-\fetdef\thirtysecondflag{106}
-\fetdef\sixtyfourthflag{107}
-\fetdef\deighthflag{108}
-\fetdef\dsixteenthflag{109}
-\fetdef\dthirtysecondflag{110}
-\fetdef\dsixtyfourthflag{111}
-
-% clefs
-\fetdef\altoclef{112}
-\fetdef\caltoclef{113}
-\fetdef\bassclef{114}
-\fetdef\cbassclef{115}
-\fetdef\trebleclef{116}
-\fetdef\ctrebleclef{117}
-
-% timesig
-\fetdef\fourfourmeter{118}
-\fetdef\allabreve{119}
-\fetdef\oldfourfourmeter{120}
-\fetdef\oldallabreve{121}
-\fetdef\oldthreetwometer{122}
-\fetdef\oldsixfourmeter{123}
-\fetdef\oldninefourmeter{124}
-
diff --git a/Documentation/metadoc/fonts.doc b/Documentation/metadoc/fonts.doc
deleted file mode 100644 (file)
index 287dde4..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-
-                                % -*-LaTeX-*-
-
-\documentclass{article}
-\def\kdots{,\ldots,}
-\title{Not the Font-En-Tja font}
-\author{HWN \& JCN} 
-\def\preMudelaExample{}
-\def\postMudelaExample{}
-\begin{document}
-\maketitle
-
-
-\section{Introduction}
-
-This document are some design notes of the Feta font, and other
-symbols related to LilyPond.  Feta (not an abbreviation of
-Font-En-Tja) is a font of music symbols.  All MetaFont sources are
-original.  The symbols are modelled after various editions of music,
-notably \begin{itemize} \item B\"arenreiter \item Hofmeister \item
-Breitkopf \item Durand \& C'ie \end{itemize}
-
-The best references on Music engraving are Wanske\cite{wanske} and
-Ross\cite{ross} some of their insights were used.  Although it is a
-matter of taste, I'd say that B\"arenreiter has the finest typography
-of all.
-
-
-\section{Bezier curves for slurs}
-
-Objective:  slurs in music are curved objects designating that notes
-should fluently bound.  They are drawn as smooth curves, with their
-center thicker and the endings tapered.
-
-There are some variants: the simplest slur shape only has the width as
-parameter.  Then we give some suggestions for tuning the shapes.  The
-simple slur algorithm is used for drawing ties as well.
-
-
-
-\subsection{Simple slurs}
-
-Long slurs are flat, whereas short slurs look like small circle arcs.
-Details are given in Wanske\cite{ross} and Ross\cite{wanske}.  The
-shape of a slur can be given as a Bezier curve with four control
-points:
-
-\begin{eqnarray*}
-  B(t) &=& (1-t)^3c_1 +3(1-t)^2tc_2 + 3(1-t)t^2c_3 + t^3c_4.
-\end{eqnarray*}
-
-We will assume that the slur connects two notes of the same
-pitch.  Different slurs can be created by rotating the derived shape.
-We will also assume that the slur has a vertical axis of symmetry
-through its center.  The left point will be the origin.     So we have
-the following equations for the control points $c_1\kdots c_4$.
-
-\begin{eqnarray*}
-c_1&=& (0,0)\\
-c_2&=& (i, h)\\
-c_3&=& (b-i, h)\\
-c_4&=& (b, 0)
-\end{eqnarray*}
-
-The quantity $b$ is given, it is the width of the slur.  The
-conditions on the shape of the slur for small and large $b$ transform
-to
-\begin{eqnarray*}
- h \to h_{\infty} , &&\quad b \to \infty\\
- h \approx r_{0} b, &&\quad b \to 0.
-\end{eqnarray*}
-To tackle  this, we  will  assume that $h   = F(b)$, for  some kind of
-$F(\cdot)$.  One function that satisfies the above conditions is
-$$
-F(b) = h_{\infty} \frac{2}{\pi} \arctan \left( \frac{\pi r_0}{2
-h_{\infty}} b \right).
-$$
-
-For satisfying results we choose $h_{\infty} = 2\cdot \texttt{interline}$
-and $r_0 = \frac 13$.
-
-\subsection{Height correction}
-
-Aside from being a smooth curve, slurs should avoid crossing
-enclosed notes and their stems.
-
-An easy way to achieve this is to extend the slur's height,
-so that the slur will curve just above any disturbing notes.
-
-The parameter $i$ determines the flatness of the curve.  Satisfying
-results have been obtained with $i = h$.
-
-The formula can be generalised to allow for corrections in the shape, 
-\begin{eqnarray*}
-c_1&=& (0,0)\\
-c_2&=& (i', h')\\
-c_3&=& (b-i', h')\\
-c_4&=& (b, 0)
-\end{eqnarray*}
-Where
-$$
-i' = h(b) (1 + i_{corr}), \quad h' = h(b) (1 + h_{corr}).
-$$
-
-The default values for these corrections are $0$.  A $h_{corr}$ that is
-negative, makes the curve flatter in the center.  A $h_{corr}$ that is
-positive make the curve higher. 
-
-At every encompassed note's x position the difference $\delta _y$ 
-between the slur's height and the note is calculated.  The greatest 
-$\delta _y$ is used to calculate $h_{corr}$ is by lineair extrapolation.
-
-However, this simple method produces satisfactory results only for 
-small and symmetric disturbances.
-
-
-\subsection{Tangent method correction}
-
-A somewhat more elaborate\footnote{While staying in the realm 
-of empiric computer science} way of having a slur avoid 
-disturbing notes is by first defining the slur's ideal shape 
-and then using the height correction.  The ideal shape of a 
-slur can be guessed by calculating the tangents of the disturbing 
-notes:
-% a picture wouldn't hurt...
-\begin{eqnarray*}
-  y_{disturb,l} &=& \rm{rc}_l x\\
-  y_{disturb,r} &=& \rm{rc}_r + c_{3,x},
-\end{eqnarray*}
-where
-\begin{eqnarray*}
-  \rm{rc}_l &=& \frac{y_{disturb,l} - y_{encompass,1}}
-    {x_{disturb,l} - x_{encompass,1}}\dot x\\
-  \rm{rc}_r &=& \frac{y_{encompass,n} - y_{disturb,r}}
-    {x_{encompass,n} - x_{disturb,r}} \dot x + c_{3,x}.
-\end{eqnarray*}
-
-We assume that having the control points $c_2$ and $c_3$ located 
-on tangent$_1$ and tangent$_2$ resp. 
-% t: tangent
-\begin{eqnarray*}
-  y_{tangent,l} &=& \alpha \rm{rc}_l x\\
-  y_{tangent,r} &=& \alpha \rm{rc}_r + c_{3,x}.
-\end{eqnarray*}
-
-Beautiful slurs have rather strong curvature at the extreme
-control points.  That's why we'll have $\alpha > 1$.
-Satisfactory resulsts have been obtained with
-$$
-  \alpha \approx 2.4.
-$$
-
-The positions of control points $c_2$ and $c_3$ are obtained
-by solving with the height-line
-\begin{eqnarray*}
-  y_h &=& \rm{rc}_h + c_h.
-\end{eqnarray*}
-
-The top-line runs through the points disturb$_{left}$ and
-disturb$_{right}$.  In the case that 
-$$
-z_{disturb,l} = z_{disturb,r},
-$$
-we'll have 
-$$
-  \angle(y_{tangent,l},y_h) = \angle(y_{tangent,r},y_h).
-$$
-
-
-
-\section{Sizes}
-
-Traditional engraving uses a set of 9 standardised sizes for Staffs
-(running from 0 to 8).  
-
-We have tried to measure these (helped by a magnifying glass), and
-found the staffsizes in  table~\ref{fonts:staff-size}.  One should note that
-these are estimates, so I think there could be a measuring error of ~
-.5 pt.  Moreover [Ross] states that not all engravers use exactly
-those sizes.
-
-\begin{table}[h]
-  \begin{center}
-    \begin{tabular}{lll}
-Staffsize       &Numbers                &Name\\
-\hline\\
-26.2pt  &No. 0\\
-22.6pt  &No. 1          &Giant/English\\
-21.3pt  &No. 2          &Giant/English\\
-19.9pt  &No. 3          &Regular, Ordinary, Common\\
-19.1pt  &No. 4          &Peter\\
-17.1pt  &No. 5          &Large middle\\
-15.9pt  &No. 6          &Small middle\\
-13.7pt  &No. 7          &Cadenza\\
-11.1pt  &No. 8          &Pearl\\
-    \end{tabular}
-    \caption{Foo}
-    \label{fonts:staff-size}
-  \end{center}
-\end{table}
-
-
-
-
-\section{Beams}
-
-\subsection{Slope}
-
-Traditionally, beam slopes are computed by following a large and hairy
-set of rules.  Some of these are talked-about in Wanske, a more
-recipy-like description can be found in Ross.
-
-There are some problems when trying to follow these rules:
-\begin{itemize}
-
-\item the set is not complete
-
-\item they are not formulated as a general rule with exceptions, but
-rather as a huge case of individual rules\cite{ross}
-
-\item in some cases, the result is wrong or ugly (or both)
-
-\item they try to solve a couple of problems at a time (e.g. Ross
-handles ideal slope and slope-quantisation as a paired problem)
-\end{itemize}
-Reading Ross it is clear that the rules presented there are certainly
-not the ultimate idea of what beam(slope)s should look like, but
-rather a (very much) simplified hands-on recipy for a human engraver.
-
-There are good reasons not to follow those rules:
-
-\begin{itemize}
-\item One cannot expect a human engraver to solve least-squares
-problems for every beam
-  
-\item A human engravers will allways trust themselves in judging the
-outcome of the applied recipy.  If, in a complicated case, the result
-"doesn't look good", they will ignore the rules and draw their own
-beams, based on experience.
-
-\item The exact rules probably don't "really exist" but in the minds
-  of good engravers, in the form of experience
-\end{itemize}
-
-We'll propose to do a least-squares solve.  This seems to be the best
-way to calculate the slope for a computerised engraver such as Lily.
-
-It would be nice to have some rules to catch and handle "ugly" cases,
-though.  In general, the slope of the beam should mirror the pitches
-of the notes.  If this can't be done because there simply is no
-uniform trend, it would probably be best to set the slope to zero.
-
-
-\subsection{Quantising}
-
-The beams should be prevented to conflict with the stafflines,
-especially at small slopes.  Traditionally, poor printing techniques
-imposed rather strict rules for quantisation.  In modern (post 1955)
-music printing we see that quality has improved substantially and
-obsoleted the technical justification for following some of these
-strict rules, notably the avoiding of so-called wedges.
-
-
-\subsection{Thickness and spacing}
-
-The spacing of double and triple beams (sixteenth and thirtysecond beams)
-is the same, quadruple and quintuple (thirtyfourth and hundredtwentyeighth
-beams) is wider.
-All beams are equally thick.  Using the layout of triple beams and the 
-beam-thickness $bt$ we can calculate the inter-beam spacing $ib$.
-
-Three beams span two interlines, including stafflines:
-\begin{eqnarray*}
- 2 ib + bt &=& 2 il\\
- ib &=& (2 il - bt) / 2
-\end{eqnarray*}
-
-We choose
-\begin{eqnarray*}
-  bt &=& 0.48(il - st)
-\end{eqnarray*}
-
-\subsubsection{Quadruple beams}
-
-If we have more than three beams they must open-up
-in order to not collide with staff lines.  The only valid
-position that remains is for the upper beam to hang.
-
-\begin{eqnarray*}
- 3 ib_{4+} + bt &=& 3 il\\
- ib_{4+} &=& (3 il - bt) / 3
-\end{eqnarray*}
-
-
-\section{Layout of the source files}
-
-The main font (with the fixed size music glyphs) uses a the \TeX\
-logfile as a communication device.  Use the specialised macros to
-create and export glyphs.
-
-\bibliographystyle{plain}
-\bibliography{engraving}
-
-
-
-\end{document}
-
-\begin{verbatim}
-Paul Terry <paul@musonix.demon.co.uk> writes:
-
-Ross states that the dies (the stamps to make the symbols) come in
-12 different sizes.
-
->Can you tell me how big rastrals are?
-
-According to the Score manual:
-
-   Rastral Size     Height in millimetres
-
-   0                9   mm
-   1                8   mm
-   2                7.5 mm
-   3                7   mm
-   4                6.5 mm
-   5                6   mm
-   6                5.5 mm
-
-I must say, despite having been a music setter for many years, I had to
-look these up - none of the publishers I work for deal in Rastral sizes
-these days (they all use millimetres).
diff --git a/Documentation/metadoc/hacking.texi b/Documentation/metadoc/hacking.texi
deleted file mode 100644 (file)
index 42bcbee..0000000
+++ /dev/null
@@ -1,829 +0,0 @@
-\input texinfo @c -*-texinfo-*-
-@setfilename internals.info
-@settitle LilyPond internals
-
-@node Top, LilyPond internals, (dir), (dir)
-@top
-
-
-@menu
-* LilyPond internals::
-* Overview::
-* mudela::                      
-* Request_engraver::            
-* Graphic elements::
-* Score elements::
-* Items::
-* Spanners::
-* Future work::
-* Coding standards::
-* Making patches::
-
-@end menu
-
-@node LilyPond internals,  , Top, Top
-@menu
-* Overview::                      Overview
-* mudela::                        mudela
-* Request_engraver::              Request_engraver
-@end menu
-
-
-@chapter Help Needed!
-
-[Call for help]
-
-[List tasks:
-
-* Mutopia
-
-* Doco LilyPond
-
-* Straightforward extensions
-
-* GUI editors.
-
-]
-
-@chapter LilyPond internals
-
-
-This documents some aspects of the internals of GNU LilyPond. Some of
-this stuff comes from e-mail I wrote, some from e-mail others wrote,
-some are large comments taken away from the headers. This page may be
-a little incoherent.  Unfortunately, it is also quite outdated.  A
-more thorough  and understandable document is in the works.
-
-You should use @code{doc++} to take a peek at the sources.
-
-@node Overview, mudela, Top, Top
-@section Overview
-
-GNU LilyPond is a "multi-pass" system. The different passes have been
-created so that they do not depend on each other. In a later stage
-some parts may be moved into libraries, or seperate programs, or they
-might be integrated in larger systems.
-
-@table @samp
-
-@item Parsing:
-
-No difficult algorithms. The .ly file is read, and converted to a list
-of @code{Scores}, which each contain @code{Music} and paper/midi-definitions.
-
-@item Interpreting music
-
-The music is walked through in time-order. The iterators which do the
-walking report Music to Translators which use this information to
-create elements, either MIDI or "visual" elements. The translators
-form a hierarchy; the ones for paper output are Engravers, for MIDI
-Performers.
-
-The translators swallow Music (mostly atomic gobs called Requests),
-create elements, broadcast them to other translators on higher or same
-level in the hierarchy:
-
-The stem of a voice A is broadcast to the staff which contains A, but
-not to the stems, beams and noteheads of a different voice (say B) or
-a different staff. The stem and noteheads of A are coupled, because
-the the Note_heads_engraver broadcasts its heads, and the Stem_engraver catches
-these.
-
-The engraver which agrees to handle a request decides whether to to
-honor the request, ignore it, or merge it with other requests. Merging
-of requests is preferably done with other requests done by members of
-the same voicegroups (beams, brackets, stems). In this way you can put
-the voices of 2 instruments in a conductor's score so they make chords
-(the Beam requests of both instruments will be merged).
-
-@item Prebreaking
-
-Breakable stuff (eg. clefs and bars) are copied into pre and
-postbreaks.
-
-@item Preprocessing
-
-Some dependencies are resolved, such as the direction of stems, beams,
-and "horizontal" placement issues (the order of clefs,  keys etc,
-placement of chords in multi-voice music), 
-
-@item Break calculation:
-
-The lines and horizontal positions of the columns are determined.
-
-@item Breaking
-
-Through some magical interactions with Line_of_score and Super_elem
-(check out the source) the "lines" are produced.
-
-All other spanners can figure across which lines they are spread. If
-applicable, they break themselves into pieces. After this, each piece
-(or, if there are no pieces, the original spanner itself) throws out
-any dependencies which are in the wrong line.
-
-@item Postprocesing:
-
-Some items and all spanners need computation after the Paper_column
-positions are determined. Examples: slurs, vertical positions of
-staffs.
-
-@item Output paper
-
-@end table
-
-@node mudela, Request_engraver, Overview, Top
-@section mudela
-
-Most information is stored in the form of a request.  In music
-typesetting, the user might want to cram a lot more symbols on the
-paper than actually fits. To reflect this idea (the user asks more
-than we can do), the container for this data is called Request.
-
-In a lot of other formats this would be called an 'Event'
-
-@table @samp
-@item @code{Barcheck_req}
-    Checks during music processing if start of this voice element
-    coincides with the start of a measure. Handy to check if you left out
-    some voice elts.
-@item @code{Note_req}
-    LilyPond has to decide if the ball should be hanging left or
-    right. This influences the horizontal dimensions of a column, and this
-    is why request processing should be done before horizontal spacing.
-    Other voices' frivolities may cause the need for accidentals, so this
-    is also for the to decide. The engraver can decide on positioning based on
-    ottava commands and the appropriate clef.
-@item @code{Rest_req}
-    Typeset a rest.
-@item @code{Span_req}
-    This type of request typically results in the creation of a @code{Spanner}
-@item @code{Beam_req}
-    Start/stop a beam.
-    Engraver has to combine this request with the stem_request, since the
-    number of flags that a stem wants to carry will determine the
-    number of beams.
-@item @code{Dynamic}
-    Each dynamic is bound to one note (a crescendo spanning multiple
-    notes is thought to be made of two "dynamics": a start and a stop).
-    Dynamic changes can occur in a smaller time than the length of its
-    note, therefore fore each  @code{Dynamic} request carries a time, measured
-    from the start of its note.
-@end table
-
-@node Request_engraver, , mudela, Top
-@section Request_engraver
-
-In the previous section the idea of Request has been explained, but
-this only solves one half of the problem. The other half is deciding
-which requests should be honored, which should merged with other
-requests, and which should be ignored. Consider this input
-
-@example 
-
-       \type Staff < % chord
-               @{ \meter 2/4; [c8 c8] @}
-               @{\meter 2/4;  [e8 e8] @}
-       >
-@end example 
-
-Both the cs and es are part of a staff (they are in the same
-Voice_group), so they should share meters, but the two [ ] pairs
-should be merged.
-
-The judge in this "allocation" problem a set of brokers: the requests
-are transmitted to so-called engravers which respond if they want to
-accept a request eg, the @code{Notehead_engraver} will accept
-@code{Note_req}s, and turn down @code{Slur_req}s. If the Music_iterator
-cannot find a engraver that wants the request, it is junked (with a
-warning message).
-
-After all requests have been either assigned, or junked, the Engraver
-will process the requests (which usually means creating an @code{Item}
-or @code{Spanner}). If a @code{Request_engraver} creates something, it
-tells the enclosing context. If all items/spanners have been created,
-then each Engraver is notified of any created Score_element, via a
-broadcasting system.
-
-@unnumberedsubsec example:
-
-@example 
-
-       c4
-@end example 
-
-produces:
-
-@example 
-
-       Note_request (duration 1/4)
-       Stem_request (duration 1/4)
-@end example 
-
-Note_request will be taken by a @code{Notehead_engraver}, stem_request
-will be taken by a @code{Stem_beam_engraver}. @code{Notehead_engraver}
-creates a @code{Notehead}, @code{Stem_beam_engraver} creates a
-@code{Stem}. Both announce this to the Staff_engraver. Staff_engraver
-will tell @code{Stem_beam_engraver} about the @code{Notehead}, which
-will add the @code{Notehead} to the @code{Stem} it just created.
-
-To decide on merging, several engravers have been grouped. Please
-check @file{init/engraver.ly}.
-
-
-
-@node Graphic elements, , , Top 
-@section Graphic elements
-
-
-Music notation is composed of a sets of interrelated glyphs.  In
-Lilypond every glyph usually is represented by one object, a so-called
-Graphic Object.  The primary relations between graphic objects involve
-positions:
-
-@itemize
-@item consecutive notes are printed left to right, grouped  in a staff
-@item simultaneous notes are horizontally aligned (internally grouped in
-a paper column).
-@item  the staccato mark is horizontally centered on the note it applies
-to.
-@end itemize
-
-The abstract encoding of such relations is done with the concept
-@dfn{reference point}.  The reference point (in X direction) of the
-staccato mark is the note it applies to.  The (X) position of the
-staccato mark is stored relative to the position of the note head.  This
-means that the staccato will always maintain a fixed offset wrt to the
-note head, whereever the head is moved to.
-
-In the same vein, all notes on a staff have their Y positions stored
-relative to an abstract object called Axis_group_spanner.  If the
-Axis_group_spanner of one staff is moved, the absolute Y positions of
-all objects in that spanner change along, in effect causing the staff
-and all its contents to move as a whole.
-
-Each graphic object stores a pointer and an relative offset for each
-direction: one for the X-axis, one for the Y-axis.  For example, the X
-parent of a Note_head usually is a Note_column.  The X parent of a
-Note_column usually is either a Collision or a Paper_column. The X
-parent of a Collision usually is a Paper_column.  If the Collision
-moves, all Note_heads that have that Collision as parent also move, but
-the absolute position of the Paper_column does not change.
-
-To build a graphical score with Graphic_elements, conceptually, one
-needs to have one Root object (in Lilypond: Line_of_score), and
-recursively attach objects to the Root.   However, due to the nature
-of the context selection mechanisms, it turns out to be more
-advantageous to construct the tree the other way around: first small
-trees (note heads, barlines etc.) are created, and these are
-subsequently composed into larger trees, which are finally hung on a
-Paper_column (in X direction) or Line_of_score (in Y direction). 
-
-The structure of the X,Y parent relations are determined by the
-engravers and notation contexts:
-
-The most important X-axis parent relation depends on the timing: notes
-that come earlier are attached to Paper_column that will be positioned
-more to the left.
-
-The most important Y-axis relation depends on containment of contexts:
-notes (created in a Thread or Voice context) are put in the staff where
-the originating context lives in.
-
-Graphical_axis_groups are special graphic objects, that are designed to
-function as a parent.  The size of a Graphical_axis_groups group is the
-union of its children.
-
-@node Score elements, ,  , Top
-
-Besides relative positions there are lots of other relations between
-elements. Lilypond does not contain other specialized relation
-management (Like the relative positioning code).  In stead, objects can
-be connected through dependencies, which sets the order in which objects
-are to be processed.
-
-Example: the direction of a beamed stem should equal the direction of
-the beam.  When the stem is a added to the beam, a dependency on the
-beam is set in the stem: this means that @code{Beam::do_pre_processing
-()} (which does various direction related things) will be called before
-@code{Stem::do_pre_processing ()}.
-
-The code that manages dependencies resides in the class
-@code{Score_element}, a derived class of @code{Graphical_element}.  The
-bulk of the code handles line breaking related issues.
-
-To sketch the problems with line breaking: suppose a slur spans a line
-break,
-@example
-
-c4(  c'''' c | \break d d )d
-
-@end example
-In this case, the slur will appear as two parts, the first part spanning
-the first three notes (the @code{c}s), the second spanning the last
-three (the @code{d}s).  Within Lilypond this is modeled as breaking the
-slur in parts: from the Original slur, two new clones of the old slur
-are made. Initially both clones depend on the six notes.  After the
-hairy code in Score_element, Spanner and Item which does substitutions
-in sets of dependencies, the first clone depends on the first three
-notes, the second on the last three.
-
-The major derived classes of Score_element are Item and  Spanner.
-An item has one horizontal position.  A spanner hangs on two  items.
-
-@node Items, , , Top
-@section Items
-
-
-
-An item is a score element that is associated with only one
-Paper_column. Examples are note heads, clefs, sup and superscripts, etc.
-Item is a derived class of Score_element.
-
-The shape of an item is known before the break calculations, and line
-spacing depends on the size of items: very wide items need more space
-than very small ones.
-
-An additional complication is the behavior of items at linebreaks.  For
-example, when you do a time signature change, you get only one symbol.
-If it occurs at a linebreak, the new time signature must be printed both
-before and after the linebreak.  Other `breakable symbols' such as
-clefs, and bar lines also exhibit this behavior. 
-
-if a line of music is broken, the next line usually gets a clef. So in
-TeX terms, the clef is a postbreak. The same thing happens with meter
-signs: Normally the meter follows the bar. If a line is broken at that
-bar, the bar along with the meter stays on the "last" line, but the next
-line also gets a meter sign after the clef.   To support this,
-breakable items are generated in the three versions: original
-(unbroken), left (before line break) and right (after line break).
-During the line spacing, these versions are used to try how the spacing
-of a  line works out.
-
-Once the definitive spacing is determined, dependencies (and various
-other pointers) are substituted such that all dependencies point at the
-active items: either they point at the original, or they point at left
-and right.
-
-@node Spanners, , , Top
-@section Spanners
-
-Spanners are symbols that are of variable shape, eg. Slurs, beams, etc.
-Spanners is a derived class of Score_element.
-
-The final shape can only be determined after the line breaking process.
-All spanners are spanned on two items, called the left and right
-boundary item.  The X reference point is the left boundary item.
-
-
-@node Future work, , , Top
-@section Future work
-
-There are plans to unify Spanner and Item, so there will no longer be
-such a clear distinction between the two.  Right now, Score_elements are
-always either Item or either Spanner.
-
-Most of the properties of a graphic object are now member variables of
-the classes involved.  To offer configurability, we want to move these
-variables to scheme (GUILE) variables, and no longer use C++ code to
-calculate them, but use Scheme functions.
-
-@node Coding standards,  , , Top
-
-@chapter CodingStyle - standards while programming for GNU
-LilyPond
-
-Functions and methods do not return errorcodes.
-
-
-@unnumberedsubsec Languages
-
-C++ and Python are preferred.  Perl is not.  Python code should use an
-indent of 8, using TAB characters.
-
-@unnumberedsubsec Filenames
-
-Definitions of classes that are only accessed via pointers
-(*) or references (&) shall not be included as include files.
-
-filenames
-
-@example 
-       ".hh"   Include files
-       ".cc"   Implementation files
-       ".icc"  Inline definition files
-       ".tcc"  non inline Template defs
-@end example 
-
-in emacs:
-
-@example 
-       (setq auto-mode-alist
-             (append '(("\\.make$" . makefile-mode)
-                       ("\\.cc$" . c++-mode)
-                       ("\\.icc$" . c++-mode)
-                       ("\\.tcc$" . c++-mode)
-                       ("\\.hh$" . c++-mode)
-                       ("\\.pod$" . text-mode)         
-                       )
-                     auto-mode-alist))
-@end example 
-
-
-The class Class_name_abbreviation is coded in @file{class-name-abbr.*}
-
-@unnumberedsubsec Indentation
-
-Standard GNU coding style is used.   In emacs:
-
-@example 
-       (add-hook 'c++-mode-hook
-                 '(lambda() (c-set-style "gnu")
-                    )
-                 )
-@end example 
-
-If you like using font-lock, you can also add this to your @file{.emacs}:
-
-@example 
-       (setq font-lock-maximum-decoration t)
-       (setq c++-font-lock-keywords-3 
-             (append
-              c++-font-lock-keywords-3
-              '(("\\b\\([a-zA-Z_]+_\\)\\b" 1 font-lock-variable-name-face)
-              ("\\b\\([A-Z]+[a-z_]+\\)\\b" 1 font-lock-type-face))
-              ))
-@end example 
-
-@unnumberedsubsec Classes and Types
-
-@example 
-       This_is_a_class
-@end example 
-
-@unnumberedsubsec Members
-
-@example 
-       Class::member ()
-       Type Class::member_type_
-       Type Class::member_type ()
-@end example 
-
-the @code{type} is a Hungarian notation postfix for @code{Type}. See below
-
-@unnumberedsubsec Macros
-
-Macros should be written completely in uppercase
-
-The code should not be compilable if proper macro declarations are not
-included. 
-
-Don't laugh. It took us a whole evening/night to figure out one of
-these bugs, because we had a macro that looked like
-@code{DECLARE_VIRTUAL_FUNCTIONS ()}. 
-
-@unnumberedsubsec Broken code
-
-Broken code (hardwired dependencies, hardwired constants, slow
-algorithms and obvious limitations) should be marked as such: either
-with a verbose TODO, or with a short "ugh" comment.
-
-@unnumberedsubsec Comments
-
-The source is commented in the DOC++ style.  Check out doc++ at
-@uref{http://www.zib.de/Visual/software/doc++/index.html}
-
-@example 
-
-       /*
-               C style comments for multiline comments.
-               They come before the thing to document.
-               [...]
-       */
-
-       /**
-               short description.
-               Long class documentation.
-               (Hungarian postfix)
-
-               TODO Fix boring_member ()
-       */
-       class Class @{
-               /**
-                 short description.
-                 long description
-               */
-
-               Data data_member_;
-
-               /**
-                       short memo. long doco of member ()
-                       @@param description of arguments
-                       @@return Rettype
-               */
-               Rettype member (Argtype);
-
-               /// memo only
-               boring_member () @{
-                       data_member_ = 121; // ugh
-               @}
-       @};
-@end example 
-
-       
-Unfortunately most of the code isn't really documented that good.
-
-@unnumberedsubsec Members (2)
-
-Standard methods:
-
-@example 
-
-       ///check that *this satisfies its invariants, abort if not.
-       void OK () const
-
-       /// print *this (and substructures) to debugging log
-       void print () const
-
-       /**
-       protected member. Usually invoked by non-virtual XXXX ()
-       */
-       virtual do_XXXX ()
-
-       /**add some data to *this.
-       Presence of these methods usually imply that it is not feasible to this
-       via  a constructor
-       */
-       add (..)
-
-       /// replace some data of *this
-       set (..)
-@end example 
-
-@unnumberedsubsec Constructor
-
-Every class should have a default constructor.  
-
-Don't use non-default constructors if this can be avoided:
-
-@example 
-
-       Foo f(1)
-@end example 
-
-is less readable than
-
-@example 
-
-       Foo f;
-       f.x = 1
-@end example 
-
-or 
-
-@example 
-
-       Foo f(Foo_convert::int_to_foo (1))
-@end example 
-
-@unnumberedsec Hungarian notation naming convention
-
-Proposed is a naming convention derived from the so-called
-@emph{Hungarian Notation}.  Macros, @code{enum}s and @code{const}s are all
-uppercase, with the parts of the names separated by underscores.
-
-The hungarian notation  is to be used when variables are not declared
-near usage (mostly in member variables and functions).
-
-@unnumberedsubsec Types
-
-@table @samp
-@item @code{byte}
-    unsigned char. (The postfix _by is ambiguous)
-@item @code{b}
-    bool
-@item @code{bi}
-    bit
-@item @code{ch}
-    char
-@item @code{f}
-    float
-@item @code{i}
-    signed integer
-@item @code{str}
-    string class
-@item @code{sz}
-    Zero terminated c string
-@item @code{u}
-    unsigned integer
-@end table
-
-@unnumberedsubsec User defined types
-
-@example 
-
-       /** Slur blah. blah.
-       (slur)
-       */
-       class Slur @{@};
-       Slur* slur_p = new Slur;
-@end example 
-
-@unnumberedsubsec Modifiers
-
-The following types modify the meaning of the prefix. 
-These are preceded by the prefixes:
-
-@table @samp
-@item @code{a}
-    array
-@item @code{array}
-    user built array.
-@item @code{c}
-    const. Note that the proper order is @code{Type const}
-    i.s.o. @code{const Type}
-@item @code{C}
-    A const pointer. This would be equivalent to @code{_c_l}, but since any
-    "const" pointer has to be a link (you can't delete a const pointer),
-    it is superfluous.
-@item @code{l}
-    temporary pointer to object (link)
-@item @code{p}
-    pointer to newed object
-@item @code{r}
-    reference
-@end table
-
-@unnumberedsubsec Adjective
-
-Adjectives such as global and static should be spelled out in full.
-They come before the noun that they refer to, just as in normal english.
-
-@example 
-
-foo_global_i: a global variable of type int commonly called "foo".
-@end example 
-
-static class members do not need the static_ prefix in the name (the
-Class::var notation usually makes it clear that it is static)
-
-@table @samp
-@item @code{loop_i}
-    Variable loop: an integer
-@item @code{u}
-    Temporary variable: an unsigned integer
-@item @code{test_ch}
-    Variable test: a character
-@item @code{first_name_str}
-    Variable first_name: a String class object
-@item @code{last_name_ch_a}
-    Variable last_name: a @code{char} array
-@item @code{foo_i_p}
-    Variable foo: an @code{Int*} that you must delete
-@item @code{bar_i_l}
-    Variable bar: an @code{Int*} that you must not delete
-@end table
-
-Generally default arguments are taboo, except for nil pointers.
-
-The naming convention can be quite conveniently memorised, by
-expressing the type in english, and abbreviating it
-
-@example 
-
-       static Array<int*> foo
-@end example 
-
-@code{foo} can be described as "the static int-pointer user-array", so you get
-
-@example 
-
-       foo_static_l_arr
-@end example 
-
-
-@unnumberedsec Miscellaneous
-    
-For some tasks, some scripts are supplied, notably creating patches, a
-mirror of the website, generating the header to put over cc and hh
-files, doing a release.
-
-Use them.
-
-@node Making patches,  , , Top
-
-
-@unnumberedsec name
-    
-
-PATCHES - track and distribute your code changes
-
-This page documents how to distribute your changes to GNU lilypond
-    
-We would like to have unified context diffs with full pathnames.  A
-script automating supplied with Lily.
-
-Distributing a change normally goes like this:
-
-@itemize @bullet
-@item make your fix/add your code 
-@item Add changes to CHANGES, and add yourself to Documentation/topdocs/AUTHORS.texi
-@item generate a patch, 
-@item e-mail your patch to one of the mailing lists
-    gnu-music-discuss@@gnu.org or bug-gnu-music@@gnu.org
-@end itemize
-
-Please do not send entire files, even if the patch is bigger than the
-original.  A patch makes it clear what is changed, and it won't
-overwrite previous (not yet released) changes.
-
-@unnumberedsec Generating a patch
-
-Simple version: run
-
-@example
-        make -C lilypond-x.y.z/ distclean
-        make -C lilypond-x.y.z.NEW/ distclean
-        diff -urN lilypond-x.y.z/ lilypond-x.y.z.NEW/
-@end example
-
-Complicated (but automated) version:
-
-In @file{VERSION}, set MY_PATCH_LEVEL:
-
-@example 
-
-    VERSION:
-       ...
-       MY_PATCH_LEVEL=jcn1
-@end example 
-
-In @file{CHANGES}, enter a summary of changes:
-
-@example 
-       pl 0.1.73.jcn1
-               - added PATCHES.texi
-@end example 
-
-Then, from the top of Lily's source tree, type
-
-@example 
-    make release
-@end example 
-
-These handy python scripts assume a directory structure which looks
-like:
-
-@example 
-
-    lilypond -> lilypond-x.y.z   # symlink to development directory
-    lilypond-x.y.z/              # current development
-    patches/                    # patches between different releases
-    releases/                    # .tar.gz releases
-
-@end example 
-
-(Some scripts also assume this lives in  @file{$HOME/usr/src}).
-
-       
-@unnumberedsec Applying patches
-    
-
-If you're following LilyPond development regularly, you probably want to
-download just the patch for each subsequent release.
-After downloading the patch (into the patches directory, of course), simply 
-apply it:
-
-@example 
-
-    gzip -dc ../patches/lilypond-0.1.74.diff.gz | patch -p1 -E
-@end example 
-
-and don't forget to make automatically generated files:
-
-@example 
-
-    autoconf footnote(patches don't include automatically generated files, 
-    i.e. file(configure) and files generated by file(configure).)
-
-    configure
-@end example 
-    
-
-@bye
-
-
diff --git a/Documentation/metadoc/lilypond-overview.doc b/Documentation/metadoc/lilypond-overview.doc
deleted file mode 100644 (file)
index a408a9e..0000000
+++ /dev/null
@@ -1,743 +0,0 @@
-%-*-LaTeX-*-
-
-\documentclass{article}
-\usepackage{a4}
-\def\postMudelaExample{\setlength{\parindent}{1em}}
-\title{LilyPond, a Music Typesetter}
-\author{HWN}
-\usepackage{musicnotes}
-\usepackage{graphics}
-
-
-\begin{document}
-\maketitle
-
-[THIS IS WORK IN PROGRESS.  THIS IS NOT FINISHED]
-
-% -*-LaTeX-*-
-\section{Introduction}
-
-The Internet has become a popular medium for collaborative work on
-information.  Its success is partly due to its use of simple, text-based
-formats.  Examples of these formats are HTML and \LaTeX.  Anyone can
-produce or modify such files using nothing but a text editor, they are
-easily processed with run-of-the-mill text tools, and they can be
-integrated into other text-based formats.
-
-Software for processing this information and presenting these formats
-in an elegant form is available freely (Netscape, \LaTeX, etc.).
-Ubiquitousness of the software and simplicity of the formats have
-revolutionised the way people publish text-based information
-nowadays.
-
-In the field of performed music, where the presentation takes the form
-of sheet music, such a revolution has not started yet.  Let us review
-some alternatives that have been available for transmitting sheet
-music until now:
-\begin{itemize}
-\item MIDI\cite{midi}.  This format was designed for interchanging performances
-  of music; one should think of it as a glorified tape recorder
-  format.  It needs dedicated editors, since it is binary.  It does
-  not provide enough information for producing musical scores: some of
-  the abstract musical content of what is performed is thrown away.
-  
-\item PostScript\cite{Postscript}. This format is a printer control
-  language.  Printed musical scores can be transmitted in PostScript,
-  but once a score is converted to PostScript, it is virtually
-  impossible to modify the score in a meaningful way.
-  
-\item Formats for various notation programs.  Notation programs either
-  work with binary  formats (e.g., NIFF\cite{niff-web}), need specific
-  platforms   (e.g.,  Sibelius\cite{sibelius}),  are   proprietary  or
-  non-portable  tools  themselves  (idem), produce  inadequate  output
-  (e.g.,  MUP\cite{mup}),  are   based  on  graphical  content  (e.g.,
-  MusixTeX\cite{musixtex1}),  limit themselves to  specific subdomains
-  (e.g.,  ABC\cite{abc2mtex}),  or   require  considerable  skill  and
-  knowledge to use (e.g., SCORE\cite{score})
-  
-\item SMDL\cite{smdl-web}.  This is a very rich ASCII format, that is
-  designed for storing many types of music.  Unfortunately, there is
-  no implementation of a program to print music from SMDL available.
-  Moreover, SMDL is so verbose, that it is not suitable for human
-  production.
-  
-\item TAB\cite{tablature-web}.  Tab (short for tablature) is a popular
-  format, for interchanging music over e-mail, but it can only be used
-  for guitar music.
-\end{itemize}
-
-In summary, sheet music is not published and edited on a wide scale
-across the internet  because no format for music
-interchange exists that is:
-\begin{itemize}
-\item open, i.e., with publically available specifications.
-\item based on ASCII, and therefore suitable for human consumption and
-  production.
-\item rich enough for producing publication quality sheet music from
-  it.
-\item based on musical content (unlike, for example, PostScript), and
-  therefore suitable for making modifications.
-\item accompanied by tools for processing it that are freely available
-  across multiple platforms.
-\end{itemize}
-
-
-With the creation of LilyPond, we have tried to create both a
-convenient format for storing sheet music, and a portable,
-high-quality implementation of a compiler, that compiles the input
-into a printable score.  You can find a small example of LilyPond
-input along with output in Figure~\ref{fig:intro-fig}.
-%
-\begin{figure}[htbp]
-  \begin{center}
-\begin[verbatim]{mudela}
-      \score {
-        \notes
-          \context GrandStaff <
-             \transpose c'' { c4 c4 g4 g4 a4 a4 g2 }
-             { \clef "bass"; c4 c'4
-               \context Staff <e'2 {\stemdown c'4 c'4}> f'4 c'4 e'4 c'4 }
-           >
-           \paper { 
-             linewidth = -1.0\cm ;
-           }
-        }      
-\end{mudela}
-    \caption{A small example of LilyPond input}
-    \label{fig:intro-fig}
-  \end{center}
-\end{figure}
-%
-
-The input language encodes musical events (such as notes and rests) on
-the basis of their time-ordering.  For example, the grammar includes
-constructs that specify that notes start simultaneous and that notes
-are to be played in sequence.  In this encoding some context that is
-present in sheet music is lost.
-
-The compiler reconstructs the notation from the encoded music.  Its
-operation comprises four different steps (see
-Figure~\ref{fig:intro-steps}).
-
-\begin{description}
-\item[Parsing] During parsing, the input is converted in a syntax tree.
-  
-\item[Interpreting] In the \emph{interpreting} step, it is determined
-  which symbols have to be printed.  Objects that correspond to
-  notation (\emph{Graphical objects}) are created from the syntax tree
-  in this phase. Generally speaking, for every symbol printed there is
-  one graphical object.  These objects are incomplete: their position
-  and their final shape is unknown.
-  
-  The context that was lost by encoding the input in a language is
-  reconstructed during this conversion.
-\item[Formatting] The next step is determing where symbols are to be
-  placed, this is called \emph{formatting}.
-\item[Outputting]   
-  Finally, all Graphical objects are outputted as PostScript or \TeX\ code.
-\end{description}
-
-\def\staffsym{\vbox to 16pt{
-    \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip
-    \vfil
-    \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip
-    \vfil
-    \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip
-    \vfil
-    \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip
-    \vfil
-    \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip
-}}
-
-\def\vspacer{\vbox to 20pt{\vss}}
-\begin{figure}[h]
-\def\spacedhbox#1{\hbox{\ #1\ }}
-\begin{eqnarray*}
-  {\spacedhbox{Input}\atop \hbox{\texttt{\{c8 c8\}}}} {\spacedhbox{Parsing}\atop\longrightarrow}
-  {\spacedhbox{Syntax tree}\atop\spacedhbox{\textsf{Sequential(Note,Note)}}}
-  {\spacedhbox{Interpreting}\atop\longrightarrow}\\
-  \vspacer\\
-  {\spacedhbox{Graphic objects}\atop\spacedhbox{\texttrebleclef \textquarterhead\texteighthflag\textquarterhead\texteighthflag \staffsym }}
-  {\spacedhbox{Formatting}\atop\longrightarrow}
-  {\spacedhbox{Formatted objects}\atop\hbox{
-    \mudela{c''8 c''8}
-    }}\\
-\vspacer\\
-  {\spacedhbox{Outputting}\atop\longrightarrow}
-  {\spacedhbox{PostScript code}\atop\hbox{\texttt{\%!PS-Adobe}\ldots}}
-\end{eqnarray*}
-  \caption{Parsing, Interpreting, Formatting and Outputting}
-    \label{fig:intro-steps}
-\end{figure}
-
-
-The second step, the interpretation phase of the compiler, can be
-manipulated as a separate entity: the interpretation process is
-composed of many separate modules, and the behaviour of the modules is
-parameterised.  By recombining these interpretation modules,
-and changing parameter settings, the same piece of music can be
-printed differently, as is shown in Figure~\ref{fig:intro-interpret}.
-
-This makes it easy to extend the program. Moreover, this enables the
-same music to be printed in different versions, e.g., in a conductors
-score and in extracted parts.
-
-
-\begin{figure}[h]
-  \begin{center}
-    \begin{mudela}
-      \score {
-        \notes
-          \context GrandStaff <
-             \transpose c'' { c4 c4 g4 g4 a4 a4 g2 }
-             { \clef "bass"; c4 c'4
-               \context Staff <e'2 {\stemdown c'4 c'4}> f'4 c'4 e'4 c'4 }
-           >
-           \paper { 
-             linewidth = -1.0\cm ;
-             \translator {  
-                \VoiceContext
-                \remove "Stem_engraver";
-             }
-           \translator {
-             \StaffContext
-               numberOfStaffLines = 3;
-           }
-          }
-        }
-    \end{mudela}
-    \caption{The interpretation phase can be manipulated: the same
-      music as in Figure~\ref{fig:intro-fig} is interpreted
-      differently: three staff lines and no stems.}
-    \label{fig:intro-interpret}
-  \end{center}
-\end{figure}
-
-
-
-\section{Preliminaries}
-
-To understand the rest of the article, it is necessary to know
-something about music notation and music typography.  Since both
-communicate music, we will explain some characteristics of instruments
-and western music that motivate some notational constructs.
-
-\subsection{Music}
-
-Music notation is meant to be read by human performers.  They sing or
-play instruments that can produce sounds of different pitches.  These
-sounds are called \emph{notes}. Additionally, the sounds can be
-articulated in differents ways, e.g., staccato (short and separated)
-or legato (fluently bound together).  The loudness of the notes can
-also be varied.  Changes in loudness are called \emph{dynamics}.
-
-Silence is also an element of music.  The musical terminology for
-silence within music is \emph{rest}.
-
-The basic unit of pitch is the \emph{octave}.  The octave corresponds
-to a frequency ratio of 1:2. For example the pitch denoted by a'
-(frequency: 440 hertz) is one octave lower than a'' (frequency: 880
-hertz).  Various instruments have a limited \emph{pitch range}, for
-example, a trumpet has a range of about 2.5 octaves.  Not all
-instruments have ranges in the same register: a tuba also has a range
-of 2.5 octaves, but the range of the tuba is much lower.
-
-Musicology has a confusing mix of relative and absolute measures for
-pitches: the term `octave' refers to both a difference between two
-pitches (the frequency ratio of 1:2), and to a range of pitches.  For
-example, the term `[eengestreept] octave' refers to the pitch range
-between 261.6 Hz and 523.3 Hz.
-
-
-The octave is divided into smaller pitch steps.  In modern western
-music, every octave is divided into twelve approximately equidistant
-pitch steps, and each step is called a \emph{semitone}.  Usually, the
-pitches in a musical piece come from a smaller subset of these twelve
-possible pitches.  This smaller subset along with the musical
-functions fo the pitches is called the
-\emph{tonality}\footnote{Tonality also refers to the relations between
-  and functions of certain pitches.  Since these do not have any
-  impact on notation, we ignore this} of the piece.
-
-
-The standard tonality that forms the basis of music notation 
-(the key of C major) is a set of seven pitches within every octave.
-Each of these seven is denoted by a name. In English, these are names
-are (in rising pitch) denoted by c, d, e, f, g, a and b.  Pitches that
-are a semitone higher or lower than one of these seven can be
-represented by suffixing the name with `sharp' or `flat'
-respectively (this is called an \emph{chromatic alteration}).
-
-A pitch therefore can be fully specified by a combination of the
-octave number, the note name and a chromatic alteration.
-Figure~\ref{fig:intro-pitches} shows the relation between names and
-frequencies.
-
-
-
-
-\begin{figure}[h]
-  \begin{center}
-    [te doen]
-  \end{center}
-  \caption{Pitches in western music.  The octave number is denoted
-    by a superscript.}
-  \label{fig:intro-pitches}
-\end{figure}
-
-
-Many instruments can produce more than one note at the same time, e.g.
-pianos and guitars.  When more notes are played simultaneously, they
-form a so-called \emph{chord}.
-
-The unit of duration is the \emph{beat}. When playing, the tempo is
-determined by setting the number of beats per minute.  In western
-music, beats are often stressed in a regular pattern: for example
-Waltzes have a stress pattern that is strong-weak-weak, i.e. every
-note that starts on a `strong' beat is louder and has more pronounced
-articulation.  This stress pattern is called \emph{meter}.
-
-\subsection{Music notation}
-
-Music notation is a system that tries to represent musical ideas
-through printed symbols.  Music notation has no precise definition,
-but most conventions have described in reference manuals on music
-notation\cite{read-notation}.
-
-In music notation, sounds and silences are represented by symbols that
-are called note and rest respectively.\footnote{These names serve a
-  double purpose: the same terms are used to denote the musical
-  concepts.}  The shape of notes and rests indicates their duration
-(See figure~\ref{noteshapes}) relative to the whole note.
-
-
-\begin{figure}[h]
-  \begin{center}
-\begin{mudela}
-  \score {
-    \notes \transpose c''{ c\longa*1/4 c\breve*1/2 c1 c2 c4 c8 c16 c32 c64 }
-    \paper {
-     \translator {
-       \StaffContext
-       \remove "Staff_symbol_engraver";
-        \remove "Time_signature_engraver";
-%        \remove "Bar_engraver";
-        \remove "Clef_engraver";
- }
-linewidth = -1.;
-    }
-}
-\end{mudela}
-\begin{mudela}
-  \score {
-    \notes \transpose c''\context Staff { r\longa*1/4 r\breve*1/2 r1 r2 r4 r8 r16 r32 r64 }
-    \paper {
-      \translator {
-        \StaffContext
-        \remove "Staff_symbol_engraver";
-        \remove "Time_signature_engraver";
-%        \remove "Bar_engraver";
-        \remove "Clef_engraver";
-        }
-      linewidth = -1.;
-    }
-}
-\end{mudela}
-    \caption{Note and rest shapes encode the length.  At the top notes
-      are shown, at the bottom rests.  From left to right a quadruple
-      note (\emph{longa}), double (\emph{breve}), whole, half,
-      quarter, eigth, sixteenth, thirtysecond and sixtyfourth. Each
-      note has half of the duration of its predecessor.}
-    \label{fig:noteshapes}
-\end{center}
-\end{figure}
-
-
-Notes are printed in a grid of horizontal lines called \emph{staff} to
-denote their pitch: each line represents the pitch of from the
-standard scale (c, d, e, f, g, a, b).  The reference point is the
-\emph{clef}, eg., the treble clef marks the location of the $g^1$
-pitch.  The notes are printed in their time order, from left to right.
-
-
-\begin{figure}[h]
-  \begin{center}
-    \begin{mudela}
-      \score { \notes {
-      a4 b c d e f g a \clef bass;
-      a4 b c d e f g a \clef alto;
-      a4 b c d e f g a \clef treble;
-      }
-      \paper { linewidth = 15.\cm; }
-      }
-    \end{mudela}
-    \caption{Pitches ranging from $a, b, c',\ldots a'$, in different
-      clefs.  From left right the bass, alto and treble clef are
-      featured.}
-    \label{fig:pitches}
-  \end{center}
-\end{figure}
-
-The chromatic alterations are indicated by printing a flat sign or a
-sharp sign in front of the note head.  If these chromatic alterations
-occur systematically (if they are part of the tonality of the piece),
-then this indicated with a \emph{key signature}.  This is a list of
-sharp/flat signs which is printed next to the clef.
-
-Articulation is notated by marking the note shapes wedges, hats and
-dots all indicate specific articulations.  If the notes are to be
-bound fluently (legato), the note shapes are encompassed by a smooth
-curve called \emph{slur},
-
-\begin{figure}[h]
-  \begin{center}
-    \begin{mudela}
-      c'4-> c'4-. g'4 ( b'4  ) g''4
-    \end{mudela}
-    \caption{Some articulations.  From left to right: extra stress
-      (\emph{marcato}), short (staccato), slurred notes (legato).}
-    \label{fig:articulation}
-  \end{center}
-\end{figure}
-
-
-
-Dynamics are notated in two ways: absolute dynamics are indicated by
-letters: \textbf{f} (from Italian ``forte'') stands for loud,
-\textbf{p} (from Italian ``piano'') means soft.  Gradual changes in
-loudness are notated by (de)crescendos.  These are hairpin like shapes
-below the staff.
-
-\begin{figure}[h]
-  \begin{center}
-    \begin{mudela}
-      g'4\pp \<  g'4 \! g'4 \ff \> g'4 g' \! g'\ppp
-    \end{mudela}
-    \caption{Dynamics: start very soft (pp), grow to loud (ff) and
-      decrease to extremely soft (ppp)}
-    \label{fig:dynamics}
-  \end{center}
-\end{figure}
-
-
-The meter is indicated by barlines: every start of the stress pattern
-is preceded by a vertical line, the \emph{bar line}.  The space
-between two bar lines is called measure.  It is therefore the unit of
-the rhythmic pattern.
-
-The time signature also indicates what kind of rhythmic pattern is
-desired.  The time signature takes the form of two numbers stacked
-vertically. The top number is the number of beats in one measure, the
-bottom number is the duration (relative to the whole note) of the note
-that takes  one beat.  Example: 2/4  time signature means ``two beats
-per measure, and a quarter note takes one beat''
-
-Chords are written by attaching multiple note heads to one stem.  When
-the composer wants to emphasize the horizontal relationships between
-notes, the simultaneous notes can be written as voices (where every
-note head has its own stem).  A small example is given in
-Figure~\ref{fig:simultaneous}.
-
-\begin{figure}[h]
-  \begin{center}
-    \begin{mudela}
-      \relative c'' {\time 2/4;  <c4 e> <d f>
-                \context Staff < \context Voice = VA{
-                  \stemdown
-                  c4 d
-                  b16 b b b b b b b }
-                \context Voice = VB {
-                  \stemup e4 f g8 g4 g8 } >
-          }
-    \end{mudela}
-    \caption{Notes sounding together.  Chord notation (left, before
-      the bar line) emphasizes vertical relations, voice notation
-      emphasizes horizontal relations. Separate voices needn't have
-      synchronous rhythms (third measure). 
-      }
-    \label{fig:simultaneous}
-  \end{center}
-\end{figure}
-
-Separate voices do not have to share one rhythmic pattern---this is
-also demonstrated in Figure~\ref{fig:simultaneous}--- they are in a sense%vaag
-independent.  A different way to express this in notation, is by
-printing each voice on a different staff.  This is customary when
-writing for piano (both left and right hand have a staff of their own)
-and for ensemble (every instrument has a staff of its own).
-
-
-
-\subsection{Music typography}
-
-Music typography is the art of placing symbols in esthetically
-pleasing configuration.  Little is explicitly known about music
-typography.  There are only a few reference works
-available\cite{ross,wanske}.  Most of the knowledge of this art has
-been transmitted verbally, and was subsequently lost.
-
-The motivation behind choices in typography is to represent the idea
-as clearly as possible. Among others, this results in the following
-guidelines:
-\begin{itemize}
-\item The printed score should use visual hints to accentuate the
-  musical content
-\item The printed score should not contain distracting elements, such
-  as large empty regions or blotted regions.
-\end{itemize}
-
-An example of the first guideline in action is the horizontal spacing.
-The amount of space following a note should reflect the duration of
-that note: short notes get a small amount of space, long notes larger
-amounts.  Such spacing constraints can be  subtle, for the
-``amount of space'' is only the impression that should be conveyed; there
-has to be some correction for optical illusions.  See
-Figure~\ref{fig:spacing}.
-
-\begin{figure}[h]
-  \begin{center}
-    \begin{mudela}
-      \relative c'' { \time 3/4; c16 c c c c8 c8 | f4 f, f'  }
-    \end{mudela}
-    \caption{Spacing conveys information about duration. Sixteenth
-      notes at the left get less space than quarter notes in the
-      middle. Spacing is ``visual'', there should be more space
-      after  the first note of the last measure, and  less after second. }
-    \label{fig:spacing}
-  \end{center}
-\end{figure}
-
-Another example of music typography is clearly visible in collisions.
-When chords or separate voices are printed, the notes that start at
-the same time should be printed aligned (ie., with the same $x$
-position).  If the pitches are close to each other, the note heads
-would collide. To prevent this, some notes (or note heads) have to be
-shifted horizontally.  An example of this is given in
-Figure~\ref{fig:collision}.
-\begin{figure}[h]
-  \begin{center}
-    [todo]
-    \caption{Collisions}
-    \label{fig:collision}
-  \end{center}
-\end{figure}
-
-\bibliographystyle{hw-plain}
-\bibliography{engraving,boeken,colorado,computer-notation,other-packages}
-
-\section{Requirements}
-
-
-\section{Approach}
-
-\subsection{Input}
-
-The input format consists of combining a symbolic representation of
-music with style sheet that describes how the symbolic presentation
-can converted to notation.  The symbolic representation is based on a
-context free language called \textsf{music}.  Music is a recursively
-defined construction in the input language.  It can be constructed by
-combining lists of \textsf{music} sequentially or parallel or from
-terminals like notes or lyrics.
-
-The grammar for \textsf{music} is listed below.  It has been edited to
-leave out the syntactic and ergonomic details.
-
-\begin{center}
-    \begin{tabular}{ll}
-Music:  & SimpleMusic\\
-        & $|$ REPEATED int Music ALTERNATIVE MusicList\\
-        & $|$ SIMULTANEOUS MusicList\\
-        & $|$ SEQUENTIAL MusicList\\
-        & $|$ CONTEXT STRING '=' STRING Music\\
-        & $|$ TIMES int int Music     \\
-        & $|$ TRANSPOSE PITCH Music \\
-SimpleMusic: & $|$ Note\\
-        & $|$ Lyric\\
-        & $|$ Rest\\
-        & $|$ Chord\\
-        & $|$ Command\\
-Command: & METERCHANGE\\
-        & $|$ CLEFCHANGE\\
-        &$|$ PROPERTY STRING '=' STRING\\
-Chord: &PitchList DURATION\\
-Rest: &REST DURATION\\
-Lyric: &STRING DURATION\\
-Note: &PITCH DURATION\\
-\end{tabular}
-\end{center}
-  
-The terminals are both purely musical concepts that have a duration,
-and take a non-zero amount of musical time, like notes and lyrics, and
-commands that behave as if they have no duration.\footnote{The
-  PROPERTY command is a generic mechanism for controlling the
-  interpretation, i.e. the musical style sheets. See [forward ref]}
-
-The nonterminal productions can
-\begin{itemize}
-\item Some productions combine multiple elements: one can specify that
-  element are to be played in sequence, simultaneously or repetitively.
-\item There are productions for transposing music, and for dilating
-  durations of music: the TIMES production can be used to encode a
-  triplet.\footnote{A triplet is a group of three notes marked by a
-    bracket, that are played 3/2 times faster.}
-\item
-  There are productions that give directions to the interpretation
-  engine (the CONTEXT production)
-\end{itemize}
-
-
-\section{Context in notation} 
-
-Music notation relies heavily on context.  Notational symbols do not
-have meaning if they are not surrounded by other context elements.  In
-this section we give some examples how the reader uses this context do
-derive meaning of a piece of notation.   We will focus on the prime
-example of context: the staff. 
-
-A staff is the grid of five horizontal lines, but it contains more components :
-\begin{itemize}
-\item A staff can have a key signature (printed at the left)
-\item A staff can have a time signature (printed at the left)
-\item A staff has bar lines
-\item A staff has a clef (printed at the left)
-\end{itemize}
-
-It is still possible to print notes without these components, but one
-cannot determine the meaning of the notes.
-\begin{mudela}
-\score{
-\notes \relative c' {  \time 2/4; g'4 c,4 a'4 f4 e c d2 }
-\paper { 
-  linewidth = -1.;
-  \translator {
-  \StaffContext
-  \remove "Time_signature_engraver";
-%  \remove "Bar_engraver";
-  \remove "Staff_symbol_engraver";
-  \remove "Clef_engraver";
-  \remove "Key_engraver";
-  }
- }
-}
-\end{mudela}
-
-As you can see, you can still make out the general form of the melody
-and the rhythm that is to be played, but the notation is difficult to
-read and the musical information is not complete.  The stress
-pattern in the notes can't be deduced from this output.  For this, we
-need a time signature.  Adding barlines helps with finding the strong
-and weak beats.
-\begin{mudela}
-\score {
-  \notes \relative c' {  \time 2/4; g'4 c,4 a'4 f4 e c d2 }
-  \paper{
-  linewidth = -1.;
-\translator{
-  \StaffContext
-  \remove "Staff_symbol_engraver";
-  \remove "Clef_engraver";
-  \remove "Key_engraver";}
-  }
- }
-\end{mudela}
-
-It is impossible to deduce the exact pitch of the notes.  One needs a
-clef to do so.  Staff lines help the eye in determining the vertical
-position of a note wrt. to the clef.
-\begin{mudela}
-\score {
-  \notes \relative c' {\clef alto;  \time 2/4; g'4 c,4 a'4 f4 e c d2 }
-  \paper {
-    linewidth = -1.;
-  }
-}  
-\end{mudela}
-
-Now you know the pitch of the notes: you look at the start of the line
-and see a clef, and with this clef, you can determine the notated pitches.
-You have found the em(context) in which the notation is to be
-interpreted!
-
-
-\section{Interpretation context}
-
-Context (clef, time signature etc.) determines the relationship
-between musical and its notation in notes.  Because LilyPond writes
-notation, context works the other way around for LilyPond: with
-context a piece of music can be converted to notation.
-
-A reader remembers this context while reading the notation from left
-to right.  By analogy, LilyPond constructs this context while
-constructing notes from left to right.  This is what happens in the
-``Interpretation'' phase from~\ref{fig:intro-fig}.  In LilyPond, the
-state of this context is a set of variables with their values; A staff
-context contains variables like
-
-\begin{itemize}
-\item current clef
-\item current time signature
-\item current key
-\end{itemize}
-
-These variables determine when and how clefs, time signatures, bar
-lines and accidentals are printed.
-
-
-Staff is not the only form of context in notation.  In polyphonic
-music, the stem direction shows which notes form a voice: all notes of
-the same voice have stems pointing in the same direction.  The value
-of this variable determines the appearance of the printed stems.
-
-In LilyPond ``Notation context'' is abstracted to a data structure
-that is used, constructed and modified during the interpretation
-phase.  It contains context properties, and is responsible for
-creating notational elements: the staff context creates symbols for
-clefs, time signatures and key signatures.  The Voice context creates
-stems, note heads.
-
-For the fragment of polyphonic music below,
-\begin{mudela}
-  \context Staff { c'4 < { \stemup c'4 } \context Voice = VB { \stemdown a4 } > }
-\end{mudela}
-A staff context is created.  Within this staff context (which printed
-the clef), a Voice context is created, which prints the first note.
-Then, a second Voice context is created, with stem direction set to
-``up'', and the direction for the other is set to down. Both Voice
-contexts  are  still part of the same Staff context.
-
-In the same way, multiple staff scores are created: within the score
-context, multiple staff contexts are created.  Every staff context
-creates the notation associated with a staff.  
-
-\section{Discussion}
-
-
-
-\end{document}
-
-The complexity of  music notation was tackled by adopting a modular
-design: both the formatting system (which encodes the esthetic rules of
-notation), and the interpretation system (which encodes the semantic
-rules) are highly modular.
-
-
-The difficulty in creating a format for music notation is rooted in
-the fact that music is multi dimensional: each sound has its own
-duration, pitch, loudness and articulation. Additionally, multiple
-sounds may be played simultaneously.  Because of this, there is no
-obvious way to ``flatten'' music into a context-free language.
-
-The difficulty in creating a printing engine is rooted in the fact
-that music notation complicated: it is very large graphical
-``language'' with many arbitrary esthetic and semantic conventions.
-Building a system that formats full fledged musical notation is a
-challenge in itself, regardless of whether it is part of a compiler or
-an editor.
-
-The fact that music and its notation are of a different nature,
-implies that the conversion between input notation is non-trivial.
-
-In LilyPond we solved the above problem in the following way:
-
diff --git a/Documentation/metadoc/musicnotes.sty b/Documentation/metadoc/musicnotes.sty
deleted file mode 100644 (file)
index 31d2f83..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-
-\input lilyponddefs
-
-\def\fetdef#1#2{%
-  \def#1{\hbox{\char#2}}}
-
-% huh? from where
-\input feta20.sty
-
-\font\fetasixteenfont=feta16
-\font\fetaelevenfont=feta11
-\def\fetafont{\fetasixteenfont}
-
-\newdimen\ild
-\ild=4pt
-\newdimen\stemthick
-\stemthick=0.4pt
-
-\def\eighthstem{{\fetafont\vrule height 3.5ex width \stemthick depth0pt\raise
-  3.5ex\hbox{\eighthflag}}}
-\def\texteighthflag{{\fetafont\raise 0ex\hbox{\fetafont\eighthflag}}}
-\def\textdeighthflag{{\fetafont\raise 0ex\hbox{\deighthflag}}}
-
-\def\texteighthnote{{\hbox{\hbox{\fetafont\quartball}\kern
-      -0.5\stemthick\eighthstem}}}
-\def\quarterstem{{\fetafont\vrule height 3.5ex width \stemthick depth0pt}}
-\def\textquarterstem{\quarterstem}
-\def\textchord{{\hbox{\fetafont\lower.5ex\hbox to
-      0pt{\textquarterhead}\raise.5ex\hbox{\textquarterhead}\kern
-      -0.5\stemthick\eighthstem}}}
-\def\textbassclef{\hbox{\fetafont\bassclef}}
-\def\texttrebleclef{\hbox{\fetafont\trebleclef}}
-\def\textslur{\embeddedps{9.378744 -3.171539 3.923099 -3.171539 0.000000 0.000000 12.800000 0.000000 3.672177 -3.672177 9.127823 -3.672177 12.800000 0.000000 0.000000 0.000000  draw_slur}}
-
-\def\textmarcato{{\fetafont\raise 1ex\hbox{\hskip 1ex\sforzatoaccent}}}
-
-
-\def\textquarterhead{\hbox{\fetafont\raise 2.5pt\hbox{\quartball}}}
-\def\texteighthstem{\hbox{\lower 5pt\hbox{\eighthstem}}}
-\def\texthalfnote{{\hbox{\hbox{\fetafont\halfball}\kern -0.5\stemthick\quarterstem}}}
-\def\textquarternote{{\hbox{\hbox{\fetafont\quartball}\kern -0.5\stemthick\quarterstem}}}
-\def\textflat{{\fetafont\raise 1ex\hbox{\flat}}}
-\def\textsharp{{\fetafont\raise1ex\hbox{\sharp}}}
diff --git a/Documentation/metadoc/regression-test.tely b/Documentation/metadoc/regression-test.tely
deleted file mode 100644 (file)
index 24e4d58..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-\input texinfo @c -*-texinfo-*-   vim:tw=72
-@setfilename regression-test.info
-@settitle LilyPond Regression test
-
-@c fool ls-latex
-@ignore
-@author Han-Wen Nienhuys and Jan Nieuwenhuizen
-@title LilyPond Regression test
-@end ignore
-
-@node Top, , ,
-
-@section Introduction
-
-This document tries give an brief overview of LilyPond features.  When
-the text correspond with the shown notation, we consider LilyPond
-Officially BugFree (tm).  This document is intended for finding bugs,
-and documenting bugfixes.
-
-@section Notes and rests
-
-Rests.  Note that the dot of 8th, 16th and 32nd rests rest should be
-next to the top of the rest.  All rests except the whole rest are
-centered on the middle staff line.  
-
-@mudelafile{rest.fly}
-
-Note head shapes are settable.  The stem endings should be adjusted
-per note head.  If you want different note head styles on one stem,
-you must create a special context called Thread.
-
-@mudelafile{noteheadstyle.ly}
-
-Noteheads can have dots, and ---although this is bad style in duple
-meters--- rests can too.  Augmentation dots should never be printed on
-a staff line, but rather be shifted vertically. They should go up, but
-in case of multiple parts, the down stems have down shifted dots.
-(Wanske p. 186) In case of chords, all dots should be in a column.
-The dots go along as rests are shifted to avoid collisions.
-
-@mudelafile{dots.fly}
-
-Multiple measure rests do not collide with barlines and clefs.  They
-are not expanded when you set @code{Score.SkipBars}.  Although the
-multi-measure-rest is a Spanner, minimum distances are set to keep it
-colliding from barlines. 
-
-@mudelafile{multi-measure-rest.ly}
-
-@section Stems
-
-Stem tremolos (official naming?) or rolls are tremolo signs that look
-like beam segments crossing stems.  If the stem is in a beam, the
-tremolo must be parallel to the beam.  If the stem is invisible
-(eg. on a whole note), the tremolo must be centered on the note.
-
-@mudelafile{stem-tremolo.ly}
-
-Chord tremolos look like beams, but are a kind of repeat symbol.
-To avoid confusion, chord tremolo beams do not reach the stems, but 
-leave a gap.  Chord tremolo beams on half notes are not ambiguous,
-as half notes cannot appear in a regular beam, and should reach the 
-stems.
-  
-@mudelafile{chord-tremolo.sly}
-
-Beams, stems and noteheads often have communication troubles, since
-the two systems for y dimensions (1 unit = staffspace, 1 unit = 1
-point) are mixed.
-
-Stems, beams, ties and slurs should behave similarly, when placed
-on the middle staff line. Of course stem-direction is down for high
-notes, and up for low notes.
-
-@mudelafile{stem-direction.sly}
-
-Similarly, if @code{stem_default_neutral_direction} is set to @code{-1}.
-
-@mudelafile{stem-direction-down.ly}
-
-@section Scripts
-
-The staccato dot (and all scripts with follow-into-staff set), must
-not be on staff lines.
-
-@mudelafile{staccato-pos.sly}
-
-@section Grace notes
-
-Grace notes are typeset as an encapsulated piece of music. You can
-have beams, notes, chords, stems etc. within a @code{\grace} section.
-Slurs that start within a grace section, but aren't ended are attached
-to the next normal note.  Grace notes have zero duration.  If there
-are tuplets, the grace notes won't be under the brace.  Grace notes
-can have accidentals, but they are (currently) spaced at a fixed
-distance.  Grace notes (of course) come before the accidentals of the
-main note.  Grace notes can also be positioned after the main note.
-
-@mudelafile{grace.ly}
-
-
-@section Beams, slurs and other spanners
-
-Beaming is generated automatically. Beams may cross bar lines. In that
-case, line breaks are forbidden.  Yet clef and key signatures are
-hidden just as with breakable bar lines.
-
-@mudelafile{beaming.ly}
-
-Beams should behave reasonably well, even under extreme circumstances.
-Stems may be short, but noteheads should never touch the beam.
-
-@mudelafile{beam-extreme.ly}
-
-Beams should always reach the middle staff line, the second beam
-counting from the note head side, should never be lower than the
-second staff line.  This does not hold for grace note beams.
-
-@mudelafile{beam-position.sly}
-
-Slurs should look nice and symmetric.  The curvature may increase
-only to avoid noteheads, and as little as possible.
-
-@mudelafile{slur-symmetry.ly}
-@mudelafile{slur-symmetry-1.ly}
-
-Ties are strictly horizontal.  They are placed in between note heads.
-The horizontal middle should not overlap with a staffline.
-
-@mudelafile{tie.ly}
-
-Beams can be typeset over fixed distance aligned staffs, beam
-beautification doesn't really work, but knees do. Beams should be
-behave well, wherever the switching point is.
-
-@mudelafile{beam-interstaff.ly}
-
-The same goes for slurs. They behave decently when broken across
-linebreak.
-
-@mudelafile{slur-interstaff.ly}
-
-Tuplets are indicated by a bracket with a number.  There should be no
-bracket if there is one beam that matches  the length of the tuplet.
-The bracket does not interfere with the stafflines, and the number is
-centered in the gap in the bracket.
-
-@mudelafile{tup.ly}
-
-@section Repeats
-
-LilyPond has three modes for repeats: folded, unfolded and
-semi-unfolded.  Unfolded repeats are fully written out. Semi unfolded
-repeats have the body written and all alternatives sequentially.
-Folded repeats have the body written and all alternatives
-simultaneously.  If the number of alternatives is larger than the
-repeat count, the excess alternatives are ignored.  If the number of
-alternatives is smaller, the first alternative is multiplied to get to
-the number of repeats.
-
-Unfolded behavior:
-
-@mudelafile{repeat-unfold.ly}
-
-Volta (Semi folded) behavior.  Voltas can start on non-barline moments.
-If they don't barlines should still be shown.
-
-@mudelafile{repeat-volta.ly}
-
-Folded.  This doesn't make sense without alternatives, but it works.
-
-@mudelafile{repeat-fold.ly}
-
-@section Lyrics
-
-Lyrics can be set to a melody automatically.  Excess lyrics will be
-dumped.  Lyrics will not be set over rests.  You can have melismata
-either by setting a property melismaBusy, or by setting
-automaticMelismas (which will set melismas during slurs and ties).  If
-you want a different order than first Music, then Lyrics, you must
-precook a chord of staffs/lyrics and label those.  Of course
-@code{\rhythm} ignores any other rhythms in the piece.  Hyphens and
-extenders do not assume anything about lyric lengths, so they continue
-to work.
-
-@mudelafile{lyric-combine.ly}
-
-@section Multiple notes
-
-Rests should not collide with beams, stems and noteheads.  Rests may
-be under beams.  Rests should be move by integral number of spaces
-inside the staff, and by half spaces outside.  Notice that the half
-and whole rests just outside the staff get ledger lines in different
-cases.
-
-@mudelafile{rest-collision.ly}
-
-Normal collisions. We have support for polyphony, where the
-middle voices are horizontally shifted.
-
-@mudelafile{collisions.ly}
-
-The number of stafflines of a staff can be set with the property
-numberOfStaffLines.  Ledger lines both on note heads and rests are
-adjusted.  Barlines also are adjusted.
-
-
-@mudelafile{number-staff-lines.fly}
-
-@section Spacing
-
-In a limited number of cases, LilyPond corrects for optical spacing
-effects.  In this example, space for opposite pointed stems is adjusted
-
-@mudelafile{stem-spacing.sly}
-
-If there are accidentals in the music, we add space, but the space
-between note and accidentals is less than between the notes with the
-same value.  Clef changes also get extra space, but not as much as
-barlines.
-
-
-Even if a line is very tightly spaced, there will still be room
-between prefatory matter and the following notes.  The space after the
-prefatory is very rigid.  In contrast, the space before the barline
-must stretch like the space within the measure.
-
-Tight:
-
-@mudelafile{spacing-tight.ly}
-
-Natural:
-
-@mudelafile{spacing-natural.ly}
-
-Loose:
-
-@mudelafile{spacing-loose.ly}
-
-Adding a @code{Bar_engraver} to the LyricsVoice context makes sure that
-lyrics don't collide with barlines.
-
-@mudelafile{lyrics-bar.ly}
-
-@section Global stuff
-
-Breaks can be encouraged and discouraged using @code{\break} and
-@code{\nobreak}.  They are abbrevs for @code{\penalty} commands.
-
-@mudelafile{break.ly}
-
-
-Markings that are attached to (invisible) barlines are 
-delicate: the are attached to the rest of the score without the score
-knowing it.  Consequently, they fall over  often.
-
-@mudelafile{bar-scripts.ly}
-
-Staff margins are also markings attached to barlines.  They should be
-left of the staff, and be centered vertically wrt the staff.  They may
-be on normal staffs, but also on compound staffs, like the PianoStaff
-
-@mudelafile{staff-margin.ly}
-
-Breathing signs, also used for phrasing, do normally not influence
-global spacing -- only if space gets tight, notes are shifted to make
-room for the breathing sign. Breathing signs break beams running
-through their voice. In the following example, the notes in the first
-two measures all have the same distance from each other:
-
-@mudelafile{breathing-sign.ly}
-
-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.    
-
-@mudelafile[nofly]{size11.ly}
-
-@mudelafile[nofly]{size13.ly}
-
-@mudelafile[nofly]{size16.ly}
-
-@mudelafile[nofly]{size20.ly}
-
-@mudelafile[nofly]{size23.ly}
-
-@mudelafile[nofly]{size26.ly}
-
-
-@section Clefs and Time Signatures
-
-The transparent clef should not occupy any space and with style
-@code{fullSizeChanges}, the changing clef should be typeset in full
-size. For octaviated clefs, the ``8'' should appear closely above or
-below the clef respectively.  The ``8'' is processed in a convoluted
-way, so this is fragile as well.
-
-@mudelafile{clefs.ly}
-
-@ignore
-@c the input file is too long and does not test for specific bugs
-By default, time signatures are written with two numbers. With style
-``C'', 4/4 and 2/2 are written with their corresponding symbols and
-with style ``old'', 2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8 and
-9/8 are typeset with symbols, all other signatures retain the default
-layout. The style ``1'', gives single number signatures for all
-signatures. 
-%
-\mu delafile{time.fly}
-@end ignore
-
-@bye
diff --git a/Documentation/misc/CHANGES-1.2 b/Documentation/misc/CHANGES-1.2
new file mode 100644 (file)
index 0000000..7bb36d4
--- /dev/null
@@ -0,0 +1,287 @@
+  
+pl 15.hwn1
+       - reverted MIDI unfold patches.
+       - bf: cross staff beam, cross staff slur (2x)
+       - doco  updates:
+         * metadoc/ -> programmer/ ,
+         * FAQ
+         * hacking
+         * index with logo
+
+pl 15.jcn3
+       - bf: smob fix
+       - mutopia/doc target 'local-web':
+         shorthand for 'CONFIGSUFFIX=www local-WWW'
+
+pl 15.lu2
+       - bf: close comments in website footer
+       - error messages for release didn't make it into .lu1?
+pl 15.jcn2
+       - small website fixes
+pl 15.jcn1
+       - bfs: initialise members of Column-x-positions and Break_node
+       - bf: Documentation/misc: don't include backups
+       - bf:  .gdbinit
+pl 15.lu1
+       - error messages for failing diff/release
+       - \property noStemExtend: don't extend normal or beamed stems to
+         middle staff line: input/test/no-stem-extend.fly
+
+******
+pl 15  (Oct 18)
+
+14.jcn1
+       - Kludge for accented chars (thanks, Mats)
+       - bf: don't fail on error in doco package
+       - doco package: noarch
+       - bf: standchen: mutopia prep
+
+14.hwn1
+       - move some misc stuff into Documentation/misc/
+       - cleanups: slur & beam.
+       - junked Encompass_info
+       - Smobs -- simplifies sc_elt memory management
+       - Timing_engraver collects bar reqs
+       - unfold all if doing MIDI.
+       - bfs: do something sensible if it doesn't fit.
+       - penalties for break stuff supported.
+
+*******
+13.jcn2,3
+       - mutopia/J.S.Bach/Petites-Preludes: bf's and mutopia preraration
+       - separate documentation package
+
+13.hwn2
+       - mutopia: scs2, horn-concerto-3
+       - junked Line_spacer baseclass.
+       - removed gourlay complications
+       - use force iso. energy for minimisation. Add uniformity term
+to demerits.
+
+13.jcn1
+       - bf: mudela-book
+
+*******
+12.jcn1
+       - auto-knees, input/test/auto-knee.ly
+
+pl 12.rrr2
+       - voltaSpannerDuration may be a rational
+       - .ly files corrected, Voice.dynamicDir to Voice.dynamicDirection
+
+pl 12.rrr1
+       - key (K:) with clef, bug fix for abc2ly
+       - voltaSpannerDuration code added to lilypond
+
+pl 12.hwn1
+       - junked wordwrap
+       - bf: use position (not pitch) for autochange
+       - mudela-book fixes: --dependencies, --dep-prefix
+       - mudela.tely more updates.  Now absorbed LilyPond manpage. 
+       - BUGS now in INSTALL.texi
+
+*******
+pl 11.uu1
+       - changed debug init code.
+
+pl 11.jcn2
+       - bf: LDFLAGS=foo CFLAGS=bar ./configure
+       - bf: configure (--disable-printing = default) -DNPRINT
+       - bf: mf-to-xpms / make -C mf xpms; feta-accordion is broken,
+         see mf/README
+
+pl 11.jcn1
+       - gnossiene with new \autochange
+
+pl 11.jbr1
+        - Tried to get rid of path and switch dependencies in mf
+          build process.
+
+pl 11.hwn1
+       - doco reorganisation: folded glossary and tutorial into manual.
+       - move mudela-book-doc to texinfo
+       - feta.tex to mf/
+       - release.py, package-diff.py now dump into out/
+
+
+****
+pl 10.hwn1
+       - Auto_change_music, Auto_change_iterator: auto staff
+switching. 2nd try.  See input/test/auto-change.ly
+
+pl 10.uu1
+       - doc restructure: hacking.texi
+       - make & install .pfas
+       - updates: faq.texi
+       - rpm fixes.
+       - Windows fixes (9.jbr)
+
+******
+pl 9.rrr1
+       - abc2ly bug fixes and extensions
+       - volta spanner given height to avoid collisions
+
+pl 9.jcn2
+       - 2.95 fixes
+       - input/test/different-time-signatures.ly (wasn't this in refman?)
+
+pl 9.hwn1
+       - fixes for mi2mu
+       - bf: staff-side with empty parent.
+       - bf:
+Hara_kiri_vertical_group_spanner::do_substitute_element_pointer has to
+call Axis_group_spanner::do_substitute_element_pointer.  Fixes
+harakiri & barline problem.
+       - junk: Spring_spacer, Ineq_constrained_qp, Mixed_qp,
+Active_constraints, Inactive_iter, Matrix, Vector,
+Choleski_decomposition, Full_storage
+
+
+pl 9.jcn1
+       - included last Localisation.texi
+       - set-lily: de catalog too
+
+*******
+pl 8.hwn1
+       - Erwin Dieterich: german translation.
+       - dependency helper funcs simplified.
+       - junk breaking stats.
+       - cleanups: Line_of_score also is X_AXIS group. Score_columns
+are put into Line_of_score of score.
+
+pl 8.jcn2
+       - scripts/mudela-book.py: use hash of full .ly contents (by default)
+       - bf: footify html doc upon creation too
+
+pl 8.jcn1
+       - Documentation/Localisation.texi: still some issues
+       - Uniformised locale strings
+       - marked some errors/warnings without _/_f markings
+       - added programming_warning (): not to be localised warnings
+         (none identified as yet)
+       - Update of po/nl.po
+
+*******
+pl 7.hwn1
+       - website fixes.
+       - spacer cleanups
+       - Simple_spacer: a simpler constraint solver. Enabled by default.
+pl 7.jcn1
+       - fixes to nl.po
+
+********
+
+pl 6.uu1
+       - website fixes.
+
+*******
+pl 5.hwn1
+       - more .texi; yodl completely removed.
+       - rm'd several doc stuff: engraving.yo, gnu-page.yo, translated blurbs (leave it to translation project)
+       - sm: help2man-*make
+       - mcgrain bib entry.
+       - debian updates.
+       - gcc 2.95 const fixes. (hopefully)
+       - sm: rm'd Documentation/tex/ directory.  everything in stepmake/INSTALL.texi
+
+pl 5.jcn1
+       - lily.scm: don't use regex-substitute/global 
+       - website/doco fixes
+       - bf: package-diff.py
+
+************
+
+pl 4.hwn1
+       - bf: repeats.
+       - bf: mmrests
+       - bf: simpler guile detection.
+       - use texinfo for reference manual.
+       - inline lily.ps from lilypond.
+       - texi for doco: converted directory Documentation/tex/
+
+
+pl 3.hwn1
+       - mudela-book tweaks for surviving texinfo
+       - include feta  command seqs. in .tex 
+       - guile 1.3.2 fixes.
+       - include  config.h directly.
+       - bf: mudela-book.  Now linear in size of document.
+       - scriptHorizontal property; more or less works.
+       - changes in Graphical_element, Graphical_axis_group
+offset removed from public interface, now use relative_coordinate ().
+extent () is given relative to this.
+       - removed Rhythmic_head::dots_i_
+       - bf: Rhythmic_head::do_substitute_element_pointer ()
+       - Direct access to dim_cache_ replaced by methods in
+Graphical_element.
+
+**********
+
+
+pl 2.mk1
+       - bf, tie.cc: handle postbreak left align correctly
+pl 2.lec1
+       - abc2ly fixes.
+
+pl 2.hwn1
+       - rewrite of mudela-book.  Now uses chunks, and you can put
+\input, \include and \mudelagraphics  in verbatim sections. 
+
+
+pl 2.jcn2
+       - bf: auto-beamer: don't junk beam if manual beam shows up
+
+pl 2.jcn1
+       - add-html-footer.py, ls-latex.py .tely updates and fixes
+       - tely (texinfo-lily) rules and test Documentation/metadoc/foo.tely
+
+*************
+
+pl 1.uu2
+       - complete rewrite of mudela-book. Much cleaner now.
+Support for texinfo.
+       - convert-mudela now per file, add \version if not present.
+
+pl 1.uu1.jcn1
+       - internationalization fixes for getopt-long help
+
+pl 1.uu1
+       - rewrite --help messages for help2man:
+       * lilypond
+       * mi2mu
+       * mudela-book
+       * convert-mudela
+       - cleanup: mf-to-table.py
+       - Getopt_long: support for --help msg.
+
+pl 1.mb1
+       - bf, scalar.cc: ".3" now detected as numerical
+
+********
+       
+pl 0.uu1
+       - refman updates by Werner & Mats
+       - now use ChangeLog for changes.
+       
+pl 0.jcn2
+       - po fixes
+
+pl 0.jcn1
+       - gcc-2.95 nitpicks
+       - added pointers to mailing lists in toplevel docs
+
+0.mb2
+       - configure: more robust detection of Guile
+       - Midi_note_off: revert to fixed note-off velocity. Fixes
+         problem with notes that never stop.
+       - Decreased breakable_column_space_strength
+       - Added a few TODO
+       - bf: "harmonic" and "cross" note heads also for half and 
+         whole notes.
+       - linewidth and textheight set independent of the font size.
+       - bf, titledefs.tex: opus and piece are not repeated for 
+         every piece unless they are explicitly set again.
+
+0.mb1
+       - Changed dynamicDir to dynamicDirection.
+       - refman and tutorial corrections.
index 55a1efe7ed53462d95afee542560367709c68359..d9b79c0e6ecf49e678ccfdf7205c249e1ccac3d6 100644 (file)
@@ -4,10 +4,9 @@ NAME = documentation
 
 STEPMAKE_TEMPLATES=documentation  texinfo
 
 
 STEPMAKE_TEMPLATES=documentation  texinfo
 
-TEXTS =AIMS $(wildcard CHANGES-*)  $(wildcard ANNOUNCE-*) $(wildcard NEWS-*) interview
+TEXTS =AIMS $(wildcard CHANGES-*[0-9])  $(wildcard ANNOUNCE-*[0-9]) $(wildcard NEWS-*[0-9]) interview
 EXTRA_DIST_FILES = $(TEXTS)
 
 EXTRA_DIST_FILES = $(TEXTS)
 
-
 include $(depth)/make/stepmake.make 
 
 default: do-doc
 include $(depth)/make/stepmake.make 
 
 default: do-doc
index d3499b3490e93d1c1a7c67515ba86414449d49b6..bc03e6e5a0e32f8d4e804ff2c89c16c386d36a31 100644 (file)
@@ -1,3 +1,12 @@
+WHAT'S NEW SINCE 1.2.0
+
+* Much faster spacing engine. 
+
+* Features: automatic staff switching
+
+* Documentation now all is in texinfo.
+
+
 WHAT'S NEW SINCE 1.0.17
 
 * Large cleanups, enhanced design and GUILE integration for smaller
 WHAT'S NEW SINCE 1.0.17
 
 * Large cleanups, enhanced design and GUILE integration for smaller
diff --git a/Documentation/misc/NEWS-1.2~ b/Documentation/misc/NEWS-1.2~
deleted file mode 100644 (file)
index d3499b3..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-WHAT'S NEW SINCE 1.0.17
-
-* Large cleanups, enhanced design and GUILE integration for smaller
-  memory footprint and more flexible code.
-
-* Direct output to PostScript (optional), PDFTeX or as GUILE script
-  (default output still to plain TeX).
-
-* Convertors for ABC and MUP formats.
-
-* Font: now available as scalable PostScript.  New glyphs: time
-  signature, more note heads.
-
-* Enhanced input: semi-automatic beaming, (nested) tuplets, (nested)
-  repeats, chordnames, automatic Lyrics durations.
-  
-* Grace notes, volta brackets, multiple styles for note heads and 
-  time signatures, breathing signs, lyric extenders, cross staff 
-  beaming and slurring.
-  
-* --safe option for the paranoid.
-
-* More elegant spacing.  Text is spaced exactly.
-
-* Lots of bugfixes.
diff --git a/Documentation/pictures/lelie-icon.xpm b/Documentation/pictures/lelie-icon.xpm
new file mode 100644 (file)
index 0000000..0ad7f75
--- /dev/null
@@ -0,0 +1,141 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"50 71 63 2",
+/* colors */
+"`` c #666664",
+"`a c #F2F2F4",
+"`b c #5E5E5C",
+"`c c #EAEAEC",
+"`d c #565654",
+"`e c #E2E2E4",
+"`f c #4E4E4C",
+"`g c #DADADC",
+"`h c #464644",
+"`i c #D2D2D4",
+"`j c #3E3E3C",
+"`k c #CACACC",
+"`l c #363634",
+"`m c #C2C2C4",
+"`n c #2E2E2C",
+"`o c #BABABC",
+"`p c #262624",
+"`q c #B2B2B4",
+"`r c #1E1E1C",
+"`s c #AAAAAC",
+"`t c #161614",
+"`u c #A2A2A4",
+"`v c #0E0E0C",
+"`w c #9A9A9C",
+"`x c #060604",
+"`y c #929294",
+"`z c #8A8A8C",
+"a` c #828284",
+"aa c #7A7A7C",
+"ab c #727274",
+"ac c #6A6A6C",
+"ad c #626264",
+"ae c #5A5A5C",
+"af c #525254",
+"ag c #4A4A4C",
+"ah c #424244",
+"ai c #3A3A3C",
+"aj c #323234",
+"ak c #2A2A2C",
+"al c #FEFEFC",
+"am c #222224",
+"an c #F6F6F4",
+"ao c #1A1A1C",
+"ap c #EEEEEC",
+"aq c #121214",
+"ar c #E6E6E4",
+"as c #0A0A0C",
+"at c #DEDEDC",
+"au c #D6D6D4",
+"av c #CECECC",
+"aw c #C6C6C4",
+"ax c #BEBEBC",
+"ay c #B6B6B4",
+"az c #AEAEAC",
+"b` c #A6A6A4",
+"ba c #9E9E9C",
+"bb c #969694",
+"bc c #8E8E8C",
+"bd c #868684",
+"be c #7E7E7C",
+"bf c #767674",
+"bg c #6E6E6C",
+"bh c #FAFAFC",
+/* pixels */
+"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
+"alalbhbhalalbhalalbhalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
+"alalalbhbhalalbhalalalalalalalalalalalalalalalalalal`o`ya``s`wbhalalalalalalalalalalalalalalalalalal",
+"bhalalalalalbhalalalalalalalalalalalalalalalalalal`a`malalalap`obb`malalalalal`cax`galalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalalalalalalalbcalbhalalalalalax`ialalal`gauav`u`ealalalalalalal",
+"alalalalalalalbhalalalalalalalalalalalalalalalalawar`ialalalalalalalaxapalalbaacat`i`oalalalalalalal",
+"alalbhalalalalbhalalalalalalalalalalalalalalalalazal`sbhalalalalalalalayalbh`eba`iapavalalalalalalal",
+"albhalbhalalalalalalalalalalalalalalalalalalalal`oatalb``aalalalalalal`oanazazanbhayalalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalalalalanawal`salalbaalalalalalalalazaa`cav`oalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalalalapawalalaranal`i`qalalalalalalbeayazbcbcalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalalal`g`oapalalalalal`yalalalalal`gbbabbhapalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalalalal`sanalalalalalbdalalalalalbc`obbalalalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalalalapaaanalalalalal`qatan`ealax`sbbazalalalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalalal`kab`oalalalalalau`uaw`salbb`ua`bcalalalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalalalayalalalalalalan`ea`axax`oba`oazaxaralalalalalalalalalalal",
+"alalalalalalalalalalapbhalalalalalalalalalaybhalalalalan`s`sazav`gaz`qbdalalazalalalalalalalalalalal",
+"alalalalalalalalalalax`u`aalalalalalalalalaraw`o`c`c`aaxaw`g`kav`sayb`ayalal`m`calalalalalalalalalal",
+"alalalalalalalalalalal`c`sbhalalalalalalalalalal`c`jb`albh`yavapazay`w`ialalalay`aalalalalalalalalal",
+"alalalalalalalalalalalalar`qbhalalalalalalalalalal`v`sav`abcaubbaw`u`salalalalalayapalalalalalalalal",
+"alalalalalalalalalalalalal`i`kalalalalalalalalalal`l`way`uau`cazazazbc`q`ialalalal`galalalalalalalal",
+"alalalalalalalalalalalalalalaw`galalalalalalan`i`m`hbe`q`oap`w`m`uax`ialax`salalalalalalalalalalalal",
+"alalalalalalalalalalalalalalal`oatalalalbh`kbaadagad```oav`i`mb`ba`ualalal`i`oalalalalalalalalalalal",
+"alalalalalalalalalalalalalalalanaz`aalanaz`nag`ian`w`k`iar`waw`o`o`ialalalalau`ialalalalalalalalalal",
+"alalalalalalalalalalalalalalalalapba`c`zakac`aalau`calapaz`gbabb`qbhalalalalal`ualalalalalalalalalal",
+"alalalalalalalalalalalalalalalalal`ibdambd`c`aalalalal`a`yax`kb``u`aalalalalal`e`kalalalalalalalalal",
+"alalalalalalalalalalalalalalalalarbcajbf`q`kalalalalal`w`c`sbc`k`e`kalalalalalal`salalalalalalalalal",
+"alalalalalalalalalalalalalalalalawaoaibbaw`kalalalalapbaaw`gb`baalaualalalalalal`salalalalalalalalal",
+"alalalalalalalalalalalalalalal`cbgaq`y`q`o`ialalalal`wbh`sba`g`oalaralalalalalal`ualalalalalalalalal",
+"alalalalalalalbhbhalalalalalalar`v`lbfazap`qapalal`gaz`k`e`y`u`galbhalalalalalalb`alalalalalalalalal",
+"alalalalalalalalalalalalalalalbb`x`l`qayalap`u`aala`al`u`q`ebebhalbhalalalalalalb`alalalalalalalalal",
+"alalalalalalalalalalalalalalal`gao`hayazalalapb``kax`iaubeaybaalalalalalalalalalbaalalalalalalalalal",
+"alalalalalalalalalalalalalalalalbdahba`galalalatbcalbb`maxbeatalalalalalalalalalbaalalalalalalalalal",
+"alalalalalalalalalalalalalalalalau`jb``calbhalal`k`oaw`zapbfalalalalanalalalalal`salalalalalalalalal",
+"alalalalalalalalalalalalalalalal`aad`malalbbalalal`o`kbb`y`ialalalal`walalalalal`qalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalbebaalapbfalalalbhbb`c`dalalalalalagalalalalap`oalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalbb`ialalajalalalalap`w`walalalalaxaaalalalal`qalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalazalalalbf`aalalalalbaayanalalalbg`ealalalbh`qalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalaxalalalbebhalalal`c`s`saxalalal``alalalalaybhalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalal`oalalal`ealalalalbb`eaw`uawalalawalbhalataualalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalanalalalalalalalal`wb`alayb``malalal`sal`oalalalalalalalalalalalal",
+"alalalalalalalalalalalalalalalalalalalal`galalalal`q`g`wauaraz`yalalaxapalbhalalalalalalalalalalalal",
+"alalalalbhalalalalbhalalalalbhbhalalbhal`salalalal`waw`kay`kapb`al`k`galalalbhbhbhbhbhalalalalalalal",
+"albhbhalbhalalalalbhalalalalalbhalalal`i`malalbhar`sbdal`q`oalalal`walalbhalalalalalbhalalalalalalal",
+"bhalalalalalalalalalalalbhalalal`ialalanavalalalbcalbbat`g`qalbhar`qalalalalalalalalalbhbhbhbhbhbhal",
+"alalalalbhbhbhalalbhbhalalalal`mbealbhalawalalalbd`iat`oaratalal`yalbhalalalalalalalalalalalalalbhal",
+"alalbhalalalalbhalalalalbhbhal`najalal`aarbhal`s`eazalazazalal`cb`alalalbhbhbhbhbhalalalalalalalalal",
+"bhalbhalalalalbhalalalalalalbbas`naralalalalal`yalazarauayalalbaa`albhalalalalalbhalalalalalalalbhal",
+"alalalalalalalalalalbhalal`aaq`r`hbdalalalalaraz`m`aazan`mal`ebd`jalalalalalalalalbhbhbhbhbhbhalalal",
+"alalbhbhbhalalbhbhalalalalaa`vah`d`d`calbhalbaal`qal`o`obhalbhbd`ray`i`gbhalalalalalalalalalbhalbhal",
+"bhalalalalbhalalalalbhalal`v`t`lah```ualalalbaan`q`cavaxalalatbeai`hauaw`waz`kav`ialalalalalalalalal",
+"bhalalalalbhalalalalal`aap`x`tahafbb`ybdalavat`sbh`sal`qalal`c`qafam`faab`axauav`i`s`oaualalbhalbhal",
+"alalalalalalalanaxax`s`q`gasao`pbebabb`ubd`walb`al`oavapalalbhaybeagaq`n`sauaw`i`iapat`kayauapalalal",
+"bhbhbhalalav`kazarauayay`sad`r`facae`mazaubgb``sbh`m`oalalalalavbbaeai`j`oav`g`oatau`c`g`a`eb`azanal",
+"alalalat`o`e`mavayavauarawayaq`lbf`yb``e`zap`yawbd`qayalalalap`ibcad`j`jbb`i`gapal`cal`iatau`gar`o`c",
+"alal`eavalbh`g`g`g`ialanaral`b`vabbd`u`ibd`e`ual`o`ea`bbbdbcb`arb````la``uap`i`cavapalarav`catav`c`q",
+"al`eavar`aanar`gavatayavaranatasae`wbcawax`iaval`calalalalalalaybcaf`hbb`garan`g`c`g`i`eatauatau`oap",
+"al`s`a`carau`capanal`gapanbhal`s`ragbc`e`k`walalalalalalal`cap`oa`bfbgarauauan`g`i`e`c`c`a`g`cauatal",
+"al`e`qay`s`i`eanarau`matau`cauau`s`ta`bd`sawalbhalalbhalapatav`s`f`baxalanat`aananan`eawat`max`aalal",
+"bhalbhawavbh`aavar`e`gawawau`k`i`c`i`h`d`y`ealalbhalalalalapauaxb`avan`carbhan`gau`aan`iax`ebhalalal",
+"alalalalan`uawawal`g`e`e`oatavat`q`ganbb`babbhalalap`ubbb`bb`z`u`gaparbhbhalanaw`iavax`cbhalalalbhal",
+"albhalbhalalbhanax`oaw`m`i`m`m`kbhalalalap`obaavalbhan`aan`aalalalalapaxawaw`oapanbhalalalalalalbhal",
+"alalalalalalalalalalananbhanbhalalalalalalalan`gb``qawavaxau`m`o`o`s`eananalalalalalalalalalalalalal",
+"alalalalalalbhbhbhalalalalalalalalbhalbhalalalalalalbhbhanbhalalalalalalalalalalalalalalalbhalalalal",
+"albhalalalbhalalalalalalalalbhbhbhalalalbhalbhalalalalalalalbhalalalalalalalalalbhalalalbhalalalbhal",
+"alalbhbhalalalalalbhalbhalalalalalalalalbhalalbhalalalalbhalalalbhalalbhbhbhalalbhbhbhalalbhalalbhal",
+"albhalalalalalalbhalbhalbhalalalalbhalalalalbhalalalalalalalalbhalbhalalalalbhalalal`aalalalbhalalal",
+"alalalalbhbhbhalalalalalalalalbhalbhalalalalalbhbhbhbhalalbhalalalbhalalalalalap`qbb`salalalalalbhal",
+"alalalbhalalalalalalalalbhbhbhalalalbhalbhalalalalalalalbhalalalalalalalalalalae`uav`calalalbhalalal",
+"bhbhalalalalalbhalbhalalalalalalalalbhalalbhalalalalbhalalalbhalalbhbhbhalalalalalaralalalalbhalbhal"
+};
diff --git a/Documentation/pictures/lelie-logo.xpm b/Documentation/pictures/lelie-logo.xpm
new file mode 100644 (file)
index 0000000..15408fb
--- /dev/null
@@ -0,0 +1,215 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"100 143 65 1",
+/* colors */
+"  c #ADADAD",
+". c #A5A5A5",
+"X c #9D9D9D",
+"o c #959595",
+"O c #8D8D8D",
+"+ c #858585",
+"@ c #7D7D7D",
+"# c #757575",
+"$ c #6D6D6D",
+"% c #656565",
+"& c #5D5D5D",
+"* c #555555",
+"= c #4D4D4D",
+"- c #FCFCFC",
+"; c #FAFAFA",
+": c #454545",
+"> c #F2F2F2",
+", c #3D3D3D",
+"< c #EAEAEA",
+"1 c #353535",
+"2 c #E2E2E2",
+"3 c #2D2D2D",
+"4 c #DADADA",
+"5 c #252525",
+"6 c #D2D2D2",
+"7 c #1D1D1D",
+"8 c #CACACA",
+"9 c #151515",
+"0 c #C2C2C2",
+"q c #0D0D0D",
+"w c #BABABA",
+"e c #050505",
+"r c #B2B2B2",
+"t c #AAAAAA",
+"y c #A2A2A2",
+"u c #9A9A9A",
+"i c #929292",
+"p c #8A8A8A",
+"a c #828282",
+"s c #7A7A7A",
+"d c #727272",
+"f c #6A6A6A",
+"g c #626262",
+"h c #5A5A5A",
+"j c #525252",
+"k c #FDFDFD",
+"l c #4A4A4A",
+"z c #F5F5F5",
+"x c #424242",
+"c c #EDEDED",
+"v c #3A3A3A",
+"b c #E5E5E5",
+"n c #323232",
+"m c #DDDDDD",
+"M c #2A2A2A",
+"N c #D5D5D5",
+"B c #222222",
+"V c #CDCDCD",
+"C c #1A1A1A",
+"Z c #C5C5C5",
+"A c #121212",
+"S c #BDBDBD",
+"D c #0A0A0A",
+"F c #B5B5B5",
+"G c #020202",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkk;kkkkkk;kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkk;kkkkk;kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkk;kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkk;kkkk;kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk.lexGGj*9jkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkhkkkkkkkkwhs+kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk6 kkkkkkkkkkkVeCkkkkkkkkkkkkrsspkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkk2G2kkkkkkkkkdkkkkekkkkkkkkkkkkkkkk",
+"k;kkkk;kkkk;kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk.Gkkkckkkkkkkkkkkk@kkkkkkkkskk:kkdokkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkk;kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkw2rkkkkkkkkkkkkkkkkk1kkkkkkkdkGykuk@kkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskk*kkkkkkkkkkkkkkkkrZkkkkkkGGtkm k%kkkkkkkkkkkkkkk",
+"kkk;kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjkkk$kkkkkkkkkkkkkkkkk=kkkkkkwniw kk@kkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk&kkkk3kkkkkkkkkkkkkkkkw6kkkkkk>X6kk4rkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkakkkkk=kkkkkkkkkkkkkkkk=kkkw:vNkkkk$kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkk;kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk&k06kkkvckkkkkkkkkkkkkk+zkkqkkkkkk&kkkkkkkkkkkkkkkkk",
+"kk;;kk;kkkkkkk;kk;kkkkkkkkkkkkkkkkkkkkkkkkkkkkkukkk+kkkk,kkkkkkkkkkkkkkk%kMkkkkk.ykkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkX8kky+kkkkk:kkkkkkkkkkkkkk$kGZk2Fwykkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkNikkkkk+mkkkknckkkkkkkkkkkkk@l*kZM@vGkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk4okkkkkkkkkkkkkGkkkkkkkkkkkkkZfikXkc$Ckkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjkkkkkkkkkkkkkkGkkkkkkkkkkkkk9ry,>kktkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk% Zkkkkkkkkkkky.kkkkkkkkkkkXu6f$kkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk<fVkkkkkkkkkkkm7kkkkkkkkkkkG0bgkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkkkkkkkkkkkkkb,kkkkkkkkkkxkFiDkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk2GkkkkkkkkkkkkkkqkkkkkkkkkkBFkaGkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk9kkkkkkkkkkkzk.ykkkkwkkkMktaOzZkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk:9Aakkkkkkkkkkkakjkkok:kkk*.khnkDkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk60a=kkkkkkkkkkkkV:kkOk&kkCkfpp8k5kkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkktkkkkkkkkkkkkkkrkAkk*k$kb#skd:kknkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk,kkkkkkkkkkkkkkkkGkkikak7k%rcjkkXZkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdkkkkkkkkkkkkkkp@FCkkub4SV#khOkkkk,kkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkk;kkkkkkkkkkkkkkkkkkkk%kkkkkkkkkkkkk%whkakmVFk3kfkZxkkkk@kkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkk,bt2kkkkkkkkkkkkkkkkkkksSkkkkkkkkkk#y<F<dkokkazsk3k+kkkkk:kkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkXugckkkkkkkkkkkkkkkkkkkSOddVkkkkk$kpm<>okpkknk*kh%kkkkkki4kkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkaikkkkkkkkkkkkkkkkkkkkkkk4rqZFskkk>kgk0>k%z44hk=kkkkkkk:kkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkk+ikkkkkkkkkkkkkkkkkkkkkkkkGhFFkkkk>Akskkvk*kxmZkkkkkkkkdkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkiikkkkkkkkkkkkkkkkkkkkkkk7D+0kkkk*FbNk,kkp.k*kkkkkkkkkzlkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkk>u.kkkkkkkkkkkkkkkkkkkkkkGGrF$;kkGkOkk7knkvkdkkkkkkkkkkzdkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkZoZkkkkkkkkkkkkkkkkkkkkkMM8$skk*zwkk:kkoNS@@kkkkkkkkkkkzMkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkSybkkkkkkkkkkkkkkkkkkkkfDO *kk=kwk>,kvk3kn>g$0kkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkku kkkkkkkkkkkkkkkkkkkV+G%uXkGkykk3kkfk+kjkkk*Mkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkO.kkkkkkkkkkkkkkk4o4k.G@&FS46;k4gkvkvk1gkkkkkG>kkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkiukkkkkkkkkkkkmSkSGG&GtrMFktkk9kk%kqkGckkkkkkGkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcX kkkkkkkkkkukgGGG+;GMxZkOkkutkvk$k#xkkkkkkkk5kkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkNoVkkkkkkktjdGGsikkkGGVk+kmkBkkdkMkGhkkkkkkkkkjkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk X<kkkkk ZGG7s<kkkkv;kukcbd2kjku64Ghkkkkkkkkk6ykkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuXkkk26oG%*t>>kkyakk;;kyk7kkxkGkGykkkkkkkkkkkMkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkphk6k9Gqx1kkkkNSkkkkkSk,kk:k2skGmkkkkkkkkkkkb&kkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk+ukGG&=k<kkkkkkkkkkkkknkkxkGk=X kkkkkkkkkkkkhkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk0SeG$tpkk6kkkkkkkkkkkGkk:kkvkGCk>kkkkkkkkkkkzakkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk.;G<AnsVkgkkkkkkkkkkkpdkkxk9kblik$kkkkkkkkkkkkMkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZkGGDknuSc6kkkkkkkkkkkGkkhkkGkAiak+kkkkkkkkkkkkgkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkiOG=qiV>6i>kkkkkkkkkk+tkkjkh;kGpkkskkkkkkkkkkkkwrkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk6kG77n:VOk#kkkkkkkkkkkGkkskkqkjx6k; kkkkkkkkkkkkk&kkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk lGGxX,koykkkkkkkkkkkgbkk3k+tkGkkk$kkkkkkkkkkkkkk3kkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk6kGGGFXdkbyukkkkkkkkkkCkkf;kGk41<kk@kkkkkkkkkkkkkkjkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZ%GCahFO4tcOSkkkkkkkk5kkkjkSgk9Zzkbb0kkkkkkkkkkkkkjkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk<GGvC3 4pkk6i<kkkkkkN,kkOzkGkkGh>kkkpkkkkkkkkkkkkk=kkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkk4rGG1nyjm%kkkOakkkkkkDkkknkk1koGtkkkkokkkkkkkkkkkkkjkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkk ,GC,5 cZ6kkkkO@kkkk.gkkONk1kkGZkkkk+kkkkkkkkkkkkkk=kkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOyGG=l#;%2kkkkkOakkkGkkknkkGkkCfkkkk;kkkkkkkkkkkkkkjkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk4GG:*OV@Zkkkkkkpiktpkk 8k56kv9;kkkkkkkkkkkkkkkkkkk,kkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcGG#s>ykkkkkkk>obGkkk7kkGkkq8kkkkkkkkkkkkkkkkkkkk7kkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk2CGp*0rkkkkkkkk .akkurkp+kbqokkkkkkkkkkkkkkkkkkkkjkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkm#Gpd;bkkkkkkkkktukkDkkGkkxu>kkkkkkkkkkkkkkkkkkkk=kkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkNGgCkFkkkkkkkkkkpXmik<,kkGSkkkkkkkkkkkkkkkkkkkkk&kkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkktyGtVkkkkNkkkkkkkovkkGkkdd4kkkkkkkkNkkkkkkkkkkkkfkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkSGk.kkkkGkkkkkkk;o0kGkk9rkkkkkkkkkGkkkkkkkkkkkw8kkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkbAhkkkkkGkkkkkkkk2t3wkwx;kkkkkkkkkG2kkkkkkkkkkMkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk83MkkkkFGkkkkkkkkkuokkA*kkkkkkkkkkG&kkkkkkkkkkhkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkA=kkkkkGVkkkkkkkkkd.kGbkkkkkkkkkkGZkkkkkkkkk$;kkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk5ykkkkkGGkkkkkkkkkkfdnzkkkkkkkkkaGkkkkkkkkkkgkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjkkkkkkrGkkkkkkkkkkkdikkkkkkkkkkGDkkkkkkkkk<akkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklkkkkkkkG>kkkkkkkkkN&wukkkkkkkk<Gkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkakkkkkkkG0kkkkkkkkkCk;ptkkkkkkkFGkkkkkkkkk6wkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdkkkkkkkGkkkkkkkkkknkw@w8kkkkkk Gkkkkkkkkk,kkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkt4kkkkkkkGkkkkkkkkk$NkgkXS>kkkkkkGkkkkkkkkObkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkhkkkkkkkkkkkkkkkkkkGkkgkk9ykkkkkkpkkkkkkk2.kkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkykkkkkkkkkkkkkkkkk2gkjzkXkyskkkkkkkkkbkkkhkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkvkkxkk&k4@#kkkkkkkm5kk*kkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk7kkgkkfk&koZkkkkkk%kk;0kkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk2kkkkkkkkkf8k1kktNkjkiXkkkkkhkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk:kkkkkkkkkekk7kk$kkhk@akkkkfkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkobkkkkkkkk4#kr+kkjkOkkXhkkk ykkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk5kkkkkkkkkCkkGkk6Zk%kkkkkkk7kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkik kkkkkkkkCkkGkkgkk%kkkkkk8pkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkpkskkkkkkkgbkOrkkgkV8kkkkkk9kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk2NkkkkkkkGkkGkkNXkhkkkkkkk3kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkGkkkkkkkukkkkkkk4&kkfkk$kk$kkkkkk$kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkFGkkkkkkk+kkkkkkkqkkFSkkfkz kkkkkkqkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkGGckkkkkkukkkkkkkDkkjkk>ykdkkkkkkk7kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkhGGdkkkkkNSkkkkkk=4kkjkk*kk*kkkkkkk%kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkGGCGkkkkkkkkkkkkkGkka;kk=kk&kkkkkawikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkAGG%Gkkkkkkkkkkkk4&kkjkkkukXckkkkmn$.kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkk>G3Gnv%kkkkkkkkkkkCkkk&kk%kk=kkkkkkg3Xkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkGGe91gGkkkkkkkkkkkCkkpkkkjkk$kkkbS.99@kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkk GGA$B%pskkkkkkkkkd4kk=kkkdkVZkkkkbbdG3kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkGGAG$Gi$v;kkkkkkkk7kk>skk+kk%kkkkkk0OG,okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkktGBqCaha9dXkkkkkkkk&kkhkkkhkk$kkkkk<#BvG9mpsfN>kkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkGGGeD=,Chtswkkkkkk1kkkjkkkskk+kkkk6mX@:BC:kNrm3$fwitkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkGGGj5*gl$12=kkkkkk1kkNokkozkskkkkkk0y&%1GtFkykkF$kckdpftkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkGAG5en#Dwyk+7kkkkZ kkjkkkxkkgkkkkkkkF hCnGlgO.xz<ruckkko*+wkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkwtkGAG5ij#%&Vfn$3kkk,kkk3kkk*kk%kkkkkktNw v1GqqM,aV+m22ty>>4b+dyikkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkbot&h akGGG5GG*@syi06.Gkkhkkrwkk bkF2kkkkkkkwp +*=DGGjokkSjNXk tkkkk2ud$2kkkkkkkkk",
+"kkkkkkkkkkkkkkk6p3$48wNckknGG=*MfNSt.a*c#*Akkk3kkk*kk&kkkkkkkkkX@loD=Ge$apykkkNkkkm2mVVkkk8sXkkkkkkk",
+"kkkkkkkkkkkkkXi4k>0NsZk+sSrGB,Cs,lMAX46fkkGlak&kkk&kk&kkkkkkkkkpt$$,%MGh%>kkkbFrwm2k4>kbkkmkN9#kkkkk",
+"kkkkkkkkkkNvy6%SkkkbN8awiSkGeDBpl0Fdc0.k0Si;8G&kk4Vk<tkkkkkkkkm6.F%&MMGyZk dXwFSkb t;;FFk8Nk4N2Mmkkk",
+"kkkkkkkkF=Sk@2k++tkkwZ;2Zs #G,B*othug04Sk9kkk,kvd@kk@kkkkkkkkzSbwis1xhGjr9tNZ0kkkkkkkkzZcm2X;k<km&kk",
+"kkkkkkkgmkkkk bckOhwkkkmkkz;GG1qxli6VpkkVnk4VgkkkGGa*kkkkkkkkr4V%sFnvMGy+kkkkk4<kkb2kk< zyk4tS>kS2uk",
+"kkkkkk%zkkkk<800840kkkkkkkkkFGDG:O aOOkVoa.k%kkkbSk>Gn&GGBnD9uV<dy@3$BGkG22mFFbb0y2kkkkk0SrkkNy6Vkgk",
+"kkkk;#kkkkk>wkzkkNZ4kkk6VSkkkGGCps&$k$gkDk4k5kkkgkk>kkkkkkkkkkkz0bd#vGvbFkkkk4mkkZNkkkkt6kkzrkkF<k*k",
+"kkkk*kzFkbkkzkkSNNktag@6kkkkktGB3X4f@fkunkkk%kkk0kkkkkkkkkkkkk.N8uGfD@6nkkkkck>pNkk>owbkkkrNkmw;y mk",
+"kkk$kkkb<kk4mNZZZ0bkkkkkmFmkkkGG3%otorakk<knkkkkkkkkkkkkkkkkkkS@xflovf%k0XXckkzkk2oNkkk u0k6ukV<<Xkk",
+"kkk=k6kk0NSbkVmkkkkk<6kkkkkkkkkGGxjMrr>kykkAkkkkkkkkkkkkkkkkkkkwoZ+$3orkkkkkk4 Zkkkkk.0kkkbkk4kbukkk",
+"kkkhkk8Nkkb8>zckkckkbFV<ck>kkkkkGBGOj%r;#k2+kkkkkkkkkkkkkkkyw<wd&=pfy%kkFtXrkkkkou.zk;kkk>w02k.wkkkk",
+"kkkXscihna6kwkbzkkk0iVz0y8kckVykkGC7oZGky8,kkkkkkkkkkkkkkwZkkFuh=jll3kkkkkkkk<2kkkkkkkkVw;k ;hckkkkk",
+"kkkkklkkk>wr6kkk>opkk.0k2kFkO;ZbkkqGxdM8Fpkkkkkkkkkkkkkkkkk FVkNn%F5kkkkkk2tcckkkk2kVtiukSwyokkkkkkk",
+"kkkkkkXOkkkkkkkyVkkkkVSZZ kFNF48Nkk8Gl5FiakkkkkkkkkkkkkkkkkV0 dpka&kkkkkkkkkkkkwyF4kkzzkruykkkkkkkkk",
+"kkkkkkkzsykkkNpkkm4wF2w2N8<wZ2Fbk6k009G&xcickkkkkkkkkkkkkkkkkkkkhNkkkNZNrVkkk4rckkkkkkNaykkkkkkkkkkk",
+"kkkkkkkkk;g3Skkkkk VF2mrkS64kZkktS@zkkOGftrqkkkkkkkk6m2S2b@#5GqskwVk8bkkkkkkkmkkkkko$aZkkkkkkkkkkkkk",
+"kkkkkkkkkkkk6s@okkkkkkkkfF;Ny04ya8kkkkkk=G+f<kkkkkkyj&j:xfa6kkk;6zkkkkkkkkkkkkmvXyuzkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkk;fasikkkkkkzkko$Nkkkkkkkkkc&wb kkkkkkkkkkkk<kkkk;kkkkkkkkkk #afNkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkmud$# rs+@kkkkkkkkkkkkkkco15;kkkkkkkkkkkkkkkkkkkkkt%a@pkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkaxg$* o;mkkkkyojuf+=hyzkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk44d#ddN6kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk-kkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk--kkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk-k-----kkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk----k--kkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk;--kk-kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk-kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk-kkkkkkkkkkkkkkkk"
+};
diff --git a/Documentation/pictures/lelie_icon.xpm b/Documentation/pictures/lelie_icon.xpm
deleted file mode 100644 (file)
index 0ad7f75..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-/* XPM */
-static char *noname[] = {
-/* width height ncolors chars_per_pixel */
-"50 71 63 2",
-/* colors */
-"`` c #666664",
-"`a c #F2F2F4",
-"`b c #5E5E5C",
-"`c c #EAEAEC",
-"`d c #565654",
-"`e c #E2E2E4",
-"`f c #4E4E4C",
-"`g c #DADADC",
-"`h c #464644",
-"`i c #D2D2D4",
-"`j c #3E3E3C",
-"`k c #CACACC",
-"`l c #363634",
-"`m c #C2C2C4",
-"`n c #2E2E2C",
-"`o c #BABABC",
-"`p c #262624",
-"`q c #B2B2B4",
-"`r c #1E1E1C",
-"`s c #AAAAAC",
-"`t c #161614",
-"`u c #A2A2A4",
-"`v c #0E0E0C",
-"`w c #9A9A9C",
-"`x c #060604",
-"`y c #929294",
-"`z c #8A8A8C",
-"a` c #828284",
-"aa c #7A7A7C",
-"ab c #727274",
-"ac c #6A6A6C",
-"ad c #626264",
-"ae c #5A5A5C",
-"af c #525254",
-"ag c #4A4A4C",
-"ah c #424244",
-"ai c #3A3A3C",
-"aj c #323234",
-"ak c #2A2A2C",
-"al c #FEFEFC",
-"am c #222224",
-"an c #F6F6F4",
-"ao c #1A1A1C",
-"ap c #EEEEEC",
-"aq c #121214",
-"ar c #E6E6E4",
-"as c #0A0A0C",
-"at c #DEDEDC",
-"au c #D6D6D4",
-"av c #CECECC",
-"aw c #C6C6C4",
-"ax c #BEBEBC",
-"ay c #B6B6B4",
-"az c #AEAEAC",
-"b` c #A6A6A4",
-"ba c #9E9E9C",
-"bb c #969694",
-"bc c #8E8E8C",
-"bd c #868684",
-"be c #7E7E7C",
-"bf c #767674",
-"bg c #6E6E6C",
-"bh c #FAFAFC",
-/* pixels */
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalbhbhalalbhalalbhalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalbhbhalalbhalalalalalalalalalalalalalalalalalal`o`ya``s`wbhalalalalalalalalalalalalalalalalalal",
-"bhalalalalalbhalalalalalalalalalalalalalalalalalal`a`malalalap`obb`malalalalal`cax`galalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalbcalbhalalalalalax`ialalal`gauav`u`ealalalalalalal",
-"alalalalalalalbhalalalalalalalalalalalalalalalalawar`ialalalalalalalaxapalalbaacat`i`oalalalalalalal",
-"alalbhalalalalbhalalalalalalalalalalalalalalalalazal`sbhalalalalalalalayalbh`eba`iapavalalalalalalal",
-"albhalbhalalalalalalalalalalalalalalalalalalalal`oatalb``aalalalalalal`oanazazanbhayalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalanawal`salalbaalalalalalalalazaa`cav`oalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalapawalalaranal`i`qalalalalalalbeayazbcbcalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalal`g`oapalalalalal`yalalalalal`gbbabbhapalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalal`sanalalalalalbdalalalalalbc`obbalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalapaaanalalalalal`qatan`ealax`sbbazalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalal`kab`oalalalalalau`uaw`salbb`ua`bcalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalayalalalalalalan`ea`axax`oba`oazaxaralalalalalalalalalalal",
-"alalalalalalalalalalapbhalalalalalalalalalaybhalalalalan`s`sazav`gaz`qbdalalazalalalalalalalalalalal",
-"alalalalalalalalalalax`u`aalalalalalalalalaraw`o`c`c`aaxaw`g`kav`sayb`ayalal`m`calalalalalalalalalal",
-"alalalalalalalalalalal`c`sbhalalalalalalalalalal`c`jb`albh`yavapazay`w`ialalalay`aalalalalalalalalal",
-"alalalalalalalalalalalalar`qbhalalalalalalalalalal`v`sav`abcaubbaw`u`salalalalalayapalalalalalalalal",
-"alalalalalalalalalalalalal`i`kalalalalalalalalalal`l`way`uau`cazazazbc`q`ialalalal`galalalalalalalal",
-"alalalalalalalalalalalalalalaw`galalalalalalan`i`m`hbe`q`oap`w`m`uax`ialax`salalalalalalalalalalalal",
-"alalalalalalalalalalalalalalal`oatalalalbh`kbaadagad```oav`i`mb`ba`ualalal`i`oalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalanaz`aalanaz`nag`ian`w`k`iar`waw`o`o`ialalalalau`ialalalalalalalalalal",
-"alalalalalalalalalalalalalalalalapba`c`zakac`aalau`calapaz`gbabb`qbhalalalalal`ualalalalalalalalalal",
-"alalalalalalalalalalalalalalalalal`ibdambd`c`aalalalal`a`yax`kb``u`aalalalalal`e`kalalalalalalalalal",
-"alalalalalalalalalalalalalalalalarbcajbf`q`kalalalalal`w`c`sbc`k`e`kalalalalalal`salalalalalalalalal",
-"alalalalalalalalalalalalalalalalawaoaibbaw`kalalalalapbaaw`gb`baalaualalalalalal`salalalalalalalalal",
-"alalalalalalalalalalalalalalal`cbgaq`y`q`o`ialalalal`wbh`sba`g`oalaralalalalalal`ualalalalalalalalal",
-"alalalalalalalbhbhalalalalalalar`v`lbfazap`qapalal`gaz`k`e`y`u`galbhalalalalalalb`alalalalalalalalal",
-"alalalalalalalalalalalalalalalbb`x`l`qayalap`u`aala`al`u`q`ebebhalbhalalalalalalb`alalalalalalalalal",
-"alalalalalalalalalalalalalalal`gao`hayazalalapb``kax`iaubeaybaalalalalalalalalalbaalalalalalalalalal",
-"alalalalalalalalalalalalalalalalbdahba`galalalatbcalbb`maxbeatalalalalalalalalalbaalalalalalalalalal",
-"alalalalalalalalalalalalalalalalau`jb``calbhalal`k`oaw`zapbfalalalalanalalalalal`salalalalalalalalal",
-"alalalalalalalalalalalalalalalal`aad`malalbbalalal`o`kbb`y`ialalalal`walalalalal`qalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalbebaalapbfalalalbhbb`c`dalalalalalagalalalalap`oalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalbb`ialalajalalalalap`w`walalalalaxaaalalalal`qalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalazalalalbf`aalalalalbaayanalalalbg`ealalalbh`qalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalaxalalalbebhalalal`c`s`saxalalal``alalalalaybhalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalal`oalalal`ealalalalbb`eaw`uawalalawalbhalataualalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalanalalalalalalalal`wb`alayb``malalal`sal`oalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalal`galalalal`q`g`wauaraz`yalalaxapalbhalalalalalalalalalalalal",
-"alalalalbhalalalalbhalalalalbhbhalalbhal`salalalal`waw`kay`kapb`al`k`galalalbhbhbhbhbhalalalalalalal",
-"albhbhalbhalalalalbhalalalalalbhalalal`i`malalbhar`sbdal`q`oalalal`walalbhalalalalalbhalalalalalalal",
-"bhalalalalalalalalalalalbhalalal`ialalanavalalalbcalbbat`g`qalbhar`qalalalalalalalalalbhbhbhbhbhbhal",
-"alalalalbhbhbhalalbhbhalalalal`mbealbhalawalalalbd`iat`oaratalal`yalbhalalalalalalalalalalalalalbhal",
-"alalbhalalalalbhalalalalbhbhal`najalal`aarbhal`s`eazalazazalal`cb`alalalbhbhbhbhbhalalalalalalalalal",
-"bhalbhalalalalbhalalalalalalbbas`naralalalalal`yalazarauayalalbaa`albhalalalalalbhalalalalalalalbhal",
-"alalalalalalalalalalbhalal`aaq`r`hbdalalalalaraz`m`aazan`mal`ebd`jalalalalalalalalbhbhbhbhbhbhalalal",
-"alalbhbhbhalalbhbhalalalalaa`vah`d`d`calbhalbaal`qal`o`obhalbhbd`ray`i`gbhalalalalalalalalalbhalbhal",
-"bhalalalalbhalalalalbhalal`v`t`lah```ualalalbaan`q`cavaxalalatbeai`hauaw`waz`kav`ialalalalalalalalal",
-"bhalalalalbhalalalalal`aap`x`tahafbb`ybdalavat`sbh`sal`qalal`c`qafam`faab`axauav`i`s`oaualalbhalbhal",
-"alalalalalalalanaxax`s`q`gasao`pbebabb`ubd`walb`al`oavapalalbhaybeagaq`n`sauaw`i`iapat`kayauapalalal",
-"bhbhbhalalav`kazarauayay`sad`r`facae`mazaubgb``sbh`m`oalalalalavbbaeai`j`oav`g`oatau`c`g`a`eb`azanal",
-"alalalat`o`e`mavayavauarawayaq`lbf`yb``e`zap`yawbd`qayalalalap`ibcad`j`jbb`i`gapal`cal`iatau`gar`o`c",
-"alal`eavalbh`g`g`g`ialanaral`b`vabbd`u`ibd`e`ual`o`ea`bbbdbcb`arb````la``uap`i`cavapalarav`catav`c`q",
-"al`eavar`aanar`gavatayavaranatasae`wbcawax`iaval`calalalalalalaybcaf`hbb`garan`g`c`g`i`eatauatau`oap",
-"al`s`a`carau`capanal`gapanbhal`s`ragbc`e`k`walalalalalalal`cap`oa`bfbgarauauan`g`i`e`c`c`a`g`cauatal",
-"al`e`qay`s`i`eanarau`matau`cauau`s`ta`bd`sawalbhalalbhalapatav`s`f`baxalanat`aananan`eawat`max`aalal",
-"bhalbhawavbh`aavar`e`gawawau`k`i`c`i`h`d`y`ealalbhalalalalapauaxb`avan`carbhan`gau`aan`iax`ebhalalal",
-"alalalalan`uawawal`g`e`e`oatavat`q`ganbb`babbhalalap`ubbb`bb`z`u`gaparbhbhalanaw`iavax`cbhalalalbhal",
-"albhalbhalalbhanax`oaw`m`i`m`m`kbhalalalap`obaavalbhan`aan`aalalalalapaxawaw`oapanbhalalalalalalbhal",
-"alalalalalalalalalalananbhanbhalalalalalalalan`gb``qawavaxau`m`o`o`s`eananalalalalalalalalalalalalal",
-"alalalalalalbhbhbhalalalalalalalalbhalbhalalalalalalbhbhanbhalalalalalalalalalalalalalalalbhalalalal",
-"albhalalalbhalalalalalalalalbhbhbhalalalbhalbhalalalalalalalbhalalalalalalalalalbhalalalbhalalalbhal",
-"alalbhbhalalalalalbhalbhalalalalalalalalbhalalbhalalalalbhalalalbhalalbhbhbhalalbhbhbhalalbhalalbhal",
-"albhalalalalalalbhalbhalbhalalalalbhalalalalbhalalalalalalalalbhalbhalalalalbhalalal`aalalalbhalalal",
-"alalalalbhbhbhalalalalalalalalbhalbhalalalalalbhbhbhbhalalbhalalalbhalalalalalap`qbb`salalalalalbhal",
-"alalalbhalalalalalalalalbhbhbhalalalbhalbhalalalalalalalbhalalalalalalalalalalae`uav`calalalbhalalal",
-"bhbhalalalalalbhalbhalalalalalalalalbhalalbhalalalalbhalalalbhalalbhbhbhalalalalalaralalalalbhalbhal"
-};
diff --git a/Documentation/pictures/lelie_logo.xpm b/Documentation/pictures/lelie_logo.xpm
deleted file mode 100644 (file)
index 96be267..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-/* XPM */
-static char *noname[] = {
-/* width height ncolors chars_per_pixel */
-"100 143 64 2",
-/* colors */
-"`` c #666664",
-"`a c #F2F2F4",
-"`b c #5E5E5C",
-"`c c #EAEAEC",
-"`d c #565654",
-"`e c #E2E2E4",
-"`f c #4E4E4C",
-"`g c #DADADC",
-"`h c #464644",
-"`i c #D2D2D4",
-"`j c #3E3E3C",
-"`k c #CACACC",
-"`l c #363634",
-"`m c #C2C2C4",
-"`n c #2E2E2C",
-"`o c #BABABC",
-"`p c #262624",
-"`q c #B2B2B4",
-"`r c #1E1E1C",
-"`s c #AAAAAC",
-"`t c #161614",
-"`u c #A2A2A4",
-"`v c #0E0E0C",
-"`w c #9A9A9C",
-"`x c #060604",
-"`y c #929294",
-"`z c #8A8A8C",
-"a` c #828284",
-"aa c #7A7A7C",
-"ab c #727274",
-"ac c #6A6A6C",
-"ad c #626264",
-"ae c #5A5A5C",
-"af c #525254",
-"ag c #4A4A4C",
-"ah c #424244",
-"ai c #3A3A3C",
-"aj c #323234",
-"ak c #2A2A2C",
-"al c #FEFEFC",
-"am c #222224",
-"an c #F6F6F4",
-"ao c #1A1A1C",
-"ap c #EEEEEC",
-"aq c #121214",
-"ar c #E6E6E4",
-"as c #0A0A0C",
-"at c #DEDEDC",
-"au c #020204",
-"av c #D6D6D4",
-"aw c #CECECC",
-"ax c #C6C6C4",
-"ay c #BEBEBC",
-"az c #B6B6B4",
-"b` c #AEAEAC",
-"ba c #A6A6A4",
-"bb c #9E9E9C",
-"bc c #969694",
-"bd c #8E8E8C",
-"be c #868684",
-"bf c #7E7E7C",
-"bg c #767674",
-"bh c #6E6E6C",
-"bi c #FAFAFC",
-/* pixels */
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalbialalalalalalbialalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalbialalalalalbialalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalbialalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalbialalalalbialalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalbaag`xahauauaf`d`tafalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaealalalalalalalal`oaeaabealalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`ib`alalalalalalalalalalalaw`xaoalalalalalalalalalalalal`qaaaa`zalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalbdalalalalalalalalalalalalalal`eau`ealalalalalalalalalabalalalal`xalalalalalalalalalalalalalalalal",
-"albialalalalbialalalalbialalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalbaaualalalapalalalalalalalalalalalalbfalalalalalalalalaaalal`halalabbcalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalbialalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`o`e`qalalalalalalalalalalalalalalalalal`lalalalalalalalabalau`ual`walbfalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaaalal`dalalalalalalalalalalalalalalalal`qaxalalalalalalauau`salatb`al``alalalalalalalalalalalalalalal",
-"alalalbialalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalafalalalbhalalalalalalalalalalalalalalalalal`falalalalalal`oaj`y`ob`alalbfalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`balalalal`nalalalalalalalalalalalalalalalal`o`ialalalalalal`abb`ialal`g`qalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalala`alalalalal`falalalalalalalalalalalalalalalal`falalal`o`haiavalalalalbhalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalbialalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`bal`m`ialalalaiapalalalalalalalalalalalalalalbeanalal`valalalalalal`balalalalalalalalalalalalalalalalal",
-"alalbibialalbialalalalalalalbialalbialalalalalalalalalalalalalalalalalalalalalalalalalalalalal`walalalbealalalal`jalalalalalalalalalalalalalalal``alakalalalalalba`ualalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalbb`kalal`ubealalalalal`halalalalalalalalalalalalalalbhalauaxal`eaz`o`ualalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalav`yalalalalalbeatalalalalajapalalalalalalalalalalalalalbfag`dalaxakbfaiaualalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`gbcalalalalalalalalalalalalalaualalalalalalalalalalalalalaxac`yalbbalapbhaoalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalafalalalalalalalalalalalalalalaualalalalalalalalalalalalal`t`q`u`j`aalal`salalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal``b`axalalalalalalalalalalal`ubaalalalalalalalalalalalbb`w`iacbhalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`cacawalalalalalalalalalalalat`ralalalalalalalalalalalau`maradalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaladalalalalalalalalalalalalalar`jalalalalalalalalalalahalaz`yasalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`eaualalalalalalalalalalalalalal`valalalalalalalalalalamazala`aualalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`talalalalalalalalalalalanalba`ualalalal`oalalalakal`sa`bdanaxalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`h`taqa`alalalalalalalalalalala`alafalalbcal`halalal`dbaalaeajalasalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`i`ma``falalalalalalalalalalalalaw`halalbdal`balalaoalac`z`z`kal`palalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`salalalalalalalalalalalalalal`qalaqalal`dalbhalarbgaaalab`halalajalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`jalalalalalalalalalalalalalalalalaualal`yala`al`ral```qapafalalbbaxalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalabalalalalalalalalalalalalalal`zbfazaoalal`war`gayawbgalaebdalalalal`jalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalbialalalalalalalalalalalalalalalalalalalal``alalalalalalalalalalalalal```oaeala`alatawazal`nalacalaxahalalalalbfalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalal`jar`s`ealalalalalalalalalalalalalalalalalalalaaayalalalalalalalalalalbg`u`caz`cabalbcalala`anaaal`nalbealalalalal`halalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalbb`wadapalalalalalalalalalalalalalalalalalalalaybdababawalalalalalbhal`zat`c`abcal`zalalajal`dalae``alalalalalal`y`galalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalala``yalalalalalalalalalalalalalalalalalalalalalalal`g`q`vaxazaaalalal`aaladal`m`aal``an`g`gaeal`falalalalalalal`halalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalbe`yalalalalalalalalalalalalalalalalalalalalalalalalauaeazazalalalal`aaqalaaalalaial`dalahataxalalalalalalalalabalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalal`y`yalalalalalalalalalalalalalalalalalalalalalalal`rasbe`malalalal`dazaraval`jalal`zbaal`dalalalalalalalalalanagalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalal`a`wbaalalalalalalalalalalalalalalalalalalalalalalauau`qazbhbialalaualbdalal`ralajalaialabalalalalalalalalalalanabalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalaxbcaxalalalalalalalalalalalalalalalalalalalalalakak`kbhaaalal`dan`oalal`halalbcavaybfbfalalalalalalalalalalalanakalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalay`uaralalalalalalalalalalalalalalalalalalalalacasbdb``dalal`fal`oal`a`jalaial`nalaj`aadbh`malalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalal`wb`alalalalalalalalalalalalalalalalalalalawbeau```wbbalaual`ualal`nalalacalbealafalalal`dakalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalbdbaalalalalalalalalalalalalalalal`gbc`galbaaubf`bazay`g`ibial`gadalaialaial`ladalalalalalau`aalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`y`walalalalalalalalalalalalatayalayauau`bau`s`qakazal`salal`talal``al`valauapalalalalalalaualalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalapbbb`alalalalalalalalalal`waladauauaubebiauakahaxalbdalal`w`salaialbhalbgahalalalalalalalal`palalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalavbcawalalalalalalal`safabauauaa`yalalalauauawalbealatalamalalabalakalauaealalalalalalalalalafalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalb`bb`calalalalalb`axauau`raa`calalalalaibial`walaparab`ealafal`w`i`gauaealalalalalalalalal`i`ualalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`wbbalalal`e`ibcau```d`s`a`aalal`ua`alalbibial`ual`ralalahalaualau`ualalalalalalalalalalalakalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`zaeal`ial`tau`vah`lalalalalavayalalalalalayal`jalal`hal`eaaalauatalalalalalalalalalalalar`balalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalbe`walauau`b`fal`calalalalalalalalalalalalalajalalahalaual`fbbb`alalalalalalalalalalalalaealalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`may`xaubh`s`zalal`ialalalalalalalalalalalaualal`halalaialauaoal`aalalalalalalalalalalalana`alalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalbabiau`caqajaaawaladalalalalalalalalalalal`zabalalahal`talarag`yalbhalalalalalalalalalalalalakalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaxalauauasalaj`wayap`ialalalalalalalalalalalaualalaealalaualaq`ya`albealalalalalalalalalalalaladalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`ybdau`f`v`yaw`a`i`y`aalalalalalalalalalalbe`salalafalaebialau`zalalaaalalalalalalalalalalalal`o`qalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`ialau`r`raj`hawbdalbgalalalalalalalalalalalaualalaaalal`valafah`ialbib`alalalalalalalalalalalalal`balalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalb`agauauahbb`jalbc`ualalalalalalalalalalaladaralal`nalbe`salaualalalbhalalalalalalalalalalalalalal`nalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalbialalalalalalalalalalalalalal`ialauauauazbbabalar`u`walalalalalalalalalalaoalalacbialaual`g`l`calalbfalalalalalalalalalalalalalalafalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalax``auaoa`aeazbd`g`sapbdayalalalalalalalal`palalalafalayadal`taxanalarar`malalalalalalalalalalalalalafalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalbibialalalalalalalalalalalalalal`cauauaiao`nb``g`zalal`i`y`calalalalalalav`jalalbdanalaualalauae`aalalal`zalalalalalalalalalalalalal`falalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`g`qauau`laj`uafat``alalalbda`alalalalalalasalalalajalal`lalbcau`salalalalbcalalalalalalalalalalalalalafalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalbibialalalalalalalalalalalalalb``jauao`j`pb`apax`ialalalalbdbfalalalalbaadalalbdaval`lalalauaxalalalalbealalalalalalalalalalalalalal`falalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalbd`uauau`fagbgbi```ealalalalalbda`alalalaualalalajalalaualalaoacalalalalbialalalalalalalalalalalalalalafalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalbialalalalalalalalalalalalalal`gauau`h`dbdawbfaxalalalalalal`z`yal`s`zalalb``kal`p`ialai`tbialalalalalalalalalalalalalalalalalalal`jalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalapauaubgaa`a`ualalalalalalal`abcaraualalal`ralalaualal`v`kalalalalalalalalalalalalalalalalalalalal`ralalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`eaoau`z`d`m`qalalalalalalalalb`baa`alal`w`qal`zbealar`vbcalalalalalalalalalalalalalalalalalalalalafalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalatbgau`zabbiaralalalalalalalalal`s`walalasalalaualalah`w`aalalalalalalalalalalalalalalalalalalalal`falalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalavauadaoalazalalalalalalalalalal`zbbat`yal`c`jalalauayalalalalalalalalalalalalalalalalalalalalal`balalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`s`uau`sawalalalalavalalalalalalalbcaialalaualalabab`galalalalalalalalavalalalalalalalalalalalalacalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalayaualbaalalalalaualalalalalalalbibc`malaualal`t`qalalalalalalalalalaualalalalalalalalalalal`o`kalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaraqaealalalalalaualalalalalalalal`e`s`n`oal`oahbialalalalalalalalalau`ealalalalalalalalalalakalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`k`nakalalalalazaualalalalalalalalal`wbcalalaq`dalalalalalalalalalalau`balalalalalalalalalalaealalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaq`falalalalalauawalalalalalalalalalabbaalauaralalalalalalalalalalauaxalalalalalalalalalbhbialalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`p`ualalalalalauaualalalalalalalalalalacabajanalalalalalalalalala`aualalalalalalalalalaladalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalafalalalalalal`qaualalalalalalalalalalalab`yalalalalalalalalalalauasalalalalalalalalal`ca`alalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalagalalalalalalalau`aalalalalalalalalalav`b`o`walalalalalalalal`caualalalalalalalalalalahalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalala`alalalalalalalau`malalalalalalalalalaoalbi`z`salalalalalalalazaualalalalalalalalal`i`oalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalabalalalalalalalaualalalalalalalalalalajal`obf`o`kalalalalalalb`aualalalalalalalalal`jalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`s`galalalalalalalaualalalalalalalalalbhavaladalbbay`aalalalalalalaualalalalalalalalbdaralalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaealalalalalalalalalalalalalalalalalalaualaladalal`t`ualalalalalal`zalalalalalalal`ebaalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`ualalalalalalalalalalalalalalalalal`eadalafanalbbal`uaaalalalalalalalalalaralalalaealalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaialalahalal`bal`gbfbgalalalalalalalat`palal`dalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`ralaladalalacal`balbcaxalalalalalal``alalbi`malalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`ealalalalalalalalalac`kal`lalal`savalafal`ybbalalalalalaealalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`halalalalalalalalal`xalal`ralalbhalalaealbfa`alalalalacalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalbcaralalalalalalalal`gbgal`qbealalafalbdalalbbaealalalb``ualalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`palalalalalalalalalaoalalaualal`iaxal``alalalalalalal`ralalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`yalb`alalalalalalalalaoalalaualaladalal``alalalalalal`k`zalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`zalaaalalalalalalaladaralbd`qalaladalaw`kalalalalalal`talalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`eavalalalalalalalaualalaualalavbbalaealalalalalalal`nalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaualalalalalalal`walalalalalalal`g`balalacalalbhalalbhalalalalalalbhalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalazaualalalalalalalbealalalalalalal`valalazayalalacalanb`alalalalalal`valalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalauauapalalalalalal`walalalalalalalasalalafalal`a`ualabalalalalalalal`ralalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaeauauabalalalalalavayalalalalalal`f`galalafalal`dalal`dalalalalalalal``alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalauauaoaualalalalalalalalalalalalalaualala`bialal`falal`balalalalala``o`yalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalaqauau``aualalalalalalalalalalalal`g`balalafalalal`walbbapalalalalatajbhbaalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalal`aau`nauajai``alalalalalalalalalalalaoalalal`balal``alal`falalalalalalad`nbbalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalauau`x`t`ladaualalalalalalalalalalalaoalal`zalalalafalalbhalalalarayba`t`tbfalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalb`auauaqbham```zaaalalalalalalalalalab`galal`falalalabalawaxalalalalararabau`nalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalauauaqaubhau`ybhaibialalalalalalalal`ralal`aaaalalbealal``alalalalalal`mbdau`jbcalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalal`sauam`vaoa`aea``tabbbalalalalalalalal`balalaealalalaealalbhalalalalal`cbgamaiau`tat`zaaacav`aalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalauauau`xas`f`jaoae`saa`oalalalalalal`lalalalafalalalaaalalbealalalal`iatbbbf`hamao`halav`qat`nbhac`o`y`salalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalauauauaf`p`dadagbh`l`e`falalalalalal`lalalavbcalalbcanalaaalalalalalal`m`u`b```lau`sazal`ualalazbhalapalab`zac`salalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalauaqau`p`xajbgas`o`ualbe`ralalalalaxb`alalafalalalahalaladalalalalalalalazb`aeaoajauagadbdbaahan`c`q`wapalalalbc`dbe`oalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalal`o`salauaqau`p`yafbg```bawacajbh`nalalal`jalalal`nalalal`dalal``alalalalalal`sav`ob`ai`lau`v`vak`ja`awbeat`e`e`s`u`a`a`garbeab`u`yalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalarbc`s`baeb`a`alauauau`pauau`dbfaa`u`y`m`ibaaualalaealal`q`oalalb`aralaz`ealalalalalalal`o`zb`be`d`fasauauafbcalalayafavbbalb``salalalal`e`wabbh`ealalalalalalalalal",
-"alalalalalalalalalalalalalalal`i`z`nbh`g`k`oavapalalajauau`f`dakacavay`sbaa``dapbg`daqalalal`nalalal`dalal`balalalalalalalalalbbbfagbcas`fau`xbha``z`ualalalavalalalat`eatawawalalal`kaabbalalalalalalal",
-"alalalalalalalalalalalalalbb`y`gal`a`mavaaaxalbeaaay`qauam`jaoaa`jagakaqbb`g`iacalalauaga`al`balalal`balal`balalalalalalalalal`z`sbhbh`j``akauae```aalalalaraz`q`oat`eal`g`aalaralalatalav`tbgalalalalal",
-"alalalalalalalalalalavai`u`i``ayalalalarav`ka``o`yayalau`xasam`zag`mazabap`mbaal`may`ybi`kau`balal`gawal`c`salalalalalalalalat`ibaaz```bakakau`uaxalb`abbb`oazayalarb``sbibiazazal`kaval`gav`eakatalalal",
-"alalalalalalalalaz`fayalbf`ealbebe`salal`oaxbi`eaxaab`bgau`jam`dbc`sae`wad`m`gayal`talalal`jalaiabbfalalbfalalalalalalalalanayar`o`yaa`lahaeauaf`q`t`savax`malalalalalalalalanaxapat`ebbbial`calat`balal",
-"alalalalalalaladatalalalalb`arapalbdae`oalalalatalalanbiauau`l`vahag`y`iaw`zalalawajal`gawadalalalauaua``dalalalalalalalal`q`gaw``aaazajaiakau`ubealalalalal`g`calalar`ealal`cb`an`ual`g`say`aalay`e`wal",
-"alalalalalal``analalalal`c`k`m`m`k`g`malalalalalalalalalazauasau`hbdb`a`bdbdalawbca`baal``alalalarayal`aauaj`bauauamajas`t`waw`cab`ubf`nbhamaualau`e`eatazazarar`m`u`ealalalalal`may`qalalav`u`iawaladal",
-"alalalalbibgalalalalal`a`oalanalalavax`galalal`iawayalalalauauao`zaa`bbhalbhadalasal`gal`palalaladalal`aalalalalalalalalalalalan`marabbgaiauaiarazalalalal`gatalalaxavalalalal`s`ialalan`qalalaz`cal`dal",
-"alalalal`dalanazalaralalanalalayavaval`sa`adbf`ialalalalal`sauam`nbb`gacbfacal`wajalalal``alalal`malalalalalalalalalalalalalbaav`k`wauacasbf`iajalalalalapal`a`zavalal`abc`oaralalal`qavalat`obi`ub`atal",
-"alalalbhalalalar`calal`gatavaxaxax`maralalalalalatazatalalalauau`n``bc`sbc`qa`alal`calajalalalalalalalalalalalalalalalalalalaybfahacagbcaiac``al`mbbbbapalalanalal`ebcavalalalb``w`mal`i`walaw`c`cbbalal",
-"alalal`fal`ialal`mavayaralawatalalalalal`c`ialalalalalalalalalauauahafak`q`q`aal`ualalaqalalalalalalalalalalalalalalalalalalal`obcaxbebh`nbc`qalalalalalal`gb`axalalalalalba`malalalaralal`galar`walalal",
-"alalalaealal`kavalalar`k`aanapalalapalalarazaw`capal`aalalalalalauamaubdaf```qbibgal`ebealalalalalalalalalalalalalalal`u`o`c`oab`b`f`zac`u``alalaz`sbb`qalalalalbc`wbaanalbialalal`a`o`m`ealba`oalalalal",
-"alalalbbaaap`yaeaja``ial`oalaranalalal`m`yawan`m`u`kalapalaw`ualalauao`rbcaxaual`u`k`jalalalalalalalalalalalalalal`oaxalalaz`wae`fafagag`nalalalalalalalal`c`ealalalalalalalalaw`obialb`biaeapalalalalal",
-"alalalalalagalalal`a`o`q`ialalal`abc`zalalba`mal`ealazalbdbiaxaralal`vauahabak`kaz`zalalalalalalalalalalalalalalalalalb`azawalavaj``az`palalalalalal`e`sapapalalalal`ealaw`s`y`walay`o`ubcalalalalalalal",
-"alalalalalalbbbdalalalalalalal`uawalalalalawayaxaxb`alazavaz`g`kavalal`kauag`paz`ya`alalalalalalalalalalalalalalalalalaw`mb`ab`zala``balalalalalalalalalalalal`o`uaz`galalananal`q`w`ualalalalalalalalal",
-"alalalalalalalanaa`ualalalav`zalalat`g`oaz`e`o`eav`k`c`oax`eazaral`ial`m`m`tau`bahap`yapalalalalalalalalalalalalalalalalalalalalaeavalalalavaxav`qawalalal`g`qapalalalalalalava``ualalalalalalalalalalal",
-"alalalalalalalalalbiad`nayalalalalalb`awaz`eat`qalay`i`galaxalal`saybfanalalbdauac`s`q`valalalalalalalal`iat`eay`earbfbg`pau`vaaal`oawal`karalalalalalalalatalalalalalbcbha`axalalalalalalalalalalalalal",
-"alalalalalalalalalalalal`iaabfbcalalalalalalalalacazbiav`u`m`g`ua``kalalalalalal`faubeac`calalalalalal`uaf`baf`hahaca``ialalalbi`ianalalalalalalalalalalalalataibb`u`wanalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalbiaca`aa`yalalalalalalanalalbcbhavalalalalalalalalalap`b`oarb`alalalalalalalalalalalal`calalalalbialalalalalalalalalalb`bga`acavalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalat`wabbhbgb``qaabebfalalalalalalalalalalalalalalapbc`l`pbialalalalalalalalalalalalalalalalalalalalal`s``a`bf`zalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalala`ahadbh`db`bcbiatalalalal`ubcaf`wacbe`fae`uanalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`g`gabbgababav`ialalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaxalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalafaealalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalal`oal`z`l`wbhafalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalauagbeaqal`mb`alalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalaf`mbialalaaalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalbaalalalalalalalalalalalalalalalal",
-"alalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalbialalalalalalalalalalalalalalalal"
-};
diff --git a/Documentation/programmer/1086342053.tex b/Documentation/programmer/1086342053.tex
new file mode 100644 (file)
index 0000000..814dd64
--- /dev/null
@@ -0,0 +1,891 @@
+%created by: GNU LilyPond 1.2.16.hwn2, bij Tue Oct 26 21:09:33 1999
+
+% Uitvoer van Score, gedefinieerd op: 
+% out/1086342053.ly:8:17
+\def\mudelatagline{Lily was here, 1.2.16.hwn2}
+\def\LilyPondVersion{1.2.16.hwn2}
+\def\mudelapaperslur_slope_damping{0.300000}
+\def\mudelapapergrace_factor{0.800000}
+\def\mudelapaperinterbeam{3.264000}
+\def\mudelapaperbarthick_score{0.640000}
+\def\mudelapaperbeam_dir_algorithm{2.000000}
+\def\mudelapaperfont_finger{4.000000}
+\def\mudelapaperhyphen_minimum_length{2.000000}
+\def\mudelapaperloose_column_distance{8.000000}
+\def\mudelapapergrace_stem_length2{3.200000}
+\def\mudelapaperMEAN{3.000000}
+\def\mudelapaperminimum_stem_length3{2.000000}
+\def\mudelapaperWordwrap{0.000000}
+\def\mudelapaperstemSpacingCorrection{2.000000}
+\def\mudelapaperstem_max{3.000000}
+\def\mudelapaperslur_interstaff_slope_damping{0.600000}
+\def\mudelapaperstem_length1{5.000000}
+\def\mudelapaperfont_mark{10.000000}
+\def\mudelapaperquartwidth{5.280000}
+\def\mudelapaperbeam_thickness{1.872000}
+\def\mudelapaperslur_interstaff_snap_max_slope_change{0.500000}
+\def\mudelapapergrace_forced_stem_shorten0{0.000000}
+\def\mudelapaperhsize{597.507874}
+\def\mudelapaperarithmetic_multiplier{4.752000}
+\def\mudelapaperfont_number-1{8.000000}
+\def\mudelapaperbeam_steep_slope{0.200000}
+\def\mudelapaperslur_snap_to_stem{7.000000}
+\def\mudelapapergrace_minimum_stem_length0{0.000000}
+\def\mudelapapergrace_forced_stem_shorten1{0.000000}
+\def\mudelapaperstaffheight{16.000000}
+\def\mudelapaperslur_clip_height{48.000000}
+\def\mudelapapercollision_note_width{6.600000}
+\def\mudelapapergrace_forced_stem_shorten3{0.000000}
+\def\mudelapaperscmsetting{"(lilyponddefs.ps) findlibfile {exch pop //systemdict /run get exec}%
+  { /undefinedfilename signalerror }%
+  ifelse";
+ }
+\def\mudelapaperMEDIAN{4.000000}
+\def\mudelapaperbreakable_column_space_strength{2.000000}
+\def\mudelapaperbeam_lengthened{0.800000}
+\def\mudelapaperinterline{4.000000}
+\def\mudelapaperforced_stem_shorten0{1.000000}
+\def\mudelapaperstemthickness{0.320000}
+\def\mudelapapermusical_to_musical_left_spacing_factor{0.400000}
+\def\mudelapaperpaperfile{a4.ly}
+\def\mudelapaperarithmetic_basicspace{2.000000}
+\def\mudelapaperfont_volta{5.000000}
+\def\mudelapapertie_y_gap{1.000000}
+\def\mudelapaperminimum_stem_length1{3.000000}
+\def\mudelapaperindent{38.614454}
+\def\mudelapaperforced_stem_shorten1{1.000000}
+\def\mudelapaperstem_length2{4.000000}
+\def\mudelapaperpostBreakPadding{0.000000}
+\def\mudelapaperstafflinethickness{0.400000}
+\def\mudelapaperstem_length0{7.000000}
+\def\mudelapaperfont_number+1{12.000000}
+\def\mudelapapertie_staffspace_length{16.000000}
+\def\mudelapaperslur_interstaff_snap_to_stem{10.000000}
+\def\mudelapapervolta_thick{0.640000}
+\def\mudelapaperwholewidth{7.920000}
+\def\mudelapaperstem_length3{3.000000}
+\def\mudelapapergrace_forced_stem_shorten2{0.000000}
+\def\mudelapaperslur_height_limit{16.000000}
+\def\mudelapaperstem_default_neutral_direction{1.000000}
+\def\mudelapaperhyphen_thickness{0.400000}
+\def\mudelapaperrestcollision_minimum_beamdist{1.500000}
+\def\mudelapapergrace_stem_length3{2.400000}
+\def\mudelapapertuplet_spanner_gap{8.000000}
+\def\mudelapapercrescendo_height{2.664000}
+\def\mudelapaperfont_dynamic{10.000000}
+\def\mudelapaperbefore_grace_spacing_factor{1.200000}
+\def\mudelapapercompression_energy_factor{0.600000}
+\def\mudelapapertexsetting{}
+\def\mudelapaperslur_height_damping{0.400000}
+\def\mudelapapergrace_minimum_stem_length1{2.400000}
+\def\mudelapapergrace_minimum_stem_length2{2.000000}
+\def\mudelapaperforced_stem_shorten2{1.000000}
+\def\mudelapapergourlay_energybound{100000.000000}
+\def\mudelapapervsize{844.762323}
+\def\mudelapaperfont_normal{8.000000}
+\def\mudelapaperslur_x_minimum{6.000000}
+\def\mudelapapertie_x_gap{0.800000}
+\def\mudelapaperrestcollision_minimum_dist{3.000000}
+\def\mudelapaperfont_number{8.000000}
+\def\mudelapaperbarthick_thick{2.400000}
+\def\mudelapapermmrest_x_minimum{22.400000}
+\def\mudelapaperslur_rc_factor{2.400000}
+\def\mudelapapercrescendo_thickness{0.400000}
+\def\mudelapaperarticulation_script_padding_default{1.000000}
+\def\mudelapaperslur_clip_angle{100.000000}
+\def\mudelapapergrace_stem_length1{4.000000}
+\def\mudelapapercrescendo_shorten{16.000000}
+\def\mudelapapertuplet_thick{0.400000}
+\def\mudelapaperminimum_stem_length2{2.500000}
+\def\mudelapaperslur_y_gap{1.000000}
+\def\mudelapaperGourlay{0.000000}
+\def\mudelapapertie_x_minimum{10.000000}
+\def\mudelapaperdecrease_nonmus_spacing_factor{1.000000}
+\def\mudelapaperextender_height{0.320000}
+\def\mudelapaperlinewidth{390.000000}
+\def\mudelapaperUP{1.000000}
+\def\mudelapaperslur_snap_max_slope_change{0.500000}
+\def\mudelapaperforced_stem_shorten3{1.000000}
+\def\mudelapaperslur_interstaff_height_damping{0.500000}
+\def\mudelapapergrace_stem_length0{5.600000}
+\def\mudelapaperslur_thickness{0.560000}
+\def\mudelapapergrace_minimum_stem_length3{1.600000}
+\def\mudelapapermagnification_dynamic{1.000000}
+\def\mudelapaperDOWN{-1.000000}
+\def\mudelapaperfont_Large{10.000000}
+\def\mudelapaperslur_y_free{3.000000}
+\def\mudelapaperinterbeam4{3.376000}
+\def\mudelapaperslur_ratio{0.250000}
+\def\mudelapaperfont_large{12.000000}
+\def\mudelapaperpssetting{}
+\def\mudelapaperbarthick_thin{0.640000}
+\def\mudelapapervolta_spanner_height{8.000000}
+\def\mudelapaperbar_kern{1.200000}
+\def\mudelapaperminimum_stem_length0{0.000000}
+\def\mudelapaperhyphen_height{1.600000}
+\def\mudelapapertextheight{730.951299}
+\def\mudelapaperbar_thinkern{1.200000}
+\def\mudelapaperslur_clip_ratio{1.200000}
+\def\mudelapapernotewidth{6.600000}
+\def\mudelapaperslur_x_gap{0.800000}
+\def\mudelapaperMAJORITY{2.000000}
+\def\mudelapaperrulethickness{0.400000}
+\def\mudelapapergourlay_maxmeasures{10.000000}
+\special{! %!PS-Adobe-1.0: lily.ps 
+% 
+% 2 setlanguagelevel %  hmm. auto_resize_dicts doesn't help either.  
+% round cappings 
+1 setlinecap 
+ % 
+% 
+/draw_beam % width slope thick 
+{ 
+          2 div /beam_thick exch def 
+          /beam_slope exch def 
+          /beam_wd exch def 
+          beam_slope beam_wd mul /beam_ht exch def 
+          0 beam_thick neg moveto  
+          beam_wd beam_ht rlineto  
+          0 beam_thick 2 mul rlineto 
+          0 beam_thick lineto 
+          closepath fill 
+  }%
+  bind def 
+ % 
+/draw_decrescendo %  width height cons thick 
+{ 
+       setlinewidth 
+       /cresc_cont exch def 
+       /cresc_ht exch def 
+       /cresc_wd exch def 
+  % 
+       cresc_wd cresc_cont moveto 
+       0 cresc_ht lineto 
+       stroke 
+       cresc_wd cresc_cont neg moveto 
+       0 cresc_ht neg lineto 
+       stroke 
+  }%
+  bind def 
+ % 
+/draw_crescendo % width height cons thick 
+{ 
+       setlinewidth 
+       /cresc_cont exch def 
+       /cresc_ht exch def 
+       /cresc_wd exch def 
+  % 
+       0 cresc_cont moveto 
+       cresc_wd cresc_ht lineto 
+       stroke 
+       0 cresc_cont neg moveto 
+       cresc_wd cresc_ht neg lineto 
+       stroke 
+  }%
+  bind def 
+ % 
+/lily_distance  
+ { 
+       1 copy mul exch 1 copy mul add sqrt 
+  }%
+  bind def 
+ % 
+/draw_tuplet % height gap dx dy thick dir 
+{ 
+  % urg: the only Level-2 PS, check effect in print 
+%      true setstrokeadjust 
+       /dir exch def 
+       setlinewidth 
+       1 setlinecap 
+       1 setlinejoin 
+       /tuplet_dy exch def 
+       /tuplet_dx exch def 
+       /tuplet_gapx exch def 
+       /tuplet_h exch def 
+       tuplet_dy tuplet_dx div tuplet_gapx mul /tuplet_gapy exch def 
+  % 
+% 
+       0 0 moveto 
+       0 tuplet_h dir mul lineto  
+       tuplet_dx tuplet_gapx sub 2 div  
+               tuplet_dy tuplet_gapy sub 2 div tuplet_h dir mul add lineto 
+       tuplet_dx tuplet_gapx add 2 div  
+               tuplet_dy tuplet_gapy add 2 div tuplet_h dir mul add moveto 
+       tuplet_dx tuplet_dy tuplet_h dir mul add lineto 
+       tuplet_dx tuplet_dy lineto 
+       stroke 
+  }%
+  bind def 
+ % 
+/draw_volta % h w thick vert_start vert_end 
+{ 
+       /vert_end exch def 
+       /vert_start exch def 
+       setlinewidth 
+       /volta_w exch def 
+       /volta_h exch def 
+  % urg: the only Level-2 PS, check effect in print 
+%      true setstrokeadjust 
+       1 setlinecap 
+       1 setlinejoin 
+       vert_start 0 eq { 
+               0 0 moveto 
+               0 volta_h lineto 
+       }%
+   if 
+       0 volta_h moveto 
+       volta_w volta_h lineto 
+       vert_end 0 eq { 
+               volta_w 0 lineto 
+       }%
+   if 
+       stroke 
+  }%
+  bind def 
+ % 
+% this is for drawing slurs. 
+/draw_bezier_sandwich  % thickness  
+{ 
+       setlinewidth 
+       moveto 
+       curveto 
+       lineto 
+       curveto 
+       gsave 
+       fill 
+       grestore 
+       stroke 
+  }%
+  bind def 
+ % 
+/draw_dashed_slur 
+ { 
+       1 setlinecap 
+       1 setlinejoin 
+       setdash 
+       setlinewidth 
+       8 -2 roll 
+       moveto 
+       curveto 
+       stroke 
+  }%
+  bind def 
+ % 
+% 
+% 
+/bracket_traject 
+ { 
+    /traject_ds exch def 
+    /traject_alpha exch def 
+    traject_ds traject_alpha sin mul add 
+    exch 
+    traject_ds traject_alpha cos mul add 
+    exch 
+  }%
+  bind def 
+ % 
+% 
+% 
+/half_bracket 
+ { 
+  %6 
+       0 0 
+  %5a 
+       bracket_b bracket_v add bracket_h bracket_t sub bracket_u add 
+       bracket_alpha bracket_v -0.15 mul bracket_traject 
+  %5b 
+       1 bracket_h 
+       0 bracket_v 0.5 mul bracket_traject 
+  %5c 
+       0 bracket_h 
+  %4a 
+       bracket_b bracket_h bracket_t sub 
+       0 bracket_v 0.4 mul bracket_traject 
+  %4b 
+       bracket_b bracket_v add bracket_h bracket_t sub bracket_u add 
+       bracket_alpha bracket_v -0.25 mul bracket_traject 
+  %4c 
+       bracket_b bracket_v add bracket_h bracket_t sub bracket_u add 
+  %3 
+       bracket_b bracket_h bracket_t sub 
+  %2 
+       bracket_b 0 
+  %1 
+       0 0 
+  }%
+  bind def 
+ % 
+/draw_half_bracket { 
+       moveto 
+       lineto 
+       lineto 
+       curveto 
+       curveto 
+       lineto 
+       gsave 
+       fill 
+       grestore 
+  }%
+  bind def 
+ % 
+/draw_bracket % height 
+{ 
+       2 div bracket_b add /bracket_h exch def 
+       bracket_t setlinewidth 
+  % urg: the only Level-2 PS, check effect in print 
+%      true setstrokeadjust 
+       1 setlinecap 
+       1 setlinejoin 
+       half_bracket 
+       20 copy 
+       1 -1 scale 
+       draw_half_bracket 
+       stroke 
+       1 -1 scale 
+  % ugh, ugh: 
+       0.05 0 translate 
+       draw_half_bracket 
+       stroke 
+  }%
+  bind def 
+ % 
+}\input lilyponddefs \turnOnPostScript\vbox to 32.2 pt {\hbox{%
+\placebox{-24.0 pt }%
+  {38.6144544431946 pt }%
+  {\kern0.0 pt \vrule width 351.385545556806 pt depth 0.2 pt height 0.2 pt  }%
+  \placebox{-20.0 pt }%
+  {38.6144544431946 pt }%
+  {\kern0.0 pt \vrule width 351.385545556806 pt depth 0.2 pt height 0.2 pt  }%
+  \placebox{-16.0 pt }%
+  {38.6144544431946 pt }%
+  {\kern0.0 pt \vrule width 351.385545556806 pt depth 0.2 pt height 0.2 pt  }%
+  \placebox{-12.0 pt }%
+  {38.6144544431946 pt }%
+  {\kern0.0 pt \vrule width 351.385545556806 pt depth 0.2 pt height 0.2 pt  }%
+  \placebox{-8.0 pt }%
+  {38.6144544431946 pt }%
+  {\kern0.0 pt \vrule width 351.385545556806 pt depth 0.2 pt height 0.2 pt  }%
+  \font\lilyfontA=feta16\lilyfontA\placebox{-20.0 pt }%
+  {42.6144544431946 pt }%
+  {\char91 }%
+  \placebox{-24.0 pt }%
+  {58.1650144431946 pt }%
+  {\embeddedps{4.44208 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {53.5229344431946 pt }%
+  {\embeddedps{9.28416 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {53.7229344431946 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {53.5629344431946 pt }%
+  {\char30 }%
+  \placebox{-14.0 pt }%
+  {60.6470944431946 pt }%
+  {\char23 }%
+  \placebox{-16.0 pt }%
+  {62.6070944431946 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {62.4470944431946 pt }%
+  {\char30 }%
+  \placebox{-24.0 pt }%
+  {86.5016544431946 pt }%
+  {\embeddedps{4.44208 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {81.8595744431946 pt }%
+  {\embeddedps{9.28415999999999 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {76.5754144431946 pt }%
+  {\embeddedps{5.68416 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {72.3333344431946 pt }%
+  {\embeddedps{4.44208 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {67.6912544431946 pt }%
+  {\embeddedps{9.28415999999999 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {67.8912544431946 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {67.7312544431946 pt }%
+  {\char30 }%
+  \placebox{-14.0 pt }%
+  {74.8154144431946 pt }%
+  {\char23 }%
+  \placebox{-16.0 pt }%
+  {76.7754144431946 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {76.6154144431946 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {82.0595744431946 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {81.8995744431946 pt }%
+  {\char30 }%
+  \placebox{-14.0 pt }%
+  {88.9837344431946 pt }%
+  {\char23 }%
+  \placebox{-16.0 pt }%
+  {90.9437344431946 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {90.7837344431946 pt }%
+  {\char30 }%
+  \placebox{-27.264 pt }%
+  {96.0278944431946 pt }%
+  {\embeddedps{5.68416 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {96.2278944431946 pt }%
+  {\embeddedps{2.64208 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {96.2278944431946 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {96.0678944431946 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {101.512054443195 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {101.352054443195 pt }%
+  {\char30 }%
+  \placebox{-14.0 pt }%
+  {108.436214443195 pt }%
+  {\char23 }%
+  \placebox{-16.0 pt }%
+  {110.236214443195 pt }%
+  {\kern0.0 pt \vrule width 0.64 pt depth 8.0 pt height 8.0 pt  }%
+  \placebox{-27.264 pt }%
+  {128.545190550629 pt }%
+  {\embeddedps{6.2865703732489 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {128.745190550629 pt }%
+  {\embeddedps{2.94328518662445 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {122.65862017738 pt }%
+  {\embeddedps{6.2865703732489 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {118.360336107513 pt }%
+  {\embeddedps{4.49828406986707 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {113.662052037646 pt }%
+  {\embeddedps{9.39656813973413 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {113.862052037646 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {113.702052037646 pt }%
+  {\char30 }%
+  \placebox{-14.0 pt }%
+  {120.786212037646 pt }%
+  {\char23 }%
+  \placebox{-16.0 pt }%
+  {122.85862017738 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {122.69862017738 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {128.745190550629 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {128.585190550629 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {134.631760923878 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {134.471760923878 pt }%
+  {\char30 }%
+  \placebox{-14.0 pt }%
+  {141.555920923878 pt }%
+  {\char23 }%
+  \placebox{-27.264 pt }%
+  {152.424897203346 pt }%
+  {\embeddedps{5.68415999999998 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {152.424897203346 pt }%
+  {\embeddedps{5.68415999999998 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-20.736 pt }%
+  {152.424897203346 pt }%
+  {\embeddedps{5.68415999999998 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {143.428329063612 pt }%
+  {\embeddedps{9.39656813973413 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {143.628329063612 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {143.468329063612 pt }%
+  {\char30 }%
+  \placebox{-14.0 pt }%
+  {150.552489063612 pt }%
+  {\char23 }%
+  \placebox{-16.0 pt }%
+  {152.624897203346 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {152.464897203346 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {157.909057203346 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {157.749057203346 pt }%
+  {\char30 }%
+  \placebox{-24.736 pt }%
+  {162.993217203346 pt }%
+  {\embeddedps{8.24876049766521 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {163.193217203346 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 8.736 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {163.033217203346 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {171.041977701011 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 8.736 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {170.881977701011 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {178.730738198676 pt }%
+  {\kern0.0 pt \vrule width 0.64 pt depth 8.0 pt height 8.0 pt  }%
+  \placebox{-27.264 pt }%
+  {182.156575793128 pt }%
+  {\embeddedps{8.24876049766521 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {182.156575793128 pt }%
+  {\embeddedps{8.24876049766521 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {182.356575793128 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {182.196575793128 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {190.205336290793 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {190.045336290793 pt }%
+  {\char30 }%
+  \placebox{-27.264 pt }%
+  {197.854096788458 pt }%
+  {\embeddedps{6.2865703732489 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {197.854096788458 pt }%
+  {\embeddedps{6.2865703732489 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-20.736 pt }%
+  {197.854096788458 pt }%
+  {\embeddedps{6.2865703732489 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {198.054096788458 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {197.894096788458 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {203.940667161707 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {203.780667161707 pt }%
+  {\char30 }%
+  \placebox{-31.264 pt }%
+  {209.627237534956 pt }%
+  {\embeddedps{5.68415999999998 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.888 pt }%
+  {209.627237534956 pt }%
+  {\embeddedps{5.68415999999998 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.512 pt }%
+  {209.627237534956 pt }%
+  {\embeddedps{5.68415999999998 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-21.136 pt }%
+  {209.627237534956 pt }%
+  {\embeddedps{5.68415999999998 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {209.827237534956 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 15.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {209.667237534956 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {215.111397534956 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 15.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {214.951397534956 pt }%
+  {\char30 }%
+  \placebox{-32.0 pt }%
+  {220.435557534956 pt }%
+  {\char84 }%
+  \placebox{-16.0 pt }%
+  {220.435557534956 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 16.0 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {220.275557534956 pt }%
+  {\char30 }%
+  \placebox{-24.736 pt }%
+  {226.122127908205 pt }%
+  {\embeddedps{21.9840913685793 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {226.322127908205 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 8.736 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {226.162127908205 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {240.271400935835 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.03836152345 pt height 2.0 pt  }%
+  \placebox{-28.0 pt }%
+  {235.826360935835 pt }%
+  {\char25 }%
+  \placebox{-28.0 pt }%
+  {239.752280935835 pt }%
+  {\char25 }%
+  \placebox{-28.0 pt }%
+  {239.026680935835 pt }%
+  {\char25 }%
+  \placebox{-28.0 pt }%
+  {235.147240935835 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {247.906219276784 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 8.736 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {247.746219276784 pt }%
+  {\char30 }%
+  \placebox{-24.736 pt }%
+  {267.328120520947 pt }%
+  {\embeddedps{12.5026258109842 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.736 pt }%
+  {257.517169898866 pt }%
+  {\embeddedps{10.2109506220815 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {257.717169898866 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 8.736 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {257.557169898866 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {267.528120520947 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 8.736 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {267.368120520947 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {277.179071143029 pt }%
+  {\kern0.0 pt \vrule width 0.64 pt depth 8.0 pt height 8.0 pt  }%
+  \placebox{-16.0 pt }%
+  {279.630746331931 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 8.736 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {279.470746331931 pt }%
+  {\char30 }%
+  \placebox{-28.0 pt }%
+  {289.448303654769 pt }%
+  {\char82 }%
+  \placebox{-16.0 pt }%
+  {289.448303654769 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 12.0 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {289.288303654769 pt }%
+  {\char30 }%
+  \placebox{-24.0 pt }%
+  {312.013490085556 pt }%
+  {\embeddedps{4.90547531104077 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {306.908014774515 pt }%
+  {\embeddedps{10.2109506220815 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {299.05925427685 pt }%
+  {\embeddedps{8.24876049766526 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {299.25925427685 pt }%
+  {\embeddedps{3.92438024883263 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {299.25925427685 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {299.09925427685 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {307.108014774515 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {306.948014774515 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {316.918965396597 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {316.758965396597 pt }%
+  {\char30 }%
+  \placebox{-20.736 pt }%
+  {350.276197511674 pt }%
+  {\embeddedps{3.92438024883263 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {346.151817262842 pt }%
+  {\embeddedps{8.24876049766526 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {346.151817262842 pt }%
+  {\embeddedps{8.24876049766526 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {338.303056765176 pt }%
+  {\embeddedps{8.24876049766526 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {338.303056765176 pt }%
+  {\embeddedps{8.24876049766526 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {330.454296267511 pt }%
+  {\embeddedps{8.24876049766526 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {330.454296267511 pt }%
+  {\embeddedps{8.24876049766526 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {324.567725894262 pt }%
+  {\embeddedps{6.28657037324893 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {324.567725894262 pt }%
+  {\embeddedps{6.28657037324893 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-20.736 pt }%
+  {324.767725894262 pt }%
+  {\embeddedps{2.94328518662446 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {324.767725894262 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {324.607725894262 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {330.654296267511 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {330.494296267511 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {338.503056765176 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {338.343056765176 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {346.351817262842 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {346.191817262842 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {354.200577760507 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {354.040577760507 pt }%
+  {\char30 }%
+  \placebox{-20.736 pt }%
+  {378.727954315711 pt }%
+  {\embeddedps{4.90547531104077 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {378.727954315711 pt }%
+  {\embeddedps{4.90547531104077 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {373.62247900467 pt }%
+  {\embeddedps{10.2109506220815 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {365.773718507005 pt }%
+  {\embeddedps{8.24876049766526 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {365.973718507005 pt }%
+  {\embeddedps{3.92438024883263 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-27.264 pt }%
+  {359.887148133756 pt }%
+  {\embeddedps{6.28657037324893 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-24.0 pt }%
+  {360.087148133756 pt }%
+  {\embeddedps{2.94328518662446 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-20.736 pt }%
+  {360.087148133756 pt }%
+  {\embeddedps{2.94328518662446 0.0 1.872 draw_beam}%
+   }%
+  \placebox{-16.0 pt }%
+  {360.087148133756 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {359.927148133756 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {365.973718507005 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {365.813718507005 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {373.82247900467 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {373.66247900467 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {383.633429626751 pt }%
+  {\kern-0.16 pt \vrule width 0.32 pt depth 11.264 pt height 1.03836152344995 pt  }%
+  \placebox{-14.0 pt }%
+  {383.473429626751 pt }%
+  {\char30 }%
+  \placebox{-16.0 pt }%
+  {389.36 pt }%
+  {\kern0.0 pt \vrule width 0.64 pt depth 8.0 pt height 8.0 pt  }%
+  }%
+ \vss}
+\EndLilyPondOutput
\ No newline at end of file
diff --git a/Documentation/programmer/GNUmakefile b/Documentation/programmer/GNUmakefile
new file mode 100644 (file)
index 0000000..25b42ee
--- /dev/null
@@ -0,0 +1,36 @@
+# Documentation/tex/Makefile
+
+depth=../..
+
+TEX_FILES = $(wildcard *.tex)
+DOC_FILES = $(wildcard *.doc)
+DVI_FILES = $(addprefix $(outdir)/,$(DOC_FILES:.doc=.dvi)  $(TELY_FILES:.tely=.dvi))
+
+OUTTEX_FILES = $(addprefix $(outdir)/, $(TEX_FILES))
+OUTDOC_FILES = $(addprefix $(outdir)/, $(DOC_FILES))
+
+EXTRA_DIST_FILES= $(DOC_FILES) $(TEX_FILES) $(wildcard *.sty) 
+HTML_FILES = $(addprefix $(outdir)/,  $(TEXI_FILES:.texi=.html) $(TELY_FILES:.tely=.html))
+PS_FILES = $(DVI_FILES:.dvi=.ps)
+
+STEPMAKE_TEMPLATES=tex documentation texinfo
+LOCALSTEPMAKE_TEMPLATES=lilypond mudela
+
+export BIBINPUTS:=$(shell pwd)//$(PATHSEP)$(BIBINPUTS)
+include $(depth)/make/stepmake.make 
+
+dvi: $(DVI_FILES)
+
+ps: $(PS_FILES)
+
+# urg
+default:
+
+
+localclean:
+       rm -f fonts.aux fonts.log feta*.tfm feta*.*pk
+
+local-WWW: $(HTML_FILES)
+       $(PYTHON) $(step-bindir)/ls-latex.py --title 'Hacker documentation' \
+          $(DOC_FILES) $(TEXI_FILES) $(TELY_FILES) \
+         | sed "s!$(outdir)/!!g" > $(outdir)/index.html
diff --git a/Documentation/programmer/feta20.sty b/Documentation/programmer/feta20.sty
new file mode 100644 (file)
index 0000000..0dbfcf9
--- /dev/null
@@ -0,0 +1,146 @@
+% Creator: mf-to-table.py version 0.7
+% Automatically generated on
+% Do not edit
+% input from out/feta20.log
+% name
+% rests
+\fetdef\wholerest{0}
+\fetdef\halfrest{1}
+\fetdef\outsidewholerest{2}
+\fetdef\outsidehalfrest{3}
+\fetdef\breverest{4}
+\fetdef\longarest{5}
+\fetdef\multirest{6}
+\fetdef\quartrest{7}
+\fetdef\eighthrest{8}
+\fetdef\sixteenthrest{9}
+\fetdef\thirtysecondrest{10}
+\fetdef\sixtyfourthrest{11}
+\fetdef\hundredtwentyeighthrest{12}
+
+% accidentals
+\fetdef\sharp{13}
+\fetdef\natural{14}
+\fetdef\flat{15}
+\fetdef\flatflat{16}
+\fetdef\sharpsharp{17}
+\fetdef\rightparen{18}
+\fetdef\leftparen{19}
+
+% dots
+\fetdef\dot{20}
+\fetdef\repeatcolon{21}
+
+% balls
+\fetdef\brevisball{22}
+\fetdef\brevisledger{23}
+\fetdef\longaball{24}
+\fetdef\longaledger{25}
+\fetdef\wholeball{26}
+\fetdef\wholeledger{27}
+\fetdef\halfball{28}
+\fetdef\halfledger{29}
+\fetdef\quartball{30}
+\fetdef\quartledger{31}
+
+% scripts
+\fetdef\ufermata{32}
+\fetdef\dfermata{33}
+\fetdef\thumb{34}
+\fetdef\sforzatoaccent{35}
+\fetdef\staccato{36}
+\fetdef\ustaccatissimo{37}
+\fetdef\dstaccatissimo{38}
+\fetdef\tenuto{39}
+\fetdef\umarcato{40}
+\fetdef\dmarcato{41}
+\fetdef\ouvert{42}
+\fetdef\plusstop{43}
+\fetdef\upbow{44}
+\fetdef\downbow{45}
+\fetdef\reverseturn{46}
+\fetdef\turn{47}
+\fetdef\trill{48}
+\fetdef\upedalheel{49}
+\fetdef\dpedalheel{50}
+\fetdef\upedaltoe{51}
+\fetdef\dpedaltoe{52}
+\fetdef\flageolet{53}
+\fetdef\trilelement{54}
+\fetdef\prall{55}
+\fetdef\mordent{56}
+\fetdef\prallprall{57}
+\fetdef\prallmordent{58}
+\fetdef\upprall{59}
+\fetdef\downprall{60}
+\fetdef\accDiscant{61}
+\fetdef\accDiscantF{62}
+\fetdef\accDiscantEh{63}
+\fetdef\accDiscantE{64}
+\fetdef\accDiscantFE{65}
+\fetdef\accDiscantFEh{66}
+\fetdef\accDiscantEE{67}
+\fetdef\accDiscantFEE{68}
+\fetdef\accDiscantEEE{69}
+\fetdef\accDiscantFEEE{70}
+\fetdef\accDiscantS{71}
+\fetdef\accDiscantFS{72}
+\fetdef\accDiscantES{73}
+\fetdef\accDiscantEhS{74}
+\fetdef\accDiscantFES{75}
+\fetdef\accDiscantFEhS{76}
+\fetdef\accDiscantEES{77}
+\fetdef\accDiscantFEES{78}
+\fetdef\accDiscantEEES{79}
+\fetdef\accDiscantFEEES{80}
+\fetdef\accDiscantSS{81}
+\fetdef\accDiscantESS{82}
+\fetdef\accDiscantEESS{83}
+\fetdef\accDiscantEEESS{84}
+\fetdef\accFreebass{85}
+\fetdef\accFreebassF{86}
+\fetdef\accFreebassE{87}
+\fetdef\accFreebassFE{88}
+\fetdef\accStdbass{89}
+\fetdef\accStdbassM{90}
+\fetdef\accStdbassBp{91}
+\fetdef\accStdbassT{92}
+\fetdef\accStdbassTp{93}
+\fetdef\accBayanbass{94}
+\fetdef\accBayanbassT{95}
+\fetdef\accBayanbassE{96}
+\fetdef\accBayanbassTE{97}
+\fetdef\accBayanbassEE{98}
+\fetdef\accBayanbassTEE{99}
+\fetdef\accSB{100}
+\fetdef\accBB{101}
+\fetdef\accOldEE{102}
+\fetdef\accOldEES{103}
+
+% flags
+\fetdef\eighthflag{104}
+\fetdef\sixteenthflag{105}
+\fetdef\thirtysecondflag{106}
+\fetdef\sixtyfourthflag{107}
+\fetdef\deighthflag{108}
+\fetdef\dsixteenthflag{109}
+\fetdef\dthirtysecondflag{110}
+\fetdef\dsixtyfourthflag{111}
+
+% clefs
+\fetdef\altoclef{112}
+\fetdef\caltoclef{113}
+\fetdef\bassclef{114}
+\fetdef\cbassclef{115}
+\fetdef\trebleclef{116}
+\fetdef\ctrebleclef{117}
+
+% timesig
+\fetdef\fourfourmeter{118}
+\fetdef\allabreve{119}
+\fetdef\oldfourfourmeter{120}
+\fetdef\oldallabreve{121}
+\fetdef\oldthreetwometer{122}
+\fetdef\oldsixfourmeter{123}
+\fetdef\oldninefourmeter{124}
+
diff --git a/Documentation/programmer/fonts.doc b/Documentation/programmer/fonts.doc
new file mode 100644 (file)
index 0000000..287dde4
--- /dev/null
@@ -0,0 +1,330 @@
+
+                                % -*-LaTeX-*-
+
+\documentclass{article}
+\def\kdots{,\ldots,}
+\title{Not the Font-En-Tja font}
+\author{HWN \& JCN} 
+\def\preMudelaExample{}
+\def\postMudelaExample{}
+\begin{document}
+\maketitle
+
+
+\section{Introduction}
+
+This document are some design notes of the Feta font, and other
+symbols related to LilyPond.  Feta (not an abbreviation of
+Font-En-Tja) is a font of music symbols.  All MetaFont sources are
+original.  The symbols are modelled after various editions of music,
+notably \begin{itemize} \item B\"arenreiter \item Hofmeister \item
+Breitkopf \item Durand \& C'ie \end{itemize}
+
+The best references on Music engraving are Wanske\cite{wanske} and
+Ross\cite{ross} some of their insights were used.  Although it is a
+matter of taste, I'd say that B\"arenreiter has the finest typography
+of all.
+
+
+\section{Bezier curves for slurs}
+
+Objective:  slurs in music are curved objects designating that notes
+should fluently bound.  They are drawn as smooth curves, with their
+center thicker and the endings tapered.
+
+There are some variants: the simplest slur shape only has the width as
+parameter.  Then we give some suggestions for tuning the shapes.  The
+simple slur algorithm is used for drawing ties as well.
+
+
+
+\subsection{Simple slurs}
+
+Long slurs are flat, whereas short slurs look like small circle arcs.
+Details are given in Wanske\cite{ross} and Ross\cite{wanske}.  The
+shape of a slur can be given as a Bezier curve with four control
+points:
+
+\begin{eqnarray*}
+  B(t) &=& (1-t)^3c_1 +3(1-t)^2tc_2 + 3(1-t)t^2c_3 + t^3c_4.
+\end{eqnarray*}
+
+We will assume that the slur connects two notes of the same
+pitch.  Different slurs can be created by rotating the derived shape.
+We will also assume that the slur has a vertical axis of symmetry
+through its center.  The left point will be the origin.     So we have
+the following equations for the control points $c_1\kdots c_4$.
+
+\begin{eqnarray*}
+c_1&=& (0,0)\\
+c_2&=& (i, h)\\
+c_3&=& (b-i, h)\\
+c_4&=& (b, 0)
+\end{eqnarray*}
+
+The quantity $b$ is given, it is the width of the slur.  The
+conditions on the shape of the slur for small and large $b$ transform
+to
+\begin{eqnarray*}
+ h \to h_{\infty} , &&\quad b \to \infty\\
+ h \approx r_{0} b, &&\quad b \to 0.
+\end{eqnarray*}
+To tackle  this, we  will  assume that $h   = F(b)$, for  some kind of
+$F(\cdot)$.  One function that satisfies the above conditions is
+$$
+F(b) = h_{\infty} \frac{2}{\pi} \arctan \left( \frac{\pi r_0}{2
+h_{\infty}} b \right).
+$$
+
+For satisfying results we choose $h_{\infty} = 2\cdot \texttt{interline}$
+and $r_0 = \frac 13$.
+
+\subsection{Height correction}
+
+Aside from being a smooth curve, slurs should avoid crossing
+enclosed notes and their stems.
+
+An easy way to achieve this is to extend the slur's height,
+so that the slur will curve just above any disturbing notes.
+
+The parameter $i$ determines the flatness of the curve.  Satisfying
+results have been obtained with $i = h$.
+
+The formula can be generalised to allow for corrections in the shape, 
+\begin{eqnarray*}
+c_1&=& (0,0)\\
+c_2&=& (i', h')\\
+c_3&=& (b-i', h')\\
+c_4&=& (b, 0)
+\end{eqnarray*}
+Where
+$$
+i' = h(b) (1 + i_{corr}), \quad h' = h(b) (1 + h_{corr}).
+$$
+
+The default values for these corrections are $0$.  A $h_{corr}$ that is
+negative, makes the curve flatter in the center.  A $h_{corr}$ that is
+positive make the curve higher. 
+
+At every encompassed note's x position the difference $\delta _y$ 
+between the slur's height and the note is calculated.  The greatest 
+$\delta _y$ is used to calculate $h_{corr}$ is by lineair extrapolation.
+
+However, this simple method produces satisfactory results only for 
+small and symmetric disturbances.
+
+
+\subsection{Tangent method correction}
+
+A somewhat more elaborate\footnote{While staying in the realm 
+of empiric computer science} way of having a slur avoid 
+disturbing notes is by first defining the slur's ideal shape 
+and then using the height correction.  The ideal shape of a 
+slur can be guessed by calculating the tangents of the disturbing 
+notes:
+% a picture wouldn't hurt...
+\begin{eqnarray*}
+  y_{disturb,l} &=& \rm{rc}_l x\\
+  y_{disturb,r} &=& \rm{rc}_r + c_{3,x},
+\end{eqnarray*}
+where
+\begin{eqnarray*}
+  \rm{rc}_l &=& \frac{y_{disturb,l} - y_{encompass,1}}
+    {x_{disturb,l} - x_{encompass,1}}\dot x\\
+  \rm{rc}_r &=& \frac{y_{encompass,n} - y_{disturb,r}}
+    {x_{encompass,n} - x_{disturb,r}} \dot x + c_{3,x}.
+\end{eqnarray*}
+
+We assume that having the control points $c_2$ and $c_3$ located 
+on tangent$_1$ and tangent$_2$ resp. 
+% t: tangent
+\begin{eqnarray*}
+  y_{tangent,l} &=& \alpha \rm{rc}_l x\\
+  y_{tangent,r} &=& \alpha \rm{rc}_r + c_{3,x}.
+\end{eqnarray*}
+
+Beautiful slurs have rather strong curvature at the extreme
+control points.  That's why we'll have $\alpha > 1$.
+Satisfactory resulsts have been obtained with
+$$
+  \alpha \approx 2.4.
+$$
+
+The positions of control points $c_2$ and $c_3$ are obtained
+by solving with the height-line
+\begin{eqnarray*}
+  y_h &=& \rm{rc}_h + c_h.
+\end{eqnarray*}
+
+The top-line runs through the points disturb$_{left}$ and
+disturb$_{right}$.  In the case that 
+$$
+z_{disturb,l} = z_{disturb,r},
+$$
+we'll have 
+$$
+  \angle(y_{tangent,l},y_h) = \angle(y_{tangent,r},y_h).
+$$
+
+
+
+\section{Sizes}
+
+Traditional engraving uses a set of 9 standardised sizes for Staffs
+(running from 0 to 8).  
+
+We have tried to measure these (helped by a magnifying glass), and
+found the staffsizes in  table~\ref{fonts:staff-size}.  One should note that
+these are estimates, so I think there could be a measuring error of ~
+.5 pt.  Moreover [Ross] states that not all engravers use exactly
+those sizes.
+
+\begin{table}[h]
+  \begin{center}
+    \begin{tabular}{lll}
+Staffsize       &Numbers                &Name\\
+\hline\\
+26.2pt  &No. 0\\
+22.6pt  &No. 1          &Giant/English\\
+21.3pt  &No. 2          &Giant/English\\
+19.9pt  &No. 3          &Regular, Ordinary, Common\\
+19.1pt  &No. 4          &Peter\\
+17.1pt  &No. 5          &Large middle\\
+15.9pt  &No. 6          &Small middle\\
+13.7pt  &No. 7          &Cadenza\\
+11.1pt  &No. 8          &Pearl\\
+    \end{tabular}
+    \caption{Foo}
+    \label{fonts:staff-size}
+  \end{center}
+\end{table}
+
+
+
+
+\section{Beams}
+
+\subsection{Slope}
+
+Traditionally, beam slopes are computed by following a large and hairy
+set of rules.  Some of these are talked-about in Wanske, a more
+recipy-like description can be found in Ross.
+
+There are some problems when trying to follow these rules:
+\begin{itemize}
+
+\item the set is not complete
+
+\item they are not formulated as a general rule with exceptions, but
+rather as a huge case of individual rules\cite{ross}
+
+\item in some cases, the result is wrong or ugly (or both)
+
+\item they try to solve a couple of problems at a time (e.g. Ross
+handles ideal slope and slope-quantisation as a paired problem)
+\end{itemize}
+Reading Ross it is clear that the rules presented there are certainly
+not the ultimate idea of what beam(slope)s should look like, but
+rather a (very much) simplified hands-on recipy for a human engraver.
+
+There are good reasons not to follow those rules:
+
+\begin{itemize}
+\item One cannot expect a human engraver to solve least-squares
+problems for every beam
+  
+\item A human engravers will allways trust themselves in judging the
+outcome of the applied recipy.  If, in a complicated case, the result
+"doesn't look good", they will ignore the rules and draw their own
+beams, based on experience.
+
+\item The exact rules probably don't "really exist" but in the minds
+  of good engravers, in the form of experience
+\end{itemize}
+
+We'll propose to do a least-squares solve.  This seems to be the best
+way to calculate the slope for a computerised engraver such as Lily.
+
+It would be nice to have some rules to catch and handle "ugly" cases,
+though.  In general, the slope of the beam should mirror the pitches
+of the notes.  If this can't be done because there simply is no
+uniform trend, it would probably be best to set the slope to zero.
+
+
+\subsection{Quantising}
+
+The beams should be prevented to conflict with the stafflines,
+especially at small slopes.  Traditionally, poor printing techniques
+imposed rather strict rules for quantisation.  In modern (post 1955)
+music printing we see that quality has improved substantially and
+obsoleted the technical justification for following some of these
+strict rules, notably the avoiding of so-called wedges.
+
+
+\subsection{Thickness and spacing}
+
+The spacing of double and triple beams (sixteenth and thirtysecond beams)
+is the same, quadruple and quintuple (thirtyfourth and hundredtwentyeighth
+beams) is wider.
+All beams are equally thick.  Using the layout of triple beams and the 
+beam-thickness $bt$ we can calculate the inter-beam spacing $ib$.
+
+Three beams span two interlines, including stafflines:
+\begin{eqnarray*}
+ 2 ib + bt &=& 2 il\\
+ ib &=& (2 il - bt) / 2
+\end{eqnarray*}
+
+We choose
+\begin{eqnarray*}
+  bt &=& 0.48(il - st)
+\end{eqnarray*}
+
+\subsubsection{Quadruple beams}
+
+If we have more than three beams they must open-up
+in order to not collide with staff lines.  The only valid
+position that remains is for the upper beam to hang.
+
+\begin{eqnarray*}
+ 3 ib_{4+} + bt &=& 3 il\\
+ ib_{4+} &=& (3 il - bt) / 3
+\end{eqnarray*}
+
+
+\section{Layout of the source files}
+
+The main font (with the fixed size music glyphs) uses a the \TeX\
+logfile as a communication device.  Use the specialised macros to
+create and export glyphs.
+
+\bibliographystyle{plain}
+\bibliography{engraving}
+
+
+
+\end{document}
+
+\begin{verbatim}
+Paul Terry <paul@musonix.demon.co.uk> writes:
+
+Ross states that the dies (the stamps to make the symbols) come in
+12 different sizes.
+
+>Can you tell me how big rastrals are?
+
+According to the Score manual:
+
+   Rastral Size     Height in millimetres
+
+   0                9   mm
+   1                8   mm
+   2                7.5 mm
+   3                7   mm
+   4                6.5 mm
+   5                6   mm
+   6                5.5 mm
+
+I must say, despite having been a music setter for many years, I had to
+look these up - none of the publishers I work for deal in Rastral sizes
+these days (they all use millimetres).
diff --git a/Documentation/programmer/hacking.texi b/Documentation/programmer/hacking.texi
new file mode 100644 (file)
index 0000000..233c800
--- /dev/null
@@ -0,0 +1,851 @@
+\input texinfo @c -*-texinfo-*-
+@setfilename internals.info
+@settitle LilyPond internals
+
+@node Top, LilyPond internals, (dir), (dir)
+@top
+
+
+@menu
+* LilyPond internals::
+* Overview::
+* mudela::                      
+* Request_engraver::            
+* Graphic elements::
+* Score elements::
+* Items::
+* Spanners::
+* Future work::
+* Coding standards::
+* Making patches::
+
+@end menu
+
+@node LilyPond internals,  , Top, Top
+@menu
+* Overview::                      Overview
+* mudela::                        mudela
+* Request_engraver::              Request_engraver
+@end menu
+
+
+@chapter Getting involved
+
+Please help us make LilyPond a better program. You can help LilyPond in
+several ways. Not all tasks requiring programming or understanding the
+full source code.  You can write to the mailing list
+(@email{gnu-music-discuss@@gnu.org} for more information)
+
+@unnumberedsubsec Users
+
+Mutopia needs your help. The mutopia project is a collection of public
+domain sheet music. You can help the project by entering music and
+submitting. Point your browser to the
+@uref{http://sca.uwaterloo.ca/Mutopia, Mutopia webpage}
+
+@unnumberedsubsec Font designers
+
+Our set of glyphs (the Feta font) is far from complete.  If you know  a
+little MetaFont you can contribute a glyph
+
+@unnumberedsubsec Writers
+
+The documentation of LilyPond and related utilities needs a lot of work.
+
+@unnumberedsubsec Translators
+
+LilyPond is completely ready for internationalized messages, but there
+are only three translations so far.
+
+@unnumberedsubsec Hackers
+
+
+There are lots of possibilities of improving the program itself. There are
+both small projects and big ones. Most of them are listed in the TODO
+file.  A interesting and very big project is writing a GUI frontend to
+LilyPond.
+
+
+
+@chapter LilyPond internals
+
+
+This documents some aspects of the internals of GNU LilyPond. Some of
+this stuff comes from e-mail I wrote, some from e-mail others wrote,
+some are large comments taken away from the headers. This page may be
+a little incoherent.  Unfortunately, it is also quite outdated.  A
+more thorough  and understandable document is in the works.
+
+You should use @code{doc++} to take a peek at the sources.
+
+@node Overview, mudela, Top, Top
+@section Overview
+
+GNU LilyPond is a "multi-pass" system. The different passes have been
+created so that they do not depend on each other. In a later stage
+some parts may be moved into libraries, or seperate programs, or they
+might be integrated in larger systems.
+
+@table @samp
+
+@item Parsing:
+
+No difficult algorithms. The .ly file is read, and converted to a list
+of @code{Scores}, which each contain @code{Music} and paper/midi-definitions.
+
+@item Interpreting music
+
+The music is walked through in time-order. The iterators which do the
+walking report Music to Translators which use this information to
+create elements, either MIDI or "visual" elements. The translators
+form a hierarchy; the ones for paper output are Engravers, for MIDI
+Performers.
+
+The translators swallow Music (mostly atomic gobs called Requests),
+create elements, broadcast them to other translators on higher or same
+level in the hierarchy:
+
+The stem of a voice A is broadcast to the staff which contains A, but
+not to the stems, beams and noteheads of a different voice (say B) or
+a different staff. The stem and noteheads of A are coupled, because
+the the Note_heads_engraver broadcasts its heads, and the Stem_engraver catches
+these.
+
+The engraver which agrees to handle a request decides whether to to
+honor the request, ignore it, or merge it with other requests. Merging
+of requests is preferably done with other requests done by members of
+the same voicegroups (beams, brackets, stems). In this way you can put
+the voices of 2 instruments in a conductor's score so they make chords
+(the Beam requests of both instruments will be merged).
+
+@item Prebreaking
+
+Breakable stuff (eg. clefs and bars) are copied into pre and
+postbreaks.
+
+@item Preprocessing
+
+Some dependencies are resolved, such as the direction of stems, beams,
+and "horizontal" placement issues (the order of clefs,  keys etc,
+placement of chords in multi-voice music), 
+
+@item Break calculation:
+
+The lines and horizontal positions of the columns are determined.
+
+@item Breaking
+
+Through some magical interactions with Line_of_score and Super_elem
+(check out the source) the "lines" are produced.
+
+All other spanners can figure across which lines they are spread. If
+applicable, they break themselves into pieces. After this, each piece
+(or, if there are no pieces, the original spanner itself) throws out
+any dependencies which are in the wrong line.
+
+@item Postprocesing:
+
+Some items and all spanners need computation after the Paper_column
+positions are determined. Examples: slurs, vertical positions of
+staffs.
+
+@item Output paper
+
+@end table
+
+@node mudela, Request_engraver, Overview, Top
+@section mudela
+
+Most information is stored in the form of a request.  In music
+typesetting, the user might want to cram a lot more symbols on the
+paper than actually fits. To reflect this idea (the user asks more
+than we can do), the container for this data is called Request.
+
+In a lot of other formats this would be called an 'Event'
+
+@table @samp
+@item @code{Barcheck_req}
+    Checks during music processing if start of this voice element
+    coincides with the start of a measure. Handy to check if you left out
+    some voice elts.
+@item @code{Note_req}
+    LilyPond has to decide if the ball should be hanging left or
+    right. This influences the horizontal dimensions of a column, and this
+    is why request processing should be done before horizontal spacing.
+    Other voices' frivolities may cause the need for accidentals, so this
+    is also for the to decide. The engraver can decide on positioning based on
+    ottava commands and the appropriate clef.
+@item @code{Rest_req}
+    Typeset a rest.
+@item @code{Span_req}
+    This type of request typically results in the creation of a @code{Spanner}
+@item @code{Beam_req}
+    Start/stop a beam.
+    Engraver has to combine this request with the stem_request, since the
+    number of flags that a stem wants to carry will determine the
+    number of beams.
+@item @code{Dynamic}
+    Each dynamic is bound to one note (a crescendo spanning multiple
+    notes is thought to be made of two "dynamics": a start and a stop).
+    Dynamic changes can occur in a smaller time than the length of its
+    note, therefore fore each  @code{Dynamic} request carries a time, measured
+    from the start of its note.
+@end table
+
+@node Request_engraver, , mudela, Top
+@section Request_engraver
+
+In the previous section the idea of Request has been explained, but
+this only solves one half of the problem. The other half is deciding
+which requests should be honored, which should merged with other
+requests, and which should be ignored. Consider this input
+
+@example 
+
+       \type Staff < % chord
+               @{ \meter 2/4; [c8 c8] @}
+               @{\meter 2/4;  [e8 e8] @}
+       >
+@end example 
+
+Both the cs and es are part of a staff (they are in the same
+Voice_group), so they should share meters, but the two [ ] pairs
+should be merged.
+
+The judge in this "allocation" problem a set of brokers: the requests
+are transmitted to so-called engravers which respond if they want to
+accept a request eg, the @code{Notehead_engraver} will accept
+@code{Note_req}s, and turn down @code{Slur_req}s. If the Music_iterator
+cannot find a engraver that wants the request, it is junked (with a
+warning message).
+
+After all requests have been either assigned, or junked, the Engraver
+will process the requests (which usually means creating an @code{Item}
+or @code{Spanner}). If a @code{Request_engraver} creates something, it
+tells the enclosing context. If all items/spanners have been created,
+then each Engraver is notified of any created Score_element, via a
+broadcasting system.
+
+@unnumberedsubsec example:
+
+@example 
+
+       c4
+@end example 
+
+produces:
+
+@example 
+
+       Note_request (duration 1/4)
+       Stem_request (duration 1/4)
+@end example 
+
+Note_request will be taken by a @code{Notehead_engraver}, stem_request
+will be taken by a @code{Stem_beam_engraver}. @code{Notehead_engraver}
+creates a @code{Notehead}, @code{Stem_beam_engraver} creates a
+@code{Stem}. Both announce this to the Staff_engraver. Staff_engraver
+will tell @code{Stem_beam_engraver} about the @code{Notehead}, which
+will add the @code{Notehead} to the @code{Stem} it just created.
+
+To decide on merging, several engravers have been grouped. Please
+check @file{init/engraver.ly}.
+
+
+
+@node Graphic elements, , , Top 
+@section Graphic elements
+
+
+Music notation is composed of a sets of interrelated glyphs.  In
+Lilypond every glyph usually is represented by one object, a so-called
+Graphic Object.  The primary relations between graphic objects involve
+positions:
+
+@itemize
+@item consecutive notes are printed left to right, grouped  in a staff
+@item simultaneous notes are horizontally aligned (internally grouped in
+a paper column).
+@item  the staccato mark is horizontally centered on the note it applies
+to.
+@end itemize
+
+The abstract encoding of such relations is done with the concept
+@dfn{reference point}.  The reference point (in X direction) of the
+staccato mark is the note it applies to.  The (X) position of the
+staccato mark is stored relative to the position of the note head.  This
+means that the staccato will always maintain a fixed offset wrt to the
+note head, whereever the head is moved to.
+
+In the same vein, all notes on a staff have their Y positions stored
+relative to an abstract object called Axis_group_spanner.  If the
+Axis_group_spanner of one staff is moved, the absolute Y positions of
+all objects in that spanner change along, in effect causing the staff
+and all its contents to move as a whole.
+
+Each graphic object stores a pointer and an relative offset for each
+direction: one for the X-axis, one for the Y-axis.  For example, the X
+parent of a Note_head usually is a Note_column.  The X parent of a
+Note_column usually is either a Collision or a Paper_column. The X
+parent of a Collision usually is a Paper_column.  If the Collision
+moves, all Note_heads that have that Collision as parent also move, but
+the absolute position of the Paper_column does not change.
+
+To build a graphical score with Graphic_elements, conceptually, one
+needs to have one Root object (in Lilypond: Line_of_score), and
+recursively attach objects to the Root.   However, due to the nature
+of the context selection mechanisms, it turns out to be more
+advantageous to construct the tree the other way around: first small
+trees (note heads, barlines etc.) are created, and these are
+subsequently composed into larger trees, which are finally hung on a
+Paper_column (in X direction) or Line_of_score (in Y direction). 
+
+The structure of the X,Y parent relations are determined by the
+engravers and notation contexts:
+
+The most important X-axis parent relation depends on the timing: notes
+that come earlier are attached to Paper_column that will be positioned
+more to the left.
+
+The most important Y-axis relation depends on containment of contexts:
+notes (created in a Thread or Voice context) are put in the staff where
+the originating context lives in.
+
+Graphical_axis_groups are special graphic objects, that are designed to
+function as a parent.  The size of a Graphical_axis_groups group is the
+union of its children.
+
+@node Score elements, ,  , Top
+
+Besides relative positions there are lots of other relations between
+elements. Lilypond does not contain other specialized relation
+management (Like the relative positioning code).  In stead, objects can
+be connected through dependencies, which sets the order in which objects
+are to be processed.
+
+Example: the direction of a beamed stem should equal the direction of
+the beam.  When the stem is a added to the beam, a dependency on the
+beam is set in the stem: this means that @code{Beam::do_pre_processing
+()} (which does various direction related things) will be called before
+@code{Stem::do_pre_processing ()}.
+
+The code that manages dependencies resides in the class
+@code{Score_element}, a derived class of @code{Graphical_element}.  The
+bulk of the code handles line breaking related issues.
+
+To sketch the problems with line breaking: suppose a slur spans a line
+break,
+@example
+
+c4(  c'''' c | \break d d )d
+
+@end example
+In this case, the slur will appear as two parts, the first part spanning
+the first three notes (the @code{c}s), the second spanning the last
+three (the @code{d}s).  Within Lilypond this is modeled as breaking the
+slur in parts: from the Original slur, two new clones of the old slur
+are made. Initially both clones depend on the six notes.  After the
+hairy code in Score_element, Spanner and Item which does substitutions
+in sets of dependencies, the first clone depends on the first three
+notes, the second on the last three.
+
+The major derived classes of Score_element are Item and  Spanner.
+An item has one horizontal position.  A spanner hangs on two  items.
+
+@node Items, , , Top
+@section Items
+
+
+
+An item is a score element that is associated with only one
+Paper_column. Examples are note heads, clefs, sup and superscripts, etc.
+Item is a derived class of Score_element.
+
+The shape of an item is known before the break calculations, and line
+spacing depends on the size of items: very wide items need more space
+than very small ones.
+
+An additional complication is the behavior of items at linebreaks.  For
+example, when you do a time signature change, you get only one symbol.
+If it occurs at a linebreak, the new time signature must be printed both
+before and after the linebreak.  Other `breakable symbols' such as
+clefs, and bar lines also exhibit this behavior. 
+
+if a line of music is broken, the next line usually gets a clef. So in
+TeX terms, the clef is a postbreak. The same thing happens with meter
+signs: Normally the meter follows the bar. If a line is broken at that
+bar, the bar along with the meter stays on the "last" line, but the next
+line also gets a meter sign after the clef.   To support this,
+breakable items are generated in the three versions: original
+(unbroken), left (before line break) and right (after line break).
+During the line spacing, these versions are used to try how the spacing
+of a  line works out.
+
+Once the definitive spacing is determined, dependencies (and various
+other pointers) are substituted such that all dependencies point at the
+active items: either they point at the original, or they point at left
+and right.
+
+@node Spanners, , , Top
+@section Spanners
+
+Spanners are symbols that are of variable shape, eg. Slurs, beams, etc.
+Spanners is a derived class of Score_element.
+
+The final shape can only be determined after the line breaking process.
+All spanners are spanned on two items, called the left and right
+boundary item.  The X reference point is the left boundary item.
+
+
+@node Future work, , , Top
+@section Future work
+
+There are plans to unify Spanner and Item, so there will no longer be
+such a clear distinction between the two.  Right now, Score_elements are
+always either Item or either Spanner.
+
+Most of the properties of a graphic object are now member variables of
+the classes involved.  To offer configurability, we want to move these
+variables to scheme (GUILE) variables, and no longer use C++ code to
+calculate them, but use Scheme functions.
+
+@node Coding standards,  , , Top
+
+@chapter CodingStyle - standards while programming for GNU
+LilyPond
+
+Functions and methods do not return errorcodes.
+
+
+@unnumberedsubsec Languages
+
+C++ and Python are preferred.  Perl is not.  Python code should use an
+indent of 8, using TAB characters.
+
+@unnumberedsubsec Filenames
+
+Definitions of classes that are only accessed via pointers
+(*) or references (&) shall not be included as include files.
+
+filenames
+
+@example 
+       ".hh"   Include files
+       ".cc"   Implementation files
+       ".icc"  Inline definition files
+       ".tcc"  non inline Template defs
+@end example 
+
+in emacs:
+
+@example 
+       (setq auto-mode-alist
+             (append '(("\\.make$" . makefile-mode)
+                       ("\\.cc$" . c++-mode)
+                       ("\\.icc$" . c++-mode)
+                       ("\\.tcc$" . c++-mode)
+                       ("\\.hh$" . c++-mode)
+                       ("\\.pod$" . text-mode)         
+                       )
+                     auto-mode-alist))
+@end example 
+
+
+The class Class_name_abbreviation is coded in @file{class-name-abbr.*}
+
+@unnumberedsubsec Indentation
+
+Standard GNU coding style is used.   In emacs:
+
+@example 
+       (add-hook 'c++-mode-hook
+                 '(lambda() (c-set-style "gnu")
+                    )
+                 )
+@end example 
+
+If you like using font-lock, you can also add this to your @file{.emacs}:
+
+@example 
+       (setq font-lock-maximum-decoration t)
+       (setq c++-font-lock-keywords-3 
+             (append
+              c++-font-lock-keywords-3
+              '(("\\b\\([a-zA-Z_]+_\\)\\b" 1 font-lock-variable-name-face)
+              ("\\b\\([A-Z]+[a-z_]+\\)\\b" 1 font-lock-type-face))
+              ))
+@end example 
+
+@unnumberedsubsec Classes and Types
+
+@example 
+       This_is_a_class
+@end example 
+
+@unnumberedsubsec Members
+
+@example 
+       Class::member ()
+       Type Class::member_type_
+       Type Class::member_type ()
+@end example 
+
+the @code{type} is a Hungarian notation postfix for @code{Type}. See below
+
+@unnumberedsubsec Macros
+
+Macros should be written completely in uppercase
+
+The code should not be compilable if proper macro declarations are not
+included. 
+
+Don't laugh. It took us a whole evening/night to figure out one of
+these bugs, because we had a macro that looked like
+@code{DECLARE_VIRTUAL_FUNCTIONS ()}. 
+
+@unnumberedsubsec Broken code
+
+Broken code (hardwired dependencies, hardwired constants, slow
+algorithms and obvious limitations) should be marked as such: either
+with a verbose TODO, or with a short "ugh" comment.
+
+@unnumberedsubsec Comments
+
+The source is commented in the DOC++ style.  Check out doc++ at
+@uref{http://www.zib.de/Visual/software/doc++/index.html}
+
+@example 
+
+       /*
+               C style comments for multiline comments.
+               They come before the thing to document.
+               [...]
+       */
+
+       /**
+               short description.
+               Long class documentation.
+               (Hungarian postfix)
+
+               TODO Fix boring_member ()
+       */
+       class Class @{
+               /**
+                 short description.
+                 long description
+               */
+
+               Data data_member_;
+
+               /**
+                       short memo. long doco of member ()
+                       @@param description of arguments
+                       @@return Rettype
+               */
+               Rettype member (Argtype);
+
+               /// memo only
+               boring_member () @{
+                       data_member_ = 121; // ugh
+               @}
+       @};
+@end example 
+
+       
+Unfortunately most of the code isn't really documented that good.
+
+@unnumberedsubsec Members (2)
+
+Standard methods:
+
+@example 
+
+       ///check that *this satisfies its invariants, abort if not.
+       void OK () const
+
+       /// print *this (and substructures) to debugging log
+       void print () const
+
+       /**
+       protected member. Usually invoked by non-virtual XXXX ()
+       */
+       virtual do_XXXX ()
+
+       /**add some data to *this.
+       Presence of these methods usually imply that it is not feasible to this
+       via  a constructor
+       */
+       add (..)
+
+       /// replace some data of *this
+       set (..)
+@end example 
+
+@unnumberedsubsec Constructor
+
+Every class should have a default constructor.  
+
+Don't use non-default constructors if this can be avoided:
+
+@example 
+
+       Foo f(1)
+@end example 
+
+is less readable than
+
+@example 
+
+       Foo f;
+       f.x = 1
+@end example 
+
+or 
+
+@example 
+
+       Foo f(Foo_convert::int_to_foo (1))
+@end example 
+
+@unnumberedsec Hungarian notation naming convention
+
+Proposed is a naming convention derived from the so-called
+@emph{Hungarian Notation}.  Macros, @code{enum}s and @code{const}s are all
+uppercase, with the parts of the names separated by underscores.
+
+The hungarian notation  is to be used when variables are not declared
+near usage (mostly in member variables and functions).
+
+@unnumberedsubsec Types
+
+@table @samp
+@item @code{byte}
+    unsigned char. (The postfix _by is ambiguous)
+@item @code{b}
+    bool
+@item @code{bi}
+    bit
+@item @code{ch}
+    char
+@item @code{f}
+    float
+@item @code{i}
+    signed integer
+@item @code{str}
+    string class
+@item @code{sz}
+    Zero terminated c string
+@item @code{u}
+    unsigned integer
+@end table
+
+@unnumberedsubsec User defined types
+
+@example 
+
+       /** Slur blah. blah.
+       (slur)
+       */
+       class Slur @{@};
+       Slur* slur_p = new Slur;
+@end example 
+
+@unnumberedsubsec Modifiers
+
+The following types modify the meaning of the prefix. 
+These are preceded by the prefixes:
+
+@table @samp
+@item @code{a}
+    array
+@item @code{array}
+    user built array.
+@item @code{c}
+    const. Note that the proper order is @code{Type const}
+    i.s.o. @code{const Type}
+@item @code{C}
+    A const pointer. This would be equivalent to @code{_c_l}, but since any
+    "const" pointer has to be a link (you can't delete a const pointer),
+    it is superfluous.
+@item @code{l}
+    temporary pointer to object (link)
+@item @code{p}
+    pointer to newed object
+@item @code{r}
+    reference
+@end table
+
+@unnumberedsubsec Adjective
+
+Adjectives such as global and static should be spelled out in full.
+They come before the noun that they refer to, just as in normal english.
+
+@example 
+
+foo_global_i: a global variable of type int commonly called "foo".
+@end example 
+
+static class members do not need the static_ prefix in the name (the
+Class::var notation usually makes it clear that it is static)
+
+@table @samp
+@item @code{loop_i}
+    Variable loop: an integer
+@item @code{u}
+    Temporary variable: an unsigned integer
+@item @code{test_ch}
+    Variable test: a character
+@item @code{first_name_str}
+    Variable first_name: a String class object
+@item @code{last_name_ch_a}
+    Variable last_name: a @code{char} array
+@item @code{foo_i_p}
+    Variable foo: an @code{Int*} that you must delete
+@item @code{bar_i_l}
+    Variable bar: an @code{Int*} that you must not delete
+@end table
+
+Generally default arguments are taboo, except for nil pointers.
+
+The naming convention can be quite conveniently memorised, by
+expressing the type in english, and abbreviating it
+
+@example 
+
+       static Array<int*> foo
+@end example 
+
+@code{foo} can be described as "the static int-pointer user-array", so you get
+
+@example 
+
+       foo_static_l_arr
+@end example 
+
+
+@unnumberedsec Miscellaneous
+    
+For some tasks, some scripts are supplied, notably creating patches, a
+mirror of the website, generating the header to put over cc and hh
+files, doing a release.
+
+Use them.
+
+@node Making patches,  , , Top
+
+
+@unnumberedsec name
+    
+
+PATCHES - track and distribute your code changes
+
+This page documents how to distribute your changes to GNU lilypond
+    
+We would like to have unified context diffs with full pathnames.  A
+script automating supplied with Lily.
+
+Distributing a change normally goes like this:
+
+@itemize @bullet
+@item make your fix/add your code 
+@item Add changes to CHANGES, and add yourself to Documentation/topdocs/AUTHORS.texi
+@item generate a patch, 
+@item e-mail your patch to one of the mailing lists
+    gnu-music-discuss@@gnu.org or bug-gnu-music@@gnu.org
+@end itemize
+
+Please do not send entire files, even if the patch is bigger than the
+original.  A patch makes it clear what is changed, and it won't
+overwrite previous (not yet released) changes.
+
+@unnumberedsec Generating a patch
+
+Simple version: run
+
+@example
+        make -C lilypond-x.y.z/ distclean
+        make -C lilypond-x.y.z.NEW/ distclean
+        diff -urN lilypond-x.y.z/ lilypond-x.y.z.NEW/
+@end example
+
+Complicated (but automated) version:
+
+In @file{VERSION}, set MY_PATCH_LEVEL:
+
+@example 
+
+    VERSION:
+       ...
+       MY_PATCH_LEVEL=jcn1
+@end example 
+
+In @file{CHANGES}, enter a summary of changes:
+
+@example 
+       pl 0.1.73.jcn1
+               - added PATCHES.texi
+@end example 
+
+Then, from the top of Lily's source tree, type
+
+@example 
+    make release
+@end example 
+
+These handy python scripts assume a directory structure which looks
+like:
+
+@example 
+
+    lilypond -> lilypond-x.y.z   # symlink to development directory
+    lilypond-x.y.z/              # current development
+    patches/                    # patches between different releases
+    releases/                    # .tar.gz releases
+
+@end example 
+
+(Some scripts also assume this lives in  @file{$HOME/usr/src}).
+
+       
+@unnumberedsec Applying patches
+    
+
+If you're following LilyPond development regularly, you probably want to
+download just the patch for each subsequent release.
+After downloading the patch (into the patches directory, of course), simply 
+apply it:
+
+@example 
+
+    gzip -dc ../patches/lilypond-0.1.74.diff.gz | patch -p1 -E
+@end example 
+
+and don't forget to make automatically generated files:
+
+@example 
+
+    autoconf footnote(patches don't include automatically generated files, 
+    i.e. file(configure) and files generated by file(configure).)
+
+    configure
+@end example 
+    
+
+@bye
+
+
diff --git a/Documentation/programmer/lilypond-overview.doc b/Documentation/programmer/lilypond-overview.doc
new file mode 100644 (file)
index 0000000..a408a9e
--- /dev/null
@@ -0,0 +1,743 @@
+%-*-LaTeX-*-
+
+\documentclass{article}
+\usepackage{a4}
+\def\postMudelaExample{\setlength{\parindent}{1em}}
+\title{LilyPond, a Music Typesetter}
+\author{HWN}
+\usepackage{musicnotes}
+\usepackage{graphics}
+
+
+\begin{document}
+\maketitle
+
+[THIS IS WORK IN PROGRESS.  THIS IS NOT FINISHED]
+
+% -*-LaTeX-*-
+\section{Introduction}
+
+The Internet has become a popular medium for collaborative work on
+information.  Its success is partly due to its use of simple, text-based
+formats.  Examples of these formats are HTML and \LaTeX.  Anyone can
+produce or modify such files using nothing but a text editor, they are
+easily processed with run-of-the-mill text tools, and they can be
+integrated into other text-based formats.
+
+Software for processing this information and presenting these formats
+in an elegant form is available freely (Netscape, \LaTeX, etc.).
+Ubiquitousness of the software and simplicity of the formats have
+revolutionised the way people publish text-based information
+nowadays.
+
+In the field of performed music, where the presentation takes the form
+of sheet music, such a revolution has not started yet.  Let us review
+some alternatives that have been available for transmitting sheet
+music until now:
+\begin{itemize}
+\item MIDI\cite{midi}.  This format was designed for interchanging performances
+  of music; one should think of it as a glorified tape recorder
+  format.  It needs dedicated editors, since it is binary.  It does
+  not provide enough information for producing musical scores: some of
+  the abstract musical content of what is performed is thrown away.
+  
+\item PostScript\cite{Postscript}. This format is a printer control
+  language.  Printed musical scores can be transmitted in PostScript,
+  but once a score is converted to PostScript, it is virtually
+  impossible to modify the score in a meaningful way.
+  
+\item Formats for various notation programs.  Notation programs either
+  work with binary  formats (e.g., NIFF\cite{niff-web}), need specific
+  platforms   (e.g.,  Sibelius\cite{sibelius}),  are   proprietary  or
+  non-portable  tools  themselves  (idem), produce  inadequate  output
+  (e.g.,  MUP\cite{mup}),  are   based  on  graphical  content  (e.g.,
+  MusixTeX\cite{musixtex1}),  limit themselves to  specific subdomains
+  (e.g.,  ABC\cite{abc2mtex}),  or   require  considerable  skill  and
+  knowledge to use (e.g., SCORE\cite{score})
+  
+\item SMDL\cite{smdl-web}.  This is a very rich ASCII format, that is
+  designed for storing many types of music.  Unfortunately, there is
+  no implementation of a program to print music from SMDL available.
+  Moreover, SMDL is so verbose, that it is not suitable for human
+  production.
+  
+\item TAB\cite{tablature-web}.  Tab (short for tablature) is a popular
+  format, for interchanging music over e-mail, but it can only be used
+  for guitar music.
+\end{itemize}
+
+In summary, sheet music is not published and edited on a wide scale
+across the internet  because no format for music
+interchange exists that is:
+\begin{itemize}
+\item open, i.e., with publically available specifications.
+\item based on ASCII, and therefore suitable for human consumption and
+  production.
+\item rich enough for producing publication quality sheet music from
+  it.
+\item based on musical content (unlike, for example, PostScript), and
+  therefore suitable for making modifications.
+\item accompanied by tools for processing it that are freely available
+  across multiple platforms.
+\end{itemize}
+
+
+With the creation of LilyPond, we have tried to create both a
+convenient format for storing sheet music, and a portable,
+high-quality implementation of a compiler, that compiles the input
+into a printable score.  You can find a small example of LilyPond
+input along with output in Figure~\ref{fig:intro-fig}.
+%
+\begin{figure}[htbp]
+  \begin{center}
+\begin[verbatim]{mudela}
+      \score {
+        \notes
+          \context GrandStaff <
+             \transpose c'' { c4 c4 g4 g4 a4 a4 g2 }
+             { \clef "bass"; c4 c'4
+               \context Staff <e'2 {\stemdown c'4 c'4}> f'4 c'4 e'4 c'4 }
+           >
+           \paper { 
+             linewidth = -1.0\cm ;
+           }
+        }      
+\end{mudela}
+    \caption{A small example of LilyPond input}
+    \label{fig:intro-fig}
+  \end{center}
+\end{figure}
+%
+
+The input language encodes musical events (such as notes and rests) on
+the basis of their time-ordering.  For example, the grammar includes
+constructs that specify that notes start simultaneous and that notes
+are to be played in sequence.  In this encoding some context that is
+present in sheet music is lost.
+
+The compiler reconstructs the notation from the encoded music.  Its
+operation comprises four different steps (see
+Figure~\ref{fig:intro-steps}).
+
+\begin{description}
+\item[Parsing] During parsing, the input is converted in a syntax tree.
+  
+\item[Interpreting] In the \emph{interpreting} step, it is determined
+  which symbols have to be printed.  Objects that correspond to
+  notation (\emph{Graphical objects}) are created from the syntax tree
+  in this phase. Generally speaking, for every symbol printed there is
+  one graphical object.  These objects are incomplete: their position
+  and their final shape is unknown.
+  
+  The context that was lost by encoding the input in a language is
+  reconstructed during this conversion.
+\item[Formatting] The next step is determing where symbols are to be
+  placed, this is called \emph{formatting}.
+\item[Outputting]   
+  Finally, all Graphical objects are outputted as PostScript or \TeX\ code.
+\end{description}
+
+\def\staffsym{\vbox to 16pt{
+    \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip
+    \vfil
+    \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip
+    \vfil
+    \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip
+    \vfil
+    \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip
+    \vfil
+    \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip
+}}
+
+\def\vspacer{\vbox to 20pt{\vss}}
+\begin{figure}[h]
+\def\spacedhbox#1{\hbox{\ #1\ }}
+\begin{eqnarray*}
+  {\spacedhbox{Input}\atop \hbox{\texttt{\{c8 c8\}}}} {\spacedhbox{Parsing}\atop\longrightarrow}
+  {\spacedhbox{Syntax tree}\atop\spacedhbox{\textsf{Sequential(Note,Note)}}}
+  {\spacedhbox{Interpreting}\atop\longrightarrow}\\
+  \vspacer\\
+  {\spacedhbox{Graphic objects}\atop\spacedhbox{\texttrebleclef \textquarterhead\texteighthflag\textquarterhead\texteighthflag \staffsym }}
+  {\spacedhbox{Formatting}\atop\longrightarrow}
+  {\spacedhbox{Formatted objects}\atop\hbox{
+    \mudela{c''8 c''8}
+    }}\\
+\vspacer\\
+  {\spacedhbox{Outputting}\atop\longrightarrow}
+  {\spacedhbox{PostScript code}\atop\hbox{\texttt{\%!PS-Adobe}\ldots}}
+\end{eqnarray*}
+  \caption{Parsing, Interpreting, Formatting and Outputting}
+    \label{fig:intro-steps}
+\end{figure}
+
+
+The second step, the interpretation phase of the compiler, can be
+manipulated as a separate entity: the interpretation process is
+composed of many separate modules, and the behaviour of the modules is
+parameterised.  By recombining these interpretation modules,
+and changing parameter settings, the same piece of music can be
+printed differently, as is shown in Figure~\ref{fig:intro-interpret}.
+
+This makes it easy to extend the program. Moreover, this enables the
+same music to be printed in different versions, e.g., in a conductors
+score and in extracted parts.
+
+
+\begin{figure}[h]
+  \begin{center}
+    \begin{mudela}
+      \score {
+        \notes
+          \context GrandStaff <
+             \transpose c'' { c4 c4 g4 g4 a4 a4 g2 }
+             { \clef "bass"; c4 c'4
+               \context Staff <e'2 {\stemdown c'4 c'4}> f'4 c'4 e'4 c'4 }
+           >
+           \paper { 
+             linewidth = -1.0\cm ;
+             \translator {  
+                \VoiceContext
+                \remove "Stem_engraver";
+             }
+           \translator {
+             \StaffContext
+               numberOfStaffLines = 3;
+           }
+          }
+        }
+    \end{mudela}
+    \caption{The interpretation phase can be manipulated: the same
+      music as in Figure~\ref{fig:intro-fig} is interpreted
+      differently: three staff lines and no stems.}
+    \label{fig:intro-interpret}
+  \end{center}
+\end{figure}
+
+
+
+\section{Preliminaries}
+
+To understand the rest of the article, it is necessary to know
+something about music notation and music typography.  Since both
+communicate music, we will explain some characteristics of instruments
+and western music that motivate some notational constructs.
+
+\subsection{Music}
+
+Music notation is meant to be read by human performers.  They sing or
+play instruments that can produce sounds of different pitches.  These
+sounds are called \emph{notes}. Additionally, the sounds can be
+articulated in differents ways, e.g., staccato (short and separated)
+or legato (fluently bound together).  The loudness of the notes can
+also be varied.  Changes in loudness are called \emph{dynamics}.
+
+Silence is also an element of music.  The musical terminology for
+silence within music is \emph{rest}.
+
+The basic unit of pitch is the \emph{octave}.  The octave corresponds
+to a frequency ratio of 1:2. For example the pitch denoted by a'
+(frequency: 440 hertz) is one octave lower than a'' (frequency: 880
+hertz).  Various instruments have a limited \emph{pitch range}, for
+example, a trumpet has a range of about 2.5 octaves.  Not all
+instruments have ranges in the same register: a tuba also has a range
+of 2.5 octaves, but the range of the tuba is much lower.
+
+Musicology has a confusing mix of relative and absolute measures for
+pitches: the term `octave' refers to both a difference between two
+pitches (the frequency ratio of 1:2), and to a range of pitches.  For
+example, the term `[eengestreept] octave' refers to the pitch range
+between 261.6 Hz and 523.3 Hz.
+
+
+The octave is divided into smaller pitch steps.  In modern western
+music, every octave is divided into twelve approximately equidistant
+pitch steps, and each step is called a \emph{semitone}.  Usually, the
+pitches in a musical piece come from a smaller subset of these twelve
+possible pitches.  This smaller subset along with the musical
+functions fo the pitches is called the
+\emph{tonality}\footnote{Tonality also refers to the relations between
+  and functions of certain pitches.  Since these do not have any
+  impact on notation, we ignore this} of the piece.
+
+
+The standard tonality that forms the basis of music notation 
+(the key of C major) is a set of seven pitches within every octave.
+Each of these seven is denoted by a name. In English, these are names
+are (in rising pitch) denoted by c, d, e, f, g, a and b.  Pitches that
+are a semitone higher or lower than one of these seven can be
+represented by suffixing the name with `sharp' or `flat'
+respectively (this is called an \emph{chromatic alteration}).
+
+A pitch therefore can be fully specified by a combination of the
+octave number, the note name and a chromatic alteration.
+Figure~\ref{fig:intro-pitches} shows the relation between names and
+frequencies.
+
+
+
+
+\begin{figure}[h]
+  \begin{center}
+    [te doen]
+  \end{center}
+  \caption{Pitches in western music.  The octave number is denoted
+    by a superscript.}
+  \label{fig:intro-pitches}
+\end{figure}
+
+
+Many instruments can produce more than one note at the same time, e.g.
+pianos and guitars.  When more notes are played simultaneously, they
+form a so-called \emph{chord}.
+
+The unit of duration is the \emph{beat}. When playing, the tempo is
+determined by setting the number of beats per minute.  In western
+music, beats are often stressed in a regular pattern: for example
+Waltzes have a stress pattern that is strong-weak-weak, i.e. every
+note that starts on a `strong' beat is louder and has more pronounced
+articulation.  This stress pattern is called \emph{meter}.
+
+\subsection{Music notation}
+
+Music notation is a system that tries to represent musical ideas
+through printed symbols.  Music notation has no precise definition,
+but most conventions have described in reference manuals on music
+notation\cite{read-notation}.
+
+In music notation, sounds and silences are represented by symbols that
+are called note and rest respectively.\footnote{These names serve a
+  double purpose: the same terms are used to denote the musical
+  concepts.}  The shape of notes and rests indicates their duration
+(See figure~\ref{noteshapes}) relative to the whole note.
+
+
+\begin{figure}[h]
+  \begin{center}
+\begin{mudela}
+  \score {
+    \notes \transpose c''{ c\longa*1/4 c\breve*1/2 c1 c2 c4 c8 c16 c32 c64 }
+    \paper {
+     \translator {
+       \StaffContext
+       \remove "Staff_symbol_engraver";
+        \remove "Time_signature_engraver";
+%        \remove "Bar_engraver";
+        \remove "Clef_engraver";
+ }
+linewidth = -1.;
+    }
+}
+\end{mudela}
+\begin{mudela}
+  \score {
+    \notes \transpose c''\context Staff { r\longa*1/4 r\breve*1/2 r1 r2 r4 r8 r16 r32 r64 }
+    \paper {
+      \translator {
+        \StaffContext
+        \remove "Staff_symbol_engraver";
+        \remove "Time_signature_engraver";
+%        \remove "Bar_engraver";
+        \remove "Clef_engraver";
+        }
+      linewidth = -1.;
+    }
+}
+\end{mudela}
+    \caption{Note and rest shapes encode the length.  At the top notes
+      are shown, at the bottom rests.  From left to right a quadruple
+      note (\emph{longa}), double (\emph{breve}), whole, half,
+      quarter, eigth, sixteenth, thirtysecond and sixtyfourth. Each
+      note has half of the duration of its predecessor.}
+    \label{fig:noteshapes}
+\end{center}
+\end{figure}
+
+
+Notes are printed in a grid of horizontal lines called \emph{staff} to
+denote their pitch: each line represents the pitch of from the
+standard scale (c, d, e, f, g, a, b).  The reference point is the
+\emph{clef}, eg., the treble clef marks the location of the $g^1$
+pitch.  The notes are printed in their time order, from left to right.
+
+
+\begin{figure}[h]
+  \begin{center}
+    \begin{mudela}
+      \score { \notes {
+      a4 b c d e f g a \clef bass;
+      a4 b c d e f g a \clef alto;
+      a4 b c d e f g a \clef treble;
+      }
+      \paper { linewidth = 15.\cm; }
+      }
+    \end{mudela}
+    \caption{Pitches ranging from $a, b, c',\ldots a'$, in different
+      clefs.  From left right the bass, alto and treble clef are
+      featured.}
+    \label{fig:pitches}
+  \end{center}
+\end{figure}
+
+The chromatic alterations are indicated by printing a flat sign or a
+sharp sign in front of the note head.  If these chromatic alterations
+occur systematically (if they are part of the tonality of the piece),
+then this indicated with a \emph{key signature}.  This is a list of
+sharp/flat signs which is printed next to the clef.
+
+Articulation is notated by marking the note shapes wedges, hats and
+dots all indicate specific articulations.  If the notes are to be
+bound fluently (legato), the note shapes are encompassed by a smooth
+curve called \emph{slur},
+
+\begin{figure}[h]
+  \begin{center}
+    \begin{mudela}
+      c'4-> c'4-. g'4 ( b'4  ) g''4
+    \end{mudela}
+    \caption{Some articulations.  From left to right: extra stress
+      (\emph{marcato}), short (staccato), slurred notes (legato).}
+    \label{fig:articulation}
+  \end{center}
+\end{figure}
+
+
+
+Dynamics are notated in two ways: absolute dynamics are indicated by
+letters: \textbf{f} (from Italian ``forte'') stands for loud,
+\textbf{p} (from Italian ``piano'') means soft.  Gradual changes in
+loudness are notated by (de)crescendos.  These are hairpin like shapes
+below the staff.
+
+\begin{figure}[h]
+  \begin{center}
+    \begin{mudela}
+      g'4\pp \<  g'4 \! g'4 \ff \> g'4 g' \! g'\ppp
+    \end{mudela}
+    \caption{Dynamics: start very soft (pp), grow to loud (ff) and
+      decrease to extremely soft (ppp)}
+    \label{fig:dynamics}
+  \end{center}
+\end{figure}
+
+
+The meter is indicated by barlines: every start of the stress pattern
+is preceded by a vertical line, the \emph{bar line}.  The space
+between two bar lines is called measure.  It is therefore the unit of
+the rhythmic pattern.
+
+The time signature also indicates what kind of rhythmic pattern is
+desired.  The time signature takes the form of two numbers stacked
+vertically. The top number is the number of beats in one measure, the
+bottom number is the duration (relative to the whole note) of the note
+that takes  one beat.  Example: 2/4  time signature means ``two beats
+per measure, and a quarter note takes one beat''
+
+Chords are written by attaching multiple note heads to one stem.  When
+the composer wants to emphasize the horizontal relationships between
+notes, the simultaneous notes can be written as voices (where every
+note head has its own stem).  A small example is given in
+Figure~\ref{fig:simultaneous}.
+
+\begin{figure}[h]
+  \begin{center}
+    \begin{mudela}
+      \relative c'' {\time 2/4;  <c4 e> <d f>
+                \context Staff < \context Voice = VA{
+                  \stemdown
+                  c4 d
+                  b16 b b b b b b b }
+                \context Voice = VB {
+                  \stemup e4 f g8 g4 g8 } >
+          }
+    \end{mudela}
+    \caption{Notes sounding together.  Chord notation (left, before
+      the bar line) emphasizes vertical relations, voice notation
+      emphasizes horizontal relations. Separate voices needn't have
+      synchronous rhythms (third measure). 
+      }
+    \label{fig:simultaneous}
+  \end{center}
+\end{figure}
+
+Separate voices do not have to share one rhythmic pattern---this is
+also demonstrated in Figure~\ref{fig:simultaneous}--- they are in a sense%vaag
+independent.  A different way to express this in notation, is by
+printing each voice on a different staff.  This is customary when
+writing for piano (both left and right hand have a staff of their own)
+and for ensemble (every instrument has a staff of its own).
+
+
+
+\subsection{Music typography}
+
+Music typography is the art of placing symbols in esthetically
+pleasing configuration.  Little is explicitly known about music
+typography.  There are only a few reference works
+available\cite{ross,wanske}.  Most of the knowledge of this art has
+been transmitted verbally, and was subsequently lost.
+
+The motivation behind choices in typography is to represent the idea
+as clearly as possible. Among others, this results in the following
+guidelines:
+\begin{itemize}
+\item The printed score should use visual hints to accentuate the
+  musical content
+\item The printed score should not contain distracting elements, such
+  as large empty regions or blotted regions.
+\end{itemize}
+
+An example of the first guideline in action is the horizontal spacing.
+The amount of space following a note should reflect the duration of
+that note: short notes get a small amount of space, long notes larger
+amounts.  Such spacing constraints can be  subtle, for the
+``amount of space'' is only the impression that should be conveyed; there
+has to be some correction for optical illusions.  See
+Figure~\ref{fig:spacing}.
+
+\begin{figure}[h]
+  \begin{center}
+    \begin{mudela}
+      \relative c'' { \time 3/4; c16 c c c c8 c8 | f4 f, f'  }
+    \end{mudela}
+    \caption{Spacing conveys information about duration. Sixteenth
+      notes at the left get less space than quarter notes in the
+      middle. Spacing is ``visual'', there should be more space
+      after  the first note of the last measure, and  less after second. }
+    \label{fig:spacing}
+  \end{center}
+\end{figure}
+
+Another example of music typography is clearly visible in collisions.
+When chords or separate voices are printed, the notes that start at
+the same time should be printed aligned (ie., with the same $x$
+position).  If the pitches are close to each other, the note heads
+would collide. To prevent this, some notes (or note heads) have to be
+shifted horizontally.  An example of this is given in
+Figure~\ref{fig:collision}.
+\begin{figure}[h]
+  \begin{center}
+    [todo]
+    \caption{Collisions}
+    \label{fig:collision}
+  \end{center}
+\end{figure}
+
+\bibliographystyle{hw-plain}
+\bibliography{engraving,boeken,colorado,computer-notation,other-packages}
+
+\section{Requirements}
+
+
+\section{Approach}
+
+\subsection{Input}
+
+The input format consists of combining a symbolic representation of
+music with style sheet that describes how the symbolic presentation
+can converted to notation.  The symbolic representation is based on a
+context free language called \textsf{music}.  Music is a recursively
+defined construction in the input language.  It can be constructed by
+combining lists of \textsf{music} sequentially or parallel or from
+terminals like notes or lyrics.
+
+The grammar for \textsf{music} is listed below.  It has been edited to
+leave out the syntactic and ergonomic details.
+
+\begin{center}
+    \begin{tabular}{ll}
+Music:  & SimpleMusic\\
+        & $|$ REPEATED int Music ALTERNATIVE MusicList\\
+        & $|$ SIMULTANEOUS MusicList\\
+        & $|$ SEQUENTIAL MusicList\\
+        & $|$ CONTEXT STRING '=' STRING Music\\
+        & $|$ TIMES int int Music     \\
+        & $|$ TRANSPOSE PITCH Music \\
+SimpleMusic: & $|$ Note\\
+        & $|$ Lyric\\
+        & $|$ Rest\\
+        & $|$ Chord\\
+        & $|$ Command\\
+Command: & METERCHANGE\\
+        & $|$ CLEFCHANGE\\
+        &$|$ PROPERTY STRING '=' STRING\\
+Chord: &PitchList DURATION\\
+Rest: &REST DURATION\\
+Lyric: &STRING DURATION\\
+Note: &PITCH DURATION\\
+\end{tabular}
+\end{center}
+  
+The terminals are both purely musical concepts that have a duration,
+and take a non-zero amount of musical time, like notes and lyrics, and
+commands that behave as if they have no duration.\footnote{The
+  PROPERTY command is a generic mechanism for controlling the
+  interpretation, i.e. the musical style sheets. See [forward ref]}
+
+The nonterminal productions can
+\begin{itemize}
+\item Some productions combine multiple elements: one can specify that
+  element are to be played in sequence, simultaneously or repetitively.
+\item There are productions for transposing music, and for dilating
+  durations of music: the TIMES production can be used to encode a
+  triplet.\footnote{A triplet is a group of three notes marked by a
+    bracket, that are played 3/2 times faster.}
+\item
+  There are productions that give directions to the interpretation
+  engine (the CONTEXT production)
+\end{itemize}
+
+
+\section{Context in notation} 
+
+Music notation relies heavily on context.  Notational symbols do not
+have meaning if they are not surrounded by other context elements.  In
+this section we give some examples how the reader uses this context do
+derive meaning of a piece of notation.   We will focus on the prime
+example of context: the staff. 
+
+A staff is the grid of five horizontal lines, but it contains more components :
+\begin{itemize}
+\item A staff can have a key signature (printed at the left)
+\item A staff can have a time signature (printed at the left)
+\item A staff has bar lines
+\item A staff has a clef (printed at the left)
+\end{itemize}
+
+It is still possible to print notes without these components, but one
+cannot determine the meaning of the notes.
+\begin{mudela}
+\score{
+\notes \relative c' {  \time 2/4; g'4 c,4 a'4 f4 e c d2 }
+\paper { 
+  linewidth = -1.;
+  \translator {
+  \StaffContext
+  \remove "Time_signature_engraver";
+%  \remove "Bar_engraver";
+  \remove "Staff_symbol_engraver";
+  \remove "Clef_engraver";
+  \remove "Key_engraver";
+  }
+ }
+}
+\end{mudela}
+
+As you can see, you can still make out the general form of the melody
+and the rhythm that is to be played, but the notation is difficult to
+read and the musical information is not complete.  The stress
+pattern in the notes can't be deduced from this output.  For this, we
+need a time signature.  Adding barlines helps with finding the strong
+and weak beats.
+\begin{mudela}
+\score {
+  \notes \relative c' {  \time 2/4; g'4 c,4 a'4 f4 e c d2 }
+  \paper{
+  linewidth = -1.;
+\translator{
+  \StaffContext
+  \remove "Staff_symbol_engraver";
+  \remove "Clef_engraver";
+  \remove "Key_engraver";}
+  }
+ }
+\end{mudela}
+
+It is impossible to deduce the exact pitch of the notes.  One needs a
+clef to do so.  Staff lines help the eye in determining the vertical
+position of a note wrt. to the clef.
+\begin{mudela}
+\score {
+  \notes \relative c' {\clef alto;  \time 2/4; g'4 c,4 a'4 f4 e c d2 }
+  \paper {
+    linewidth = -1.;
+  }
+}  
+\end{mudela}
+
+Now you know the pitch of the notes: you look at the start of the line
+and see a clef, and with this clef, you can determine the notated pitches.
+You have found the em(context) in which the notation is to be
+interpreted!
+
+
+\section{Interpretation context}
+
+Context (clef, time signature etc.) determines the relationship
+between musical and its notation in notes.  Because LilyPond writes
+notation, context works the other way around for LilyPond: with
+context a piece of music can be converted to notation.
+
+A reader remembers this context while reading the notation from left
+to right.  By analogy, LilyPond constructs this context while
+constructing notes from left to right.  This is what happens in the
+``Interpretation'' phase from~\ref{fig:intro-fig}.  In LilyPond, the
+state of this context is a set of variables with their values; A staff
+context contains variables like
+
+\begin{itemize}
+\item current clef
+\item current time signature
+\item current key
+\end{itemize}
+
+These variables determine when and how clefs, time signatures, bar
+lines and accidentals are printed.
+
+
+Staff is not the only form of context in notation.  In polyphonic
+music, the stem direction shows which notes form a voice: all notes of
+the same voice have stems pointing in the same direction.  The value
+of this variable determines the appearance of the printed stems.
+
+In LilyPond ``Notation context'' is abstracted to a data structure
+that is used, constructed and modified during the interpretation
+phase.  It contains context properties, and is responsible for
+creating notational elements: the staff context creates symbols for
+clefs, time signatures and key signatures.  The Voice context creates
+stems, note heads.
+
+For the fragment of polyphonic music below,
+\begin{mudela}
+  \context Staff { c'4 < { \stemup c'4 } \context Voice = VB { \stemdown a4 } > }
+\end{mudela}
+A staff context is created.  Within this staff context (which printed
+the clef), a Voice context is created, which prints the first note.
+Then, a second Voice context is created, with stem direction set to
+``up'', and the direction for the other is set to down. Both Voice
+contexts  are  still part of the same Staff context.
+
+In the same way, multiple staff scores are created: within the score
+context, multiple staff contexts are created.  Every staff context
+creates the notation associated with a staff.  
+
+\section{Discussion}
+
+
+
+\end{document}
+
+The complexity of  music notation was tackled by adopting a modular
+design: both the formatting system (which encodes the esthetic rules of
+notation), and the interpretation system (which encodes the semantic
+rules) are highly modular.
+
+
+The difficulty in creating a format for music notation is rooted in
+the fact that music is multi dimensional: each sound has its own
+duration, pitch, loudness and articulation. Additionally, multiple
+sounds may be played simultaneously.  Because of this, there is no
+obvious way to ``flatten'' music into a context-free language.
+
+The difficulty in creating a printing engine is rooted in the fact
+that music notation complicated: it is very large graphical
+``language'' with many arbitrary esthetic and semantic conventions.
+Building a system that formats full fledged musical notation is a
+challenge in itself, regardless of whether it is part of a compiler or
+an editor.
+
+The fact that music and its notation are of a different nature,
+implies that the conversion between input notation is non-trivial.
+
+In LilyPond we solved the above problem in the following way:
+
diff --git a/Documentation/programmer/musicnotes.sty b/Documentation/programmer/musicnotes.sty
new file mode 100644 (file)
index 0000000..31d2f83
--- /dev/null
@@ -0,0 +1,43 @@
+
+\input lilyponddefs
+
+\def\fetdef#1#2{%
+  \def#1{\hbox{\char#2}}}
+
+% huh? from where
+\input feta20.sty
+
+\font\fetasixteenfont=feta16
+\font\fetaelevenfont=feta11
+\def\fetafont{\fetasixteenfont}
+
+\newdimen\ild
+\ild=4pt
+\newdimen\stemthick
+\stemthick=0.4pt
+
+\def\eighthstem{{\fetafont\vrule height 3.5ex width \stemthick depth0pt\raise
+  3.5ex\hbox{\eighthflag}}}
+\def\texteighthflag{{\fetafont\raise 0ex\hbox{\fetafont\eighthflag}}}
+\def\textdeighthflag{{\fetafont\raise 0ex\hbox{\deighthflag}}}
+
+\def\texteighthnote{{\hbox{\hbox{\fetafont\quartball}\kern
+      -0.5\stemthick\eighthstem}}}
+\def\quarterstem{{\fetafont\vrule height 3.5ex width \stemthick depth0pt}}
+\def\textquarterstem{\quarterstem}
+\def\textchord{{\hbox{\fetafont\lower.5ex\hbox to
+      0pt{\textquarterhead}\raise.5ex\hbox{\textquarterhead}\kern
+      -0.5\stemthick\eighthstem}}}
+\def\textbassclef{\hbox{\fetafont\bassclef}}
+\def\texttrebleclef{\hbox{\fetafont\trebleclef}}
+\def\textslur{\embeddedps{9.378744 -3.171539 3.923099 -3.171539 0.000000 0.000000 12.800000 0.000000 3.672177 -3.672177 9.127823 -3.672177 12.800000 0.000000 0.000000 0.000000  draw_slur}}
+
+\def\textmarcato{{\fetafont\raise 1ex\hbox{\hskip 1ex\sforzatoaccent}}}
+
+
+\def\textquarterhead{\hbox{\fetafont\raise 2.5pt\hbox{\quartball}}}
+\def\texteighthstem{\hbox{\lower 5pt\hbox{\eighthstem}}}
+\def\texthalfnote{{\hbox{\hbox{\fetafont\halfball}\kern -0.5\stemthick\quarterstem}}}
+\def\textquarternote{{\hbox{\hbox{\fetafont\quartball}\kern -0.5\stemthick\quarterstem}}}
+\def\textflat{{\fetafont\raise 1ex\hbox{\flat}}}
+\def\textsharp{{\fetafont\raise1ex\hbox{\sharp}}}
diff --git a/Documentation/programmer/regression-test.tely b/Documentation/programmer/regression-test.tely
new file mode 100644 (file)
index 0000000..fe5ee1d
--- /dev/null
@@ -0,0 +1,312 @@
+\input texinfo @c -*-texinfo-*-   vim:tw=72
+@setfilename regression-test.info
+@settitle LilyPond Regression test
+
+@c fool ls-latex
+@ignore
+@author Han-Wen Nienhuys and Jan Nieuwenhuizen
+@title LilyPond Regression test
+@end ignore
+
+@node Top, , ,
+
+@section Introduction
+
+This document tries give an brief overview of LilyPond features.  When
+the text correspond with the shown notation, we consider LilyPond
+Officially BugFree (tm).  This document is intended for finding bugs,
+and documenting bugfixes.
+
+@section Notes and rests
+
+Rests.  Note that the dot of 8th, 16th and 32nd rests rest should be
+next to the top of the rest.  All rests except the whole rest are
+centered on the middle staff line.  
+
+@mudelafile{rest.fly}
+
+Note head shapes are settable.  The stem endings should be adjusted
+per note head.  If you want different note head styles on one stem,
+you must create a special context called Thread.
+
+@mudelafile{noteheadstyle.ly}
+
+Noteheads can have dots, and ---although this is bad style in duple
+meters--- rests can too.  Augmentation dots should never be printed on
+a staff line, but rather be shifted vertically. They should go up, but
+in case of multiple parts, the down stems have down shifted dots.
+(Wanske p. 186) In case of chords, all dots should be in a column.
+The dots go along as rests are shifted to avoid collisions.
+
+@mudelafile{dots.fly}
+
+Multiple measure rests do not collide with barlines and clefs.  They
+are not expanded when you set @code{Score.SkipBars}.  Although the
+multi-measure-rest is a Spanner, minimum distances are set to keep it
+colliding from barlines. 
+
+@mudelafile{multi-measure-rest.ly}
+
+@section Stems
+
+Stem tremolos (official naming?) or rolls are tremolo signs that look
+like beam segments crossing stems.  If the stem is in a beam, the
+tremolo must be parallel to the beam.  If the stem is invisible
+(eg. on a whole note), the tremolo must be centered on the note.
+
+@mudelafile{stem-tremolo.ly}
+
+Chord tremolos look like beams, but are a kind of repeat symbol.
+To avoid confusion, chord tremolo beams do not reach the stems, but 
+leave a gap.  Chord tremolo beams on half notes are not ambiguous,
+as half notes cannot appear in a regular beam, and should reach the 
+stems.
+  
+@mudelafile{chord-tremolo.sly}
+
+Beams, stems and noteheads often have communication troubles, since
+the two systems for y dimensions (1 unit = staffspace, 1 unit = 1
+point) are mixed.
+
+Stems, beams, ties and slurs should behave similarly, when placed
+on the middle staff line. Of course stem-direction is down for high
+notes, and up for low notes.
+
+@mudelafile{stem-direction.sly}
+
+Similarly, if @code{stem_default_neutral_direction} is set to @code{-1}.
+
+@mudelafile{stem-direction-down.ly}
+
+@section Scripts
+
+The staccato dot (and all scripts with follow-into-staff set), must
+not be on staff lines.
+
+@mudelafile{staccato-pos.sly}
+
+@section Grace notes
+
+Grace notes are typeset as an encapsulated piece of music. You can
+have beams, notes, chords, stems etc. within a @code{\grace} section.
+Slurs that start within a grace section, but aren't ended are attached
+to the next normal note.  Grace notes have zero duration.  If there
+are tuplets, the grace notes won't be under the brace.  Grace notes
+can have accidentals, but they are (currently) spaced at a fixed
+distance.  Grace notes (of course) come before the accidentals of the
+main note.  Grace notes can also be positioned after the main note.
+
+@mudelafile{grace.ly}
+
+
+@section Beams, slurs and other spanners
+
+Beaming is generated automatically. Beams may cross bar lines. In that
+case, line breaks are forbidden.  Yet clef and key signatures are
+hidden just as with breakable bar lines.
+
+@mudelafile{beaming.ly}
+
+Beams should behave reasonably well, even under extreme circumstances.
+Stems may be short, but noteheads should never touch the beam.
+
+@mudelafile{beam-extreme.ly}
+
+Beams should always reach the middle staff line, the second beam
+counting from the note head side, should never be lower than the
+second staff line.  This does not hold for grace note beams.
+
+@mudelafile{beam-position.sly}
+
+Slurs should look nice and symmetric.  The curvature may increase
+only to avoid noteheads, and as little as possible.
+
+@mudelafile{slur-symmetry.ly}
+@mudelafile{slur-symmetry-1.ly}
+
+Ties are strictly horizontal.  They are placed in between note heads.
+The horizontal middle should not overlap with a staffline.
+
+@mudelafile{tie.ly}
+
+Beams can be typeset over fixed distance aligned staffs, beam
+beautification doesn't really work, but knees do. Beams should be
+behave well, wherever the switching point is.
+
+@mudelafile{beam-cross-staff.ly}
+
+The same goes for slurs. They behave decently when broken across
+linebreak.
+
+@mudelafile{slur-cross-staff.ly}
+
+Tuplets are indicated by a bracket with a number.  There should be no
+bracket if there is one beam that matches  the length of the tuplet.
+The bracket does not interfere with the stafflines, and the number is
+centered in the gap in the bracket.
+
+@mudelafile{tup.ly}
+
+@section Repeats
+
+LilyPond has three modes for repeats: folded, unfolded and
+semi-unfolded.  Unfolded repeats are fully written out. Semi unfolded
+repeats have the body written and all alternatives sequentially.
+Folded repeats have the body written and all alternatives
+simultaneously.  If the number of alternatives is larger than the
+repeat count, the excess alternatives are ignored.  If the number of
+alternatives is smaller, the first alternative is multiplied to get to
+the number of repeats.
+
+Unfolded behavior:
+
+@mudelafile{repeat-unfold.ly}
+
+Volta (Semi folded) behavior.  Voltas can start on non-barline moments.
+If they don't barlines should still be shown.
+
+@mudelafile{repeat-volta.ly}
+
+Folded.  This doesn't make sense without alternatives, but it works.
+
+@mudelafile{repeat-fold.ly}
+
+@section Lyrics
+
+Lyrics can be set to a melody automatically.  Excess lyrics will be
+dumped.  Lyrics will not be set over rests.  You can have melismata
+either by setting a property melismaBusy, or by setting
+automaticMelismas (which will set melismas during slurs and ties).  If
+you want a different order than first Music, then Lyrics, you must
+precook a chord of staffs/lyrics and label those.  Of course
+@code{\rhythm} ignores any other rhythms in the piece.  Hyphens and
+extenders do not assume anything about lyric lengths, so they continue
+to work.
+
+@mudelafile{lyric-combine.ly}
+
+@section Multiple notes
+
+Rests should not collide with beams, stems and noteheads.  Rests may
+be under beams.  Rests should be move by integral number of spaces
+inside the staff, and by half spaces outside.  Notice that the half
+and whole rests just outside the staff get ledger lines in different
+cases.
+
+@mudelafile{rest-collision.ly}
+
+Normal collisions. We have support for polyphony, where the
+middle voices are horizontally shifted.
+
+@mudelafile{collisions.ly}
+
+The number of stafflines of a staff can be set with the property
+numberOfStaffLines.  Ledger lines both on note heads and rests are
+adjusted.  Barlines also are adjusted.
+
+
+@mudelafile{number-staff-lines.fly}
+
+@section Spacing
+
+In a limited number of cases, LilyPond corrects for optical spacing
+effects.  In this example, space for opposite pointed stems is adjusted
+
+@mudelafile{stem-spacing.sly}
+
+If there are accidentals in the music, we add space, but the space
+between note and accidentals is less than between the notes with the
+same value.  Clef changes also get extra space, but not as much as
+barlines.
+
+
+Even if a line is very tightly spaced, there will still be room
+between prefatory matter and the following notes.  The space after the
+prefatory is very rigid.  In contrast, the space before the barline
+must stretch like the space within the measure.
+
+Tight:
+
+@mudelafile{spacing-tight.ly}
+
+Natural:
+
+@mudelafile{spacing-natural.ly}
+
+Loose:
+
+@mudelafile{spacing-loose.ly}
+
+Adding a @code{Bar_engraver} to the LyricsVoice context makes sure that
+lyrics don't collide with barlines.
+
+@mudelafile{lyrics-bar.ly}
+
+@section Global stuff
+
+Breaks can be encouraged and discouraged using @code{\break} and
+@code{\nobreak}.  They are abbrevs for @code{\penalty} commands.
+
+@mudelafile{break.ly}
+
+
+Markings that are attached to (invisible) barlines are 
+delicate: the are attached to the rest of the score without the score
+knowing it.  Consequently, they fall over  often.
+
+@mudelafile{bar-scripts.ly}
+
+Staff margins are also markings attached to barlines.  They should be
+left of the staff, and be centered vertically wrt the staff.  They may
+be on normal staffs, but also on compound staffs, like the PianoStaff
+
+@mudelafile{staff-margin.ly}
+
+Breathing signs, also used for phrasing, do normally not influence
+global spacing -- only if space gets tight, notes are shifted to make
+room for the breathing sign. Breathing signs break beams running
+through their voice. In the following example, the notes in the first
+two measures all have the same distance from each other:
+
+@mudelafile{breathing-sign.ly}
+
+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.    
+
+@mudelafile[nofly]{size11.ly}
+
+@mudelafile[nofly]{size13.ly}
+
+@mudelafile[nofly]{size16.ly}
+
+@mudelafile[nofly]{size20.ly}
+
+@mudelafile[nofly]{size23.ly}
+
+@mudelafile[nofly]{size26.ly}
+
+
+@section Clefs and Time Signatures
+
+The transparent clef should not occupy any space and with style
+@code{fullSizeChanges}, the changing clef should be typeset in full
+size. For octaviated clefs, the ``8'' should appear closely above or
+below the clef respectively.  The ``8'' is processed in a convoluted
+way, so this is fragile as well.
+
+@mudelafile{clefs.ly}
+
+@ignore
+@c the input file is too long and does not test for specific bugs
+By default, time signatures are written with two numbers. With style
+``C'', 4/4 and 2/2 are written with their corresponding symbols and
+with style ``old'', 2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8 and
+9/8 are typeset with symbols, all other signatures retain the default
+layout. The style ``1'', gives single number signatures for all
+signatures. 
+%
+\mu delafile{time.fly}
+@end ignore
+
+@bye
index 6bd3b069c40479b735c8f3c8b4d88ce15f8c70d8..6fecb0ea434a7825d61629b4b9933357103804ad 100644 (file)
@@ -2,11 +2,10 @@
 @setfilename programs.info
 @settitle Programs
 
 @setfilename programs.info
 @settitle Programs
 
-@node Top, , midi2ly Authors, (dir)
+@node  Top, , , (dir)
 @top
 @menu
 * Programs::                      Your Softs-
 @top
 @menu
 * Programs::                      Your Softs-
-* convert-mudela::                convert-mudela to newer versions
 * Ly2dvi::                        Python utility to convert mudela to DVI
 * midi2ly::                       convert MIDI to -mudela-
 @end menu
 * Ly2dvi::                        Python utility to convert mudela to DVI
 * midi2ly::                       convert MIDI to -mudela-
 @end menu
@@ -14,7 +13,7 @@
 
 
 
 
 
 
-@node Programs, convert-mudela, , Top
+@node  Programs, , , Top
 @chapter Programs
 
 
 @chapter Programs
 
 
@@ -23,7 +22,7 @@
 
 
 
 
 
 
-@node Ly2dvi, Ly2dvi DESCRIPTION, LilyPond Authors, Top
+@node  Ly2dvi, , , Top
 @menu
 * Ly2dvi DESCRIPTION::            Ly2dvi DESCRIPTION
 * Ly2dvi SYNOPSIS::               Ly2dvi SYNOPSIS
 @menu
 * Ly2dvi DESCRIPTION::            Ly2dvi DESCRIPTION
 * Ly2dvi SYNOPSIS::               Ly2dvi SYNOPSIS
@@ -39,7 +38,7 @@
 @end menu
 @chapter Ly2dvi
 
 @end menu
 @chapter Ly2dvi
 
-@node Ly2dvi DESCRIPTION, Ly2dvi SYNOPSIS, Ly2dvi, Ly2dvi
+@node  Ly2dvi DESCRIPTION, , , Ly2dvi
 @section DESCRIPTION
 ly2dvi is a Python script which creates input file for LaTeX,
 based on information from the output files from LilyPond.
 @section DESCRIPTION
 ly2dvi is a Python script which creates input file for LaTeX,
 based on information from the output files from LilyPond.
@@ -53,12 +52,12 @@ one or more DVI files.
 The majority of this utility came from a bourne script written by Jan
 Arne Fagertun name @file{ly2dvi}. 
 
 The majority of this utility came from a bourne script written by Jan
 Arne Fagertun name @file{ly2dvi}. 
 
-@node Ly2dvi SYNOPSIS, Ly2dvi OPTIONS, Ly2dvi DESCRIPTION, Ly2dvi
+@node  Ly2dvi SYNOPSIS, , , Ly2dvi
 @section SYNOPSIS
 
         ly2dvi [options] inputfile[.ly] [....]
 
 @section SYNOPSIS
 
         ly2dvi [options] inputfile[.ly] [....]
 
-@node Ly2dvi OPTIONS, Ly2dvi Features, Ly2dvi SYNOPSIS, Ly2dvi
+@node  Ly2dvi OPTIONS, , , Ly2dvi
 @section OPTIONS
 
 @table @samp
 @section OPTIONS
 
 @table @samp
@@ -106,7 +105,7 @@ Arne Fagertun name @file{ly2dvi}.
     DVI file for each.
 @end table
 
     DVI file for each.
 @end table
 
-@node Ly2dvi Features, Ly2dvi Environment, Ly2dvi OPTIONS, Ly2dvi
+@node  Ly2dvi Features, , , Ly2dvi
 @section Features
 
 ly2dvi responds to several parameters specified in the mudela
 @section Features
 
 ly2dvi responds to several parameters specified in the mudela
@@ -125,7 +124,7 @@ file. They are overridden by corresponding command line options.
     Specify name of papersize.
 @end table
 
     Specify name of papersize.
 @end table
 
-@node Ly2dvi Environment, Ly2dvi Files, Ly2dvi Features, Ly2dvi
+@node  Ly2dvi Environment, , , Ly2dvi
 @section Environment
 
 @table @samp
 @section Environment
 
 @table @samp
@@ -137,7 +136,7 @@ file. They are overridden by corresponding command line options.
     Temporary directory name. Default is /tmp
 @end table
 
     Temporary directory name. Default is /tmp
 @end table
 
-@node Ly2dvi Files, Ly2dvi Initialization Sequence, Ly2dvi Environment, Ly2dvi
+@node  Ly2dvi Files, , , Ly2dvi
 @section Files
 
 @file{titledefs.tex} is inspected for definitions used to extract
 @section Files
 
 @file{titledefs.tex} is inspected for definitions used to extract
@@ -239,7 +238,7 @@ present.  Possible value is a valid directory specification that is
 writable to the user.
 @end table
 
 writable to the user.
 @end table
 
-@node Ly2dvi Initialization Sequence, Ly2dvi See Also, Ly2dvi Files, Ly2dvi
+@node  Ly2dvi Initialization Sequence, , , Ly2dvi
 @section Initialization Sequence
 The initialization process reads inputs for several sources.  Below is
 a list of priorities for lowest to hightest proirity.
 @section Initialization Sequence
 The initialization process reads inputs for several sources.  Below is
 a list of priorities for lowest to hightest proirity.
@@ -257,12 +256,12 @@ a list of priorities for lowest to hightest proirity.
 Note that this differs slightly from the original bourne shell
 version. 
 
 Note that this differs slightly from the original bourne shell
 version. 
 
-@node Ly2dvi See Also, Ly2dvi Bugs, Ly2dvi Initialization Sequence, Ly2dvi
+@node  Ly2dvi See Also, , , Ly2dvi
 @section See Also
 
 lilypond(1), tex(1), latex(1)
 
 @section See Also
 
 lilypond(1), tex(1), latex(1)
 
-@node Ly2dvi Bugs, Ly2dvi Remarks, Ly2dvi See Also, Ly2dvi
+@node  Ly2dvi Bugs, , , Ly2dvi
 @section Bugs
 
 If you have found a bug, you should send a bugreport.
 @section Bugs
 
 If you have found a bug, you should send a bugreport.
@@ -276,7 +275,7 @@ If you have found a bug, you should send a bugreport.
     to this mailinglist).
 @end itemize
 
     to this mailinglist).
 @end itemize
 
-@node Ly2dvi Remarks, Ly2dvi Authors, Ly2dvi Bugs, Ly2dvi
+@node  Ly2dvi Remarks, , , Ly2dvi
 @section Remarks
 
 Many papersizes are now supported. Information on other sizes
 @section Remarks
 
 Many papersizes are now supported. Information on other sizes
@@ -289,7 +288,7 @@ a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, archA, archB, archC, archD,
 archE, b0, b1, b2, b3, b4, b5, flsa, flse, halfletter, ledger, legal,
 letter, note
 
 archE, b0, b1, b2, b3, b4, b5, flsa, flse, halfletter, ledger, legal,
 letter, note
 
-@node Ly2dvi Authors, midi2ly, Ly2dvi Remarks, Ly2dvi
+@node  Ly2dvi Authors, , , Ly2dvi
 @section Authors
 Python Version author:
 @email{daboys@@austin.rr.com, Jeffrey B. Reed},
 @section Authors
 Python Version author:
 @email{daboys@@austin.rr.com, Jeffrey B. Reed},
@@ -305,24 +304,21 @@ Original bourne shell version author:
 
 
 
 
 
 
-@node midi2ly, midi2ly DESCRIPTION, Ly2dvi Authors, Top
+@node  midi2ly, , , Top
 @menu
 * midi2ly DESCRIPTION::           midi2ly DESCRIPTION
 * midi2ly OPTIONS::               midi2ly OPTIONS
 @menu
 * midi2ly DESCRIPTION::           midi2ly DESCRIPTION
 * midi2ly OPTIONS::               midi2ly OPTIONS
-* midi2ly DISCLAIMER::            midi2ly DISCLAIMER
-* midi2ly SEE ALSO::              midi2ly SEE ALSO
-* midi2ly Authors::               midi2ly Authors
 @end menu
 @chapter midi2ly
 
 @end menu
 @chapter midi2ly
 
-@node midi2ly DESCRIPTION, midi2ly OPTIONS, midi2ly, midi2ly
+@node  midi2ly DESCRIPTION, , , midi2ly
 @section DESCRIPTION
 midi2ly translates a MIDI input file to Mudela (GNU LilyPond source
 format).  midi2ly is part of the GNU LilyPond music typesetting package.
 
        midi2ly [options] midi-file
 
 @section DESCRIPTION
 midi2ly translates a MIDI input file to Mudela (GNU LilyPond source
 format).  midi2ly is part of the GNU LilyPond music typesetting package.
 
        midi2ly [options] midi-file
 
-@node midi2ly OPTIONS, midi2ly DISCLAIMER, midi2ly DESCRIPTION, midi2ly
+@node  midi2ly OPTIONS, , , midi2ly
 @section OPTIONS
 
 @table @samp
 @section OPTIONS
 
 @table @samp
@@ -355,33 +351,4 @@ format).  midi2ly is part of the GNU LilyPond music typesetting package.
     Assume no double dotted notes.
 @end table
 
     Assume no double dotted notes.
 @end table
 
-@node midi2ly DISCLAIMER, midi2ly SEE ALSO, midi2ly OPTIONS, midi2ly
-@section DISCLAIMER
-
-midi2ly is copyright 1996, 1997 by its authors. midi2ly is distributed 
-as part of GNU LilyPond, under the terms of the GNU General Public
-License.  midi2ly is provided without any warranty what so ever.
-midi2ly may be freely distributed.  For further information consult
-the GNU General Public License, from the file @file{COPYING}.
-
-@node midi2ly SEE ALSO, midi2ly Authors, midi2ly DISCLAIMER, midi2ly
-@section SEE ALSO
-
-@table @samp
-@item @strong{lilypond}(1)
-    The GNU LilyPond music typesetter.
-@end table
-
-@node midi2ly Authors, Top, midi2ly SEE ALSO, midi2ly
-@section Authors
-
-Please consult the documentation file @file{AUTHORS} for more detailed
-information, and small contributions. 
-
-@email{janneke@@gnu.org, Jan Nieuwenhuizen}, @uref{http://www.xs4all.nl/~jantien}
-
-
-
-
-
 @bye
 @bye
index c2884623cc06774cb4e8b333abd03e811d85f33e..440404cb13267526dfd50b95bbbd622cc752d9c3 100644 (file)
@@ -61,7 +61,7 @@ NT/95/98 as well.  See Section Windows NT/95,es.
 Check out
 @uref{ftp://ftp.python.org} or @uref{ftp://ftp.cwi.nl/pub/python}.
 
 Check out
 @uref{ftp://ftp.python.org} or @uref{ftp://ftp.cwi.nl/pub/python}.
 
-@item  GUILE 1.3,  check out @uref{http://www.gnu.org/software/guile/guile.html,http://www.gnu.org/software/guile/guile.html}.
+@item  GUILE 1.3.4,  check out @uref{http://www.gnu.org/software/guile/guile.html,http://www.gnu.org/software/guile/guile.html}.
 
 @item GNU make. 
 Check out @uref{ftp://ftp.gnu.org/make/,ftp://ftp.gnu.org/make/}.
 
 @item GNU make. 
 Check out @uref{ftp://ftp.gnu.org/make/,ftp://ftp.gnu.org/make/}.
@@ -96,7 +96,7 @@ following software
 @item A PostScript printer and/or viewer (such as Ghostscript) is strongly
     recommended.  Xdvi will show all embedded PostScript too if you have
     Ghostscript installed.
 @item A PostScript printer and/or viewer (such as Ghostscript) is strongly
     recommended.  Xdvi will show all embedded PostScript too if you have
     Ghostscript installed.
-@item  GUILE 1.3, check out @uref{http://www.gnu.org/programs/guile.html,http://www.gnu.org/software/guile/}
+@item  GUILE 1.3.4, check out @uref{http://www.gnu.org/programs/guile.html,http://www.gnu.org/software/guile/}
 @end itemize
 
 For running LilyPond successfully you have to help TeX and MetaFont
 @end itemize
 
 For running LilyPond successfully you have to help TeX and MetaFont
@@ -361,10 +361,6 @@ demonstrated in @file{input/bugs/}.
 
 Known bugs that are not LilyPond's fault are documented here.
 
 
 Known bugs that are not LilyPond's fault are documented here.
 
-@unnumbered All platforms
-@itemize
-@item Guile 1.3.2 is buggy in several respects. Do not use it for LilyPond.
-@end itemize
 
 @unnumbered LinuxPPC Bugs:
 
 
 @unnumbered LinuxPPC Bugs:
 
@@ -390,12 +386,6 @@ solution are not known.
 
 Note that this only happens on some computers with the said platform.
 
 
 Note that this only happens on some computers with the said platform.
 
-@item GUILE
-A binary RPM of Guile 1.3 has been distributed from the LilyPond ftp
-site.  This binary was made in RedHat 5.x, and it will fail if this
-RPM is used with RedHat 6.x.
-
-
 @item libg++ 2.7
 
 LilyPond occasionally crashes while parsing the initialisation files.
 @item libg++ 2.7
 
 LilyPond occasionally crashes while parsing the initialisation files.
index afaf35fb75189bb665b248f7b6f18a61c29855a1..8f76f1f67347842dbc1d496dfcd9780ffd457b7e 100644 (file)
@@ -45,13 +45,13 @@ If you want to read the documentation online, these are options:
 @item use @file{.dvi},  for the tutorial and reference manual. Do
 
 @example 
 @item use @file{.dvi},  for the tutorial and reference manual. Do
 
 @example 
-  make -C Documentation/tex/ dvi 
+  make -C Documentation/user/ dvi 
 @end example 
 
   
 @item  use ASCII. Do
 using @example 
 @end example 
 
   
 @item  use ASCII. Do
 using @example 
-       make -C Documentation/
+       make -C doc
 @end example 
 
 @end itemize
 @end example 
 
 @end itemize
index 973f35c7075b35a5091ba926cedb1877fb960448..6078fa1349b5b98ab296d686416cab510a897e0b 100644 (file)
@@ -6,27 +6,29 @@
 @top
 
 
 @top
 
 
-
 @unnumbered LilyPond -- The @uref{http://www.fsf.org/gnu/gnu-history.html,GNU Project} Music Typesetter
 
 @unnumbered LilyPond -- The @uref{http://www.fsf.org/gnu/gnu-history.html,GNU Project} Music Typesetter
 
+
+@html
+<img src="Documentation/pictures/out-www/lelie-logo.png">
+@end html
+
 @c something breaks on 3.12 f
 
 @c something breaks on 3.12 f
 
-@c @center
-@quotation
-@mudela[fragment]
-       \relative c'' { \key es; r8 [c16 b] [c8 g] [as c16 b] [c8 d] | g,4 }
-@end mudela 
-@end quotation
-@c @end center
 
 
-@c include BLURB?
 
 LilyPond is a music typesetter.  It produces beautiful sheet music
 using a high level description file as input.  LilyPond is part of 
 the GNU Project.
 
 
 LilyPond is a music typesetter.  It produces beautiful sheet music
 using a high level description file as input.  LilyPond is part of 
 the GNU Project.
 
-@c include screenshot
 
 
+@c @center
+@quotation
+@mudela[fragment]
+       \relative c'' { \key es; r8 [c16 b] [c8 g] [as c16 b] [c8 d] | g,4 }
+@end mudela 
+@end quotation
+@c @end center
 
 
 @unnumberedsec Sheet music
 
 
 @unnumberedsec Sheet music
index 5c5754ea88b6235872bdecaa39b05cbe64405fcd..2a431f3a5c0a8c6d9eb00db2c5f15db14fcb0160 100644 (file)
@@ -53,7 +53,8 @@ Prerequisites
    * Python 1.5, Check out `ftp://ftp.python.org' or
      `ftp://ftp.cwi.nl/pub/python'.
 
    * Python 1.5, Check out `ftp://ftp.python.org' or
      `ftp://ftp.cwi.nl/pub/python'.
 
-   * GUILE 1.3,  check out http://www.gnu.org/software/guile/guile.html
+   * GUILE 1.3.4,  check out
+     http://www.gnu.org/software/guile/guile.html
      (http://www.gnu.org/software/guile/guile.html).
 
    * GNU make.  Check out ftp://ftp.gnu.org/make/
      (http://www.gnu.org/software/guile/guile.html).
 
    * GNU make.  Check out ftp://ftp.gnu.org/make/
@@ -93,7 +94,7 @@ following software
      strongly     recommended.  Xdvi will show all embedded PostScript
      too if you have     Ghostscript installed.
 
      strongly     recommended.  Xdvi will show all embedded PostScript
      too if you have     Ghostscript installed.
 
-   * GUILE 1.3, check out http://www.gnu.org/software/guile/
+   * GUILE 1.3.4, check out http://www.gnu.org/software/guile/
      (http://www.gnu.org/programs/guile.html)
 
    For running LilyPond successfully you have to help TeX and MetaFont
      (http://www.gnu.org/programs/guile.html)
 
    For running LilyPond successfully you have to help TeX and MetaFont
@@ -333,12 +334,6 @@ demonstrated in `input/bugs/'.
 
    Known bugs that are not LilyPond's fault are documented here.
 
 
    Known bugs that are not LilyPond's fault are documented here.
 
-All platforms
-*************
-
-   * Guile 1.3.2 is buggy in several respects. Do not use it for
-     LilyPond.
-
 LinuxPPC Bugs:
 **************
 
 LinuxPPC Bugs:
 **************
 
@@ -361,10 +356,6 @@ Linux-i386
      Note that this only happens on some computers with the said
      platform.
 
      Note that this only happens on some computers with the said
      platform.
 
-   * GUILE A binary RPM of Guile 1.3 has been distributed from the
-     LilyPond ftp site.  This binary was made in RedHat 5.x, and it
-     will fail if this RPM is used with RedHat 6.x.
-
    * libg++ 2.7
 
      LilyPond occasionally crashes while parsing the initialisation
    * libg++ 2.7
 
      LilyPond occasionally crashes while parsing the initialisation
diff --git a/NEWS b/NEWS
index 5d740e231dd079da6b41b2bb512ba87abf5cf482..b2027c3cb11282fc69f0eb30194f5180629d1139 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,10 +1,3 @@
 
 
-WHAT'S NEW SINCE 1.2.0
-
-* Much faster spacing engine. 
-
-* Features: automatic staff switching
-
-* Documentation now all is in texinfo.
-
+[todo]
 
 
index 33f5b31671a352ccb3050bc3c729bb6a16bad48c..c22267cdb82eb69a7b902d125d0e2328761de7e0 100644 (file)
@@ -45,10 +45,10 @@ Documentation
 
    * use `.dvi',  for the tutorial and reference manual. Do
 
 
    * use `.dvi',  for the tutorial and reference manual. Do
 
-            make -C Documentation/tex/ dvi
+            make -C Documentation/user/ dvi
 
    * use ASCII. Do using
 
    * use ASCII. Do using
-               make -C Documentation/
+               make -C doc
 
 
 Comments
 
 
 Comments
diff --git a/TODO b/TODO
index dc34df747547933ed9bc2013f0ab451def13cb2d..68c356c704bff1585f17c4b62c46dacc7c5aa89c 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
--*-outline-layout:(2 (-1 -1 0 :) 0);outline-stylish-prefixes:nil -*-
+i-*-outline-layout:(2 (-1 -1 0 :) 0);outline-stylish-prefixes:nil -*-
 
 * GNU LilyPond TODO
 Features you cannot find in the documentation as working, should be
 
 * GNU LilyPond TODO
 Features you cannot find in the documentation as working, should be
@@ -9,11 +9,20 @@ Most of the items are marked in the code as well
 Grep -i for TODO, FIXME and ugh/ugr/urg.  
 
 .* TODO
 Grep -i for TODO, FIXME and ugh/ugr/urg.  
 
 .* TODO
+. * make this file understandable for 3rd parties.
 . * use Rhythmic_head::position_i () for all Staff_referenced 
 . * use Rhythmic_head::position_i () for all Staff_referenced 
-. * .po -> .pot.
+. * note head on stem err msg in dutch.
 . *  why need to run -C mf twice?
 . *  why need to run -C mf twice?
+. * fix interstaff stuff
 . * junk BLURB files.
 . * setting indent to 0 with \shape fails
 . * junk BLURB files.
 . * setting indent to 0 with \shape fails
+. * here's no difference at all in output. When either is jacked up to 7.0,
+everything works and matches up; when either is set just a bit above the
+default 5.0 (5.4 is what I was hoping to use), stems miss note heads. So
+it's some sort of a numerical (truncation/roundoff) problem.
+John
+. * metre -> meter
+. * Fixed size staff heights;
 . * ly2dvi : don't repeat opus if same.
 . * breaks before mmrests are favored.
 . * hara kiri _8 clef.
 . * ly2dvi : don't repeat opus if same.
 . * breaks before mmrests are favored.
 . * hara kiri _8 clef.
@@ -21,10 +30,6 @@ Grep -i for TODO, FIXME and ugh/ugr/urg.
 . * mudela-book doco
 . * rerun profile
 . * fix or replace feta-accordion.mf
 . * mudela-book doco
 . * rerun profile
 . * fix or replace feta-accordion.mf
-. * fix configure with CFLAGS or LDFLAGS, try:
-   CFLAGS=-g LDFLAGS='-Wl,--warn-common' ./configure
-configure will use them while testing the compiler, but they don't
-appear in config.make
 . * script engraver
 . * Chords:
 .  * Bass/inversion pitch when not part of Chord
 . * script engraver
 . * Chords:
 .  * Bass/inversion pitch when not part of Chord
@@ -86,14 +91,14 @@ melismatic.
 What's old about absolute to relative conversion?  Could maybe use for
 abc2ly, midi2ly?
 
 What's old about absolute to relative conversion?  Could maybe use for
 abc2ly, midi2ly?
 
+. * Junk shared cruft (duration, moment) in lib/
+
+
 .* Cleanups needed
 . * \$ and $ identifier syntax in examples.
 . * Junk ghost positioning objects eg, Script leans on  Staffside
     leans on Staff.
 . * bracket ps code.
 .* Cleanups needed
 . * \$ and $ identifier syntax in examples.
 . * Junk ghost positioning objects eg, Script leans on  Staffside
     leans on Staff.
 . * bracket ps code.
-. * mudela-book
-.  * center option (??)
-.  * make mudela-book understand usepackage{geometry}
 . * Key_engraver, Local_key_item
 . * Think of comprehensive solution for "if (grace_b == self_grace_b_)"
 . * String[String.length] doesn't trap.
 . * Key_engraver, Local_key_item
 . * Think of comprehensive solution for "if (grace_b == self_grace_b_)"
 . * String[String.length] doesn't trap.
@@ -166,7 +171,6 @@ one of the spacing bugs mentioned in the TODO.
   be stacked vertically, avoiding collisions with the notes
   in all voices.
 
   be stacked vertically, avoiding collisions with the notes
   in all voices.
 
-. * break priority setting from SCM.
 . * Matanya's tips: 
 .  * don't  shorten stems/staffs closer to each other.
 .  * accidentals closer to note head
 . * Matanya's tips: 
 .  * don't  shorten stems/staffs closer to each other.
 .  * accidentals closer to note head
@@ -183,7 +187,6 @@ one of the spacing bugs mentioned in the TODO.
    page three, the c-sharp on the second line should be a quarter with 
    a circle, not a quarter tied to a sixteenth.  is this at all
    possible with lily?
    page three, the c-sharp on the second line should be a quarter with 
    a circle, not a quarter tied to a sixteenth.  is this at all
    possible with lily?
-. * scm-ify \property values.
 . * make dependencies () a virtual function.
 . * deprecate hangOnClef.
 . * Abstraction for engravers:
 . * make dependencies () a virtual function.
 . * deprecate hangOnClef.
 . * Abstraction for engravers:
diff --git a/VERSION b/VERSION
index a29c25c1b18112cdf9cbfb526f6f2ef851ede833..dc92e1726d9b164227c1412cfe7fbaa0529f62db 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,7 +1,7 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
-MINOR_VERSION=2
-PATCH_LEVEL=15
+MINOR_VERSION=3
+PATCH_LEVEL=0
 MY_PATCH_LEVEL=
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 MY_PATCH_LEVEL=
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
index d69f24b3b7a94de6415f702c646b530c60f4da01..f809aba7d3ea6aa3f14ad7ca852a6766e508658d 100755 (executable)
@@ -81,7 +81,7 @@ rm -f cmtfm; showln -sf $TEX_TFMDIR $BUILDDIR/cmtfm
 
 if [ -f ../.gdbinit.lilypond ];
 then
 
 if [ -f ../.gdbinit.lilypond ];
 then
-    showln -f ../.gdbinit.lilypond .
+    showln -f ../.gdbinit.lilypond .gdbinit
 fi
 
 if [ -f ../.dstreamrc ]
 fi
 
 if [ -f ../.dstreamrc ]
index ba46d69ed6851890f0601eaa9e80011e16fd283b..e51f97a39e1ef5ea2f802d57f7f17c91f0f77e57 100644 (file)
@@ -9,7 +9,7 @@
 #include <fstream.h>
 #include "dictionary-iter.hh"
 #include "dstream.hh"
 #include <fstream.h>
 #include "dictionary-iter.hh"
 #include "dstream.hh"
-#include "scalar.hh"
+
 #include "text-db.hh"
 #include "string-convert.hh"
 #include "rational.hh"
 #include "text-db.hh"
 #include "string-convert.hh"
 #include "rational.hh"
@@ -86,7 +86,7 @@ Dstream::operator<<(void const *v_l)
 }
 
 Dstream &
 }
 
 Dstream &
-Dstream::operator <<(Scalar s)
+Dstream::operator <<(String s)
 {
   output (s);
   return *this;
 {
   output (s);
   return *this;
@@ -99,6 +99,32 @@ Dstream::operator <<(const char * s)
   return *this;
 }
 
   return *this;
 }
 
+Dstream &
+Dstream::operator <<(char c)
+{
+  output (to_str (c));
+  return *this;
+}
+
+Dstream&
+Dstream::operator << (Real r)
+{
+  output (to_str  (r));
+  return *this;
+}
+Dstream &
+Dstream::operator <<(Rational c)
+{
+  output (c.str ());
+  return *this;
+}
+Dstream &
+Dstream::operator <<(int i)
+{
+  output (to_str(i));
+  return *this;
+}
+  
 void
 Dstream::output (String s)
 {
 void
 Dstream::output (String s)
 {
@@ -158,7 +184,7 @@ Dstream::Dstream (ostream *r, char const * cfg_nm)
        r.message (_ ("not enough fields in Dstream init"));
        continue;
       }
        r.message (_ ("not enough fields in Dstream init"));
        continue;
       }
-    (*silent_dict_p_)[r[0]] = (bool)(int)(Scalar (r[1]));
+    (*silent_dict_p_)[r[0]] = r[1] == "1";
   }
 
   if ((*silent_dict_p_).elem_b ("Dstream_default_silence"))
   }
 
   if ((*silent_dict_p_).elem_b ("Dstream_default_silence"))
index 93b9956a250ca6d70a8508384b27d42a0794705f..c207e21e38a65aece7627ad5cf71838b5192af7a 100644 (file)
@@ -10,7 +10,7 @@
 #define DSTREAM_HH
 
 #include "string.hh"
 #define DSTREAM_HH
 
 #include "string.hh"
-#include "scalar.hh"
+
 
 const char eol= '\n';
 
 
 const char eol= '\n';
 
@@ -51,12 +51,12 @@ public:
   virtual ~Dstream();
   Dstream &identify_as (String s);
 
   virtual ~Dstream();
   Dstream &identify_as (String s);
 
-  /** 
-    Output a Scalar via the Dstream.  This is the only output
-    interface.  It explicitely delegates all implicit conversion 
-    to Scalar class.  
-    */
-  Dstream &operator << (Scalar);
+
+  Dstream &operator << (String);
+  Dstream &operator << (Real);
+  Dstream &operator << (int);  
+  Dstream &operator << (Rational);
+  Dstream &operator << (char);  
   /**
      Output memory locations.
   */
   /**
      Output memory locations.
   */
index 7ea4e0aaf21ff78cf105c284552c3a3906f8154e..b1187ec6924770f10b2c813609f42394782fa521 100644 (file)
 #ifndef RATIONAL_HH
 #define RATIONAL_HH
 
 #ifndef RATIONAL_HH
 #define RATIONAL_HH
 
-#if PARANOIA
-#ifndef Rational
-#define Rational MyRational
-#endif
-#endif
 
 #include "compare.hh"
 #include "arithmetic-operator.hh"
 #include "fproto.hh"
 
 #include "compare.hh"
 #include "arithmetic-operator.hh"
 #include "fproto.hh"
+#include "string.hh"
 
 /**
    Rational numbers.  Included is support for + and - infinity.
 
 /**
    Rational numbers.  Included is support for + and - infinity.
index ec98982cdfca77fa38fceaa8eecb0122b252fc7d..630d3dd692e283c401d45b04f9b7b4e41a4ef4c0 100644 (file)
@@ -25,7 +25,7 @@ template<class T> inline T abs (T x)
 template<class T> inline int sign (T x)
 {
   if (x)
 template<class T> inline int sign (T x)
 {
   if (x)
-    return x > 0 ? 1 : -1;
+    return x > T(0) ? 1 : -1;
   return 0;
 }
 
   return 0;
 }
 
index b389277bc3bafcae8a49d056b51d1758e54e8a9e..1960e53d5614776bdddc2a66d5142bf8391c6c13 100644 (file)
 #include "string.hh"
 #include "real.hh"
 
 #include "string.hh"
 #include "real.hh"
 
+#error
 /// Perl -like scalar type.
 /// Perl -like scalar type.
-struct Scalar : public String 
+struct Scalar 
 {
 {
-  Scalar (Real r) { *this = to_str (r); }
-  Scalar (int i) { *this = to_str (i); }
-  Scalar (long l) { *this = to_str (l); }
-  Scalar (char c) { *this = to_str (c); }
-  Scalar (char const *c) : String (c) {}    
-  Scalar (String s) : String (s) {}
+  Protected_scm scm_;
+public:
+  Scalar (Real r);
+  Scalar (int i);
+  Scalar (long l);
+  Scalar (char c);
+  Scalar (char const *c);
+  Scalar (String s);
   Scalar (Rational);
   operator Rational();
   Scalar (Rational);
   operator Rational();
-  Scalar() {}
+  Scalar();
   bool isnum_b() const;
   bool isdir_b() const;
   bool isint_b() const;
   bool isnum_b() const;
   bool isdir_b() const;
   bool isint_b() const;
index 24b975949a48e54b950f55cd485238807608a7db..b0bf9f8952980b466fec339dbc05a4a06162cdaf 100644 (file)
@@ -90,16 +90,7 @@ public:
   void operator += (String s);
 
   bool empty_b  () const;
   void operator += (String s);
 
   bool empty_b  () const;
-#if 0
-  /** is the string empty?
 
 
-    Ugh-ugh-thank-you-cygnus.  W32 barfs on this
-   */
-  operator bool  () const;
-  {
-    return length_i  (); 
-  }
-#endif
   void append (String);
   void prepend (String);
 
   void append (String);
   void prepend (String);
 
index 476b6485bdd3727609f224bbeb1b64e3dc1a43bd..48d4889a4eaed7f1a49fd917ebf604c121b10bb8 100644 (file)
@@ -1,3 +1,4 @@
+#if 0
 /*
   scalar.cc -- implement Scalar
 
 /*
   scalar.cc -- implement Scalar
 
@@ -8,7 +9,7 @@
 
 #include <assert.h>
 #include <stdio.h>
 
 #include <assert.h>
 #include <stdio.h>
-#include "scalar.hh"
+
 #include "rational.hh"
 
 Scalar::Scalar (Rational r)
 #include "rational.hh"
 
 Scalar::Scalar (Rational r)
@@ -105,3 +106,4 @@ Scalar::to_bool () const
 }
 
 
 }
 
 
+#endif
index 3f9deec1813d8294da45f8fee1686a19509fc9ea..ed568286ed66cc96e064eb2df5ccb40adcad0645 100644 (file)
@@ -204,24 +204,24 @@ breakmusic = \notes {
     \translator {
     \VoiceContext
     \name "VoiceOne";
     \translator {
     \VoiceContext
     \name "VoiceOne";
-    verticalDirection = "1";
+    verticalDirection = #1
     }
     \translator {
     \VoiceContext
     \name "VoiceTwo";
     }
     \translator {
     \VoiceContext
     \name "VoiceTwo";
-    verticalDirection = "-1";
+    verticalDirection = #1
     }
     \translator {
     \VoiceContext
     \name "VoiceThree";
     }
     \translator {
     \VoiceContext
     \name "VoiceThree";
-    verticalDirection = "1";
-    horizontalNoteShift = "1";
+    verticalDirection = #1
+    horizontalNoteShift = #1
     }
     \translator {
     \VoiceContext
     \name "VoiceFour";
     }
     \translator {
     \VoiceContext
     \name "VoiceFour";
-    verticalDirection = "-1";
-    horizontalNoteShift = "1";
+    verticalDirection = #-1
+    horizontalNoteShift = #1
     }
    \translator { 
      \StaffContext 
     }
    \translator { 
      \StaffContext 
index d16dadc5e60cac95ba3a96c9a71617f9b5a8d513..0cc8c8b8a6a138ac2479e4d037dddf743872ca90 100644 (file)
@@ -4,6 +4,8 @@ http://www.Arkkra.com/doc/star.html
 http://www.Arkkra.com/doc/star.ps
 %}
 
 http://www.Arkkra.com/doc/star.ps
 %}
 
+
+
 \header{
        title="The Star Spangled Banner";
        subtitle="The United States National Anthem";
 \header{
        title="The Star Spangled Banner";
        subtitle="The United States National Anthem";
@@ -101,7 +103,7 @@ textxx = \lyrics {
     { 
       stripes and bright stars, through the per- il- ous fight,
       O'er the ram- parts we watched, were so gal- lant- ly
     { 
       stripes and bright stars, through the per- il- ous fight,
       O'er the ram- parts we watched, were so gal- lant- ly
-       _ _ _ _ % UGH UGH UGH 
+       " " " " " "  " "% _ _ _ _ % UGH UGH UGH 
        stream- ing
   And the rock- ets' red glare, the bombs
   burst- ing in air, gave proof through the night that
        stream- ing
   And the rock- ets' red glare, the bombs
   burst- ing in air, gave proof through the night that
@@ -120,25 +122,25 @@ automaticLyrics = \notes \context GrandStaff <
                \context Staff=staffA <
                        \beginmatter
                        \clef treble;
                \context Staff=staffA <
                        \beginmatter
                        \clef treble;
-                       \property Staff.automaticMelismata = "1"
-                       \notes \transpose c'' {\voiceone \$staff1_voice_1 \bar "|.";} 
-                       \notes \transpose c'' {\voicetwo \$staff1_voice_2 } 
+                       \property Staff.automaticMelismata = ##t
+                       \context Voice = one \transpose c'' {\stemup \$staff1_voice_1 \bar "|.";} 
+                       \context Voice = two \transpose c'' {\stemdown \$staff1_voice_2 } 
                >
                \context LyricVoice \textxx
                \context Staff=staffB <
                        \beginmatter
                        \clef bass;
                >
                \context LyricVoice \textxx
                \context Staff=staffB <
                        \beginmatter
                        \clef bass;
-               \property Staff.noVoltaBraces = "1"
-                       {\voiceone \$staff2_voice_1 \bar "|."; } 
-                       {\voicetwo \$staff2_voice_2 } 
+               \property Staff.noVoltaBraces = ##t
+                       \context Voice = three {\stemup \$staff2_voice_1 \bar "|."; } 
+                       \context Voice = four {\stemdown \$staff2_voice_2 } 
                >
        >
 
 handLyrics = \notes \context GrandStaff < 
                \context Staff=staffA <
                        \beginmatter
                >
        >
 
 handLyrics = \notes \context GrandStaff < 
                \context Staff=staffA <
                        \beginmatter
-                       \notes \transpose c'' {\voiceone \$staff1_voice_1 \bar "|.";} 
-                       \notes \transpose c'' {\voicetwo \$staff1_voice_2 } 
+                        \transpose c'' {\voiceone \$staff1_voice_1 \bar "|.";} 
+                        \transpose c'' {\voicetwo \$staff1_voice_2 } 
                >
                \nonRepeatText
                \context Staff=staffB <
                >
                \nonRepeatText
                \context Staff=staffB <
diff --git a/input/test/beam-cross-staff.ly b/input/test/beam-cross-staff.ly
new file mode 100644 (file)
index 0000000..376b25c
--- /dev/null
@@ -0,0 +1,33 @@
+\score{
+       \context PianoStaff <
+       \context Staff=one \notes\relative c'{
+               \stemup [c8 c \translator Staff=two \stemup c c]
+               [c c c c]
+               \translator Staff=one
+               \stemdown [c8 c \translator Staff=two \stemup c c]
+               r2
+               \stemdown [c8 c \translator Staff=one \stemdown c c]
+               r2
+               \translator Staff=two
+               \stemup [c8 c \translator Staff=one \stemdown c c]
+               r2
+       }
+       \context Staff=two \notes\relative c'{
+               \clef bass;
+               s1
+               s1
+               s1
+               s1
+       }
+       >
+       \paper{
+               \translator{
+                       \PianoStaffContext
+                       minVerticalAlign = 3.0*\staffheight;
+                       maxVerticalAlign = 3.0*\staffheight;
+               }
+%              linewidth=-1.;
+       }
+}
+
+\version "1.2.0"; 
diff --git a/input/test/beam-interstaff.ly b/input/test/beam-interstaff.ly
deleted file mode 100644 (file)
index 376b25c..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-\score{
-       \context PianoStaff <
-       \context Staff=one \notes\relative c'{
-               \stemup [c8 c \translator Staff=two \stemup c c]
-               [c c c c]
-               \translator Staff=one
-               \stemdown [c8 c \translator Staff=two \stemup c c]
-               r2
-               \stemdown [c8 c \translator Staff=one \stemdown c c]
-               r2
-               \translator Staff=two
-               \stemup [c8 c \translator Staff=one \stemdown c c]
-               r2
-       }
-       \context Staff=two \notes\relative c'{
-               \clef bass;
-               s1
-               s1
-               s1
-               s1
-       }
-       >
-       \paper{
-               \translator{
-                       \PianoStaffContext
-                       minVerticalAlign = 3.0*\staffheight;
-                       maxVerticalAlign = 3.0*\staffheight;
-               }
-%              linewidth=-1.;
-       }
-}
-
-\version "1.2.0"; 
diff --git a/input/test/embedded-scm.ly b/input/test/embedded-scm.ly
new file mode 100644 (file)
index 0000000..d530c85
--- /dev/null
@@ -0,0 +1,4 @@
+#(begin (newline)(display "hello world")(newline))\score{
+       \notes\relative c'{ c }
+}
+
diff --git a/input/test/no-stem-extend.fly b/input/test/no-stem-extend.fly
new file mode 100644 (file)
index 0000000..35ef31e
--- /dev/null
@@ -0,0 +1,13 @@
+% test noStemExtend
+\context Staff <
+       \context Voice = "a" { 
+               f2 f8 g a b 
+               \property Voice.noStemExtend = 1
+               f2 f8 g a b
+       }
+       \context Voice = "b" { 
+               c''2 c8 b a g
+               \property Voice.noStemExtend = 1
+               c2 c8 b a g
+       }
+>
diff --git a/input/test/slur-cross-staff.ly b/input/test/slur-cross-staff.ly
new file mode 100644 (file)
index 0000000..e53a579
--- /dev/null
@@ -0,0 +1,39 @@
+\score{
+       \context PianoStaff <
+       \context Staff=one \notes\relative c'{
+               \stemup c4( c \translator Staff=two c )c |
+               \translator Staff=one
+               \stemup c4( c \translator Staff=two c )c |
+               \stemup c4( c \translator Staff=one c )c |
+               \translator Staff=two
+               \stemup c4( c \translator Staff=one c )c |
+               \translator Staff=two
+               \stemup c4( \translator Staff=one c c )c |
+               r2
+               \translator Staff=two
+               \stemup c4( \translator Staff=one c
+                  \break
+               c )c
+               r2
+%              \stemdown c4( \translator Staff=two c c \translator Staff=one )c
+               \stemdown d4( \translator Staff=two c c \translator Staff=one )d
+               \translator Staff=two
+               \stemup c4( \translator Staff=one c c \translator Staff=two )c
+               r1
+       }
+       \context Staff=two \notes\relative c'{
+               \clef bass;
+               s1 s1 s1 s1 s1 s1 s1 s1 s1 s1
+       }
+       >
+       \paper{
+               \translator{
+                       \PianoStaffContext
+                       minVerticalAlign = 3.0*\staffheight;
+                       maxVerticalAlign = 3.0*\staffheight;
+               }
+               %linewidth=100.\mm;
+       }
+}
+
+\version "1.2.0"; 
diff --git a/input/test/slur-interstaff.ly b/input/test/slur-interstaff.ly
deleted file mode 100644 (file)
index e53a579..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-\score{
-       \context PianoStaff <
-       \context Staff=one \notes\relative c'{
-               \stemup c4( c \translator Staff=two c )c |
-               \translator Staff=one
-               \stemup c4( c \translator Staff=two c )c |
-               \stemup c4( c \translator Staff=one c )c |
-               \translator Staff=two
-               \stemup c4( c \translator Staff=one c )c |
-               \translator Staff=two
-               \stemup c4( \translator Staff=one c c )c |
-               r2
-               \translator Staff=two
-               \stemup c4( \translator Staff=one c
-                  \break
-               c )c
-               r2
-%              \stemdown c4( \translator Staff=two c c \translator Staff=one )c
-               \stemdown d4( \translator Staff=two c c \translator Staff=one )d
-               \translator Staff=two
-               \stemup c4( \translator Staff=one c c \translator Staff=two )c
-               r1
-       }
-       \context Staff=two \notes\relative c'{
-               \clef bass;
-               s1 s1 s1 s1 s1 s1 s1 s1 s1 s1
-       }
-       >
-       \paper{
-               \translator{
-                       \PianoStaffContext
-                       minVerticalAlign = 3.0*\staffheight;
-                       maxVerticalAlign = 3.0*\staffheight;
-               }
-               %linewidth=100.\mm;
-       }
-}
-
-\version "1.2.0"; 
diff --git a/input/test/uniform-breaking.ly b/input/test/uniform-breaking.ly
new file mode 100644 (file)
index 0000000..b07a7b2
--- /dev/null
@@ -0,0 +1,112 @@
+%{
+Hmm, ik vraag me af of dit al helemaal koel is.
+
+  return abs (this_one.force_f_) + abs (prev.force_f_ - this_one.force_f_)
+      + break_penalties;
+
+Neem als voorbeeld iets dat lijkt op allemande: keuze tussen 2 of drie
+maten per regel.
+
+* 2 lange maten -> lelie kiest 2 /regel  :beetje los
+* 3 korte -> lelie kiest 3 /regel        :beetje krap
+* 2 korte, 1 lange -> 3/regel            :krap
+* 1 korte, 2 lange -> 3/regel            :erg krap
+* 3 lange -> 3/regel                     :urg krap
+
+als je naar beloningen kijkt, kan ik me goed voorstellen dat sprong
+van 'al wat krapper' naar los te groot wordt, en ze dus steeds krapper
+wordt, tot urg krap aan toe, want kracht lineair?  Dat lijkt ook geval
+in allemande.
+
+Zie hoe eerst 10 en 9 mooi op 2maat/regel staan terwijl later tot 14
+toe 3/regel.
+
+Heb niet zomaar beter idee, nog.
+%}
+
+\score{
+       \notes\relative c'{
+               % 10
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+               c8 c c c c8 ces c ces
+
+               % 9
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+               c8 c c c c8 c ces c
+
+               % 1
+               c4 c c c
+               c4 c c c
+               c4 c c c
+
+               % 2
+               c4 c c c
+               c4 c c c
+               c4 c c8 c c c
+
+               % 3
+               c4 c c c
+               c4 c c c
+               c8 c c c c8 c c c 
+
+               % 4
+               c4 c c c
+               c4 c c8 c c c
+               c8 c c c c8 c c c 
+
+               % 5
+               c4 c c c
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+
+               % 6
+               c4 c c8 c c c
+               % c4 c c c8 c
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+
+               % 7
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+
+               % 8
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c ces
+
+               % 9
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+               c8 c c c c8 c ces c
+
+               % 10
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+               c8 c c c c8 ces c ces
+
+               % 11
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+               c8 c c c ces8 c ces c
+
+               % 12
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+               c8 c c ces c8 ces c ces
+
+               % 13
+               c8 c c c c8 c c c 
+               c8 c c c c8 c c c 
+               c8 c ces c ces8 c ces c
+
+       }
+       \paper {
+               indent=0.0\mm;
+               linewidth=90.0\mm;
+       }
+}
+
+
index bc8d67cbe32ae31dbaee9bf40d5f7e4a2253a5fa..847368ebebff5c04d390199339c93cfb634aadd8 100644 (file)
@@ -48,9 +48,6 @@ accompany = \notes \relative c {
        d b | c a | f g | c,2 
 }
 
        d b | c a | f g | c,2 
 }
 
-global = \notes {
-       \time 2/4;
-}
 
 tekst = \lyrics{ 
        Al -- tijd is Kort -- jak -- je ziek, " "
 
 tekst = \lyrics{ 
        Al -- tijd is Kort -- jak -- je ziek, " "
@@ -120,14 +117,16 @@ textiii = \lyrics{
                \context Staff=i s1
                \context Lyrics=top s1
                \context GrandStaff <
                \context Staff=i s1
                \context Lyrics=top s1
                \context GrandStaff <
-                       \context Staff=ii \repeat semi 2 < \global\melody >
-                       \context Staff=iii \repeat semi 2 < \global\accompany >
+                       \context Staff=ii \repeat volta 2 <
+                         \time 2/4;
+                         \melody >
+                       \context Staff=iii \repeat volta 2 <
+                         \accompany >
                >
                \context Lyrics=bottom s1
                % ugh, \repeat in \addlyrics dumps core
                \addlyrics
                >
                \context Lyrics=bottom s1
                % ugh, \repeat in \addlyrics dumps core
                \addlyrics
-                       % \context Staff = i \repeat semi 2 <\global\melody>
-                       \context Staff = i <\global\melody>
+                       \context Staff = i < \melody>
                        < 
                                %\repeat fold 2 {} 
                                %\alternative { 
                        < 
                                %\repeat fold 2 {} 
                                %\alternative { 
index 5f3be55dd8e0049718198d8f1009ddc2b91b55fb..ac46fd7a608e18a5d4cc185a1712e6b2bfdc1406 100644 (file)
@@ -44,7 +44,7 @@ Duration_convert::dur2ticks_i (Duration dur)
 {
   if (dur.ticks_i_)
     return dur.ticks_i_;
 {
   if (dur.ticks_i_)
     return dur.ticks_i_;
-  return dur2_mom (dur) * Moment (Duration::division_1_i_s);
+  return dur2_mom (dur) * Rational (Duration::division_1_i_s);
 }
 
 int
 }
 
 int
@@ -67,22 +67,22 @@ Duration_convert::type2_i (int type)
     return 1 << type;
 }
 
     return 1 << type;
 }
 
-Moment
+Rational
 Duration_convert::dur2_mom (Duration dur)
 {
   if (dur.ticks_i_)
 Duration_convert::dur2_mom (Duration dur)
 {
   if (dur.ticks_i_)
-    return Moment (dur.ticks_i_, Duration::division_1_i_s);    
+    return Rational (dur.ticks_i_, Duration::division_1_i_s);  
 
   // or simply assert?
   if (dur.durlog_i_<-10)
 
   // or simply assert?
   if (dur.durlog_i_<-10)
-    return Moment (0);
-  Moment mom;
+    return Rational (0);
+  Rational mom;
   if (dur.durlog_i_<0)
   if (dur.durlog_i_<0)
-    mom = Moment (type2_i (-dur.durlog_i_), 1);
+    mom = Rational (type2_i (-dur.durlog_i_), 1);
   else
   else
-    mom = Moment (1 , type2_i (dur.durlog_i_));
+    mom = Rational (1 , type2_i (dur.durlog_i_));
 
 
-  Moment delta = mom;
+  Rational delta = mom;
   while (dur.dots_i_--) 
     {
       delta /= 2.0;
   while (dur.dots_i_--) 
     {
       delta /= 2.0;
@@ -93,7 +93,7 @@ Duration_convert::dur2_mom (Duration dur)
 }
 
 Duration
 }
 
 Duration
-Duration_convert::mom2_dur (Moment mom)
+Duration_convert::mom2_dur (Rational mom)
 {
   if (!mom) 
     {
 {
   if (!mom) 
     {
@@ -111,8 +111,8 @@ Duration_convert::mom2_dur (Moment mom)
 
   //   dur.set_plet (type_mom, Duration::division_1_i_s / 4); 
 
 
   //   dur.set_plet (type_mom, Duration::division_1_i_s / 4); 
 
-  //   Moment as_plet_mom = mom / dur.mom ();
-  Moment as_plet_mom = mom / dur.length_mom ();
+  //   Rational as_plet_mom = mom / dur.mom ();
+  Rational as_plet_mom = mom / dur.length_mom ();
   as_plet_mom *= dur.plet_.mom ();
   long num = as_plet_mom.num ();
   long den = as_plet_mom.den ();
   as_plet_mom *= dur.plet_.mom ();
   long num = as_plet_mom.num ();
   long den = as_plet_mom.den ();
@@ -121,7 +121,7 @@ Duration_convert::mom2_dur (Moment mom)
 }
 
 Duration
 }
 
 Duration
-Duration_convert::mom2standardised_dur (Moment mom)
+Duration_convert::mom2standardised_dur (Rational mom)
 {
   //   if (!dur_array_s.length_i ())
   if (!dur_array_s.size ())
 {
   //   if (!dur_array_s.length_i ())
   if (!dur_array_s.size ())
@@ -129,12 +129,12 @@ Duration_convert::mom2standardised_dur (Moment mom)
   assert (dur_array_s.size ());
   for (int i = 0; i < dur_array_s.size () - 1; i++) 
     {
   assert (dur_array_s.size ());
   for (int i = 0; i < dur_array_s.size () - 1; i++) 
     {
-      Moment lower_mom = dur2_mom (dur_array_s[ i ]);
+      Rational lower_mom = dur2_mom (dur_array_s[ i ]);
       if (mom <= lower_mom) 
        {
          // all arbitrary, but 3/4 will get rid of the noise...
          // kinda ok
       if (mom <= lower_mom) 
        {
          // all arbitrary, but 3/4 will get rid of the noise...
          // kinda ok
-         if (i || (mom / lower_mom > Moment (3, 4)))
+         if (i || (mom / lower_mom > Rational (3, 4)))
            return dur_array_s[ i ];
          else 
            {
            return dur_array_s[ i ];
          else 
            {
@@ -143,7 +143,7 @@ Duration_convert::mom2standardised_dur (Moment mom)
              return d;
            }
        }
              return d;
            }
        }
-      Moment upper_mom = dur2_mom (dur_array_s[ i + 1 ]);
+      Rational upper_mom = dur2_mom (dur_array_s[ i + 1 ]);
       if ((mom < upper_mom)
          && ((mom - lower_mom) / lower_mom
              < (upper_mom - mom) / upper_mom))
       if ((mom < upper_mom)
          && ((mom - lower_mom) / lower_mom
              < (upper_mom - mom) / upper_mom))
@@ -164,14 +164,14 @@ Duration_convert::set_array ()
 }
 
 
 }
 
 
-Moment
+Rational
 Duration_convert::plet_factor_mom (Duration dur)
 {
   return dur.plet_.mom ();
 }
 
 Real
 Duration_convert::plet_factor_mom (Duration dur)
 {
   return dur.plet_.mom ();
 }
 
 Real
-Duration_convert::sync_f (Duration dur, Moment mom)
+Duration_convert::sync_f (Duration dur, Rational mom)
 {
   return mom / dur2_mom (dur);
 }
 {
   return mom / dur2_mom (dur);
 }
@@ -179,7 +179,7 @@ Duration_convert::sync_f (Duration dur, Moment mom)
 Duration
 Duration_convert::ticks2_dur (int ticks_i)
 {
 Duration
 Duration_convert::ticks2_dur (int ticks_i)
 {
-  Moment mom (ticks_i, Duration::division_1_i_s);
+  Rational mom (ticks_i, Duration::division_1_i_s);
   if (midi_as_plet_b_s)
     return mom2_dur (mom);
 
   if (midi_as_plet_b_s)
     return mom2_dur (mom);
 
@@ -194,7 +194,7 @@ Duration_convert::ticks2_dur (int ticks_i)
 Duration
 Duration_convert::ticks2standardised_dur (int ticks_i)
 {
 Duration
 Duration_convert::ticks2standardised_dur (int ticks_i)
 {
-  Moment mom (ticks_i, Duration::division_1_i_s);
+  Rational mom (ticks_i, Duration::division_1_i_s);
   Duration dur = mom2standardised_dur (mom);
   return dur;
 }
   Duration dur = mom2standardised_dur (mom);
   return dur;
 }
index 9472c0217d512044927fc81587f43a78768e85b3..abb467d1c1fad5dea73d44e73117c570ee2f28a1 100644 (file)
@@ -114,5 +114,5 @@ Duration_iterator::forward_dur ()
 bool
 Duration_iterator::ok ()
 {
 bool
 Duration_iterator::ok ()
 {
-  return cursor_dur_.length_mom () <= Moment (4);
+  return cursor_dur_.length_mom () <= Rational (4);
 }
 }
index bd9435fd829167c269d192a2d7f7386c974e3d43..b2a5f84643dd36cdec33b1b4675dc40cf597afd6 100644 (file)
@@ -16,7 +16,7 @@
 #include "string.hh"
 #include "source-file.hh"
 #include "source.hh"
 #include "string.hh"
 #include "source-file.hh"
 #include "source.hh"
-#include "moment.hh"
+#include "rational.hh"
 #include "duration.hh"
 #include "duration-convert.hh"
 #include "duration-iter.hh"
 #include "duration.hh"
 #include "duration-convert.hh"
 #include "duration-iter.hh"
@@ -42,13 +42,13 @@ Duration::duration_type_b (int t)
 }
 
 void
 }
 
 void
-Duration::compress (Moment m)
+Duration::compress (Rational m)
 {
   plet_.iso_i_ *= m.num_i ();
   plet_.type_i_ *= m.den_i (); 
 }
 
 {
   plet_.iso_i_ *= m.num_i ();
   plet_.type_i_ *= m.den_i (); 
 }
 
-Moment
+Rational
 Duration::length_mom () const
 {
   return Duration_convert::dur2_mom (*this);
 Duration::length_mom () const
 {
   return Duration_convert::dur2_mom (*this);
index 11ee123ee06b52ae88ea8312d5bea4b99d33f3f7..980c62a6f5e8ffd05bfe810b32529c8c56f9388c 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
-         duration-convert.hh -- declare 
+  duration-convert.hh -- declare Duration_convert
 
   source file of the LilyPond music typesetter
 
 
   source file of the LilyPond music typesetter
 
@@ -11,7 +11,6 @@
 #define DURATION_CONVERT_HH
 #include "duration.hh"
 #include "string.hh"
 #define DURATION_CONVERT_HH
 #include "duration.hh"
 #include "string.hh"
-//#include "array.hh"
 #include "array.hh"
 
 /**
 #include "array.hh"
 
 /**
        That is including (integer + division) representation for MIDI,
        and conversion from unexact time representation (best guess :-).
 
        That is including (integer + division) representation for MIDI,
        and conversion from unexact time representation (best guess :-).
 
-       A Moment (mom) is a Rational that holds the time fraction 
+       A Rational (mom) is a Rational that holds the time fraction 
        compared to a whole note (before also called wholes).
 
        compared to a whole note (before also called wholes).
 
-       SUGGESTION: currently a moment in time is called moment too;
-       let-s typedef Rational When too, so that we get 
-       When Staff_column::when (), Moment Voice_element::mom ().
-
        [todo]
        move all statics to real members, instantiate Duration_convert
        object (s).
        [todo]
        move all statics to real members, instantiate Duration_convert
        object (s).
@@ -51,27 +46,27 @@ struct Duration_convert {
   /// Return 0 if longer than whole note.
   static int type2_i (int type);
 
   /// Return 0 if longer than whole note.
   static int type2_i (int type);
 
-  /// Return Moment representation (fraction of whole note).
-  static Moment dur2_mom (Duration dur );
+  /// Return Rational representation (fraction of whole note).
+  static Rational dur2_mom (Duration dur );
 
   /// Return Mudela string representation.
   static String dur2_str (Duration dur );
 
 
   /// Return Mudela string representation.
   static String dur2_str (Duration dur );
 
-  /// Return duration from Moment (fraction of whole) representation.
-  static Duration mom2_dur (Moment mom );
+  /// Return duration from Rational (fraction of whole) representation.
+  static Duration mom2_dur (Rational mom );
 
   /// Return standardised duration, best guess if not exact.
 
   /// Return standardised duration, best guess if not exact.
-  static Duration mom2standardised_dur (Moment mom );
+  static Duration mom2standardised_dur (Rational mom );
   
   
-  /// Return plet factor (not a Moment: should use Rational?).
-  static Moment plet_factor_mom (Duration dur );
+  /// Return plet factor (not a Rational: should use Rational?).
+  static Rational plet_factor_mom (Duration dur );
 
   static void set_array ();
 
   /** Return synchronisation factor for mom, so that
       mom2_dur (mom / sync_f ) will return the duration dur.           
   */ 
 
   static void set_array ();
 
   /** Return synchronisation factor for mom, so that
       mom2_dur (mom / sync_f ) will return the duration dur.           
   */ 
-  static Real sync_f (Duration dur, Moment mom );
+  static Real sync_f (Duration dur, Rational mom );
 
   /// Return exact duration, in midi-ticks if not-exact.
   static Duration ticks2_dur (int ticks_i );
 
   /// Return exact duration, in midi-ticks if not-exact.
   static Duration ticks2_dur (int ticks_i );
index a4f5cdc71c5d034c00f155e65008a1a2db31052b..28580b63af32f93c5a0a56211c89a3b107700dbb 100644 (file)
@@ -13,7 +13,7 @@
 #define DURATION_HH
 
 #include "fproto.hh"
 #define DURATION_HH
 
 #include "fproto.hh"
-#include "moment.hh"
+#include "rational.hh"
 #include "plet.hh"
 
 /**
 #include "plet.hh"
 
 /**
@@ -27,11 +27,11 @@ struct Duration {
   bool plet_b ();
   String str () const;
   void set_plet (int,int );
   bool plet_b ();
   String str () const;
   void set_plet (int,int );
-  void compress (Moment);
+  void compress (Rational);
 
   static bool duration_type_b (int t);
   void set_ticks (int ticks_i );
 
   static bool duration_type_b (int t);
   void set_ticks (int ticks_i );
-  Moment length_mom () const ;
+  Rational length_mom () const ;
   static int division_1_i_s;
 
   /// Logarithm of the base duration.
   static int division_1_i_s;
 
   /// Logarithm of the base duration.
diff --git a/lib/include/moment.hh b/lib/include/moment.hh
deleted file mode 100644 (file)
index d578fbc..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-  (c) 1996--98 Han-Wen Nienhuys
-*/
-
-#ifndef MOMENT_HH
-#define MOMENT_HH
-
-#include <limits.h>
-#include "rational.hh"
-
-class String;
-typedef Rational Moment;
-
-
-/**
-  A really big time-moment.
-
-  Windhoze-suck-suck-suck-suck-suck-thank-you-cygnus
-
-  I get tired of all these incompatibilities.  Let's just assume that
-  INT_MAX is really, really, really big.
-
-  Can't we name this Saint_jut_mom (Sintjuttemis ?)  */
-  
-
-const Moment infinity_mom = INT_MAX;
-
-#endif // 
-
index dbb26da95dcb04b091425a4e644c4db20c78422d..42ef83b435d86cbbd9ac82d5a0894a14202134a0 100644 (file)
@@ -9,7 +9,7 @@
 
 #ifndef PLET_HH
 #define PLET_HH
 
 #ifndef PLET_HH
 #define PLET_HH
-#include "moment.hh"
+#include "rational.hh"
 
 /** 
   The type and replacement value of a  plet (triplet, quintuplet.) Conceptually the same as a rational, but 4/6 != 2/3.
 
 /** 
   The type and replacement value of a  plet (triplet, quintuplet.) Conceptually the same as a rational, but 4/6 != 2/3.
@@ -18,7 +18,7 @@
  */
 struct Plet {
   Plet ();
  */
 struct Plet {
   Plet ();
-  Moment mom () const;
+  Rational mom () const;
   bool unit_b () const;
   int iso_i_;  // 2/3; 2 is not duration, maar of count!
   int type_i_; 
   bool unit_b () const;
   int iso_i_;  // 2/3; 2 is not duration, maar of count!
   int type_i_; 
diff --git a/lib/moment.cc b/lib/moment.cc
deleted file mode 100644 (file)
index a4c50d8..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
-  moment.cc -- implement Moment
-
-  source file of the GNU LilyPond music typesetter
-
-  (c) 1996, 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-#include <iostream.h>
-#include "string.hh"
-#include "moment.hh"
-
index a145aa7ae48064bf2207df812d432bdc06496e45..e567515b7ed1c43366f95fa1ef688ab5ffda815a 100644 (file)
@@ -15,10 +15,10 @@ Plet::Plet ()
   iso_i_ = 1;
 }
 
   iso_i_ = 1;
 }
 
-Moment
+Rational
 Plet::mom () const
 {
 Plet::mom () const
 {
-  return  Moment (iso_i_, type_i_);
+  return  Rational (iso_i_, type_i_);
 }
 
 bool
 }
 
 bool
index ddb83af5f27f98e6f1b05a2dc4331cc220f74ae9..c28320f301dc084e9b66fadf19227c5c7a8786fb 100644 (file)
@@ -50,10 +50,10 @@ Align_note_column_engraver::do_creation_processing ()
 void
 Align_note_column_engraver::do_removal_processing ()
 {
 void
 Align_note_column_engraver::do_removal_processing ()
 {
-  Scalar al = get_property ("graceAlignPosition", 0);
-  if (al.isdir_b ())
+  SCM al = get_property ("graceAlignPosition", 0);
+  if (isdir_b (al))
     {
     {
-      align_item_p_->notehead_align_dir_ = Direction (int (al));
+      align_item_p_->notehead_align_dir_ = to_dir (al);
     }
   
   typeset_element (align_item_p_);
     }
   
   typeset_element (align_item_p_);
@@ -85,10 +85,13 @@ Align_note_column_engraver::process_acknowledged ()
         B. it has no pscore_l_ field.
 
       */
         B. it has no pscore_l_ field.
 
       */
-      Scalar grsp = get_property ("graceAccidentalSpace", 0);
-      if (grsp.isnum_b ())
+      SCM grsp = get_property ("graceAccidentalSpace", 0);
+      if (SCM_NUMBERP(grsp))
        {
        {
-         Real extra_space = double(grsp);
+         /*
+           ugh.
+         */
+         Real extra_space = gh_scm2double(grsp);
          SCM e = gh_cons (gh_double2scm (-extra_space), gh_double2scm (0.0));
          now_column_l_->set_elt_property (extra_space_scm_sym, e);
        }
          SCM e = gh_cons (gh_double2scm (-extra_space), gh_double2scm (0.0));
          now_column_l_->set_elt_property (extra_space_scm_sym, e);
        }
index 69b9a4f6ed7bb3295643980b454ab19b533c41ca..7caf691c79f9e4e02b9da81369eaa87705e4d400 100644 (file)
@@ -103,49 +103,53 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom)
   /*
     second guess: property generic time exception
   */
   /*
     second guess: property generic time exception
   */
-  Scalar begin = get_property (time_str + "beamAutoBegin", 0);
-  if (begin.length_i ())
-    begin_mom = begin.to_rat ();
+  SCM begin = get_property (time_str + "beamAutoBegin", 0);
+  if (SMOB_IS_TYPE_B(Moment, begin))
+    begin_mom = * SMOB_TO_TYPE(Moment, begin);
 
 
-  Scalar end = get_property (time_str + "beamAutoEnd", 0);
-  if (end.length_i ())
-    end_mom = end.to_rat ();
+  SCM end = get_property (time_str + "beamAutoEnd", 0);
+  if (SMOB_IS_TYPE_B (Moment, end))
+    end_mom = * SMOB_TO_TYPE(Moment,end);
 
   /*
     third guess: property time exception, specific for duration type
   */
   if (type_str.length_i ())
     {
 
   /*
     third guess: property time exception, specific for duration type
   */
   if (type_str.length_i ())
     {
-      Scalar end_mult = get_property (time_str + "beamAutoEnd" + type_str, 0);
-      if (end_mult.length_i ())
-       end_mom = end_mult.to_rat ();
-      Scalar begin_mult = get_property (time_str + "beamAutoBegin" + type_str, 0);
-      if (begin_mult.length_i ())
-       begin_mom = begin_mult.to_rat ();
+      SCM end_mult = get_property (time_str + "beamAutoEnd" + type_str, 0);
+      if (SMOB_IS_TYPE_B (Moment, end_mult))
+       end_mom = * SMOB_TO_TYPE (Moment,end_mult);
+
+      SCM begin_mult = get_property (time_str + "beamAutoBegin" + type_str, 0);
+      if (SMOB_IS_TYPE_B (Moment, begin_mult))
+       begin_mom = * SMOB_TO_TYPE (Moment,begin_mult);
     }
 
   /*
     fourth guess [user override]: property plain generic
   */
   begin = get_property ("beamAutoBegin", 0);
     }
 
   /*
     fourth guess [user override]: property plain generic
   */
   begin = get_property ("beamAutoBegin", 0);
-  if (begin.length_i ())
-    begin_mom = begin.to_rat ();
+  if (SMOB_IS_TYPE_B(Moment, begin))
+    begin_mom = * SMOB_TO_TYPE(Moment, begin);
+
+
   
   end = get_property ("beamAutoEnd", 0);
   
   end = get_property ("beamAutoEnd", 0);
-  if (end.length_i ())
-    end_mom = end.to_rat ();
+  if (SMOB_IS_TYPE_B (Moment, end))
+    end_mom = * SMOB_TO_TYPE (Moment,end);
 
   /*
     fifth guess [user override]: property plain, specific for duration type
   */
   if (type_str.length_i ())
     {
 
   /*
     fifth guess [user override]: property plain, specific for duration type
   */
   if (type_str.length_i ())
     {
-      Scalar end_mult = get_property (String ("beamAutoEnd") + type_str, 0);
-      if (end_mult.length_i ())
-       end_mom = end_mult.to_rat ();
-      Scalar begin_mult = get_property (String ("beamAutoBegin") + type_str, 0);
-      if (begin_mult.length_i ())
-       begin_mom = begin_mult.to_rat ();
+      SCM end_mult = get_property (String ("beamAutoEnd") + type_str, 0);
+      if (SMOB_IS_TYPE_B (Moment, end_mult))
+       end_mom = * SMOB_TO_TYPE (Moment,end_mult);
+
+      SCM begin_mult = get_property (String ("beamAutoBegin") + type_str, 0);
+      if (SMOB_IS_TYPE_B (Moment, begin_mult))
+       begin_mom = * SMOB_TO_TYPE (Moment,begin_mult);
     }
 
   Rational r;
     }
 
   Rational r;
@@ -160,8 +164,8 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom)
   /*
     Allow already started autobeam to end
    */
   /*
     Allow already started autobeam to end
    */
-  Scalar on = get_property ("noAutoBeaming", 0);
-  if (on.to_bool ())
+  SCM on = get_property ("noAutoBeaming", 0);
+  if (gh_boolean_p (on) && gh_scm2bool (on))
     return;
 
   if (begin_mom)
     return;
 
   if (begin_mom)
@@ -200,20 +204,20 @@ Auto_beam_engraver::create_beam_p ()
     }
   
   /* urg, copied from Beam_engraver */
     }
   
   /* urg, copied from Beam_engraver */
-  Scalar prop = get_property ("beamslopedamping", 0);
-  if (prop.isnum_b ()) 
-    beam_p->set_elt_property (damping_scm_sym, gh_int2scm(prop));
+  SCM prop = get_property ("beamslopedamping", 0);
+  if (SCM_NUMBERP(prop)) 
+    beam_p->set_elt_property (damping_scm_sym, prop);
 
   prop = get_property ("autoKneeGap", 0);
 
   prop = get_property ("autoKneeGap", 0);
-  if (prop.isnum_b ()) 
-    beam_p->set_elt_property (auto_knee_gap_scm_sym, gh_int2scm(prop));
+  if (SCM_NUMBERP(prop)) 
+    beam_p->set_elt_property (auto_knee_gap_scm_sym, prop);
 
   prop = get_property ("autoInterstaffKneeGap", 0);
 
   prop = get_property ("autoInterstaffKneeGap", 0);
-  if (prop.isnum_b ()) 
-    beam_p->set_elt_property (auto_interstaff_knee_gap_scm_sym, gh_int2scm( prop));
+  if (SCM_NUMBERP(prop)) 
+    beam_p->set_elt_property (auto_interstaff_knee_gap_scm_sym, prop);
       
   prop = get_property ("beamquantisation", 0);
       
   prop = get_property ("beamquantisation", 0);
-  if (prop.isnum_b ()) 
+  if (SCM_NUMBERP(prop)) 
     beam_p->quantisation_ = (Beam::Quantisation)(int)prop;
  
   announce_element (Score_element_info (beam_p, 0));
     beam_p->quantisation_ = (Beam::Quantisation)(int)prop;
  
   announce_element (Score_element_info (beam_p, 0));
@@ -281,7 +285,7 @@ Auto_beam_engraver::do_removal_processing ()
 {
   /* finished beams may be typeset */
   typeset_beam ();
 {
   /* finished beams may be typeset */
   typeset_beam ();
-  /* but unfinished may need another announce/acknoledge pass */
+  /* but unfinished may need another announce/acknowledge pass */
   if (stem_l_arr_p_)
     junk_beam ();
 }
   if (stem_l_arr_p_)
     junk_beam ();
 }
@@ -289,9 +293,9 @@ Auto_beam_engraver::do_removal_processing ()
 bool
 Auto_beam_engraver::same_grace_state_b (Score_element* e)
 {
 bool
 Auto_beam_engraver::same_grace_state_b (Score_element* e)
 {
-  bool gr = (e->get_elt_property (grace_scm_sym) != SCM_BOOL_F) ;
-
-  return gr == get_property ("weAreGraceContext",0).to_bool ();
+  bool gr = e->get_elt_property (grace_scm_sym) != SCM_BOOL_F;
+  SCM wg =get_property ("weAreGraceContext",0);
+  return (gh_boolean_p (wg) && gh_scm2bool (wg)) == gr;
 }
 
 void
 }
 
 void
index 2aa490405442f7d750a4c35584544871e8043b80..5811e6dc864c1b4a4be43938f9f920c03852fc33 100644 (file)
@@ -35,25 +35,24 @@ Bar_engraver::create_bar ()
       bar_p_->set_elt_property (break_priority_scm_sym, gh_int2scm (0));
 
       // urg: "" != empty...
       bar_p_->set_elt_property (break_priority_scm_sym, gh_int2scm (0));
 
       // urg: "" != empty...
-      String default_type = get_property ("defaultBarType", 0);
-      if (default_type.length_i ())
+      SCM default_type = get_property ("defaultBarType", 0);
+      if (gh_string_p (default_type))
        {
        {
-         bar_p_->type_str_ = default_type;
+         bar_p_->type_str_ = ly_scm2string (default_type);
        }
 
       /*
        urg.  Why did I implement this?
        */
        }
 
       /*
        urg.  Why did I implement this?
        */
-      Scalar prop = get_property ("barAtLineStart", 0);
-      if (prop.to_bool ())
+      SCM prop = get_property ("barAtLineStart", 0);
+      if (gh_boolean_p (prop) && gh_scm2bool (prop))
        {
          bar_p_->set_elt_property (at_line_start_scm_sym, SCM_BOOL_T);
        }
       prop = get_property ("barSize", 0);
        {
          bar_p_->set_elt_property (at_line_start_scm_sym, SCM_BOOL_T);
        }
       prop = get_property ("barSize", 0);
-      if (prop.isnum_b ())
+      if (SCM_NUMBERP(prop))
        {
        {
-         bar_p_->set_elt_property (bar_size_scm_sym, 
-                                   gh_double2scm (Real(prop)));
+         bar_p_->set_elt_property (bar_size_scm_sym, prop);
        }
       announce_element (Score_element_info (bar_p_, 0));
     }
        }
       announce_element (Score_element_info (bar_p_, 0));
     }
@@ -67,11 +66,10 @@ Bar_engraver::create_bar ()
 void
 Bar_engraver::request_bar (String requested_type)
 {
 void
 Bar_engraver::request_bar (String requested_type)
 {
-  Scalar prop = get_property ("barAtLineStart", 0);
   if (!now_mom ())
     {
   if (!now_mom ())
     {
-      Scalar prop = get_property ("barAtLineStart", 0);
-      if (!prop.to_bool ())
+      SCM prop = get_property ("barAtLineStart", 0);
+      if (!gh_boolean_p (prop) && gh_scm2bool (prop))
        return;
     }
   bool  bar_existed = bar_p_;
        return;
     }
   bool  bar_existed = bar_p_;
index f5bfcacd91748766e9f451d6a2a4a2089c0101d0..12e94befc1f3d2cae47bd8e0c45f58dd8e9d0f15 100644 (file)
@@ -31,8 +31,8 @@ Bar_script_engraver::Bar_script_engraver ()
 void
 Bar_script_engraver::do_creation_processing ()
 {
 void
 Bar_script_engraver::do_creation_processing ()
 {
-  Scalar prop = get_property (type_ + "HangOnClef", 0);
-  if (prop.to_bool ())
+  SCM prop = get_property (type_ + "HangOnClef", 0);
+  if (gh_boolean_p (prop) && gh_scm2bool (prop))
     {
       hang_on_clef_b_ = true;
     }
     {
       hang_on_clef_b_ = true;
     }
@@ -141,10 +141,10 @@ Bar_script_engraver::create_items (Request *rq)
   text_p_ = new Text_item;
   text_p_->set_elt_property (breakable_scm_sym, SCM_BOOL_T); // ugh
 
   text_p_ = new Text_item;
   text_p_->set_elt_property (breakable_scm_sym, SCM_BOOL_T); // ugh
 
-  Scalar prop = get_property (type_ + "Direction", 0);
-  if (prop.isnum_b ())
+  SCM prop = get_property (type_ + "Direction", 0);
+  if (isdir_b (prop))
     {
     {
-      staff_side_p_->dir_ = (Direction) (int) prop;
+      staff_side_p_->dir_ = to_dir (prop);
     }
   else 
     {
     }
   else 
     {
@@ -153,10 +153,10 @@ Bar_script_engraver::create_items (Request *rq)
 
   staff_side_p_->set_victim(text_p_);
   
 
   staff_side_p_->set_victim(text_p_);
   
-  Scalar padding = get_property (type_ + "ScriptPadding", 0);
-  if (padding.length_i() && padding.isnum_b ())
+  SCM padding = get_property (type_ + "ScriptPadding", 0);
+  if (SCM_NUMBERP(padding))
     {
     {
-      staff_side_p_->set_elt_property (padding_scm_sym, gh_double2scm(Real(padding)));
+      staff_side_p_->set_elt_property (padding_scm_sym, padding);
     }
   else
     {
     }
   else
     {
index 5ba4ed9306dc1fc0e05d7bf7d7ce9fe5f8b733e7..6022a0a5781bc8cd929a48dc9c3581c52a897c3a 100644 (file)
@@ -99,21 +99,21 @@ Beam_engraver::do_process_requests ()
       
       
       /* urg, must copy to Auto_beam_engraver too */
       
       
       /* urg, must copy to Auto_beam_engraver too */
-      Scalar prop = get_property ("beamslopedamping", 0);
-      if (prop.isnum_b ()) 
-       beam_p_->set_elt_property (damping_scm_sym, gh_int2scm( prop));
+      SCM prop = get_property ("beamslopedamping", 0);
+      if (SCM_NUMBERP(prop)) 
+       beam_p_->set_elt_property (damping_scm_sym, prop);
       
       prop = get_property ("autoKneeGap", 0);
       
       prop = get_property ("autoKneeGap", 0);
-      if (prop.isnum_b ()) 
-       beam_p_->set_elt_property (auto_knee_gap_scm_sym, gh_int2scm( prop));
+      if (SCM_NUMBERP(prop)) 
+       beam_p_->set_elt_property (auto_knee_gap_scm_sym, prop);
       
       prop = get_property ("autoInterstaffKneeGap", 0);
       
       prop = get_property ("autoInterstaffKneeGap", 0);
-      if (prop.isnum_b ()) 
-       beam_p_->set_elt_property (auto_interstaff_knee_gap_scm_sym, gh_int2scm( prop));
+      if (SCM_NUMBERP(prop)) 
+       beam_p_->set_elt_property (auto_interstaff_knee_gap_scm_sym, prop);
 
       prop = get_property ("beamquantisation", 0);
 
       prop = get_property ("beamquantisation", 0);
-      if (prop.isnum_b ()) 
-       beam_p_->quantisation_ = (Beam::Quantisation)(int)prop;
+      if (SCM_NUMBERP(prop)) 
+       beam_p_->quantisation_ = (Beam::Quantisation)gh_scm2int(prop);
  
       announce_element (Score_element_info (beam_p_, reqs_drul_[START]));
     }
  
       announce_element (Score_element_info (beam_p_, reqs_drul_[START]));
     }
@@ -173,7 +173,10 @@ Beam_engraver::acknowledge_element (Score_element_info info)
 
       bool stem_grace = stem_l->get_elt_property (grace_scm_sym) != SCM_BOOL_F;
 
 
       bool stem_grace = stem_l->get_elt_property (grace_scm_sym) != SCM_BOOL_F;
 
-      if (get_property ("weAreGraceContext",0).to_bool () != stem_grace)
+      SCM wg =get_property ("weAreGraceContext",0);
+      bool wgb= gh_boolean_p (wg) && gh_scm2bool (wg);
+
+      if (wgb!= stem_grace)
        return;
 
       Rhythmic_req *rhythmic_req = dynamic_cast <Rhythmic_req *> (info.req_l_);
        return;
 
       Rhythmic_req *rhythmic_req = dynamic_cast <Rhythmic_req *> (info.req_l_);
index e9f243532b248f576365f72dccffc4e31f6d9854..2259c170976208c08a510c5203d4bf97636eba11 100644 (file)
@@ -21,7 +21,6 @@ TODO:
 #include "note-head.hh"
 #include "local-key-item.hh"
 
 #include "note-head.hh"
 #include "local-key-item.hh"
 
-#include <iostream.h>
 
 Breathing_sign_engraver::Breathing_sign_engraver()
 {
 
 Breathing_sign_engraver::Breathing_sign_engraver()
 {
@@ -46,9 +45,9 @@ Breathing_sign_engraver::do_process_requests()
   if(breathing_sign_req_l_) {
     breathing_sign_p_ = new Breathing_sign;
 
   if(breathing_sign_req_l_) {
     breathing_sign_p_ = new Breathing_sign;
 
-    Scalar prop = get_property ("verticalDirection", 0);
-    if(prop.isnum_b())
-      breathing_sign_p_->set_vertical_position((Direction)int(prop));
+    SCM prop = get_property ("verticalDirection", 0);
+    if(isdir_b(prop))
+      breathing_sign_p_->set_vertical_position(to_dir (prop));
 
     announce_element (Score_element_info (breathing_sign_p_, breathing_sign_req_l_));
   }
 
     announce_element (Score_element_info (breathing_sign_p_, breathing_sign_req_l_));
   }
index 4c36f261aa4e3c564bc00a430a1c5f3434c13852..0fff51106f00d4227043cd438442079ffdae85df 100644 (file)
@@ -18,7 +18,6 @@ TODO: --> see breathing-sign-engraver.cc
 #include "dimensions.hh"
 #include "direction.hh"
 
 #include "dimensions.hh"
 #include "direction.hh"
 
-#include <iostream.h>
 
 Breathing_sign::Breathing_sign ()
 {
 
 Breathing_sign::Breathing_sign ()
 {
index e932c794feef9581f64b49facf904170d7f359be..4fa7c519e460611ca8e108c4c7a2a0eef13c9a66 100644 (file)
@@ -21,6 +21,9 @@ Change_iterator::error (String reason)
 
   String warn1 = _f ("Can't change `%s' to `%s'", to_type, to_id) 
     + ": " + reason;
 
   String warn1 = _f ("Can't change `%s' to `%s'", to_type, to_id) 
     + ": " + reason;
+  /*
+    GUHG!
+   */
   String warn2= "Change_iterator::do_process_and_next (): " 
     + report_to_l ()->type_str_ + " = `"
     + report_to_l ()->id_str_ + "': ";
   String warn2= "Change_iterator::do_process_and_next (): " 
     + report_to_l ()->type_str_ + " = `"
     + report_to_l ()->id_str_ + "': ";
index 487514ff26d4d89e8308fc9af1162e3e43c50b96..d0005c89833380089873a782a1255e9143631311 100644 (file)
@@ -56,8 +56,8 @@ Chord_name_engraver::do_process_requests ()
 
   Chord chord (pitch_arr_);
   Musical_pitch* inversion = 0;
 
   Chord chord (pitch_arr_);
   Musical_pitch* inversion = 0;
-  Scalar chord_inversion = get_property ("chordInversion", 0);
-  if (chord_inversion.to_bool ())
+  SCM chord_inversion = get_property ("chordInversion", 0);
+  if (gh_boolean_p (chord_inversion) && gh_scm2bool (chord_inversion))
     {
       int tonic_i = tonic_req_
        ? chord.find_notename_i (tonic_req_->pitch_) : chord.find_tonic_i ();
     {
       int tonic_i = tonic_req_
        ? chord.find_notename_i (tonic_req_->pitch_) : chord.find_tonic_i ();
@@ -76,16 +76,16 @@ Chord_name_engraver::do_process_requests ()
      - switch on property, add american (?) chordNameStyle:
        Chord::american_str (...)
 
      - switch on property, add american (?) chordNameStyle:
        Chord::american_str (...)
 
-  Scalar chordNameStyle = get_property ("chordNameStyle", 0);
+  SCM chordNameStyle = get_property ("chordNameStyle", 0);
   if (chordNameStyle == "Banter")
     item_p->text_str_ = chord.banter_str (inversion);
    */
 
   item_p->text_str_ = chord.banter_str (inversion);
   
   if (chordNameStyle == "Banter")
     item_p->text_str_ = chord.banter_str (inversion);
    */
 
   item_p->text_str_ = chord.banter_str (inversion);
   
-  Scalar style = get_property ("textStyle", 0);
-  if (style.length_i ())
-    item_p->style_str_ = style;
+  SCM style = get_property ("textStyle", 0);
+  if (gh_string_p (style))
+    item_p->style_str_ = ly_scm2string (style);
   
   text_p_arr_.push (item_p);
   announce_element (Score_element_info (item_p, 0));
   
   text_p_arr_.push (item_p);
   announce_element (Score_element_info (item_p, 0));
index 060b0ad2af56c3184f8e5056fe0348613c5fc19a..68d96cef59cd25f3193dbcb88f7c60a20490e427 100644 (file)
@@ -157,9 +157,9 @@ void
 Clef_engraver::do_creation_processing()
 {
   create_default_b_ = true;    // should read property.
 Clef_engraver::do_creation_processing()
 {
   create_default_b_ = true;    // should read property.
-  Scalar def = get_property ("createInitdefaultClef", 0);
-  if (def.to_bool ()) // egcs: Scalar to bool is ambiguous
-    set_type (def);
+  SCM def = get_property ("createInitdefaultClef", 0);
+  if (gh_string_p (def))
+    set_type (ly_scm2string (def));
   
   if (clef_type_str_.length_i ())
     { 
   
   if (clef_type_str_.length_i ())
     { 
@@ -191,10 +191,9 @@ Clef_engraver::create_clef()
     {
       Clef_item *c= new Clef_item;
       c->set_elt_property (break_priority_scm_sym, gh_int2scm (-2)); // ugh
     {
       Clef_item *c= new Clef_item;
       c->set_elt_property (break_priority_scm_sym, gh_int2scm (-2)); // ugh
-      String clefstyle = get_property ("clefStyle", 0);
-      if (clefstyle.length_i ())
-       c->set_elt_property (style_scm_sym,
-                            ly_ch_C_to_scm (clefstyle.ch_C()));
+      SCM clefstyle = get_property ("clefStyle", 0);
+      if (gh_string_p(clefstyle))
+       c->set_elt_property (style_scm_sym, clefstyle);
       
       announce_element (Score_element_info (c, clef_req_l_));
       clef_p_ = c;
       
       announce_element (Score_element_info (c, clef_req_l_));
       clef_p_ = c;
@@ -218,8 +217,11 @@ Clef_engraver::do_process_requests()
     }
   else if (create_default_b_)
     {
     }
   else if (create_default_b_)
     {
-      String type = get_property ("defaultClef", 0);
-      set_type (type.length_i () ? type : "treble");
+      SCM type = get_property ("defaultClef", 0);
+      if (gh_string_p (type))
+       set_type (ly_scm2string (type));
+      else
+       set_type ( "treble");
       create_clef ();
       create_default_b_ =0;
     }
       create_clef ();
       create_default_b_ =0;
     }
index eb4c9837010048e5bb803d60157566219075a734..25326109730a7a0a96ccbbc1d8cbea88b4ff19ec 100644 (file)
@@ -14,11 +14,11 @@ Column_x_positions::Column_x_positions()
 {
   energy_f_ = infinity_f;
   satisfies_constraints_b_ = false;
 {
   energy_f_ = infinity_f;
   satisfies_constraints_b_ = false;
+  force_f_ = 0;
 }
 
 Column_x_positions::~Column_x_positions()
 {
 }
 
 Column_x_positions::~Column_x_positions()
 {
-
 }
 
 
 }
 
 
index 4c3db32bb46cb16006b1d85489c58e2f69c71b8c..2933131c8d26b62339cb48bd4a07469e56230ef7 100644 (file)
@@ -114,9 +114,6 @@ Dynamic_engraver::do_process_requests()
 
          text_p_ = new Text_item;
          text_p_->text_str_ =  loud; // ugh
 
          text_p_ = new Text_item;
          text_p_->text_str_ =  loud; // ugh
-         Scalar prop = get_property ("dynamicStyle", 0);
-
-         text_p_->style_str_ = prop.length_i () ? prop :  "dynamic";
 
          staff_side_p_ = new Staff_side_item;
          staff_side_p_->set_elt_property (script_priority_scm_sym,
 
          staff_side_p_ = new Staff_side_item;
          staff_side_p_->set_elt_property (script_priority_scm_sym,
@@ -127,16 +124,16 @@ Dynamic_engraver::do_process_requests()
          staff_side_p_->dir_ = DOWN;
 
          
          staff_side_p_->dir_ = DOWN;
 
          
-         prop = get_property ("verticalDirection", 0);
-         if (prop.isdir_b())
+         SCM prop = get_property ("verticalDirection", 0);
+         if (isdir_b (prop))
            {
            {
-             staff_side_p_->dir_ = Direction (int (prop));
+             staff_side_p_->dir_ = to_dir (prop);
            }
 
          prop = get_property ("dynamicDirection", 0);
            }
 
          prop = get_property ("dynamicDirection", 0);
-         if (prop.isnum_b ())
+         if (SCM_NUMBERP(prop))
            {
            {
-             staff_side_p_->dir_ = (Direction) (int) prop;
+             staff_side_p_->dir_ = to_dir (prop);
            }
          if (absd->dir_)
            {
            }
          if (absd->dir_)
            {
@@ -144,10 +141,9 @@ Dynamic_engraver::do_process_requests()
            }
 
          prop = get_property ("dynamicPadding", 0);
            }
 
          prop = get_property ("dynamicPadding", 0);
-         if (prop.isnum_b ())
+         if (SCM_NUMBERP(prop))
            {
            {
-             staff_side_p_->set_elt_property (padding_scm_sym, 
-                                              gh_double2scm(Real(prop)));
+             staff_side_p_->set_elt_property (padding_scm_sym, prop);
            }
          announce_element (Score_element_info (text_p_, absd));
          announce_element (Score_element_info (staff_side_p_, absd));
            }
          announce_element (Score_element_info (text_p_, absd));
          announce_element (Score_element_info (staff_side_p_, absd));
@@ -173,21 +169,20 @@ Dynamic_engraver::do_process_requests()
 
 
                  
 
 
                  
-                 Scalar prop = get_property ("verticalDirection", 0);
-                 if (prop.isdir_b())
+                 SCM prop = get_property ("verticalDirection", 0);
+                 if (isdir_b (prop))
                    {
                    {
-                     to_end_ss_span_p_->dir_ = Direction (int (prop));
+                     to_end_ss_span_p_->dir_ = to_dir (prop);
                    }
                  prop = get_property ("dynamicDirection", 0);
                    }
                  prop = get_property ("dynamicDirection", 0);
-                 if (prop.isdir_b ())
+                 if (isdir_b (prop))
                    {
                    {
-                     to_end_ss_span_p_->dir_ = (Direction) (int) prop;
+                     to_end_ss_span_p_->dir_ = to_dir (prop);
                    }
                  prop = get_property ("dynamicPadding", 0);
                    }
                  prop = get_property ("dynamicPadding", 0);
-                 if (prop.isnum_b ())
+                 if (SCM_NUMBERP(prop))
                    {
                    {
-                     to_end_ss_span_p_->set_elt_property (padding_scm_sym, 
-                                                          gh_double2scm(Real(prop)));
+                     to_end_ss_span_p_->set_elt_property (padding_scm_sym,prop);
                    }
                }
            }
                    }
                }
            }
index 30f47498c9014ea27b9390a55bedcea180e066de..b8d91ae55cc93c501baff57c2491680d6a923902 100644 (file)
@@ -19,11 +19,11 @@ Font_size_engraver::Font_size_engraver ()
 void
 Font_size_engraver::do_process_requests ()
 {
 void
 Font_size_engraver::do_process_requests ()
 {
-  Scalar s (get_property ("fontSize", 0));
+  SCM s (get_property ("fontSize", 0));
   
   
-  if (s.length_i ()  && s.isnum_b ())
+  if (SCM_NUMBERP(s))
     {
     {
-      size_i_ = int (s);
+      size_i_ = gh_scm2int (s);
     }
 }
 
     }
 }
 
index 63a6adc624f4ec6438388dd516d184592ab1293e..0e0ea46f4be98c6b524783f5ed5fdbb91e5e7259 100644 (file)
@@ -40,6 +40,7 @@ struct Break_node {
   {
     prev_break_i_ = -1;
     line_i_ = 0;
   {
     prev_break_i_ = -1;
     line_i_ = 0;
+    demerits_f_ = 0;
   }
 };
 
   }
 };
 
@@ -56,10 +57,7 @@ Gourlay_breaking::do_solve () const
   optimal_paths.set_size (breaks.size ());
 
   Break_node first_node ;
   optimal_paths.set_size (breaks.size ());
 
   Break_node first_node ;
-  first_node.prev_break_i_ = -1;
-  first_node.line_config_.force_f_ = 0;
   first_node.line_config_.energy_f_ = 0;  
   first_node.line_config_.energy_f_ = 0;  
-  first_node.line_i_ = 0;
   
   optimal_paths[0] = first_node; 
   int break_idx=1;
   
   optimal_paths[0] = first_node; 
   int break_idx=1;
index 41cee8065e7f9213928415ff1ea17b60a6d2ccca..58bdd73d6f9bb2f39a02d5843a52fa62433faa05 100644 (file)
@@ -61,9 +61,9 @@ Grace_position_performer::process_acknowledged ()
            shortest_mom = shortest_mom <? notes_[i]->length_mom_;
          
          Rational grace_fraction_rat (1, 2);
            shortest_mom = shortest_mom <? notes_[i]->length_mom_;
          
          Rational grace_fraction_rat (1, 2);
-         Scalar prop = get_property ("graceFraction", 0);
-         if (prop.length_i ())
-           grace_fraction_rat = prop.to_rat ();
+         SCM prop = get_property ("graceFraction", 0);
+         if (SMOB_IS_TYPE_B(Moment, prop))
+           grace_fraction_rat = *SMOB_TO_TYPE (Moment,prop);
 
          delay_mom = shortest_mom * grace_fraction_rat;
          for (int i=0; i < notes_.size (); i++)
 
          delay_mom = shortest_mom * grace_fraction_rat;
          for (int i=0; i < notes_.size (); i++)
index 0fbaa061853cbd17d7461fcb90243d439074cdf3..e8421fb70db9a435634d3c2fc5f5b6730dbe9cdc 100644 (file)
@@ -14,7 +14,7 @@
 #include "my-lily-lexer.hh"
 #include "debug.hh"
 #include "request.hh"
 #include "my-lily-lexer.hh"
 #include "debug.hh"
 #include "request.hh"
-#include "translator.hh"
+#include "translator-group.hh"
 #include "notename-table.hh"
 
 
 #include "notename-table.hh"
 
 
@@ -79,7 +79,7 @@ Class ## _identifier::do_print () const { \
 
 
 
 
 
 
-DEFAULT_PRINT(Translator);
+DEFAULT_PRINT(Translator_group);
 DEFAULT_PRINT(Music);
 DEFAULT_PRINT(Request);
 DEFAULT_PRINT(Score);
 DEFAULT_PRINT(Music);
 DEFAULT_PRINT(Request);
 DEFAULT_PRINT(Score);
@@ -95,7 +95,7 @@ Class ## _identifier::do_str () const { \
 
 
 DUMMY_STR(Notename_table);
 
 
 DUMMY_STR(Notename_table);
-DUMMY_STR(Translator);
+DUMMY_STR(Translator_group);
 DUMMY_STR(Music);
 DUMMY_STR(Request);
 DUMMY_STR(Score);
 DUMMY_STR(Music);
 DUMMY_STR(Request);
 DUMMY_STR(Score);
@@ -144,7 +144,7 @@ Class ## _identifier::access_content_ ## Class (bool copy_b) const {\
 Class*\
 Class ## _identifier::access_content_ ## Class (bool copy_b) const{\
   ((Class ## _identifier*)this)->accessed_b_ = true;\
 Class*\
 Class ## _identifier::access_content_ ## Class (bool copy_b) const{\
   ((Class ## _identifier*)this)->accessed_b_ = true;\
-  return copy_b ? (Class*)data_p_->clone() : data_p_;\
+  return copy_b ? dynamic_cast<Class*> (data_p_->clone()) : data_p_;\
 }
 
 #define IMPLEMENT_ID_CLASS(Class)      \
 }
 
 #define IMPLEMENT_ID_CLASS(Class)      \
@@ -162,7 +162,7 @@ Class ## _identifier::Class ## _identifier (Class ## _identifier const &s) \
 
 
 IMPLEMENT_ID_CLASS(Duration);
 
 
 IMPLEMENT_ID_CLASS(Duration);
-IMPLEMENT_ID_CLASS(Translator);
+IMPLEMENT_ID_CLASS(Translator_group);
 IMPLEMENT_ID_CLASS(int);
 IMPLEMENT_ID_CLASS(Real);
 IMPLEMENT_ID_CLASS(String);
 IMPLEMENT_ID_CLASS(int);
 IMPLEMENT_ID_CLASS(Real);
 IMPLEMENT_ID_CLASS(String);
@@ -174,7 +174,7 @@ IMPLEMENT_ID_CLASS(Paper_def);
 IMPLEMENT_ID_CLASS(Notename_table);
 VIRTUAL_ACCESSOR(Music);
 VIRTUAL_ACCESSOR(Request);
 IMPLEMENT_ID_CLASS(Notename_table);
 VIRTUAL_ACCESSOR(Music);
 VIRTUAL_ACCESSOR(Request);
-VIRTUAL_ACCESSOR(Translator);
+VIRTUAL_ACCESSOR(Translator_group);
 DEFAULT_ACCESSOR(Notename_table);
 DEFAULT_ACCESSOR(Duration);
 DEFAULT_ACCESSOR(int);
 DEFAULT_ACCESSOR(Notename_table);
 DEFAULT_ACCESSOR(Duration);
 DEFAULT_ACCESSOR(int);
index 89c7483478f07598d909834af888adfa43c3bdec..961089bf62c3516cc92d877bf3efb361ef159ecd 100644 (file)
@@ -66,7 +66,7 @@ Includable_lexer::new_input (String s, Sources  * global_sources)
     Whoops. The size argument to yy_create_buffer is not the
     filelength but a BUFFERSIZE. Maybe this is why reading stdin fucks up.
 
     Whoops. The size argument to yy_create_buffer is not the
     filelength but a BUFFERSIZE. Maybe this is why reading stdin fucks up.
 
-    */
+  */
   yy_switch_to_buffer (yy_create_buffer (sl->istream_l (), YY_BUF_SIZE));
 
 }
   yy_switch_to_buffer (yy_create_buffer (sl->istream_l (), YY_BUF_SIZE));
 
 }
@@ -102,10 +102,10 @@ Includable_lexer::close_input ()
       return false;
     }
   else
       return false;
     }
   else
-      {
-       yy_switch_to_buffer (state_stack_.pop ());
-       return true;
-      }
+    {
+      yy_switch_to_buffer (state_stack_.pop ());
+      return true;
+    }
 }
 
 char const*
 }
 
 char const*
index 35ae82c19b5a8c3c603b4a0f88e97cf258e76365..47e64af617a0228f791d74f07e1e5c8d44bbe9cb 100644 (file)
@@ -10,7 +10,6 @@
 #ifndef CLEF_GRAV_HH
 #define CLEF_GRAV_HH
 
 #ifndef CLEF_GRAV_HH
 #define CLEF_GRAV_HH
 
-#include "scalar.hh"
 #include "array.hh"
 #include "engraver.hh"
 #include "direction.hh"
 #include "array.hh"
 #include "engraver.hh"
 #include "direction.hh"
index 721f97ddaf9ed784491498bc598a09a8e57991d7..00f8ed8204029f21f35422f16fe454a198a7ca30 100644 (file)
@@ -11,7 +11,7 @@
 #define GLOBAL_TRANSLATOR_HH
 
 #include "translator-group.hh"
 #define GLOBAL_TRANSLATOR_HH
 
 #include "translator-group.hh"
-#include "rational.hh"
+#include "moment.hh"
 #include "pqueue.hh"
 
 
 #include "pqueue.hh"
 
 
index 32907cdbe7281c348a3fe946823cc1613d570be0..2a31d99266fa87b4d7fe56abbe4003a1286222d7 100644 (file)
@@ -15,9 +15,5 @@
 #include "scope.hh"
 
 
 #include "scope.hh"
 
 
-/** Store bibliographical information.  The information in the \header
-   block is read into this struct.  Lily does not process this
-   information.  */
-typedef Scope Header;
 
 #endif // HEADER_HH
 
 #endif // HEADER_HH
index 4d705020fbcbdc24490dc799057d485f6329cad3..ded6ac4a0ef4943f34b4a51d332076c1219ef0a6 100644 (file)
@@ -16,7 +16,7 @@
 #define DECLARE_TYPE_NAME(Class)
 
 class Notename_table_identifier;
 #define DECLARE_TYPE_NAME(Class)
 
 class Notename_table_identifier;
-class Translator_identifier;
+class Translator_group_identifier;
 class Music_identifier;
 class Articulation_req_identifier;
 class Symtables_identifier;
 class Music_identifier;
 class Articulation_req_identifier;
 class Symtables_identifier;
@@ -51,7 +51,7 @@ struct Identifier : public Input {
   
   void error (String) const;
   String str () const;
   
   void error (String) const;
   String str () const;
-  IDACCESSOR(Translator)
+  IDACCESSOR(Translator_group)
   IDACCESSOR(Notename_table)
   IDACCESSOR(Music)
   IDACCESSOR(Symtables)
   IDACCESSOR(Notename_table)
   IDACCESSOR(Music)
   IDACCESSOR(Symtables)
@@ -84,7 +84,7 @@ struct Class ## _identifier : Identifier {\
 }\
 
 
 }\
 
 
-DECLARE_ID_CLASS(Translator);
+DECLARE_ID_CLASS(Translator_group);
 DECLARE_ID_CLASS(Duration);
 DECLARE_ID_CLASS(Notename_table);
 DECLARE_ID_CLASS(Real);
 DECLARE_ID_CLASS(Duration);
 DECLARE_ID_CLASS(Notename_table);
 DECLARE_ID_CLASS(Real);
index 140db77927ed3a39b361b3edb138569d300d0783..af89371f22def36026c3686614e66fc40703817f 100644 (file)
@@ -8,7 +8,6 @@
 #define KEY_HH
 
 #include "array.hh"
 #define KEY_HH
 
 #include "array.hh"
-#include "scalar.hh"
 #include "lily-proto.hh"
 
 /// administration of current key in one octave.
 #include "lily-proto.hh"
 
 /// administration of current key in one octave.
index 90773ac8d1da641a8929aba0bba05df1c05acc2d..994489c41131914127e84c1b9fdb00e790a4eefb 100644 (file)
@@ -24,6 +24,7 @@ SCM ly_set_scm (String name , SCM val);
 SCM ly_append (SCM a, SCM b);
 SCM ly_eval (SCM a);
 SCM ly_func_o (char const* name);
 SCM ly_append (SCM a, SCM b);
 SCM ly_eval (SCM a);
 SCM ly_func_o (char const* name);
+SCM ly_parse_scm (char const* s, int* n);
 SCM ly_quote_scm (SCM s);
 void ly_display_scm (SCM s);
 String ly_scm2string (SCM s);
 SCM ly_quote_scm (SCM s);
 void ly_display_scm (SCM s);
 String ly_scm2string (SCM s);
@@ -31,21 +32,32 @@ SCM array_to_list (SCM *a , int l);
 
 
 #include "array.hh"
 
 
 #include "array.hh"
-#include "scalar.hh"
-
 
 void read_lily_scm_file (String);
 void init_lily_guile ();
 
 #include "ly-symbols.hh"
 
 
 void read_lily_scm_file (String);
 void init_lily_guile ();
 
 #include "ly-symbols.hh"
 
-/*
-  Do It Yourself GC protection.
- */
-SCM ly_protect_scm (SCM s);
-SCM ly_unprotect_scm (SCM s);
 void init_ly_protection ();
 void init_ly_protection ();
+unsigned int ly_scm_hash (SCM s);
 
 SCM index_cell (SCM cellp, Direction d);
 
 
 SCM index_cell (SCM cellp, Direction d);
 
+
+/*
+  snarfing.
+ */
+void add_scm_init_func (void (*)());
+
+#define ADD_SCM_INIT_FUNC(name, func)\
+class name ## _scm_initter {                   \
+public:\
+  name ## _scm_initter ()                      \
+  {                                            \
+    add_scm_init_func (func);          \
+  }                                            \
+} _ ## name ## _scm_initter;                   \
+/* end define */
+
+
 #endif // LILY_GUILE_HH
 #endif // LILY_GUILE_HH
index d3c177c2a6398843b2b3fd0746687d0e58bde4c8..9e397a0ad20da14ee8b3002733c12327deaae64d 100644 (file)
@@ -55,14 +55,14 @@ struct Bracket_req;
 struct Break_align_item;
 struct Break_req;
 struct CHyphen_req;
 struct Break_align_item;
 struct Break_req;
 struct CHyphen_req;
-struct Chord_tremolo; 
-struct Chord_tremolo_engraver;
-struct Chord_tremolo_req;
 struct Cadenza_req;
 struct Change_iterator;
 struct Change_translator;
 struct Chord;
 struct Chord_name_engraver;
 struct Cadenza_req;
 struct Change_iterator;
 struct Change_translator;
 struct Chord;
 struct Chord_name_engraver;
+struct Chord_tremolo; 
+struct Chord_tremolo_engraver;
+struct Chord_tremolo_req;
 struct Clef_change_req;
 struct Clef_engraver;
 struct Clef_item;
 struct Clef_change_req;
 struct Clef_engraver;
 struct Clef_item;
@@ -113,7 +113,6 @@ struct Lily_stream;
 struct Line_group_engraver;
 struct Line_of_score;
 struct Line_of_staff;
 struct Line_group_engraver;
 struct Line_of_score;
 struct Line_of_staff;
-struct Simple_spacer;
 struct Linestaff;
 struct Local_key;
 struct Local_key_engraver;
 struct Linestaff;
 struct Local_key;
 struct Local_key_engraver;
@@ -208,6 +207,7 @@ struct Script_req;
 struct Separating_group_spanner;
 struct Sequential_music;
 struct Simple_music;
 struct Separating_group_spanner;
 struct Sequential_music;
 struct Simple_music;
+struct Simple_spacer;
 struct Simultaneous_music;
 struct Single_malt_grouping_item;
 struct Skip_req;
 struct Simultaneous_music;
 struct Single_malt_grouping_item;
 struct Skip_req;
@@ -267,8 +267,7 @@ struct Unfolded_repeat_iterator;
 struct Vertical_brace;
 struct Vertical_spanner;
 struct Volta_spanner;
 struct Vertical_brace;
 struct Vertical_spanner;
 struct Volta_spanner;
+struct Moment;
 
 
-typedef Rational Moment;
-typedef Scope Header;
 
 #endif // LILY_PROTO_HH
 
 #endif // LILY_PROTO_HH
diff --git a/lily/include/ly-smobs.icc b/lily/include/ly-smobs.icc
new file mode 100644 (file)
index 0000000..2bb82ae
--- /dev/null
@@ -0,0 +1,75 @@
+/*   
+  ly-smobs.icc -- implement smob glue. 
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#ifndef LY_SMOBS_ICC
+#define LY_SMOBS_ICC
+
+#define IMPLEMENT_SMOBS(CL)\
+long CL::smob_tag_;\
+static scm_smobfuns CL ## _funs = {                                    \
+  CL::mark_smob, CL::free_smob,                                                \
+  CL::print_smob, 0,                                                   \
+};                                                                     \
+void                                                                   \
+CL::init_smobs ()                                                      \
+{                                                                      \
+  smob_tag_ = scm_newsmob (&CL ## _funs);                                      \
+}                                                                      \
+                                                                       \
+                                                                        \
+void                                                                    \
+CL::unsmobify_self ()                                                   \
+{                                                                       \
+  SCM s = self_scm_;                                                    \
+  scm_unprotect_object (s);                                             \
+                                                                        \
+  SCM_CAR(self_scm_) = SCM_EOL;         \
+  SCM_CDR(self_scm_) = SCM_EOL;                                                 \
+  self_scm_ = SCM_EOL;                                                  \
+}                                                                       \
+\
+SCM                                                                    \
+CL::smobify_self ()                                                    \
+{                                                                      \
+  if (self_scm_ != SCM_EOL)                                            \
+    return self_scm_;                                                  \
+                                                                       \
+  /*                                                                   \
+    This is local. We don't assign to self_scm_ directly, to assure    \
+    that S isn't GC-ed from under us.                                  \
+   */                                                                  \
+  SCM s;                                                               \
+                                                                       \
+  SCM_NEWCELL(s);                                                      \
+  self_scm_ = s;                                                       \
+                                                                       \
+  SCM_SETCAR(s,smob_tag_);                                             \
+  void * me_p = this;                                                  \
+  SCM_SETCDR(s,me_p);                                                  \
+  scm_protect_object (s);                                              \
+                                                                       \
+  do_smobify_self();                                                   \
+  return s;                                    \
+}                                              \
+scm_sizet                                      \
+CL::free_smob (SCM ses)                                \
+{                                              \
+  CL * s = (CL*) SCM_CDR(ses);                 \
+  /* someone else did the deed already; this might be an automatic var.*/ \
+  if (s->self_scm_ != ses)\
+     return 0; \
+  SCM_CAR(ses) = SCM_EOL;\
+                                       \
+  return sizeof(CL);                           \
+}                                              \
+ADD_SCM_INIT_FUNC(CL, CL::init_smobs)\
+
+
+#endif /* LY_SMOBS_ICC */
+
index f0f3dd098dcd173ec2a0ad7a657c2bf1e8a88a60..0e3f1cf7464e116d55fe9a341e2c535892069247 100644 (file)
@@ -60,6 +60,7 @@ DECLARE_LY_SYMBOL(notewidth);
 DECLARE_LY_SYMBOL(non_default);
 DECLARE_LY_SYMBOL(non_rhythmic);
 DECLARE_LY_SYMBOL(no_staff_support);
 DECLARE_LY_SYMBOL(non_default);
 DECLARE_LY_SYMBOL(non_rhythmic);
 DECLARE_LY_SYMBOL(no_staff_support);
+DECLARE_LY_SYMBOL(no_stem_extend);
 DECLARE_LY_SYMBOL(octave_dir);
 DECLARE_LY_SYMBOL(origin);
 DECLARE_LY_SYMBOL(output);
 DECLARE_LY_SYMBOL(octave_dir);
 DECLARE_LY_SYMBOL(origin);
 DECLARE_LY_SYMBOL(output);
index f367d62a2ab16f5284c60ca8999dcf3167281155..06c4f84ffcad003aa0aaf92cb4eebdb8785dc50a 100644 (file)
@@ -7,7 +7,6 @@
 #ifndef MIDI_STREAM_HH
 #define MIDI_STREAM_HH
 
 #ifndef MIDI_STREAM_HH
 #define MIDI_STREAM_HH
 
-#include <iostream.h>
 #include "string.hh"
 
 /// Midi outputfile
 #include "string.hh"
 
 /// Midi outputfile
diff --git a/lily/include/moment.hh b/lily/include/moment.hh
new file mode 100644 (file)
index 0000000..5394265
--- /dev/null
@@ -0,0 +1,53 @@
+/*   
+  moment.hh -- declare Moment
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#ifndef MOMENT_HH
+#define MOMENT_HH
+
+#include "smobs.hh"
+#include "rational.hh"
+
+/**
+   Rationals with glue for Guilification;
+ */
+struct Moment : public Rational
+{
+  Moment () { self_scm_ = SCM_EOL; }
+  Moment (int m) : Rational (m) {self_scm_ = SCM_EOL; }
+  Moment (int m, int n) : Rational (m,n) {self_scm_ = SCM_EOL; }
+  Moment (Rational m) : Rational (m) {self_scm_ = SCM_EOL; }
+  ~Moment ();
+  
+  DECLARE_SMOBS;
+};
+
+IMPLEMENT_ARITHMETIC_OPERATOR (Moment, / );
+IMPLEMENT_ARITHMETIC_OPERATOR (Moment, + );
+IMPLEMENT_ARITHMETIC_OPERATOR (Moment, * );
+IMPLEMENT_ARITHMETIC_OPERATOR (Moment, - );
+IMPLEMENT_ARITHMETIC_OPERATOR (Moment, % );
+
+INSTANTIATE_COMPARE (Moment const&, Rational::compare);
+
+
+/**
+  A really big time-moment.
+
+  Windhoze-suck-suck-suck-suck-suck-thank-you-cygnus
+
+  I get tired of all these incompatibilities.  Let's just assume that
+  INT_MAX is really, really, really big.
+
+  Can't we name this Saint_jut_mom (Sintjuttemis ?)  */
+  
+/* URG ! WE HAVE TWO RATIONAL INFINITIES! */
+const Moment infinity_mom = INT_MAX;
+
+#endif /* MOMENT_HH */
+
index d5ca0e0560dbea0c1c19a31d432118fe0b3bc054..f7d9c061e378160b750034b6ecfe96f8c2c7c9d0 100644 (file)
@@ -28,8 +28,6 @@ class Music_iterator {
   Interpretation_context_handle handle_;
 
 protected:
   Interpretation_context_handle handle_;
 
 protected:
-  bool playback_b_;            // Should use SCMs
-  
   Music const * music_l_;
 
   /// ugh. JUNKME
   Music const * music_l_;
 
   /// ugh. JUNKME
@@ -75,9 +73,9 @@ public:
   void set_translator (Translator_group*);
   
   /** Get an iterator matching the type of MUS, and use TRANS to find
   void set_translator (Translator_group*);
   
   /** Get an iterator matching the type of MUS, and use TRANS to find
-    an accompanying translation unit.  Repeated music can be fully
-    unfolded by setting PLAYING */
-  static Music_iterator* static_get_iterator_p (Music const* mus, bool playing);
+    an accompanying translation unit
+   */
+  static Music_iterator* static_get_iterator_p (Music const* mus);
   void init_translator (Music const *, Translator_group *); 
 
   Music_iterator();
   void init_translator (Music const *, Translator_group *); 
 
   Music_iterator();
index 90079037149abefda213a2cae995123264391598..45644294ee689e4e237c4ccff2142491bb472342 100644 (file)
@@ -25,9 +25,6 @@ public:
   Scope *scope_p_;
   
   Array<String> filename_str_arr_;
   Scope *scope_p_;
   
   Array<String> filename_str_arr_;
-
-
-
   
   Music_output_def (Music_output_def const&);
   Music_output_def ();
   
   Music_output_def (Music_output_def const&);
   Music_output_def ();
@@ -39,8 +36,8 @@ public:
 
   Global_translator *get_global_translator_p ();
   Translator_group *get_group_translator_p (String type) const;
 
   Global_translator *get_global_translator_p ();
   Translator_group *get_group_translator_p (String type) const;
-    String get_default_output () const;
-  void assign_translator (Translator*);
+  String get_default_output () const;
+  void assign_translator (Translator_group*);
   Translator * find_translator_l (String) const;
   virtual int get_next_default_count () const;
 };
   Translator * find_translator_l (String) const;
   virtual int get_next_default_count () const;
 };
index e5429511f6e550df5412000a0fa3bc1520c5ef34..f7e3bf56249d92fd0fac3b46a9a3717981b5ae13 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef PAPER_STREAM_HH
 #define PAPER_STREAM_HH
 
 #ifndef PAPER_STREAM_HH
 #define PAPER_STREAM_HH
 
-#include <iostream.h>
 #include "string.hh"
 
 /** Paper output
 #include "string.hh"
 
 /** Paper output
@@ -23,7 +22,7 @@ public:
     Paper_stream (String filename);
 
     /// delegate conversion to scalar class
     Paper_stream (String filename);
 
     /// delegate conversion to scalar class
-    Paper_stream &operator <<(Scalar);
+    Paper_stream &operator <<(String);
 
     /// close the file
     ~Paper_stream();
 
     /// close the file
     ~Paper_stream();
diff --git a/lily/include/property-inspect.hh b/lily/include/property-inspect.hh
new file mode 100644 (file)
index 0000000..31d26ac
--- /dev/null
@@ -0,0 +1,20 @@
+/*   
+  property-inspect.hh -- declare various property related funcs.
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#ifndef PROPERTY_INSPECT_HH
+#define PROPERTY_INSPECT_HH
+
+#include "direction.hh"
+#include "lily-guile.hh"
+
+bool isdir_b (SCM s);
+Direction to_dir (SCM s);
+
+#endif /* PROPERTY_INSPECT_HH */
+
diff --git a/lily/include/scm-hash.hh b/lily/include/scm-hash.hh
new file mode 100644 (file)
index 0000000..a0382d0
--- /dev/null
@@ -0,0 +1,32 @@
+/*   
+  scm-hash.hh -- declare Scheme hasher.
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#ifndef SCM_HASH_HH
+#define SCM_HASH_HH
+
+#include "lily-guile.hh"
+#include "hash-table.hh"
+#include "smobs.hh"
+
+/**
+   auto resizing hash table. This should come from GUILE.
+ */
+class Scheme_hash_table : public Hash_table<SCM,SCM>
+{
+public:  
+  Scheme_hash_table ();
+  void operator = (Scheme_hash_table const &); 
+  Scheme_hash_table (Scheme_hash_table const &);
+  virtual ~Scheme_hash_table ();
+  DECLARE_SMOBS;
+  SCM to_alist () const;
+};
+
+#endif /* SCM_HASH_HH */
+
index 25a30532ff396892f3b47f371f064ebf89e9a04b..c9b1a30188666cd0ea3c537f71911e634813272e 100644 (file)
@@ -11,7 +11,7 @@
 #include "virtual-methods.hh"
 #include "graphical-element.hh"
 #include "lily-guile.hh"
 #include "virtual-methods.hh"
 #include "graphical-element.hh"
 #include "lily-guile.hh"
-
+#include "smobs.hh"
 
 typedef void (Score_element::*Score_element_method_pointer) (void);
 
 
 typedef void (Score_element::*Score_element_method_pointer) (void);
 
@@ -148,13 +148,8 @@ protected:
 
   static Interval dim_cache_callback (Dimension_cache*);
 public:
 
   static Interval dim_cache_callback (Dimension_cache*);
 public:
-  SCM smobify_self ();
-  static SCM mark_smob (SCM);
-  static scm_sizet free_smob (SCM s);
-  static int print_smob (SCM s, SCM p, scm_print_state*);
-  static long smob_tag;
-  static void init_smobs();
-  SCM self_scm_;
+
+  DECLARE_SMOBS;
 };
 
 
 };
 
 
diff --git a/lily/include/smobs.hh b/lily/include/smobs.hh
new file mode 100644 (file)
index 0000000..a038db2
--- /dev/null
@@ -0,0 +1,50 @@
+/*   
+  smobs.hh -- declare smob related stuff.
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#ifndef SMOBS_HH
+#define SMOBS_HH
+
+#include "lily-guile.hh"
+
+/**
+   A smob is a C++ class with static member functions to glue it with
+   Scheme. Every instance carries SELF_SCM_, a pointer to the Scheme
+   smob of itself.  Upon destruction, SELF_SCM_ is set to SCM_EOL.
+
+   smob_free() checks if SELF_SCM_ equals its argument, so we can also
+   use a smobbified object on the stack: the destruction will happen
+   before GC hits the object.
+
+   This is discouraged, though, because it causes memory leaks, and has
+   weird semantics.
+   
+
+*/
+
+#define DECLARE_SMOBS                                  \
+       SCM smobify_self ();                                    \
+       static SCM mark_smob (SCM);                             \
+       static scm_sizet free_smob (SCM s);                     \
+       static int print_smob (SCM s, SCM p, scm_print_state*); \
+       static long smob_tag_;                                  \
+       static void init_smobs();                               \
+       void unsmobify_self ();\
+        void do_smobify_self();\
+       SCM self_scm_;
+
+
+/**
+   Check if S is of the specified C++ class.
+ */
+#define SMOB_IS_TYPE_B(TYPE, S)  (SCM_NIMP((S)) && SCM_CAR((S)) == TYPE::smob_tag_)
+
+/// Cast S.  No checks are done.
+#define SMOB_TO_TYPE(TYPE, S)  ((TYPE*) SCM_CDR((S)))
+#endif /* SMOBS_HH */
+
index 3e55b46a6103e3663d0210af2bd90499ca89a712..8278dd829d8be140380b65a46f131e2fc0f6194f 100644 (file)
@@ -11,7 +11,8 @@
 #define TRANSLATION_PROPERTY_HH
 
 #include "music.hh"
 #define TRANSLATION_PROPERTY_HH
 
 #include "music.hh"
-#include "scalar.hh"
+#include "protected-scm.hh"
+
 
 /**
   Set a property of Translator 
 
 /**
   Set a property of Translator 
@@ -20,7 +21,8 @@ class Translation_property : public Music
 {
 public:
   String var_str_;
 {
 public:
   String var_str_;
-  Scalar value_;
+  Protected_scm value_;
+  
   VIRTUAL_COPY_CONS(Music);
   
 protected:
   VIRTUAL_COPY_CONS(Music);
   
 protected:
index 4868940bb86f20924ec54331ba05dd04541c1385..00da2cd3917804bd9d78a4d71a2d8cf6ac725649 100644 (file)
@@ -16,6 +16,8 @@
 #include "translator.hh"
 #include "cons.hh"
 #include "parray.hh"
 #include "translator.hh"
 #include "cons.hh"
 #include "parray.hh"
+#include "scm-hash.hh"
+
 
 // egcs
 typedef void (Translator::*Method_pointer)(void);
 
 // egcs
 typedef void (Translator::*Method_pointer)(void);
@@ -28,7 +30,7 @@ class Translator_group : public virtual Translator {
   Array<String> consists_str_arr_;
   Array<String> consists_end_str_arr_;
   Array<String> accepts_str_arr_;
   Array<String> consists_str_arr_;
   Array<String> consists_end_str_arr_;
   Array<String> accepts_str_arr_;
-  Dictionary<Scalar> properties_dict_;
+  Scheme_hash_table properties_dict_;
 
   int iterator_count_;
   friend class Interpretation_context_handle;
 
   int iterator_count_;
   friend class Interpretation_context_handle;
@@ -36,8 +38,8 @@ class Translator_group : public virtual Translator {
   Cons_list<Translator> trans_p_list_;
 
 public:
   Cons_list<Translator> trans_p_list_;
 
 public:
-  Scalar get_property (String type_str, Translator_group  **where_found_l) const;
-  void set_property (String var_name, Scalar value);
+  SCM get_property (String type_str, Translator_group  **where_found_l) const;
+  void set_property (String var_name, SCM value);
 
   String id_str_;
 
 
   String id_str_;
 
@@ -73,10 +75,11 @@ public:
   Link_array<Translator_group> path_to_acceptable_translator (String alias) const;
 
   Translator_group*get_default_interpreter();
   Link_array<Translator_group> path_to_acceptable_translator (String alias) const;
 
   Translator_group*get_default_interpreter();
+  virtual ~Translator_group ();
+  
 protected:
   bool try_music_on_nongroup_children (Music *m);
   
 protected:
   bool try_music_on_nongroup_children (Music *m);
   
-  virtual ~Translator_group ();
   virtual void do_print () const;
   virtual void do_process_requests ();
   virtual void do_add_processing ();
   virtual void do_print () const;
   virtual void do_process_requests ();
   virtual void do_add_processing ();
index d2db7b13e40db6af2f23f70f467cf0dea78d1ccc..ec0feb943f3484cc5de8b985a05a62ff38337dec 100644 (file)
@@ -13,7 +13,7 @@
 #include "string.hh"
 #include "lily-proto.hh"
 #include "virtual-methods.hh"
 #include "string.hh"
 #include "lily-proto.hh"
 #include "virtual-methods.hh"
-#include "scalar.hh"
+#include "property-inspect.hh"
 #include "dictionary.hh"
 #include "parray.hh"
 #include "input.hh"
 #include "dictionary.hh"
 #include "parray.hh"
 #include "input.hh"
@@ -59,7 +59,7 @@ public:
     ask daddy for a feature
     */
   Music_output_def *output_def_l () const;
     ask daddy for a feature
     */
   Music_output_def *output_def_l () const;
-  Scalar get_property (String, Translator_group **) const;
+  SCM get_property (String, Translator_group **) const;
   virtual Moment now_mom () const;  
 
 protected:
   virtual Moment now_mom () const;  
 
 protected:
index 66c1463383f4baf0cefe87919e7ecec9b80d326e..6e571d4fcb95aa6c71f82797dbb8f78358d093b7 100644 (file)
@@ -48,7 +48,7 @@ Key_engraver::create_key ()
            item_p_->add (m_l.notename_i_, a);
        }
 
            item_p_->add (m_l.notename_i_, a);
        }
 
-      for (int i = 0 ; i< old_accidental_idx_arr_.size(); i++) 
+      for (int i = 0 ; i < old_accidental_idx_arr_.size(); i++) 
        {
          Musical_pitch m_l =old_accidental_idx_arr_[i];
          int a =m_l.accidental_i_;
        {
          Musical_pitch m_l =old_accidental_idx_arr_[i];
          int a =m_l.accidental_i_;
@@ -80,8 +80,8 @@ Key_engraver::acknowledge_element (Score_element_info info)
 {
   if (dynamic_cast <Clef_change_req *> (info.req_l_)) 
     {
 {
   if (dynamic_cast <Clef_change_req *> (info.req_l_)) 
     {
-      int i= get_property ("createKeyOnClefChange", 0).length_i ();
-      if (i)
+      SCM c =  get_property ("createKeyOnClefChange", 0);
+      if (gh_boolean_p (c) && gh_scm2bool (c))
        create_key ();
     }
   else if (dynamic_cast<Bar *> (info.elem_l_)
        create_key ();
     }
   else if (dynamic_cast<Bar *> (info.elem_l_)
@@ -126,11 +126,9 @@ Key_engraver::read_req (Key_change_req const * r)
 {
   old_accidental_idx_arr_ = accidental_idx_arr_;
   key_.clear ();
 {
   old_accidental_idx_arr_ = accidental_idx_arr_;
   key_.clear ();
-  Scalar prop = get_property ("keyOctaviation", 0);
-  if (prop.length_i () > 0)
-    {
-      key_.multi_octave_b_ = ! prop.to_bool ();
-    }
+  SCM prop = get_property ("keyOctaviation", 0);
+
+  key_.multi_octave_b_ = gh_boolean_p (prop) && gh_scm2bool (prop);
   
   accidental_idx_arr_.clear ();
 
   
   accidental_idx_arr_.clear ();
 
@@ -196,7 +194,4 @@ Key_engraver::do_post_move_processing ()
   old_accidental_idx_arr_.clear ();
 }
 
   old_accidental_idx_arr_.clear ();
 }
 
-
-
 ADD_THIS_TRANSLATOR (Key_engraver);
 ADD_THIS_TRANSLATOR (Key_engraver);
-
index 42e4996c580bfd0e4d995864ea7d6bd836943947..7d2d699eadd2dce9d8cbd34bfa4ae0025f11674e 100644 (file)
@@ -4,7 +4,8 @@
 
   source file of the LilyPond music typesetter
 
 
   source file of the LilyPond music typesetter
 
-  (c) 1996,1997 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1996--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+           Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 
 */
 
 
 #include <stdio.h>
 #include <ctype.h>
 
 #include <stdio.h>
 #include <ctype.h>
 
+#include "lily-guile.hh"
 #include "string.hh"
 #include "string-convert.hh"
 #include "my-lily-lexer.hh"
 #include "array.hh"
 #include "interval.hh"
 #include "string.hh"
 #include "string-convert.hh"
 #include "my-lily-lexer.hh"
 #include "array.hh"
 #include "interval.hh"
+#include "lily-guile.hh"
 #include "parser.hh"
 #include "debug.hh"
 #include "main.hh"
 #include "parser.hh"
 #include "debug.hh"
 #include "main.hh"
@@ -206,8 +209,7 @@ HYPHEN              --
 }
 <chords,notes>{RESTNAME}       {
        const char *s = YYText ();
 }
 <chords,notes>{RESTNAME}       {
        const char *s = YYText ();
-       yylval.string = new String (s); 
-       DEBUG_OUT << "rest:"<< yylval.string;
+       yylval.scm = ly_ch_C_to_scm (s);
        return RESTNAME;
 }
 <chords,notes>R                {
        return RESTNAME;
 }
 <chords,notes>R                {
@@ -231,6 +233,27 @@ HYPHEN             --
        cerr << _ ("white expected") << endl;
        exit (1);
 }
        cerr << _ ("white expected") << endl;
        exit (1);
 }
+<INITIAL,chords,lyrics,notes># { //embedded scm
+       //char const* s = YYText () + 1;
+       char const* s = here_ch_C ();
+       int n = 0;
+       if (main_input_b_ && safe_global_b) {
+               error (_ ("Can't evaluate Scheme in safe mode"));
+               return SCM_EOL;
+       }
+       yylval.scm = ly_parse_scm (s, &n);
+       DEBUG_OUT << "Scheme: ";
+       if (flower_dstream)
+               ly_display_scm (yylval.scm);
+       
+       for (int i=0; i < n; i++)
+       {
+               yyinput ();
+       }
+       char_count_stack_.top () += n;
+
+       return SCM_T;
+}
 <notes>{
        {ALPHAWORD}     {
                return scan_bare_word (YYText ());
 <notes>{
        {ALPHAWORD}     {
                return scan_bare_word (YYText ());
@@ -267,6 +290,11 @@ HYPHEN             --
        \"      {
                DEBUG_OUT << "quoted string: `" << *yylval.string << "'\n";
                yy_pop_state ();
        \"      {
                DEBUG_OUT << "quoted string: `" << *yylval.string << "'\n";
                yy_pop_state ();
+
+               /* yylval is union. Must remember STRING before setting SCM*/
+               String *sp = yylval.string;
+               yylval.scm = ly_ch_C_to_scm  (sp->ch_C ());
+               delete sp;
                return STRING;
        }
        .       {
                return STRING;
        }
        .       {
@@ -305,7 +333,8 @@ HYPHEN              --
                if (c == '{' &&  c == '}') // brace open is for not confusing dumb tools.
                        here_input ().warning (
                                "Brace found at end of lyric. Did you forget a space?");
                if (c == '{' &&  c == '}') // brace open is for not confusing dumb tools.
                        here_input ().warning (
                                "Brace found at end of lyric. Did you forget a space?");
-               yylval.string = new String (s);
+               yylval.scm = ly_ch_C_to_scm (YYText());
+
                DEBUG_OUT << "lyric : `" << s << "'\n";
                return STRING;
        }
                DEBUG_OUT << "lyric : `" << s << "'\n";
                return STRING;
        }
@@ -457,8 +486,8 @@ My_lily_lexer::scan_escaped_word (String str)
        String msg (_f ("unknown escaped string: `\\%s'", str));        
        LexerError (msg.ch_C ());
        DEBUG_OUT << "(string)";
        String msg (_f ("unknown escaped string: `\\%s'", str));        
        LexerError (msg.ch_C ());
        DEBUG_OUT << "(string)";
-       String *sp = new String (str);
-       yylval.string=sp;
+       yylval.scm = ly_ch_C_to_scm(str.ch_C());
+
        return STRING;
 }
 
        return STRING;
 }
 
@@ -482,7 +511,7 @@ My_lily_lexer::scan_bare_word (String str)
                }
        }
 
                }
        }
 
-       yylval.string=new String (str);
+       yylval.scm = ly_ch_C_to_scm (str.ch_C());
        return STRING;
 }
 
        return STRING;
 }
 
index 311397cdd857a66669592b0a828b0928a4a4b218..51b56ca726deb798e2b889965d80486f795a0837 100644 (file)
@@ -33,6 +33,62 @@ ly_ch_C_eval_scm (char const*c)
   return gh_eval_str ((char*)c);
 }
 
   return gh_eval_str ((char*)c);
 }
 
+  
+/*
+  Pass string to scm parser, evaluate one expression.
+  Return result value and #chars read.
+
+  Thanks to Gary Houston <ghouston@freewire.co.uk>
+
+  Need guile-1.3.4 (>1.3 anyway) for ftell on str ports -- jcn
+*/
+SCM
+ly_parse_scm (char const* s, int* n)
+{
+  SCM str = gh_str02scm ((char*)s);
+  SCM port = scm_mkstrport (SCM_INUM0, str, SCM_OPN | SCM_RDNG,
+                            "scm_eval_0str");
+  SCM from = scm_ftell (port);
+
+  SCM form;
+  SCM answer = SCM_UNSPECIFIED;
+
+  /* Read expression from port */
+  if (!SCM_EOF_OBJECT_P (form = scm_read (port)))
+    answer = scm_eval_x (form);
+
+  /*
+   After parsing
+
+       (begin (foo 1 2))
+
+   all seems fine, but after parsing
+
+       (foo 1 2)
+
+   read_buf has been advanced to read_pos - 1,
+   so that scm_ftell returns 1, instead of #parsed chars
+   */
+  
+  /*
+    urg: reset read_buf for scm_ftell
+    shouldn't scm_read () do this for us?
+  */
+  scm_fill_input (port);
+  SCM to = scm_ftell (port);
+  *n = gh_scm2int (to) - gh_scm2int (from);
+
+  /* Don't close the port here; if we re-enter this function via a
+     continuation, then the next time we enter it, we'll get an error.
+     It's a string port anyway, so there's no advantage to closing it
+     early.
+
+     scm_close_port (port);
+  */
+
+  return answer;
+}
+
 /*
   scm_m_quote doesn't use any env, but needs one for a good signature in GUILE.
 */
 /*
   scm_m_quote doesn't use any env, but needs one for a good signature in GUILE.
 */
@@ -129,7 +185,7 @@ ly_scm2string (SCM s)
   char * p = gh_scm2newstr (s , &len);
   
   String r (p);
   char * p = gh_scm2newstr (s , &len);
   
   String r (p);
-  //  delete p;
+
   free (p);
   return r;
 }
   free (p);
   return r;
 }
@@ -168,14 +224,28 @@ init_functions ()
   scm_make_gsubr ("ly-gulp-file", 1,0, 0, (SCM(*)(...))ly_gulp_file);
 }
 
   scm_make_gsubr ("ly-gulp-file", 1,0, 0, (SCM(*)(...))ly_gulp_file);
 }
 
-extern void init_symbols ();
-extern void init_smobs ();     // guh -> .hh
+ADD_SCM_INIT_FUNC(funcs, init_functions);
+
 
 
+typedef void (*Void_fptr)();
+Array<Void_fptr> *scm_init_funcs_;
+
+void add_scm_init_func (void (*f)())
+{
+  if (!scm_init_funcs_)
+    scm_init_funcs_ = new Array<Void_fptr>;
+
+  scm_init_funcs_->push (f);
+}
 
 void
 init_lily_guile ()
 {
 
 void
 init_lily_guile ()
 {
-  init_symbols();
-  init_functions ();
-  init_smobs ();
+  for (int i=scm_init_funcs_->size() ; i--;)
+    (scm_init_funcs_->elem (i)) ();
+}
+
+unsigned int ly_scm_hash (SCM s)
+{
+  return scm_ihashv (s, ~1u);
 }
 }
index a6a69fec5682421c07999f8287562ff05e61c006..8e773bf05a6e37683a0eb522e7a5e9d8ba2b8bf2 100644 (file)
@@ -58,7 +58,8 @@ Local_key_engraver::process_acknowledged ()
 {
   if (!key_item_p_ && mel_l_arr_.size()) 
     {
 {
   if (!key_item_p_ && mel_l_arr_.size()) 
     {
-      bool forget = get_property ("forgetAccidentals",0).to_bool();
+      SCM f = get_property ("forgetAccidentals",0);
+      bool forget = gh_boolean_p (f) && gh_scm2bool(f);
       for (int i=0; i  < mel_l_arr_.size(); i++) 
        {
          Item * support_l = support_l_arr_[i];
       for (int i=0; i  < mel_l_arr_.size(); i++) 
        {
          Item * support_l = support_l_arr_[i];
@@ -126,7 +127,9 @@ Local_key_engraver::do_pre_move_processing()
 void
 Local_key_engraver::acknowledge_element (Score_element_info info)
 {
 void
 Local_key_engraver::acknowledge_element (Score_element_info info)
 {
-  bool selfgr = get_property ("weAreGraceContext", 0).to_bool ();
+  SCM wg= get_property ("weAreGraceContext", 0);
+  
+  bool selfgr = gh_boolean_p (wg) &&gh_scm2bool (wg);
   bool he_gr = info.elem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F;
 
   Grace_align_item * gai = dynamic_cast<Grace_align_item*> (info.elem_l_);  
   bool he_gr = info.elem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F;
 
   Grace_align_item * gai = dynamic_cast<Grace_align_item*> (info.elem_l_);  
@@ -159,7 +162,8 @@ Local_key_engraver::do_process_requests()
   Time_description const * time_C_ = get_staff_info().time_C_;
   if (time_C_ && !time_C_->whole_in_measure_)
     {
   Time_description const * time_C_ = get_staff_info().time_C_;
   if (time_C_ && !time_C_->whole_in_measure_)
     {
-      bool no_res = get_property ("noResetKey",0).to_bool ();
+      SCM n =  get_property ("noResetKey",0);
+      bool no_res = gh_boolean_p (n) && gh_scm2bool (n);
       if (!no_res && key_grav_l_)
        local_key_= key_grav_l_->key_;
     }
       if (!no_res && key_grav_l_)
        local_key_= key_grav_l_->key_;
     }
index 9953c7550d1efe5d1f94794529f02e5b628a5d64..6e35416a1896982813cdf3a32df6bb802decd76c 100644 (file)
@@ -7,7 +7,7 @@
 */
 #include "local-key-item.hh"
 #include "molecule.hh"
 */
 #include "local-key-item.hh"
 #include "molecule.hh"
-#include "scalar.hh"
+
 #include "lookup.hh"
 #include "paper-def.hh"
 #include "musical-request.hh"
 #include "lookup.hh"
 #include "paper-def.hh"
 #include "musical-request.hh"
index 1000f37ab64312106fac2f49d46e7e96204cfb34..1181e03925052b1f0f3b374dac7c2f358cb150ef 100644 (file)
@@ -15,7 +15,7 @@
 #include "lookup.hh"
 #include "debug.hh"
 #include "dimensions.hh"
 #include "lookup.hh"
 #include "debug.hh"
 #include "dimensions.hh"
-#include "scalar.hh"
+
 #include "paper-def.hh"
 #include "string-convert.hh"
 #include "file-path.hh"
 #include "paper-def.hh"
 #include "string-convert.hh"
 #include "file-path.hh"
index 719bf6dfbaec58f01063ce6f1e413baa3c17fc8a..93edfce560eef3ec73b9ba95943d18b7d1a63317 100644 (file)
@@ -29,3 +29,4 @@ init_symbols ()
 }
 
 
 }
 
 
+ADD_SCM_INIT_FUNC(lysyms, init_symbols);
index 37aa4065ee24ce62d85db7b532c56e07f11010ce..080546f2f5fe6524e18e880304043fb607b9f1b1 100644 (file)
@@ -44,9 +44,9 @@ Lyric_engraver::do_process_requests()
       text_p_->text_str_ = req_l_->text_str_;
       text_p_->text_str_ += " ";       // ugh.
 
       text_p_->text_str_ = req_l_->text_str_;
       text_p_->text_str_ += " ";       // ugh.
 
-      Scalar style = get_property ("textStyle", 0);
-      if (style.length_i ())
-       text_p_->style_str_ = style;
+      SCM style = get_property ("textStyle", 0);
+      if (gh_string_p(style))
+       text_p_->style_str_ = ly_scm2string (style);
 
       text_p_->set_elt_property (non_rhythmic_scm_sym, SCM_BOOL_T);
       
 
       text_p_->set_elt_property (non_rhythmic_scm_sym, SCM_BOOL_T);
       
index 62e5d494f9e974a43f68724f832f8d64b349db70..2bc76c99309ceba781493053c755ce85c37cee9d 100644 (file)
@@ -27,10 +27,12 @@ Melisma_engraver::do_try_music (Music *m )
 {
   if (dynamic_cast<Melisma_playing_req*>(m))
     {
 {
   if (dynamic_cast<Melisma_playing_req*>(m))
     {
-      Scalar plain (get_property ("melismaBusy", 0));
-      Scalar slur (get_property ("slurMelismaBusy", 0));
-      Scalar tie (get_property ("tieMelismaBusy", 0));
-      return plain.to_bool () || slur.to_bool () || tie.to_bool ();
+      SCM plain (get_property ("melismaBusy", 0));
+      SCM slur (get_property ("slurMelismaBusy", 0));
+      SCM tie (get_property ("tieMelismaBusy", 0));
+      return (gh_boolean_p (plain) && gh_scm2bool (plain))
+       || (gh_boolean_p (slur) && gh_scm2bool (slur))
+       || (gh_boolean_p (tie) && gh_scm2bool (tie));
     }
   return false;
 }
     }
   return false;
 }
diff --git a/lily/moment.cc b/lily/moment.cc
new file mode 100644 (file)
index 0000000..7b76747
--- /dev/null
@@ -0,0 +1,69 @@
+/*   
+  moment.cc --  implement Moment
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+
+#include "lily-guile.hh"
+#include "moment.hh"
+#include "warn.hh"
+
+SCM
+Moment::mark_smob (SCM s)
+{
+  return SCM_EOL;
+}
+
+
+Moment::~Moment()
+{
+  self_scm_ = SCM_EOL;
+}
+
+int
+Moment::print_smob (SCM s, SCM port, scm_print_state *)
+{
+  Moment  *r = (Moment *) SCM_CDR (s);
+     
+  scm_puts ("#<Mom ", port);
+  String str(r->str());
+  scm_puts ((char *)str.ch_C(), port);
+  scm_puts (" >", port);
+  
+  return 1;
+}
+
+void
+Moment::do_smobify_self ()
+{}
+
+SCM
+make_rational (SCM n, SCM d)
+{
+  if (SCM_INUMP (n) && SCM_INUMP(d))
+    {
+      Moment *r = new Moment (gh_scm2int (n), gh_scm2int (d));
+      return r->smobify_self ();
+    }
+  else
+    {
+      ::error ("Not a number");
+      assert(false);
+    }
+}
+
+#include "ly-smobs.icc"
+
+IMPLEMENT_SMOBS(Moment);
+
+void
+init_moments ()
+{
+  scm_make_gsubr ("make-moment", 2 , 0, 0,  (SCM(*)(...)) make_rational);
+}
+
+ADD_SCM_INIT_FUNC(moms,init_moments);
index e5774c9f32221881dc72a1b33ef83fc0e2caa5fd..9de2bb6af7819d21ab708ec25c541a744c0c259c 100644 (file)
@@ -114,7 +114,7 @@ Music_iterator::ok() const
 }
 
 Music_iterator*
 }
 
 Music_iterator*
-Music_iterator::static_get_iterator_p (Music const *m, bool playing)
+Music_iterator::static_get_iterator_p (Music const *m)
 {
   Music_iterator * p =0;
 
 {
   Music_iterator * p =0;
 
@@ -142,15 +142,14 @@ Music_iterator::static_get_iterator_p (Music const *m, bool playing)
     p = new Music_wrapper_iterator;
   else if (Repeated_music const * n = dynamic_cast<Repeated_music const *> (m))
     {
     p = new Music_wrapper_iterator;
   else if (Repeated_music const * n = dynamic_cast<Repeated_music const *> (m))
     {
-      if (n->fold_b_ && !playing)
+      if (n->fold_b_)
        p = new Folded_repeat_iterator;
       else
        p = new Unfolded_repeat_iterator;
     }
   else
     assert (0);
        p = new Folded_repeat_iterator;
       else
        p = new Unfolded_repeat_iterator;
     }
   else
     assert (0);
-  
-  p->playback_b_ = playing;
+
 
   p->music_l_ = m;
   return p;
 
   p->music_l_ = m;
   return p;
@@ -177,7 +176,7 @@ Music_iterator::init_translator (Music const *m, Translator_group  *report_l)
 Music_iterator*
 Music_iterator::get_iterator_p (Music const*m) const
 {
 Music_iterator*
 Music_iterator::get_iterator_p (Music const*m) const
 {
-  Music_iterator*p = static_get_iterator_p (m, playback_b_);
+  Music_iterator*p = static_get_iterator_p (m);
   p->init_translator (m, report_to_l());
   
   p->construct_children();
   p->init_translator (m, report_to_l());
   
   p->construct_children();
@@ -186,7 +185,6 @@ Music_iterator::get_iterator_p (Music const*m) const
 
 Music_iterator::Music_iterator()
 {
 
 Music_iterator::Music_iterator()
 {
-  playback_b_ = false;
   first_b_ = true;
 }
 
   first_b_ = true;
 }
 
index 6006f038b43298c6681ee7345cf84271abfd04df..d355840d244c6e113f8ad614382933f6bd7f3839 100644 (file)
@@ -42,13 +42,13 @@ Music_output_def::Music_output_def (Music_output_def const &s)
   
   for (Scope_iter i (*translator_p_dict_p_);  i.ok (); i++)
     {
   
   for (Scope_iter i (*translator_p_dict_p_);  i.ok (); i++)
     {
-      Translator * t = i.val ()->access_content_Translator (false);
+      Translator * t = i.val ()->access_content_Translator_group (false);
       t-> output_def_l_ = this;
     }
 }
 
 void
       t-> output_def_l_ = this;
     }
 }
 
 void
-Music_output_def::assign_translator (Translator*tp)
+Music_output_def::assign_translator (Translator_group*tp)
 {
   String s =tp->type_str_;
   if (s.empty_b ())
 {
   String s =tp->type_str_;
   if (s.empty_b ())
@@ -58,7 +58,7 @@ Music_output_def::assign_translator (Translator*tp)
   if (translator_p_dict_p_->elem_b (s))
     delete translator_p_dict_p_->elem (s);
   
   if (translator_p_dict_p_->elem_b (s))
     delete translator_p_dict_p_->elem (s);
   
-  translator_p_dict_p_->elem (s) = new Translator_identifier (tp, 0);
+  translator_p_dict_p_->elem (s) = new Translator_group_identifier (tp, 0);
   tp ->output_def_l_ = this;
 }
 
   tp ->output_def_l_ = this;
 }
 
@@ -66,7 +66,7 @@ Translator*
 Music_output_def::find_translator_l (String name) const
 {
   if (translator_p_dict_p_->elem_b (name))
 Music_output_def::find_translator_l (String name) const
 {
   if (translator_p_dict_p_->elem_b (name))
-    return translator_p_dict_p_->elem (name)->access_content_Translator (false);
+    return translator_p_dict_p_->elem (name)->access_content_Translator_group (false);
 
   if (global_translator_dict_p->elem_b (name))
     return global_translator_dict_p->elem(name);
 
   if (global_translator_dict_p->elem_b (name))
     return global_translator_dict_p->elem(name);
index 49d84d6335efbb3619cc61a937be719042924de3..de4ea2373a3faea701568a660891cd17200c36d7 100644 (file)
@@ -11,6 +11,7 @@
 #include "notename-table.hh"
 #include "interval.hh"
 #include "identifier.hh"
 #include "notename-table.hh"
 #include "interval.hh"
 #include "identifier.hh"
+#include "lily-guile.hh"
 #include "parser.hh"
 #include "keyword.hh"
 #include "my-lily-lexer.hh"
 #include "parser.hh"
 #include "keyword.hh"
 #include "my-lily-lexer.hh"
@@ -19,6 +20,7 @@
 #include "main.hh"
 #include "scope.hh"
 #include "input.hh"
 #include "main.hh"
 #include "scope.hh"
 #include "input.hh"
+#include "moment.hh"
 
 static Keyword_ent the_key_tab[]={
   {"autochange", AUTOCHANGE},
 
 static Keyword_ent the_key_tab[]={
   {"autochange", AUTOCHANGE},
@@ -64,8 +66,6 @@ static Keyword_ent the_key_tab[]={
   {"repeat", REPEAT},
   {"repetitions", REPETITIONS},
   {"addlyrics", ADDLYRICS},
   {"repeat", REPEAT},
   {"repetitions", REPETITIONS},
   {"addlyrics", ADDLYRICS},
-  {"scm", SCM_T},
-  {"scmfile", SCMFILE},
   {"score", SCORE},
   {"script", SCRIPT},
   {"shape", SHAPE},
   {"score", SCORE},
   {"script", SCRIPT},
   {"shape", SHAPE},
index aaae6a6d943136588b8d678b5794c1f4114584f9..11ae2eeda45ac03929a2b17894f45bf7b3e8e4c8 100644 (file)
@@ -14,6 +14,7 @@
 #include "music-list.hh"
 #include "musical-request.hh"
 #include "command-request.hh"
 #include "music-list.hh"
 #include "musical-request.hh"
 #include "command-request.hh"
+#include "lily-guile.hh"
 #include "parser.hh"
 #include "scope.hh"
 #include "file-results.hh"
 #include "parser.hh"
 #include "scope.hh"
 #include "file-results.hh"
index 7ac5c8ade663bf416ba3878f7fa456595de15460..99477e09d74076452d0a4e83db6a3fa6d363d4db 100644 (file)
@@ -49,7 +49,7 @@ Note_heads_engraver::do_process_requests()
   if (note_p_arr_.size ())
     return ;
   
   if (note_p_arr_.size ())
     return ;
   
-  String noteheadstyle = get_property ("noteHeadStyle", 0);
+  SCM noteheadstyle = get_property ("noteHeadStyle", 0);
   for (int i=0; i < note_req_l_arr_.size (); i++)
     {
       Note_head *note_p  = new Note_head;
   for (int i=0; i < note_req_l_arr_.size (); i++)
     {
       Note_head *note_p  = new Note_head;
@@ -62,10 +62,10 @@ Note_heads_engraver::do_process_requests()
          note_p->dots_l_ = d;
          d->dots_i_ = note_req_l->duration_.dots_i_;
 
          note_p->dots_l_ = d;
          d->dots_i_ = note_req_l->duration_.dots_i_;
 
-         Scalar dir = get_property ("verticalDirection",0);
-         if (dir.isdir_b())
+         SCM dir = get_property ("verticalDirection",0);
+         if (isdir_b (dir))
            {
            {
-             d->resolve_dir_ = (Direction)(int)dir;
+             d->resolve_dir_ = to_dir (dir);
            }
          
          announce_element (Score_element_info (d,0));
            }
          
          announce_element (Score_element_info (d,0));
@@ -73,12 +73,13 @@ Note_heads_engraver::do_process_requests()
        }
       note_p->position_i_  = note_req_l->pitch_.steps ();
 
        }
       note_p->position_i_  = note_req_l->pitch_.steps ();
 
-      if (noteheadstyle == "transparent")
-       note_p->set_elt_property (transparent_scm_sym, SCM_BOOL_T);
-      else 
-        note_p->set_elt_property (style_scm_sym,
-                                 ly_ch_C_to_scm (noteheadstyle.ch_C()));
-
+      if (gh_string_p (noteheadstyle))
+       {
+         if (ly_scm2string (noteheadstyle) == "transparent")
+           note_p->set_elt_property (transparent_scm_sym, SCM_BOOL_T);
+         else 
+           note_p->set_elt_property (style_scm_sym, noteheadstyle);
+       }
       
       Score_element_info itinf (note_p,note_req_l);
       announce_element (itinf);
       
       Score_element_info itinf (note_p,note_req_l);
       announce_element (itinf);
index 1f88de4aadaf59dd8e42689887810ea079a37bab..f455204067df9a2a76e4463d1f11ed3bdc94de9f 100644 (file)
@@ -37,9 +37,9 @@ Note_performer::do_process_requests ()
     {
       int transposing_i = 0;
       //urg
     {
       int transposing_i = 0;
       //urg
-      Scalar prop = get_property ("transposing", 0);
-      if (!prop.empty_b () && prop.isnum_b ()) 
-       transposing_i = prop;
+      SCM prop = get_property ("transposing", 0);
+      if (SCM_NUMBERP(prop)) 
+       transposing_i = gh_scm2int (prop);
 
       while (note_req_l_arr_.size ())
        {
 
       while (note_req_l_arr_.size ())
        {
index dc99d4d87be06a52308cd41ca47705ed5776d434..c5a9146f811d1240a9c1d6ed563334f7a499804d 100644 (file)
@@ -209,7 +209,7 @@ Paper_def::reset_default_count()
 }
 
 Paper_outputter*
 }
 
 Paper_outputter*
-Paper_def::paper_outputter_p (Paper_stream* os_p, Header* header_l, String origin_str) const
+Paper_def::paper_outputter_p (Paper_stream* os_p, Scope* header_l, String origin_str) const
 {
   Paper_outputter* p = new Paper_outputter (os_p);
 
 {
   Paper_outputter* p = new Paper_outputter (os_p);
 
index fc628db526030cfbddd760dbe4b51d064f527baa..b58ba0eeafe4ba62a307695c30e4419a03074395 100644 (file)
@@ -161,7 +161,7 @@ Paper_outputter::output_comment (String str)
 {
   if (String (output_global_ch) == "scm")
     {
 {
   if (String (output_global_ch) == "scm")
     {
-      *outstream_l_ << "; " << str << '\n';
+      *outstream_l_ << "; " << str << "\n";
     }
   else
     {
     }
   else
     {
index ef983e80539069e8b1115411e0839cc8a4749fad..d8cba19d43f13871999e83186695482e1bbada58 100644 (file)
@@ -50,6 +50,9 @@ Paper_score::typeset_element (Score_element * elem_p)
 
   SCM_CDR(element_smob_list_) = gh_cons (elem_p->self_scm_,
                                         SCM_CDR (element_smob_list_));
 
   SCM_CDR(element_smob_list_) = gh_cons (elem_p->self_scm_,
                                         SCM_CDR (element_smob_list_));
+  elem_p->set_elt_property (ly_symbol ("full-name"),
+                           gh_str02scm((char*)elem_p->name()));
+  
   scm_unprotect_object (elem_p->self_scm_);
 }
 
   scm_unprotect_object (elem_p->self_scm_);
 }
 
index 2f791019ad5c7550a1bbd3669a0d1d7d40e9b2a4..f7844a8995a7da4f2adddb36c08320c78fd4c5ed 100644 (file)
@@ -42,7 +42,7 @@ Paper_stream::~Paper_stream ()
 
 // print string. don't forget indent.
 Paper_stream&
 
 // print string. don't forget indent.
 Paper_stream&
-Paper_stream::operator << (Scalar s)
+Paper_stream::operator << (String s)
 {
   for (char const *cp = s.ch_C (); *cp; cp++)
     {
 {
   for (char const *cp = s.ch_C (); *cp; cp++)
     {
index 4d84041f3866a08ff32d687678451aacae4409fe..c5b3927e59392af55540fb7e6a0c1ff7c71d0a74 100644 (file)
@@ -5,14 +5,13 @@
 
   source file of the GNU LilyPond music typesetter
 
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
            Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include <iostream.h>
 #include "lily-guile.hh"
 #include "notename-table.hh"
            Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include <iostream.h>
 #include "lily-guile.hh"
 #include "notename-table.hh"
-#include "scalar.hh"
 #include "translation-property.hh"
 #include "lookup.hh"
 #include "misc.hh"
 #include "translation-property.hh"
 #include "lookup.hh"
 #include "misc.hh"
@@ -79,11 +78,11 @@ print_mudela_versions (ostream &os)
     Array<Real>* realarr;
     Array<Musical_pitch> *pitch_arr;
     Link_array<Request> *reqvec;
     Array<Real>* realarr;
     Array<Musical_pitch> *pitch_arr;
     Link_array<Request> *reqvec;
-    Array<String> * strvec;
     Array<int> *intvec;
     Notename_table *chordmodifiertab;
     Duration *duration;
     Identifier *id;
     Array<int> *intvec;
     Notename_table *chordmodifiertab;
     Duration *duration;
     Identifier *id;
+    String * string;
     Music *music;
     Music_list *music_list;
     Score *score;
     Music *music;
     Music_list *music_list;
     Score *score;
@@ -98,11 +97,14 @@ print_mudela_versions (ostream &os)
     Paper_def *paper;
     Real real;
     Request * request;
     Paper_def *paper;
     Real real;
     Request * request;
-    Scalar *scalar;
 
 
-    String *string;
+ /* We use SCMs to do strings, because it saves us the trouble of
+deleting them.  Let's hope that a stack overflow doesnt trigger a move
+of the parse stack onto the heap. */
+    SCM scm;
+
     Tempo_req *tempo;
     Tempo_req *tempo;
-    Translator* trans;
+    Translator_group* trans;
     char c;
     int i;
     int ii[10];
     char c;
     int i;
     int ii[10];
@@ -170,7 +172,6 @@ yylex (YYSTYPE *s,  void * v_l)
 %token REPETITIONS
 %token ADDLYRICS
 %token SCM_T
 %token REPETITIONS
 %token ADDLYRICS
 %token SCM_T
-%token SCMFILE
 %token SCORE
 %token SCRIPT
 %token SHAPE
 %token SCORE
 %token SCRIPT
 %token SHAPE
@@ -206,8 +207,9 @@ yylex (YYSTYPE *s,  void * v_l)
 %token <id>    MIDI_IDENTIFIER
 %token <id>    PAPER_IDENTIFIER
 %token <real>  REAL
 %token <id>    MIDI_IDENTIFIER
 %token <id>    PAPER_IDENTIFIER
 %token <real>  REAL
-%token <string>        DURATION RESTNAME
-%token <string>        STRING
+%token <scm>   DURATION RESTNAME
+%token <scm>   STRING
+%token <scm>   SCM_T
 %token <i>     UNSIGNED
 
 
 %token <i>     UNSIGNED
 
 
@@ -221,7 +223,7 @@ yylex (YYSTYPE *s,  void * v_l)
 %type <i>      abbrev_type
 %type <i>      int unsigned
 %type <i>      script_dir
 %type <i>      abbrev_type
 %type <i>      int unsigned
 %type <i>      script_dir
-%type <i>      optional_modality
+%type <i>      optional_modality 
 %type <id>     identifier_init  
 %type <duration> steno_duration optional_notemode_duration
 %type <duration> entered_notemode_duration explicit_duration
 %type <id>     identifier_init  
 %type <duration> steno_duration optional_notemode_duration
 %type <duration> entered_notemode_duration explicit_duration
@@ -238,7 +240,7 @@ yylex (YYSTYPE *s,  void * v_l)
 %type <midi>   midi_block midi_body
 %type <duration>       duration_length
 
 %type <midi>   midi_block midi_body
 %type <duration>       duration_length
 
-%type <scalar>  scalar
+%type <scm>  embedded_scm scalar
 %type <music>  Music Sequential_music Simultaneous_music Music_sequence
 %type <music>  relative_music re_rhythmed_music
 %type <music>  property_def translator_change
 %type <music>  Music Sequential_music Simultaneous_music Music_sequence
 %type <music>  relative_music re_rhythmed_music
 %type <music>  property_def translator_change
@@ -250,11 +252,11 @@ yylex (YYSTYPE *s,  void * v_l)
 %type <request> command_req verbose_command_req
 %type <request>        extender_req
 %type <request> hyphen_req
 %type <request> command_req verbose_command_req
 %type <request>        extender_req
 %type <request> hyphen_req
-%type <string> string
+%type <scm>    string
 %type <score>  score_block score_body
 %type <realarr>        real_array
 
 %type <score>  score_block score_body
 %type <realarr>        real_array
 
-%type <string> script_abbreviation
+%type <scm>    script_abbreviation
 %type <trans>  translator_spec_block translator_spec_body
 %type <tempo>  tempo_request
 %type <notenametab> notenames_body notenames_block chordmodifiers_block
 %type <trans>  translator_spec_block translator_spec_body
 %type <tempo>  tempo_request
 %type <notenametab> notenames_body notenames_block chordmodifiers_block
@@ -300,21 +302,14 @@ toplevel_expression:
                        Midi_def_identifier ($1, MIDI_IDENTIFIER);
                THIS->lexer_p_->set_identifier ("$defaultmidi", id)
        }
                        Midi_def_identifier ($1, MIDI_IDENTIFIER);
                THIS->lexer_p_->set_identifier ("$defaultmidi", id)
        }
-       | embedded_scm { 
-       }
+       | embedded_scm {
+               // junk value
+       }       
        ;
 
 embedded_scm:
        ;
 
 embedded_scm:
-       SCMFILE STRING semicolon {
-               read_lily_scm_file (*$2);
-               delete $2;
-       }
-       | SCM_T STRING semicolon {
-               if (THIS->lexer_p_->main_input_b_ && safe_global_b)
-                       error (_("Can't evaluate Scheme in safe mode"));
-               gh_eval_str ($2->ch_l ());
-               delete $2;
-       };
+       SCM_T
+       ;
 
 
 chordmodifiers_block:
 
 
 chordmodifiers_block:
@@ -336,10 +331,9 @@ notenames_body:
                $$ = $1-> access_content_Notename_table(true);
        }
        | notenames_body STRING '=' explicit_musical_pitch {
                $$ = $1-> access_content_Notename_table(true);
        }
        | notenames_body STRING '=' explicit_musical_pitch {
-               (*$$)[*$2] = *$4;
+               (*$$)[ly_scm2string ($2)] = *$4;
 
                delete $4;
 
                delete $4;
-               delete $2;
        }
        ;
 
        }
        ;
 
@@ -369,7 +363,7 @@ assignment:
                THIS->remember_spot ();
        }
        /* cont */ '=' identifier_init  {
                THIS->remember_spot ();
        }
        /* cont */ '=' identifier_init  {
-           THIS->lexer_p_->set_identifier (*$1, $4);
+           THIS->lexer_p_->set_identifier (ly_scm2string ($1), $4);
            $4->init_b_ = THIS->init_parse_b_;
            $4->set_spot (THIS->pop_spot ());
        }
            $4->init_b_ = THIS->init_parse_b_;
            $4->set_spot (THIS->pop_spot ());
        }
@@ -396,7 +390,7 @@ identifier_init:
 
        }
        | translator_spec_block {
 
        }
        | translator_spec_block {
-               $$ = new Translator_identifier ($1, TRANS_IDENTIFIER);
+               $$ = new Translator_group_identifier ($1, TRANS_IDENTIFIER);
        }
        | Music  {
                $$ = new Music_identifier ($1, MUSIC_IDENTIFIER);
        }
        | Music  {
                $$ = new Music_identifier ($1, MUSIC_IDENTIFIER);
@@ -412,7 +406,7 @@ identifier_init:
                $$ = new Real_identifier (new Real ($1), REAL_IDENTIFIER);
        }
        | string {
                $$ = new Real_identifier (new Real ($1), REAL_IDENTIFIER);
        }
        | string {
-               $$ = new String_identifier ($1, STRING_IDENTIFIER);
+               $$ = new String_identifier (new String (ly_scm2string ($1)), STRING_IDENTIFIER);
        }
        | int   {
                $$ = new int_identifier (new int ($1), INT_IDENTIFIER);
        }
        | int   {
                $$ = new int_identifier (new int ($1), INT_IDENTIFIER);
@@ -428,23 +422,23 @@ translator_spec_block:
 
 translator_spec_body:
        TRANS_IDENTIFIER        {
 
 translator_spec_body:
        TRANS_IDENTIFIER        {
-               $$ = $1->access_content_Translator (true);
-               Translator_group * tg = dynamic_cast<Translator_group*> ($$);
-               if (!tg)
-                       THIS->parser_error (_("Need a translator group for a context"));
+               $$ = $1->access_content_Translator_group (true);
                $$-> set_spot (THIS->here_input ());
        }
        | TYPE STRING semicolon {
                $$-> set_spot (THIS->here_input ());
        }
        | TYPE STRING semicolon {
-               Translator* t = get_translator_l (*$2);
+               Translator* t = get_translator_l (ly_scm2string ($2));
                Translator_group * tg = dynamic_cast<Translator_group*> (t);
 
                if (!tg)
                        THIS->parser_error (_("Need a translator group for a context"));
                
                Translator_group * tg = dynamic_cast<Translator_group*> (t);
 
                if (!tg)
                        THIS->parser_error (_("Need a translator group for a context"));
                
-               t = t->clone ();
-               t->set_spot (THIS->here_input ());
-               $$ = t;
-               delete $2;
+               tg = dynamic_cast<Translator_group*> (t->clone ());
+               tg->set_spot (THIS->here_input ());
+               $$ = tg;
+       }
+       | translator_spec_body STRING '=' embedded_scm                  {
+               Translator_group* tg = dynamic_cast<Translator_group*> ($$);
+               tg->set_property (ly_scm2string ($2), $4);
        }
        | translator_spec_body STRING '=' identifier_init semicolon     { 
                Identifier* id = $4;
        }
        | translator_spec_body STRING '=' identifier_init semicolon     { 
                Identifier* id = $4;
@@ -452,39 +446,33 @@ translator_spec_body:
                Real_identifier *r= dynamic_cast<Real_identifier*>(id);
                int_identifier *i = dynamic_cast<int_identifier*> (id);
        
                Real_identifier *r= dynamic_cast<Real_identifier*>(id);
                int_identifier *i = dynamic_cast<int_identifier*> (id);
        
-               String str;
-               if (s) str = *s->access_content_String (false); 
-               if (i) str = to_str (*i->access_content_int (false));
-               if (r) str = to_str (*r->access_content_Real (false));
+               SCM v;
+               if (s) v = ly_ch_C_to_scm (s->access_content_String (false)->ch_C());
+               if (i) v = gh_int2scm (*i->access_content_int (false));
+               if (r) v = gh_double2scm (*r->access_content_Real (false));
                if (!s && !i && !r)
                        THIS->parser_error (_("Wrong type for property value"));
 
                delete $4;
                /* ugh*/
                Translator_group* tg = dynamic_cast<Translator_group*> ($$);
                if (!s && !i && !r)
                        THIS->parser_error (_("Wrong type for property value"));
 
                delete $4;
                /* ugh*/
                Translator_group* tg = dynamic_cast<Translator_group*> ($$);
-               if (!tg)
-                       THIS->parser_error (_("Need a translator group for a context"));
-               tg->set_property (*$2, str);
+               
+               tg->set_property (ly_scm2string ($2), v);
        }
        | translator_spec_body NAME STRING semicolon {
        }
        | translator_spec_body NAME STRING semicolon {
-               $$->type_str_ = *$3;
-               delete $3;
+               $$->type_str_ = ly_scm2string ($3);
        }
        | translator_spec_body CONSISTS STRING semicolon {
        }
        | translator_spec_body CONSISTS STRING semicolon {
-               dynamic_cast<Translator_group*> ($$)-> set_element (*$3, true);
-               delete $3;
+               dynamic_cast<Translator_group*> ($$)-> set_element (ly_scm2string ($3), true);
        }
        | translator_spec_body CONSISTSEND STRING semicolon {
        }
        | translator_spec_body CONSISTSEND STRING semicolon {
-               dynamic_cast<Translator_group*> ($$)-> set_element (*$3, true);
-               delete $3;
+               dynamic_cast<Translator_group*> ($$)-> set_element (ly_scm2string ($3), true);
        }
        | translator_spec_body ACCEPTS STRING semicolon {
        }
        | translator_spec_body ACCEPTS STRING semicolon {
-               dynamic_cast<Translator_group*> ($$)-> set_acceptor (*$3, true);
-               delete $3;
+               dynamic_cast<Translator_group*> ($$)-> set_acceptor (ly_scm2string ($3), true);
        }
        | translator_spec_body REMOVE STRING semicolon {
        }
        | translator_spec_body REMOVE STRING semicolon {
-               dynamic_cast<Translator_group*> ($$)-> set_element (*$3, false);
-               delete $3;
+               dynamic_cast<Translator_group*> ($$)-> set_element (ly_scm2string ($3), false);
        }
        ;
 
        }
        ;
 
@@ -558,8 +546,7 @@ paper_def_body:
        }
        | paper_def_body int '=' FONT STRING            { // ugh, what a syntax
                Lookup * l = new Lookup;
        }
        | paper_def_body int '=' FONT STRING            { // ugh, what a syntax
                Lookup * l = new Lookup;
-               l->font_name_ = *$5;
-               delete $5;
+               l->font_name_ = ly_scm2string ($5);
                $$->set_lookup ($2, l);
        }
        | paper_def_body assignment semicolon {
                $$->set_lookup ($2, l);
        }
        | paper_def_body assignment semicolon {
@@ -731,9 +718,8 @@ Repeated_music:
 
                Repeated_music * r = new Repeated_music ($4, $3 >? 1, m);
                $$ = r;
 
                Repeated_music * r = new Repeated_music ($4, $3 >? 1, m);
                $$ = r;
-               r->fold_b_ = (*$2 == "fold");
-               r->volta_fold_b_ =  (*$2 == "volta");
-               delete $2;
+               r->fold_b_ = (ly_scm2string ($2) == "fold");
+               r->volta_fold_b_ =  (ly_scm2string ($2) == "volta");
                r->set_spot ($4->spot  ());
        }
        ;
                r->set_spot ($4->spot  ());
        }
        ;
@@ -786,15 +772,15 @@ Composite_music:
        CONTEXT STRING Music    {
                Context_specced_music *csm =  new Context_specced_music ($3);
 
        CONTEXT STRING Music    {
                Context_specced_music *csm =  new Context_specced_music ($3);
 
-               csm->translator_type_str_ = *$2;
+               csm->translator_type_str_ = ly_scm2string ($2);
                csm->translator_id_str_ = "";
                csm->translator_id_str_ = "";
-               delete $2;
+
 
                $$ = csm;
        }
        | AUTOCHANGE STRING Music       {
 
                $$ = csm;
        }
        | AUTOCHANGE STRING Music       {
-               Auto_change_music * chm = new Auto_change_music (*$2, $3);
-               delete $2;
+               Auto_change_music * chm = new Auto_change_music (ly_scm2string ($2), $3);
+
                $$ = chm;
                chm->set_spot ($3->spot ());
        }
                $$ = chm;
                chm->set_spot ($3->spot ());
        }
@@ -804,10 +790,8 @@ Composite_music:
        | CONTEXT STRING '=' STRING Music {
                Context_specced_music *csm =  new Context_specced_music ($5);
 
        | CONTEXT STRING '=' STRING Music {
                Context_specced_music *csm =  new Context_specced_music ($5);
 
-               csm->translator_type_str_ = *$2;
-               csm->translator_id_str_ = *$4;
-               delete $2;
-               delete $4;
+               csm->translator_type_str_ = ly_scm2string ($2);
+               csm->translator_id_str_ = ly_scm2string ($4);
 
                $$ = csm;
        }
 
                $$ = csm;
        }
@@ -873,38 +857,33 @@ re_rhythmed_music:
 translator_change:
        TRANSLATOR STRING '=' STRING  {
                Change_translator * t = new Change_translator;
 translator_change:
        TRANSLATOR STRING '=' STRING  {
                Change_translator * t = new Change_translator;
-               t-> change_to_type_str_ = *$2;
-               t-> change_to_id_str_ = *$4;
+               t-> change_to_type_str_ = ly_scm2string ($2);
+               t-> change_to_id_str_ = ly_scm2string ($4);
 
                $$ = t;
                $$->set_spot (THIS->here_input ());
 
                $$ = t;
                $$->set_spot (THIS->here_input ());
-               delete $2;
-               delete $4;
        }
        ;
 
 property_def:
        }
        ;
 
 property_def:
-       PROPERTY STRING '.' STRING '=' scalar {
+       PROPERTY STRING '.' STRING '='  scalar {
                Translation_property *t = new Translation_property;
 
                Translation_property *t = new Translation_property;
 
-               t-> var_str_ = *$4;
-               t-> value_ = *$6;
+               t->var_str_ = ly_scm2string ($4);
+               t->value_ = $6;
 
                Context_specced_music *csm = new Context_specced_music (t);
                $$ = csm;
                $$->set_spot (THIS->here_input ());
 
 
                Context_specced_music *csm = new Context_specced_music (t);
                $$ = csm;
                $$->set_spot (THIS->here_input ());
 
-               csm-> translator_type_str_ = *$2;
-
-               delete $2;
-               delete $4;
-               delete $6;
+               csm-> translator_type_str_ = ly_scm2string ($2);
        }
        ;
 
 scalar:
        }
        ;
 
 scalar:
-       string          { $$ = new Scalar (*$1); delete $1; }
-       | int           { $$ = new Scalar ($1); }
+       string          { $$ = $1; }
+       | int           { $$ = gh_int2scm ($1); }
+       | embedded_scm  { $$ = $1; }
        ;
 
 
        ;
 
 
@@ -992,12 +971,11 @@ abbrev_command_req:
 
 verbose_command_req:
        BAR STRING                      {
 
 verbose_command_req:
        BAR STRING                      {
-               $$ = new Bar_req (*$2);
-               delete $2;
+               $$ = new Bar_req (ly_scm2string ($2));
        }
        | MARK STRING {
        }
        | MARK STRING {
-               $$ = new Mark_req (*$2);
-               delete $2;
+               $$ = new Mark_req (ly_scm2string ($2));
+
        }
        | MARK unsigned {
                $$ = new Mark_req (to_str ($2));
        }
        | MARK unsigned {
                $$ = new Mark_req (to_str ($2));
@@ -1031,9 +1009,10 @@ verbose_command_req:
                delete $2;
        }
        | CLEF STRING {
                delete $2;
        }
        | CLEF STRING {
-               $$ = new Clef_change_req (*$2);
-               delete $2;
+               $$ = new Clef_change_req (ly_scm2string ($2));
+
        }
        }
+/* UGH. optional.  */
        | KEY NOTENAME_PITCH optional_modality  {
                Key_change_req *key_p= new Key_change_req;
                key_p->key_.pitch_arr_.push (*$2);
        | KEY NOTENAME_PITCH optional_modality  {
                Key_change_req *key_p= new Key_change_req;
                key_p->key_.pitch_arr_.push (*$2);
@@ -1073,10 +1052,9 @@ request_that_take_dir:
        gen_text_def
        | verbose_request
        | script_abbreviation {
        gen_text_def
        | verbose_request
        | script_abbreviation {
-               Identifier*i = THIS->lexer_p_->lookup_identifier ("dash-" + *$1);
+               Identifier*i = THIS->lexer_p_->lookup_identifier ("dash-" + ly_scm2string ($1));
                Articulation_req *a = new Articulation_req;
                a->articulation_str_ = *i->access_content_String (false);
                Articulation_req *a = new Articulation_req;
                a->articulation_str_ = *i->access_content_String (false);
-               delete $1;
                $$ = a;
        }
        ;
                $$ = a;
        }
        ;
@@ -1098,17 +1076,16 @@ verbose_request:
        }
        | TEXTSCRIPT STRING STRING      {
                Text_script_req *ts_p = new Text_script_req;
        }
        | TEXTSCRIPT STRING STRING      {
                Text_script_req *ts_p = new Text_script_req;
-               ts_p-> text_str_ = *$2;
-               ts_p-> style_str_ = *$3;
+               ts_p-> text_str_ = ly_scm2string ($2);
+               ts_p-> style_str_ = ly_scm2string ($3);
                ts_p->set_spot (THIS->here_input ());
                ts_p->set_spot (THIS->here_input ());
-               delete $3;
-               delete $2;
+
                $$ = ts_p;
        }
        | SPANREQUEST int STRING {
                Span_req * sp_p = new Span_req;
                sp_p-> span_dir_  = Direction($2);
                $$ = ts_p;
        }
        | SPANREQUEST int STRING {
                Span_req * sp_p = new Span_req;
                sp_p-> span_dir_  = Direction($2);
-               sp_p->span_type_str_ = *$3;
+               sp_p->span_type_str_ = ly_scm2string ($3);
                sp_p->set_spot (THIS->here_input ());
                $$ = sp_p;
        }
                sp_p->set_spot (THIS->here_input ());
                $$ = sp_p;
        }
@@ -1120,10 +1097,10 @@ verbose_request:
        }
        | SCRIPT STRING         { 
                Articulation_req * a = new Articulation_req;
        }
        | SCRIPT STRING         { 
                Articulation_req * a = new Articulation_req;
-               a->articulation_str_ = *$2;
+               a->articulation_str_ = ly_scm2string ($2);
                a->set_spot (THIS->here_input ());
                $$ = a;
                a->set_spot (THIS->here_input ());
                $$ = a;
-               delete $2;
+
        }
        ;
 
        }
        ;
 
@@ -1283,8 +1260,8 @@ gen_text_def:
        string {
                Text_script_req *t  = new Text_script_req;
                $$ = t;
        string {
                Text_script_req *t  = new Text_script_req;
                $$ = t;
-               t->text_str_ = *$1;
-               delete $1;
+               t->text_str_ = ly_scm2string ($1);
+
                $$->set_spot (THIS->here_input ());
        }
        | DIGIT {
                $$->set_spot (THIS->here_input ());
        }
        | DIGIT {
@@ -1298,22 +1275,22 @@ gen_text_def:
 
 script_abbreviation:
        '^'             {
 
 script_abbreviation:
        '^'             {
-               $$ = new String ("hat");
+               $$ = gh_str02scm  ("hat");
        }
        | '+'           {
        }
        | '+'           {
-               $$ = new String ("plus");
+               $$ = gh_str02scm("plus");
        }
        | '-'           {
        }
        | '-'           {
-               $$ = new String ("dash");
+               $$ = gh_str02scm ("dash");
        }
        | '|'           {
        }
        | '|'           {
-               $$ = new String ("bar");
+               $$ = gh_str02scm ("bar");
        }
        | '>'           {
        }
        | '>'           {
-               $$ = new String ("larger");
+               $$ = gh_str02scm ("larger");
        }
        | '.'           {
        }
        | '.'           {
-               $$ = new String ("dot");
+               $$ = gh_str02scm ("dot");
        }
        ;
 
        }
        ;
 
@@ -1429,8 +1406,8 @@ simple_element:
                $$ = v;
        }
        | RESTNAME optional_notemode_duration           {
                $$ = v;
        }
        | RESTNAME optional_notemode_duration           {
-               $$ = THIS->get_rest_element (*$1, $2);
-               delete $1;  // delete notename
+               $$ = THIS->get_rest_element (ly_scm2string ($1), $2);
+
        }
        | MEASURES optional_notemode_duration   {
                Multi_measure_rest_req* m = new Multi_measure_rest_req;
        }
        | MEASURES optional_notemode_duration   {
                Multi_measure_rest_req* m = new Multi_measure_rest_req;
@@ -1455,8 +1432,8 @@ simple_element:
        | STRING optional_notemode_duration     {
                if (!THIS->lexer_p_->lyric_state_b ())
                        THIS->parser_error (_ ("Have to be in Lyric mode for lyrics"));
        | STRING optional_notemode_duration     {
                if (!THIS->lexer_p_->lyric_state_b ())
                        THIS->parser_error (_ ("Have to be in Lyric mode for lyrics"));
-               $$ = THIS->get_word_element (*$1, $2);
-               delete $1;
+               $$ = THIS->get_word_element (ly_scm2string ($1), $2);
+
        }
        | chord {
                if (!THIS->lexer_p_->chord_state_b ())
        }
        | chord {
                if (!THIS->lexer_p_->chord_state_b ())
@@ -1594,11 +1571,10 @@ string:
                $$ = $1;
        }
        | STRING_IDENTIFIER     {
                $$ = $1;
        }
        | STRING_IDENTIFIER     {
-               $$ = $1->access_content_String (true);
+               $$ = ly_ch_C_to_scm ($1->access_content_String (true)->ch_C ());
        }
        | string '+' string {
        }
        | string '+' string {
-               *$$ += *$3;
-               delete $3;
+               $$ = scm_string_append (scm_listify ($1, $3, SCM_UNDEFINED));
        }
        ;
 
        }
        ;
 
diff --git a/lily/property-inspect.cc b/lily/property-inspect.cc
new file mode 100644 (file)
index 0000000..5e29f41
--- /dev/null
@@ -0,0 +1,27 @@
+/*   
+  property-inspect.cc --  implement Property inspect funcs.
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#include "property-inspect.hh"
+
+bool
+isdir_b (SCM s)
+{
+  if (SCM_NUMBERP (s))
+    {
+      int i = gh_int2scm (s);
+      return i>= -1 && i <= 1; 
+    }
+  return false;
+}
+
+Direction
+to_dir (SCM s)
+{
+  return (Direction) gh_scm2int (s);
+}
index cf06c84a5d94ba56683dde3ce246c798c520fc64..1d8fd16b2a1b1449c90f801fe0fdc9e4547e4af3 100644 (file)
 #include "lily-guile.hh"
 #include "main.hh"
 
 #include "lily-guile.hh"
 #include "main.hh"
 
-#ifdef LYPROT
-#define PROTECT   ly_protect_scm
-#define UNPROTECT ly_unprotect_scm
-#else
-#define PROTECT   scm_protect_object 
-#define UNPROTECT scm_unprotect_object
-#endif
-
 Protected_scm::Protected_scm ()
 {
   object_ = 0;
 Protected_scm::Protected_scm ()
 {
   object_ = 0;
@@ -25,12 +17,12 @@ Protected_scm::Protected_scm ()
 
 Protected_scm::Protected_scm (SCM s)
 {
 
 Protected_scm::Protected_scm (SCM s)
 {
-  object_ = s  ? PROTECT (s): 0;
+  object_ = s  ? scm_protect_object (s): 0;
 }
 
 Protected_scm::Protected_scm (Protected_scm const &s)
 {
 }
 
 Protected_scm::Protected_scm (Protected_scm const &s)
 {
-  object_ = s.object_ ? PROTECT (s.object_) : 0;
+  object_ = s.object_ ? scm_protect_object (s.object_) : 0;
 }
 
 Protected_scm & 
 }
 
 Protected_scm & 
@@ -39,9 +31,9 @@ Protected_scm::operator =(SCM s)
   if (object_ == s)
     return *this;
   if (object_)
   if (object_ == s)
     return *this;
   if (object_)
-    UNPROTECT(object_);
+    scm_unprotect_object(object_);
 
 
-  object_ =  s ? PROTECT (s): 0;
+  object_ =  s ? scm_protect_object (s): 0;
   return *this;
 }
 
   return *this;
 }
 
@@ -56,8 +48,7 @@ Protected_scm::~Protected_scm ()
 {
   if  (object_)
     {
 {
   if  (object_)
     {
-      UNPROTECT (object_);
-      object_ =0L;             // be nice to conservative GC
+      scm_unprotect_object (object_);
     }
 }
 
     }
 }
 
index c716bb1243136106ff84e3cb6fa652a7374899d6..3be9fb02e2a607aae720d5f430b80115fd74a814 100644 (file)
@@ -55,7 +55,8 @@ Repeat_engraver::queue_events ()
   Music_sequence* alt = repeated_music_l_->alternatives_p_;
   Moment walk_mom = now_mom () + repeated_music_l_->repeat_body_p_->length_mom ();
 
   Music_sequence* alt = repeated_music_l_->alternatives_p_;
   Moment walk_mom = now_mom () + repeated_music_l_->repeat_body_p_->length_mom ();
 
-  bool create_volta = ! get_property ("noVoltaBraces",0).to_bool ();
+  SCM novolta = get_property ("noVoltaBraces",0);
+  bool create_volta = gh_boolean_p (novolta) && !gh_scm2bool (novolta);
 
   Cons_list<Bar_create_event> becel;
   becel.append (new Bar_create_event (now_mom (), "|:"));
 
   Cons_list<Bar_create_event> becel;
   becel.append (new Bar_create_event (now_mom (), "|:"));
@@ -101,11 +102,10 @@ Repeat_engraver::queue_events ()
              becel.append (c);
              last_number = volta_number;
              volta_number ++;
              becel.append (c);
              last_number = volta_number;
              volta_number ++;
-              Scalar l (get_property ("voltaSpannerDuration", 0));
-              if (l.length_i ()) // voltaSpannerDuration OK?
+              SCM l (get_property ("voltaSpannerDuration", 0));
+              if (SMOB_IS_TYPE_B (Moment, l))
               {
               {
-                Moment vSD_mom = l.to_rat();
+                 Moment vSD_mom = *SMOB_TO_TYPE (Moment,l);
                 if ( vSD_mom < i->car_->length_mom() ) // terminate volta early ?
                 {
                         vSD_mom += walk_mom;
                 if ( vSD_mom < i->car_->length_mom() ) // terminate volta early ?
                 {
                         vSD_mom += walk_mom;
index d3436d462b13c73237fd628ab75128dd5f2e77bf..939baa21612a12f04c016b1f7c02a937db5190eb 100644 (file)
@@ -58,10 +58,9 @@ Rest_engraver::do_process_requests ()
        }
       if (rest_p_->balltype_i_ >= 2) 
        {
        }
       if (rest_p_->balltype_i_ >= 2) 
        {
-         String reststyle = get_property ("restStyle", 0);
-         if (reststyle.length_i ())
-           rest_p_->set_elt_property (style_scm_sym,
-                                      ly_ch_C_to_scm (reststyle.ch_C()));
+         SCM reststyle = get_property ("restStyle", 0);
+         if (gh_string_p (reststyle))
+           rest_p_->set_elt_property (style_scm_sym,reststyle);
        }
       announce_element (Score_element_info (rest_p_, rest_req_l_));
     }
        }
       announce_element (Score_element_info (rest_p_, rest_req_l_));
     }
index 81e0cb65bf43783f32d84fdf05eb366b8bd3ad6b..914a2c2ecfdefa1577e9f4757a5c861e07d5671a 100644 (file)
@@ -58,8 +58,8 @@ Rhythmic_column_engraver::process_acknowledged ()
          stem_l_ = 0;
        }
 
          stem_l_ = 0;
        }
 
-
-      bool wegrace = get_property ("weAreGraceContext",0).to_bool ();
+      SCM wg = get_property ("weAreGraceContext",0);
+      bool wegrace = gh_boolean_p (wg) && gh_scm2bool (wg);
 
       if (!wegrace)
        for (int i=0; i < grace_slur_endings_.size(); i++)
 
       if (!wegrace)
        for (int i=0; i < grace_slur_endings_.size(); i++)
@@ -71,7 +71,9 @@ Rhythmic_column_engraver::process_acknowledged ()
 void
 Rhythmic_column_engraver::acknowledge_element (Score_element_info i)
 {
 void
 Rhythmic_column_engraver::acknowledge_element (Score_element_info i)
 {
-  if ((get_property ("weAreGraceContext",0).to_bool () !=
+  SCM wg = get_property ("weAreGraceContext",0);
+  bool wegrace = gh_boolean_p (wg) && gh_scm2bool (wg);
+  if ((wegrace !=
       (i.elem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F))
     && !dynamic_cast<Slur*> (i.elem_l_))
     return ;
       (i.elem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F))
     && !dynamic_cast<Slur*> (i.elem_l_))
     return ;
@@ -105,18 +107,16 @@ Rhythmic_column_engraver::do_pre_move_processing()
 {
   if (ncol_p_) 
     {
 {
   if (ncol_p_) 
     {
-      Scalar sh = get_property ("horizontalNoteShift", 0);
-      if (sh.isnum_b ())
+      SCM sh = get_property ("horizontalNoteShift", 0);
+      if (SCM_NUMBERP(sh))
        {
        {
-         ncol_p_->set_elt_property (horizontal_shift_scm_sym,
-                                    gh_int2scm (int (sh)));
+         ncol_p_->set_elt_property (horizontal_shift_scm_sym, sh);
        }
 
       sh = get_property ("forceHorizontalShift" ,0);
        }
 
       sh = get_property ("forceHorizontalShift" ,0);
-      if (sh.isnum_b ())
+      if (SCM_NUMBERP(sh))
        {
        {
-         ncol_p_->set_elt_property (force_hshift_scm_sym,
-                                    gh_double2scm (double (sh)));
+         ncol_p_->set_elt_property (force_hshift_scm_sym, sh);
        }
 
       typeset_element (ncol_p_);
        }
 
       typeset_element (ncol_p_);
diff --git a/lily/scm-hash.cc b/lily/scm-hash.cc
new file mode 100644 (file)
index 0000000..043cb23
--- /dev/null
@@ -0,0 +1,93 @@
+/*   
+  scm-hash.cc --  implement Scheme_hash_table
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#include "scm-hash.hh"
+#include "hash-table-iter.hh"
+
+Scheme_hash_table::Scheme_hash_table ()
+{
+  hash_func_ = ly_scm_hash;
+  self_scm_ = SCM_EOL;
+  smobify_self ();
+}
+
+void
+Scheme_hash_table::operator =(Scheme_hash_table const & src)
+{
+  Hash_table<SCM,SCM>::operator = (src);
+       
+  // we do not copy the self_scm_ field!
+}
+
+void
+Scheme_hash_table::do_smobify_self ()
+{
+}
+
+#include "ly-smobs.icc"
+IMPLEMENT_SMOBS(Scheme_hash_table);
+
+SCM
+Scheme_hash_table::mark_smob (SCM s)
+{
+  /*
+    can't typecheck naively, since GC bit lives in CAR of S
+   */
+  //assert (SMOB_IS_TYPE_B (Scheme_hash_table, s));
+  
+  Scheme_hash_table *me = SMOB_TO_TYPE(Scheme_hash_table,s);
+  for (Hash_table_iter<SCM,SCM> i (*me); i.ok(); i++)
+    {
+      scm_gc_mark (i.key());
+      scm_gc_mark (i.val ());
+    }
+  return SCM_EOL;
+}
+
+
+Scheme_hash_table::Scheme_hash_table (Scheme_hash_table const &src)
+  : Hash_table<SCM,SCM> (src)
+{
+  hash_func_ = src.hash_func_;
+  self_scm_ = SCM_EOL;
+  smobify_self ();
+}
+
+int
+Scheme_hash_table::print_smob (SCM s, SCM p, scm_print_state*ps)
+{
+  assert (SMOB_IS_TYPE_B (Scheme_hash_table, s));
+  Scheme_hash_table *me = SMOB_TO_TYPE(Scheme_hash_table,s);
+  for (Hash_table_iter<SCM,SCM> i (*me); i.ok(); i++)
+    {
+      scm_display (i.key(), p);
+      scm_puts (" = ",p);      
+      scm_display (i.val (), p);
+      scm_puts ("\n",p);            
+    }
+  return 1;
+}
+
+
+
+
+Scheme_hash_table::~Scheme_hash_table( )
+{
+  unsmobify_self ();
+}
+
+SCM
+Scheme_hash_table::to_alist () const
+{
+  SCM l = SCM_EOL;
+  for (Hash_table_iter<SCM,SCM> i (*this); i.ok(); i++)
+    l = gh_cons (gh_cons (i.key (), i.val()), l);
+  return l;  
+}
+
index e58ad798cbdb6e290de724082adaa15ef1c558f3..be98f18612c6064a533093459c4bf9fa43c8c0df 100644 (file)
@@ -44,14 +44,15 @@ Scope::Scope (Scope const&s)
     }
 }
 
     }
 }
 
-unsigned int scm_hash (Protected_scm s)
+unsigned int ly_pscm_hash (Protected_scm s)
 {
 {
-  return scm_ihashv (s, ~1u);
+  return ly_scm_hash (s);
 }
 
 }
 
+
 Scope::Scope ()
 {
 Scope::Scope ()
 {
-  hash_func_ = scm_hash;
+  hash_func_ = ly_pscm_hash;
 }
 
 bool
 }
 
 bool
index 9282bfc0100c045c6128c51491ee3bb2cb15dcac..a8a82a8a87c6cb0f3e636e28fdce7655a56e4633 100644 (file)
@@ -70,7 +70,7 @@ Score_element::Score_element (Score_element const&s)
 
 Score_element::~Score_element()
 {
 
 Score_element::~Score_element()
 {
-  delete output_p_; 
+  assert (!output_p_);
   assert (status_i_ >=0);
   status_i_  = -1;
 }
   assert (status_i_ >=0);
   status_i_  = -1;
 }
@@ -435,30 +435,6 @@ Score_element::find_broken_piece (Line_of_score*) const
   return 0;
 }
 
   return 0;
 }
 
-static scm_smobfuns score_elt_funs = {
- Score_element::mark_smob, Score_element::free_smob,
- Score_element::print_smob, 0,
-};
-
-
-SCM
-Score_element::smobify_self ()
-{
-  if (self_scm_ != SCM_EOL)
-    return self_scm_;
-  
-  SCM s;
-  SCM_NEWCELL(s);
-  SCM_SETCAR(s,smob_tag);
-  void * me_p = this; 
-  SCM_SETCDR(s,me_p);
-  scm_protect_object (s);
-  self_scm_ = s;
-
-  scm_unprotect_object (element_property_alist_); // ugh
-  return s;
-}
-
 SCM
 Score_element::mark_smob (SCM ses)
 {
 SCM
 Score_element::mark_smob (SCM ses)
 {
@@ -469,13 +445,6 @@ Score_element::mark_smob (SCM ses)
   return s->element_property_alist_;
 }
 
   return s->element_property_alist_;
 }
 
-scm_sizet
-Score_element::free_smob (SCM ses)
-{
-  Score_element * s = (Score_element*) SCM_CDR(ses);
-  delete s;
-  return 0;
-}
 
 int
 Score_element::print_smob (SCM s, SCM port, scm_print_state *)
 
 int
 Score_element::print_smob (SCM s, SCM port, scm_print_state *)
@@ -488,16 +457,10 @@ Score_element::print_smob (SCM s, SCM port, scm_print_state *)
   return 1;
 }
 
   return 1;
 }
 
-long Score_element::smob_tag;
-
 void
 void
-Score_element::init_smobs ()
+Score_element::do_smobify_self ()
 {
 {
-  smob_tag = scm_newsmob (&score_elt_funs);
-}
-
-void
-init_smobs()
-{
-  Score_element::init_smobs ();
+  scm_unprotect_object (element_property_alist_); // ugh
 }
 }
+#include "ly-smobs.icc"
+IMPLEMENT_SMOBS(Score_element);
index 76580cbb38a58a1b2e1bd1b016f35cfb28f8c979..be6dd2417f9e6acdd3e81d25c0cfc3de72d55f82 100644 (file)
@@ -262,7 +262,10 @@ Score_engraver::do_try_music (Music*r)
 void
 Score_engraver::forbid_breaks ()
 {
 void
 Score_engraver::forbid_breaks ()
 {
-  SCM junk = command_column_l_->remove_elt_property (breakable_scm_sym);
+  /*
+    result is junked.
+   */
+  command_column_l_->remove_elt_property (breakable_scm_sym);
 }
 
 ADD_THIS_TRANSLATOR(Score_engraver);
 }
 
 ADD_THIS_TRANSLATOR(Score_engraver);
index 5f9a2b65c506b3dae3a80c301a3d59ebab36881e..b51795072149875b7df07676593781c81584a951 100644 (file)
@@ -36,7 +36,7 @@ Score::Score (Score const &s)
   for (int i=0; i < s.def_p_arr_.size (); i++)
     def_p_arr_.push(s.def_p_arr_[i]->clone());
   errorlevel_i_ = s.errorlevel_i_;
   for (int i=0; i < s.def_p_arr_.size (); i++)
     def_p_arr_.push(s.def_p_arr_[i]->clone());
   errorlevel_i_ = s.errorlevel_i_;
-  header_p_ =  (s.header_p_) ? new Header (*s.header_p_): 0;
+  header_p_ =  (s.header_p_) ? new Scope (*s.header_p_): 0;
 }
 
 Score::~Score()
 }
 
 Score::~Score()
@@ -60,8 +60,7 @@ Score::run_translator (Music_output_def *odef_l)
   trans_p->last_mom_ = music_p_->length_mom ();
 
 
   trans_p->last_mom_ = music_p_->length_mom ();
 
 
-  bool playing  =  odef_l->scope_p_->elem_b ("unfold_all");
-  Music_iterator * iter = Music_iterator::static_get_iterator_p (music_p_, playing);
+  Music_iterator * iter = Music_iterator::static_get_iterator_p (music_p_);
   iter->init_translator(music_p_, trans_p);
 
   iter->construct_children();
   iter->init_translator(music_p_, trans_p);
 
   iter->construct_children();
index 65e9c087af148a2e3d1d9366afeabd0a25c09d5a..b3899c2d2e3f6a0e3ad0fe56c564ba911dde04b5 100644 (file)
@@ -23,7 +23,7 @@ Sources* source_global_l = 0;
 Array<String> inclusion_global_array;
 Array<String> target_str_global_array;
 Link_array<Score> score_global_array;
 Array<String> inclusion_global_array;
 Array<String> target_str_global_array;
 Link_array<Score> score_global_array;
-Header * header_global_p;
+Scope * header_global_p;
 
 
 void write_dependency_file (String fn, Array<String> targets,
 
 
 void write_dependency_file (String fn, Array<String> targets,
@@ -69,7 +69,7 @@ void
 do_scores()
 {
   if (!header_global_p)
 do_scores()
 {
   if (!header_global_p)
-    header_global_p = new Header;
+    header_global_p = new Scope;
   for (int i=0; i < score_global_array.size(); i++)
     {
       Score* is_p = score_global_array[i];
   for (int i=0; i < score_global_array.size(); i++)
     {
       Score* is_p = score_global_array[i];
index 9c5749b8921ad8599432d825b27d22fdecaaf3c5..ae2dfa312e94d391637f6b7105c0eefb0d7ac057 100644 (file)
@@ -70,31 +70,32 @@ Script_engraver::do_process_requests()
       else
          ss->dir_ = (Direction)force_dir;
 
       else
          ss->dir_ = (Direction)force_dir;
 
-      Scalar dir_prop (get_property ("articulationScriptVerticalDirection", 0));
-      if (dir_prop.isnum_b () && (int) dir_prop != CENTER)
-       ss->dir_ = (Direction)(int)dir_prop;
+      SCM dir_prop (get_property ("articulationScriptVerticalDirection", 0));
+      if (SCM_NUMBERP(dir_prop))
+       ss->dir_ = to_dir (dir_prop);
 
       if (l->dir_)
        ss->dir_ = l->dir_;
 
 
       if (l->dir_)
        ss->dir_ = l->dir_;
 
-      Real padding = 0.0;
-      Scalar paddingprop = get_property ("articulationScriptPadding", 0);
-      if (paddingprop.length_i() && paddingprop.isnum_b ())
+      SCM paddingprop = get_property ("articulationScriptPadding", 0);
+      if (SCM_NUMBERP(paddingprop))
        {
        {
-         padding = (Real)paddingprop;
+         ss->set_elt_property (padding_scm_sym, paddingprop);
        }
 
        }
 
-      Scalar axisprop = get_property ("scriptHorizontal",0);
-      if (axisprop.to_bool ())
+      SCM axisprop = get_property ("scriptHorizontal",0);
+      if (gh_boolean_p (axisprop) && gh_scm2bool (axisprop))
        ss->axis_ = X_AXIS;
 
        ss->axis_ = X_AXIS;
 
-      if (follow_staff && !axisprop.to_bool ())
+      if (follow_staff && !gh_boolean_p (axisprop) && gh_scm2bool (axisprop))
        ss->set_elt_property (no_staff_support_scm_sym, SCM_BOOL_T);
 
       p->set_staff_side (ss);
       ss->set_elt_property (script_priority_scm_sym, priority);
        ss->set_elt_property (no_staff_support_scm_sym, SCM_BOOL_T);
 
       p->set_staff_side (ss);
       ss->set_elt_property (script_priority_scm_sym, priority);
-      if (padding)
-       ss->set_elt_property (padding_scm_sym, gh_double2scm(padding));
+      if (SCM_NUMBERP (paddingprop))
+       ss->set_elt_property (padding_scm_sym, paddingprop);
+  
+  
       script_p_arr_.push (p);
       staff_side_p_arr_.push (ss);
       
       script_p_arr_.push (p);
       staff_side_p_arr_.push (ss);
       
@@ -152,7 +153,5 @@ Script_engraver::do_post_move_processing()
   script_req_l_arr_.clear();
 }
 
   script_req_l_arr_.clear();
 }
 
-
-
 ADD_THIS_TRANSLATOR(Script_engraver);
 
 ADD_THIS_TRANSLATOR(Script_engraver);
 
index 99fc66a9079781895152b86121988dfa59511576..35e24dab23330e86b21c71bbbbbf2ff021717413 100644 (file)
@@ -31,8 +31,8 @@ Separating_line_group_engraver::do_creation_processing ()
 void
 Separating_line_group_engraver::do_removal_processing ()
 {
 void
 Separating_line_group_engraver::do_removal_processing ()
 {
-  Scalar sz (get_property ("postBreakPadding", 0));
-  if (!sz.empty_b () && sz.isnum_b ())
+  SCM sz (get_property ("postBreakPadding", 0));
+  if (SCM_NUMBERP(sz))
     {
       sep_span_p_->padding_f_ = Real(sz);
     }
     {
       sep_span_p_->padding_f_ = Real(sz);
     }
index 7f1ff9756001fb1dd7111891046334f6da62dc82..1faaa67c13663a43eb60d64de06c0c13c034d44a 100644 (file)
@@ -31,7 +31,7 @@ Simultaneous_music_iterator::construct_children()
   Cons<Music> *i = (sim->music_p_list_p_) ? sim->music_p_list_p_->head_ : 0;
   for (; i;  i = i->next_, j++)
     {
   Cons<Music> *i = (sim->music_p_list_p_) ? sim->music_p_list_p_->head_ : 0;
   for (; i;  i = i->next_, j++)
     {
-      Music_iterator * mi = static_get_iterator_p (i->car_, playback_b_);
+      Music_iterator * mi = static_get_iterator_p (i->car_);
 
       /* if separate_contexts_b_ is set, create a new context with the
         number number as name */
 
       /* if separate_contexts_b_ is set, create a new context with the
         number number as name */
index 6a3a72f05fe1f85ab9e77c19a33188b6a4d7dffc..0ac32e8d347fc1cf2b1af134a732e9a38c19eb54 100644 (file)
@@ -34,7 +34,7 @@ Slur_engraver::set_melisma (bool m)
   if (!where)
     where = daddy_trans_l_;
     
   if (!where)
     where = daddy_trans_l_;
     
-  daddy_trans_l_->set_property ("slurMelismaBusy", m ? "1" :"0");
+  daddy_trans_l_->set_property ("slurMelismaBusy", m ? SCM_BOOL_T :SCM_BOOL_F);
 }
 
 void
 }
 
 void
@@ -58,7 +58,9 @@ Slur_engraver::do_removal_processing ()
       typeset_element (slur_l_stack_[i]);
     }
   slur_l_stack_.clear ();
       typeset_element (slur_l_stack_[i]);
     }
   slur_l_stack_.clear ();
-  if (!get_property ("weAreGraceContext",0).to_bool ())
+  SCM wg = get_property ("weAreGraceContext",0);
+  bool wgb = gh_boolean_p (wg) && gh_scm2bool (wgb);
+  if (!wgb)
     for (int i=0; i < requests_arr_.size(); i++)
       {
        requests_arr_[i]->warning (_ ("unterminated slur"));
     for (int i=0; i < requests_arr_.size(); i++)
       {
        requests_arr_[i]->warning (_ ("unterminated slur"));
@@ -89,9 +91,9 @@ Slur_engraver::do_process_requests()
          // push a new slur onto stack.
          //(use temp. array to wait for all slur STOPs)
          Slur * s_p =new Slur;
          // push a new slur onto stack.
          //(use temp. array to wait for all slur STOPs)
          Slur * s_p =new Slur;
-         Scalar prop = get_property ("slurDash", 0);
-         if (prop.isnum_b ()) 
-           s_p->set_elt_property (dashed_scm_sym, gh_int2scm(prop));
+         SCM prop = get_property ("slurDash", 0);
+         if (SCM_NUMBERP(prop)) 
+           s_p->set_elt_property (dashed_scm_sym, prop);
 
          
          requests_arr_.push (slur_req_l);
 
          
          requests_arr_.push (slur_req_l);
@@ -106,14 +108,14 @@ Slur_engraver::do_process_requests()
 void
 Slur_engraver::do_pre_move_processing()
 {
 void
 Slur_engraver::do_pre_move_processing()
 {
-  Scalar dir (get_property ("slurVerticalDirection", 0));
-  Scalar dir2 (get_property ("verticalDirection", 0));
+  SCM dir (get_property ("slurVerticalDirection", 0));
+  SCM dir2 (get_property ("verticalDirection", 0));
 
   Direction slurdir = CENTER;
 
   Direction slurdir = CENTER;
-  if (dir.length_i () && dir.isnum_b ())
-    slurdir = (Direction) sign (int(dir));
-  else if (dir2.length_i () && dir2.isnum_b ())
-    slurdir = (Direction) sign (int (dir2));
+  if (SCM_NUMBERP(dir))
+    slurdir = to_dir (dir);
+  else if (gh_number_p (dir2))
+    slurdir = to_dir (dir2);
   
   for (int i = 0; i < end_slur_l_arr_.size(); i++)
     {
   
   for (int i = 0; i < end_slur_l_arr_.size(); i++)
     {
@@ -127,7 +129,8 @@ void
 Slur_engraver::do_post_move_processing()
 {
   new_slur_req_l_arr_.clear();
 Slur_engraver::do_post_move_processing()
 {
   new_slur_req_l_arr_.clear();
-  if (get_property ("automaticMelismata",0).to_bool ())
+  SCM m = get_property ("automaticMelismata",0);
+  if (gh_boolean_p (m) && gh_scm2bool (m))
     {
       set_melisma (slur_l_stack_.size ());
     }
     {
       set_melisma (slur_l_stack_.size ());
     }
index c8582e8abb8239819af9ecdeda4d3adcb29d231d..9e3b16d827cf03ec7565db98cdc067f556c6fa0e 100644 (file)
@@ -14,7 +14,7 @@
  */
 
 #include "slur.hh"
  */
 
 #include "slur.hh"
-#include "scalar.hh"
+
 #include "lookup.hh"
 #include "paper-def.hh"
 #include "note-column.hh"
 #include "lookup.hh"
 #include "paper-def.hh"
 #include "note-column.hh"
@@ -243,11 +243,11 @@ Slur::do_post_processing ()
     }
   while (flip (&d) != LEFT);
 
     }
   while (flip (&d) != LEFT);
 
-  bool cross_count =  cross_staff_count ();
+  int cross_count =  cross_staff_count ();
   bool interstaff_b = (0 < cross_count) && (cross_count < encompass_arr_.size ());
 
   Drul_array<Offset> info_drul;
   bool interstaff_b = (0 < cross_count) && (cross_count < encompass_arr_.size ());
 
   Drul_array<Offset> info_drul;
-  Interval interstaff_interval;
+  Drul_array<Real> interstaff_interval;
 
   do
     {
 
   do
     {
@@ -257,7 +257,7 @@ Slur::do_post_processing ()
     }
   while (flip (&d) != LEFT);
   
     }
   while (flip (&d) != LEFT);
   
-  Real interstaff_f = interstaff_interval.length ();
+  Real interstaff_f = interstaff_interval[RIGHT] - interstaff_interval[LEFT];
 
   if (fix_broken_b)
     {
 
   if (fix_broken_b)
     {
index 706d89e990411549a4d5d182e33859e79d5e48bb..bddeeb9543f3b02ce8d9925d72ef1db4928ef3bc 100644 (file)
@@ -41,16 +41,17 @@ Staff_margin_engraver::acknowledge_element (Score_element_info inf)
     return;
 
 
     return;
 
 
-  String long_str = get_property ("instrument", 0);
-  String short_str = get_property ("instr", 0);
+  SCM long_name = get_property ("instrument", 0);
+  SCM short_name = get_property ("instr", 0);
+
   if (now_mom () > Moment (0))
   if (now_mom () > Moment (0))
-    long_str = short_str;
+    long_name = short_name;
 
 
-  if (long_str.empty_b ())
+  if (gh_string_p (long_name))
     return;
 
   create_items (0);
     return;
 
   create_items (0);
-  text_p_->text_str_ = long_str;
+  text_p_->text_str_ = ly_scm2string (long_name);
   staff_side_p_->dir_ = LEFT;
   Bar_script_engraver::do_acknowledge_element (i);
 
   staff_side_p_->dir_ = LEFT;
   Bar_script_engraver::do_acknowledge_element (i);
 
index 927285702be46cd4ef00e8c357ff03ce91492a45..853af03f630dca484aec616446067ea1f9116b4f 100644 (file)
@@ -96,21 +96,17 @@ String
 Staff_performer::new_instrument_str () 
 { 
   // mustn't ask Score for instrument: it will return piano!
 Staff_performer::new_instrument_str () 
 { 
   // mustn't ask Score for instrument: it will return piano!
-  String str = get_property ("midiInstrument", 0);
-  if (!str.length_i ())
-    str = get_property ("instrument", 0);
-  if (str == instrument_str_)
+  SCM minstr = get_property ("midiInstrument", 0);
+
+  if (!gh_string_p(minstr))
+    minstr = get_property ("instrument", 0);
+
+  if (ly_scm2string (minstr) == instrument_str_)
     return "";
 
     return "";
 
-  instrument_str_ = str;
+  instrument_str_ = ly_scm2string (minstr);
 
   return instrument_str_;
 
   return instrument_str_;
-
-/* ugh, but can 't
-  if (properties_dict_.elem_b ("instrument"))
-    return properties_dict_["instrument"];
-  return "";
-*/
 }
 
 void 
 }
 
 void 
diff --git a/lily/staff-switching-translator.cc b/lily/staff-switching-translator.cc
deleted file mode 100644 (file)
index 1d1809e..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/*   
-  staff-switching-translator.cc -- implement Staff_switching_translator
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-#include "engraver.hh"
-#include "interpretation-context-handle.hh"
-#include "drul-array.hh"
-#include "engraver-group-engraver.hh"
-#include "musical-request.hh"
-
-class Staff_switching_translator : public Engraver
-{
-  Interpretation_context_handle my_voice_;
-  Drul_array<Interpretation_context_handle> staff_handle_drul_;
-
-  int switch_pitch_i_ ;
-protected:
-  virtual bool do_try_music (Music* m);
-  virtual void do_creation_processing ();
-
-  void default_voice (Direction);
-public:
-  Staff_switching_translator ();
-  VIRTUAL_COPY_CONS(Translator);
-};
-
-Staff_switching_translator::Staff_switching_translator ()
-{
-  switch_pitch_i_ =0;
-}
-
-void
-Staff_switching_translator::do_creation_processing ()
-{
-  Translator_group * daddy =daddy_grav_l (); // staff switching context
-
-
-  Scalar pit = get_property ("switchPitch", 0);
-  if (pit.isnum_b ())
-    switch_pitch_i_ = int (pit);
-  Scalar s = get_property("staffContextName", 0);
-  Scalar up = get_property ("upStaffName",0);
-  Scalar down = get_property ("downStaffName",0);
-  if (!up.length_i()) up = "upper";
-  if (!down.length_i()) up = "lower";  
-  
-  staff_handle_drul_[UP].set_translator (daddy->daddy_trans_l_ -> find_create_translator_l (s, up));
-  staff_handle_drul_[DOWN].set_translator (daddy->daddy_trans_l_-> find_create_translator_l (s, down));  
-
-
-  staff_handle_drul_[DOWN].report_to_l ()->set_property ("defaultClef", "bass");
-
-  default_voice (UP);
-}
-  
-
-void
-Staff_switching_translator::default_voice (Direction d)
-{
-  Scalar s = get_property ("acceptorName",0);
-  my_voice_.set_translator (staff_handle_drul_[d].report_to_l ()->find_create_translator_l ("Thread", daddy_trans_l_->id_str_));
-}
-
-bool
-Staff_switching_translator::do_try_music (Music*m)
-{
-  if (Note_req*nr = dynamic_cast<Note_req*> (m))
-    {
-      Direction staff =  (nr->pitch_.semitone_pitch () >= switch_pitch_i_)
-       ? UP
-       : DOWN;
-
-
-      Translator_group * mv = my_voice_.report_to_l ();
-      Translator_group *dest_staff =staff_handle_drul_[staff].report_to_l ();
-      Scalar s = get_property ("switcherName", 0);
-      
-      while (mv && mv->type_str_ != s)
-       {
-         mv = mv -> daddy_trans_l_;
-       }
-
-      if (!mv)
-       default_voice (staff);
-
-      if (mv->daddy_trans_l_  != dest_staff)
-       {
-         mv->daddy_trans_l_->remove_translator_p (mv);
-         dest_staff->add_translator (mv);
-       }
-    }
-  
-  return my_voice_.try_music (m);
-}
-
-ADD_THIS_TRANSLATOR(Staff_switching_translator);
index b665200f35c84388ec995e939319e8b9ae95af3d..93e41b28ab3733c6b73911f1a008dff78fb7df6e 100644 (file)
@@ -34,16 +34,16 @@ Staff_symbol_engraver::do_creation_processing()
 void
 Staff_symbol_engraver::do_removal_processing()
 {
 void
 Staff_symbol_engraver::do_removal_processing()
 {
-  Scalar l (get_property ("numberOfStaffLines", 0));
-  if (l.isnum_b ())
+  SCM l (get_property ("numberOfStaffLines", 0));
+  if (SCM_NUMBERP(l))
     {
     {
-      span_p_->no_lines_i_ = l;
+      span_p_->no_lines_i_ = gh_scm2int (l);
     }
 
     }
 
-  Scalar sz (get_property ("staffLineLeading", 0));
-  if (!sz.empty_b () && sz.isnum_b ())
+  SCM sz (get_property ("staffLineLeading", 0));
+  if (SCM_NUMBERP(sz))
     {
     {
-      span_p_->staff_line_leading_f_ = Real(sz);
+      span_p_->staff_line_leading_f_ = gh_scm2double (sz);
     }
   else
     {
     }
   else
     {
index 1679e52441275bdab90ca4e37760835274188471..d48fa3925f3f0db14beaafa23a510d69a3780219 100644 (file)
@@ -28,10 +28,10 @@ Stem_engraver::Stem_engraver()
 void
 Stem_engraver::do_creation_processing ()
 {
 void
 Stem_engraver::do_creation_processing ()
 {
-  Scalar prop = get_property ("abbrev", 0);
-  if (prop.isnum_b ()) 
+  SCM prop = get_property ("abbrev", 0);
+  if (SCM_NUMBERP(prop)) 
     {
     {
-      default_abbrev_i_  = prop;
+      default_abbrev_i_  = gh_scm2int (prop);
     }
 }
 
     }
 }
 
@@ -96,38 +96,43 @@ Stem_engraver::do_pre_move_processing()
 
   if (stem_p_)
     {
 
   if (stem_p_)
     {
-      Scalar prop = get_property ("verticalDirection", 0);
-      Direction dir = prop.isnum_b () ? (Direction)int(prop) : CENTER;
-      if (dir)
+      SCM prop = get_property ("verticalDirection", 0);
+      if (SCM_NUMBERP(prop))
        {
        {
-         stem_p_->dir_ = dir;
+         stem_p_->dir_ = to_dir (prop);
          stem_p_->set_elt_property (dir_forced_scm_sym, SCM_BOOL_T);
        }
 
       Translator_group* which;
       prop = get_property ("stemLeftBeamCount", &which);
          stem_p_->set_elt_property (dir_forced_scm_sym, SCM_BOOL_T);
        }
 
       Translator_group* which;
       prop = get_property ("stemLeftBeamCount", &which);
-      if (prop.isnum_b ())
+      if (SCM_NUMBERP(prop))
        {
        {
-         stem_p_->beams_i_drul_[LEFT] = prop;
-         ((Translator_group*)which)->set_property ("stemLeftBeamCount", "");
+         stem_p_->beams_i_drul_[LEFT] = gh_scm2int (prop);
+         ((Translator_group*)which)->set_property ("stemLeftBeamCount", SCM_UNDEFINED);
        }
       prop = get_property ("stemRightBeamCount", &which);
        }
       prop = get_property ("stemRightBeamCount", &which);
-      if (prop.isnum_b ())
+      if (SCM_NUMBERP(prop))
        {
        {
-         stem_p_->beams_i_drul_[RIGHT] = prop;
-         ((Translator_group*)which)->set_property ("stemRightBeamCount", "");
+         stem_p_->beams_i_drul_[RIGHT] = gh_scm2int (prop);
+         ((Translator_group*)which)->set_property ("stemRightBeamCount", SCM_UNDEFINED);
        }
 
       prop = get_property ("stemLength", 0);
        }
 
       prop = get_property ("stemLength", 0);
-      if (prop.isnum_b ())
+      if (SCM_NUMBERP(prop))
        {
        {
-         stem_p_->set_elt_property (length_scm_sym, gh_double2scm (prop.to_f ()));
+         stem_p_->set_elt_property (length_scm_sym, prop);
        }
 
       prop = get_property ("stemStyle", 0);
        }
 
       prop = get_property ("stemStyle", 0);
-      if (prop.to_bool ())
+      if (gh_string_p (prop))
        {
        {
-         stem_p_->set_elt_property (style_scm_sym, ly_ch_C_to_scm (prop.ch_C()));
+         stem_p_->set_elt_property (style_scm_sym, prop);
+       }
+      
+      prop = get_property ("noStemExtend", 0);
+      if (gh_boolean_p (prop) && gh_scm2bool (prop))
+       {
+         stem_p_->set_elt_property (no_stem_extend_scm_sym, prop);
        }
       
       typeset_element(stem_p_);
        }
       
       typeset_element(stem_p_);
index 4a9e06e05ed3f910e5a074ba0a357139203467cd..f555ab0a6b4010b1febda1c8f4b5984e38ab44f0 100644 (file)
@@ -35,7 +35,6 @@ Stem_info::Stem_info (Stem*s, int mult)
   SCM bd = stem_l_->remove_elt_property (beam_dir_scm_sym);
   
   beam_dir_ = gh_scm2int (SCM_CDR(bd));
   SCM bd = stem_l_->remove_elt_property (beam_dir_scm_sym);
   
   beam_dir_ = gh_scm2int (SCM_CDR(bd));
-  interstaff_f_ = 0;
 
   Paper_def* paper_l = stem_l_->paper_l ();
   Real internote_f = stem_l_->staff_line_leading_f ()/2;
 
   Paper_def* paper_l = stem_l_->paper_l ();
   Real internote_f = stem_l_->staff_line_leading_f ()/2;
@@ -53,6 +52,8 @@ Stem_info::Stem_info (Stem*s, int mult)
   idealy_f_ *= beam_dir_;
 
   bool grace_b = stem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F;
   idealy_f_ *= beam_dir_;
 
   bool grace_b = stem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F;
+  bool no_extend_b = stem_l_->get_elt_property (no_stem_extend_scm_sym) 
+    != SCM_BOOL_F;
 
   int stem_max = (int)rint(paper_l->get_var ("stem_max"));
   String type_str = grace_b ? "grace_" : "";
 
   int stem_max = (int)rint(paper_l->get_var ("stem_max"));
   String type_str = grace_b ? "grace_" : "";
@@ -85,7 +86,7 @@ Stem_info::Stem_info (Stem*s, int mult)
        than middle staffline, just as normal stems.
        
       */
        than middle staffline, just as normal stems.
        
       */
-      if (!grace_b)
+      if (!grace_b && !no_extend_b)
        {
          //highest beam of (UP) beam must never be lower than middle staffline
          miny_f_ = miny_f_ >? 0;
        {
          //highest beam of (UP) beam must never be lower than middle staffline
          miny_f_ = miny_f_ >? 0;
@@ -116,9 +117,9 @@ Stem_info::Stem_info (Stem*s, int mult)
   // interstaff beam
   Beam* beam_l = stem_l_->beam_l_;
   
   // interstaff beam
   Beam* beam_l = stem_l_->beam_l_;
   
-  Real is = calc_interstaff_dist (stem_l_, beam_l);
-  idealy_f_ += is* beam_dir_;
-  miny_f_ += is * beam_dir_;
-  maxy_f_ += is * beam_dir_;
+  interstaff_f_ = calc_interstaff_dist (stem_l_, beam_l) / internote_f;
+  idealy_f_ += interstaff_f_* beam_dir_;
+  miny_f_   += interstaff_f_ * beam_dir_;
+  maxy_f_   += interstaff_f_ * beam_dir_;
 }
 
 }
 
index 919969187c70296f81ca8fd6c159298b8376ed66..7c7797a385c9c43c4ec3256776b86fe1c9fc8309 100644 (file)
@@ -201,7 +201,8 @@ Stem::set_default_stemlen ()
   set_stemend ((dir_ > 0) ? head_positions()[BIGGER] + length_f:
               head_positions()[SMALLER] - length_f);
 
   set_stemend ((dir_ > 0) ? head_positions()[BIGGER] + length_f:
               head_positions()[SMALLER] - length_f);
 
-  if (!grace_b && (dir_ * stem_end_f () < 0))
+  bool no_extend_b = get_elt_property (no_stem_extend_scm_sym) != SCM_BOOL_F;
+  if (!grace_b && !no_extend_b && (dir_ * stem_end_f () < 0))
     set_stemend (0);
 }
 
     set_stemend (0);
 }
 
index 1d652e935e618aba1c68bfde772547072bd8773e..9ecc46f43402a598e2565f94702b2014ca585dd7 100644 (file)
@@ -83,8 +83,8 @@ Text_engraver::do_process_requests ()
 
 
 
 
 
 
-      Scalar axisprop = get_property ("scriptHorizontal",0);
-      if (axisprop.to_bool ())
+      SCM axisprop = get_property ("scriptHorizontal",0);
+      if (gh_boolean_p (axisprop) && gh_scm2bool (axisprop))
        {
          ss->axis_ = X_AXIS;
          text->set_parent (ss, Y_AXIS);
        {
          ss->axis_ = X_AXIS;
          text->set_parent (ss, Y_AXIS);
@@ -100,21 +100,21 @@ Text_engraver::do_process_requests ()
       
       if (r->style_str_.empty_b ())
        {
       
       if (r->style_str_.empty_b ())
        {
-         Scalar p (get_property ("textStyle", 0));
-         if (p.length_i ())
-           text->style_str_ = p;
+         SCM p (get_property ("textStyle", 0));
+         if (gh_string_p (p))
+           text->style_str_ = ly_scm2string(p);
        }
       else
        text->style_str_ = r->style_str_;
       
        }
       else
        text->style_str_ = r->style_str_;
       
-      Scalar padding = get_property ("textScriptPadding", 0);
-      if (padding.length_i() && padding.isnum_b ())
+      SCM padding = get_property ("textScriptPadding", 0);
+      if (SCM_NUMBERP(padding))
        {
        {
-         ss->set_elt_property (padding_scm_sym, gh_double2scm(Real(padding)));
+         ss->set_elt_property (padding_scm_sym, padding);
        }
 
        }
 
-      Scalar empty = get_property ("textEmptyDimension", 0);
-      if (empty.to_bool ())
+      SCM empty = get_property ("textEmptyDimension", 0);
+      if (gh_boolean_p (empty) && gh_scm2bool (empty))
        {
          text->set_empty (true, X_AXIS);
        }
        {
          text->set_empty (true, X_AXIS);
        }
index 4d3c8ca01c37c4ca482b3250610afef6a2027011..946f8e93671c96deea57b417a8ef1174229126b4 100644 (file)
@@ -26,7 +26,9 @@ Tie_engraver::do_try_music (Music *m)
   if (Tie_req * c = dynamic_cast<Tie_req*> (m))
     {
       req_l_ = c;
   if (Tie_req * c = dynamic_cast<Tie_req*> (m))
     {
       req_l_ = c;
-      if (get_property ("automaticMelismata",0).to_bool ())
+      SCM m = get_property ("automaticMelismata",0);
+      bool am = gh_boolean_p (m) &&gh_scm2bool (m);
+      if (am)
        {
          set_melisma (true);
        }
        {
          set_melisma (true);
        }
@@ -43,7 +45,7 @@ Tie_engraver::set_melisma (bool m)
   if (!where)
     where = daddy_trans_l_;
     
   if (!where)
     where = daddy_trans_l_;
     
-  daddy_trans_l_->set_property ("tieMelismaBusy", m ? "1" :"0");
+  daddy_trans_l_->set_property ("tieMelismaBusy", m ? SCM_BOOL_T : SCM_BOOL_F);
 }
 
 void
 }
 
 void
@@ -76,89 +78,55 @@ Tie_engraver::do_process_requests ()
 void
 Tie_engraver::process_acknowledged ()
 {
 void
 Tie_engraver::process_acknowledged ()
 {
-  bool old_behavior = get_property ("oldTieBehavior", 0).to_bool ();
-  
   if (req_l_)
     {
   if (req_l_)
     {
-
-      /*
-       JUNKME!
-       */
-      if (old_behavior)
+      now_heads_.sort (CHead_melodic_tuple::pitch_compare);
+      stopped_heads_.sort(CHead_melodic_tuple::pitch_compare);
+      int i=0;
+      int j=0;
+      int tie_count=0;
+      while  ( i < now_heads_.size () && j < stopped_heads_.size ())
        {
        {
-         if (now_heads_.size () != stopped_heads_.size ())
-           {
-             req_l_->warning (_ ("unequal number of note heads for tie"));
-           }
-         int sz = now_heads_.size () <? stopped_heads_.size ();
-
-         /* hmm. Should do something more sensible.
-       because, we assume no more noteheads come along after the 1st pass.
-         */
-         if (sz <= tie_p_arr_.size ())
-           return;
+         int comp
+           = Musical_pitch::compare (now_heads_[i].req_l_->pitch_ ,
+                                     stopped_heads_[j].req_l_->pitch_);
 
 
-         now_heads_.sort (CHead_melodic_tuple::pitch_compare);
-         stopped_heads_.sort(CHead_melodic_tuple::pitch_compare);
-
-         for (int i=0; i < sz; i++)
+         if (comp)
            {
            {
-             Tie * p = new Tie;
-             p->set_head (LEFT, stopped_heads_[i].head_l_);
-             p->set_head (RIGHT, now_heads_[i].head_l_);
-             tie_p_arr_.push (p);
-             announce_element (Score_element_info (p, req_l_));
+             (comp < 0) ? i ++ : j++;
+             continue;
            }
            }
-       }
-      else
-       {
-         now_heads_.sort (CHead_melodic_tuple::pitch_compare);
-         stopped_heads_.sort(CHead_melodic_tuple::pitch_compare);
-         int i=0;
-         int j=0;
-         int tie_count=0;
-         while  ( i < now_heads_.size () && j < stopped_heads_.size ())
+         else
            {
            {
-             int comp
-               = Musical_pitch::compare (now_heads_[i].req_l_->pitch_ ,
-                                         stopped_heads_[j].req_l_->pitch_);
+             tie_count ++;
 
 
-             if (comp)
+             /* don't go around recreating ties that were already
+                made. Not infallible. Due to reordering in sort (),
+                we will make the wrong ties when noteheads are
+                added.  */
+             if (tie_count > tie_p_arr_.size ())
                {
                {
-                 (comp < 0) ? i ++ : j++;
-                 continue;
+                 Tie * p = new Tie;
+                 p->set_head (LEFT, stopped_heads_[j].head_l_);
+                 p->set_head (RIGHT, now_heads_[i].head_l_);
+                 tie_p_arr_.push (p);
+                 announce_element (Score_element_info (p, req_l_));
                }
                }
-             else
-               {
-                 tie_count ++;
-
-                 /* don't go around recreating ties that were already
-                 made. Not infallible. Due to reordering in sort (),
-                 we will make the wrong ties when noteheads are
-                 added.  */
-                 if (tie_count > tie_p_arr_.size ())
-                   {
-                     Tie * p = new Tie;
-                     p->set_head (LEFT, stopped_heads_[j].head_l_);
-                     p->set_head (RIGHT, now_heads_[i].head_l_);
-                     tie_p_arr_.push (p);
-                     announce_element (Score_element_info (p, req_l_));
-                   }
-                 i++;
-                 j++;
+             i++;
+             j++;
 
 
-               }
            }
            }
+       }
 
 
-         if (!tie_p_arr_.size ())
-           {
-             req_l_->warning (_ ("No ties were created!"));
-           }
-         
+      if (!tie_p_arr_.size ())
+       {
+         req_l_->warning (_ ("No ties were created!"));
        }
        }
+         
     }
 }
 
     }
 }
 
+
 void
 Tie_engraver::do_pre_move_processing ()
 {
 void
 Tie_engraver::do_pre_move_processing ()
 {
@@ -168,14 +136,14 @@ Tie_engraver::do_pre_move_processing ()
     }
   now_heads_.clear ();
 
     }
   now_heads_.clear ();
 
-  Scalar dir (get_property ("tieVerticalDirection", 0));
-  Scalar dir2 (get_property ("verticalDirection", 0));
+  SCM dir (get_property ("tieVerticalDirection", 0));
+  SCM dir2 (get_property ("verticalDirection", 0));
 
   Direction tie_dir = CENTER;
 
   Direction tie_dir = CENTER;
-  if (dir.length_i () && dir.isnum_b ())
-    tie_dir = (Direction) sign (int(dir));
-  else if (dir2.length_i () && dir2.isnum_b ())
-    tie_dir = (Direction) sign (int (dir2));
+  if (SCM_NUMBERP(dir))
+    tie_dir = to_dir (dir);
+  else if (isdir_b (dir2))
+    tie_dir = to_dir (dir2);
   
   for (int i=0; i<  tie_p_arr_.size (); i++)
    {
   
   for (int i=0; i<  tie_p_arr_.size (); i++)
    {
@@ -188,7 +156,8 @@ Tie_engraver::do_pre_move_processing ()
 void
 Tie_engraver::do_post_move_processing ()
 {
 void
 Tie_engraver::do_post_move_processing ()
 {
-  if (get_property ("automaticMelismata",0).to_bool ())
+  SCM m = get_property ("automaticMelismata",0);
+  if (gh_boolean_p (m) && gh_scm2bool (m))
     {
       set_melisma (false);
     }
     {
       set_melisma (false);
     }
index a71769709fe8b67c9a9786d95fac946643669246..d9051d59aee360913ab2f5cc3aab0e03233c1ea2 100644 (file)
@@ -54,10 +54,10 @@ Time_signature_engraver::do_pre_move_processing()
 {
   if (time_signature_p_) 
     {
 {
   if (time_signature_p_) 
     {
-      Scalar sigstyle = get_property ("timeSignatureStyle", 0);
-      if (sigstyle.length_i ())
+      SCM sigstyle = get_property ("timeSignatureStyle", 0);
+      if (gh_string_p (sigstyle))
        {
        {
-         time_signature_p_->time_sig_type_str_ = sigstyle;
+         time_signature_p_->time_sig_type_str_ = ly_scm2string (sigstyle);
        }
 
       typeset_element (time_signature_p_);
        }
 
       typeset_element (time_signature_p_);
index 75bbaa2ee29dbe9ca1c73479f4d6cda762f71f22..a4960abc7ba2bc32933626d4a73c91a77b84fb87 100644 (file)
@@ -7,7 +7,7 @@
   
  */
 
   
  */
 
-#include "scalar.hh"
+
 #include "molecule.hh"
 #include "time-signature.hh"
 #include "paper-def.hh"
 #include "molecule.hh"
 #include "time-signature.hh"
 #include "paper-def.hh"
index 3fa208f15d6269026d7a76f5408a104a6f4fcbe1..29ee1d6d8c508f29f03e69e1f2c4e30a432a0e76 100644 (file)
@@ -53,12 +53,15 @@ Timing_engraver::which_bar ()
       if (!now_mom ())
        return "|";
 
       if (!now_mom ())
        return "|";
 
-      Scalar nonauto = get_property ("barNonAuto", 0);
-      if (!nonauto.to_bool ())
+      SCM nonauto = get_property ("barNonAuto", 0);
+      if (!gh_boolean_p (nonauto) && gh_scm2bool (nonauto))
        {
        {
-         Scalar always = get_property ("barAlways", 0);
-         if (!time_.whole_in_measure_ || always.to_bool ())
-           return get_property ("defaultBarType" ,0);
+         SCM always = get_property ("barAlways", 0);
+         if (!time_.whole_in_measure_ || gh_boolean_p (always) && gh_scm2bool (always))
+           {
+             SCM def=get_property ("defaultBarType" ,0);
+             return (gh_string_p (def))? ly_scm2string (def) : "";
+           }
        }
       return "";
     }
        }
       return "";
     }
index 92db7ee737387df5646a935d5127c23f979eb289..82ab9dc0be63c7e1f4569088eac10ca0861239a3 100644 (file)
@@ -94,14 +94,12 @@ Timing_translator::do_process_requests()
 
   Translator_group * tr=0;
 
 
   Translator_group * tr=0;
 
-  Scalar barn = get_property ("currentBarNumber", &tr);
-  if (!barn.empty_b () && barn.isnum_b ())
+  SCM barn = get_property ("currentBarNumber", &tr);
+  if (SCM_NUMBERP(barn))
     {
     {
-      time_.bars_i_ = int(barn);
-      tr->set_property ("currentBarNumber", "");
+      time_.bars_i_ = gh_scm2int (barn);
+      tr->set_property ("currentBarNumber", SCM_UNDEFINED);
     }
     }
-  
-
 }
 
 
 }
 
 
@@ -119,7 +117,8 @@ Timing_translator::do_pre_move_processing()
   while (!global_l);
 
   /* allbars == ! skipbars */
   while (!global_l);
 
   /* allbars == ! skipbars */
-  bool allbars = ! get_property ("skipBars", 0).to_bool ();
+  SCM sb = get_property ("skipBars", 0);
+  bool allbars = !(gh_boolean_p (sb)&&gh_scm2bool (sb));
 
   // urg: multi bar rests: should always process whole of first bar?
   if (!time_.cadenza_b_ && allbars)
 
   // urg: multi bar rests: should always process whole of first bar?
   if (!time_.cadenza_b_ && allbars)
index 8811d85d9b0da17d733ee745a2c4ca15550ab83d..42e43643490e59a3c354fc2ca8f99d22f484b27a 100644 (file)
@@ -9,12 +9,12 @@
 #include "translation-property.hh"
 #include "debug.hh"
 
 #include "translation-property.hh"
 #include "debug.hh"
 
-
-
 void
 Translation_property::do_print () const
 {
 #ifndef NPRINT
 void
 Translation_property::do_print () const
 {
 #ifndef NPRINT
-  DEBUG_OUT << "." << var_str_ << " = " << value_;
+  DEBUG_OUT << "." << var_str_ << " = " ;
+  if (flower_dstream && !flower_dstream->silent_b ("Translation_property"))
+    ly_display_scm (value_);
 #endif
 }
 #endif
 }
index fc4ca2a44d6ea8814ca68c0544a834ce32e08fe7..cffdaf8905afa3a7896f97778785fafd925b4c18 100644 (file)
@@ -10,7 +10,7 @@
 #include "translator-group.hh"
 #include "translator.hh"
 #include "debug.hh"
 #include "translator-group.hh"
 #include "translator.hh"
 #include "debug.hh"
-#include "rational.hh"
+#include "moment.hh"
 #include "dictionary-iter.hh"
 
 #include "killing-cons.tcc"
 #include "dictionary-iter.hh"
 
 #include "killing-cons.tcc"
@@ -373,10 +373,8 @@ Translator_group::do_print() const
 #ifndef NPRINT
   if (!flower_dstream)
     return ;
 #ifndef NPRINT
   if (!flower_dstream)
     return ;
-  for (Dictionary_iter<Scalar> i (properties_dict_); i.ok (); i++)
-    {
-      DEBUG_OUT << i.key () << "=" << i.val () << '\n';
-    }
+
+  gh_display (properties_dict_.self_scm_);
   if (status == ORPHAN)
     {
       DEBUG_OUT << "consists of: ";
   if (status == ORPHAN)
     {
       DEBUG_OUT << "consists of: ";
@@ -449,29 +447,29 @@ Translator_group::do_add_processing ()
     }
 }
 
     }
 }
 
-Scalar
+SCM
 Translator_group::get_property (String id,
                                Translator_group **where_l) const
 {
 Translator_group::get_property (String id,
                                Translator_group **where_l) const
 {
-  if (properties_dict_.elem_b (id))
+  SCM  sym = ly_symbol (id);
+  if (properties_dict_.elem_b (sym))
     {
       if (where_l)
        *where_l = (Translator_group*) this; // ugh
     {
       if (where_l)
        *where_l = (Translator_group*) this; // ugh
-      return properties_dict_[id];
+      return properties_dict_[sym];
     }
 
     }
 
-#if 1
   if (daddy_trans_l_)
     return daddy_trans_l_->get_property (id, where_l);
   if (daddy_trans_l_)
     return daddy_trans_l_->get_property (id, where_l);
-#endif
   
   if (where_l)
     *where_l = 0;
   
   if (where_l)
     *where_l = 0;
-  return "";
+
+  return SCM_UNDEFINED;
 }
 
 void
 }
 
 void
-Translator_group::set_property (String id, Scalar val)
+Translator_group::set_property (String id, SCM val)
 {
 {
-  properties_dict_[id] = val;
+  properties_dict_[ly_symbol (id)] = val;
 }
 }
index a5a3b68d51238b5843b6dfaba96c9e958f2b3246..218a8c142339f7c83eca4a5c637919c899888827 100644 (file)
@@ -11,7 +11,7 @@
 #include "debug.hh"
 #include "translator-group.hh"
 
 #include "debug.hh"
 #include "translator-group.hh"
 
-#include "rational.hh"
+#include "moment.hh"
 
 char const*
 Translator::name() const
 
 char const*
 Translator::name() const
@@ -163,7 +163,7 @@ Translator::output_def_l () const
   return output_def_l_;
 }
 
   return output_def_l_;
 }
 
-Scalar
+SCM
 Translator::get_property (String id, Translator_group **where_l) const
 {
   return daddy_trans_l_->get_property (id, where_l);
 Translator::get_property (String id, Translator_group **where_l) const
 {
   return daddy_trans_l_->get_property (id, where_l);
index c067169a8c4aeb906470d2fa99c291e91d44e768..ce9c2cd2de27ee75670d9f0b0b55be97e4629f32 100644 (file)
@@ -35,13 +35,13 @@ void
 Tuplet_engraver::do_process_requests ()
 {
   int dir = 0;
 Tuplet_engraver::do_process_requests ()
 {
   int dir = 0;
-  Scalar prop = get_property ("tupletDirection", 0);
-  if (prop.isnum_b())
-    dir = (int)prop;
+  SCM prop = get_property ("tupletDirection", 0);
+  if (isdir_b (prop))
+    dir = to_dir (prop);
   int visibility = 3;
   prop = get_property ("tupletVisibility", 0);
   int visibility = 3;
   prop = get_property ("tupletVisibility", 0);
-  if (prop.isnum_b())
-    visibility = (int)prop;
+  if (SCM_NUMBERP(prop))
+    visibility = gh_scm2int (prop);    // bool ?
 
   for (int i= started_span_p_arr_.size ();
        i < time_scaled_music_arr_.size (); i++)
 
   for (int i= started_span_p_arr_.size ();
        i < time_scaled_music_arr_.size (); i++)
@@ -61,7 +61,9 @@ void
 Tuplet_engraver::acknowledge_element (Score_element_info i)
 {
   bool grace= (i.elem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F);
 Tuplet_engraver::acknowledge_element (Score_element_info i)
 {
   bool grace= (i.elem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F);
-  if (grace != get_property ("weAreGraceContext",0).to_bool ())
+  SCM wg = get_property ("weAreGraceContext",0);
+  bool wgb = gh_boolean_p (wg) && gh_scm2bool (wg);
+  if (grace != wgb)
     return;
   
   if (Note_column *nc = dynamic_cast<Note_column *> (i.elem_l_))
     return;
   
   if (Note_column *nc = dynamic_cast<Note_column *> (i.elem_l_))
index 8ea56cdd42b9cc41fce0d5d20ab298527ec9b3af..234a4f982ac9d02be0e51e9df54e0a9690a29cb3 100644 (file)
@@ -38,6 +38,10 @@ Tuplet_spanner::do_brew_molecule_p () const
   SCM visibility_sym =get_elt_property (tuplet_visibility_scm_sym);
   if (visibility_sym != SCM_BOOL_F)
     {
   SCM visibility_sym =get_elt_property (tuplet_visibility_scm_sym);
   if (visibility_sym != SCM_BOOL_F)
     {
+      /*
+       ARG. Fixme.
+       */
+      
       /* Property values:
         0       show nothing
         1       show number
       /* Property values:
         0       show nothing
         1       show number
index 901d69f80b7ca90201f636c506acecba3cbd79aa..347e929b4afacca896b04f6635ae203154981f6a 100644 (file)
@@ -49,7 +49,7 @@ Unfolded_repeat_iterator::next_element ()
     {
       done_mom_ += mus->repeat_body_p_->length_mom ();
 
     {
       done_mom_ += mus->repeat_body_p_->length_mom ();
 
-      if (full_unfold_b_)
+      if (!mus->volta_fold_b_)
        done_count_ ++;
      
       if (alternative_cons_l_)
        done_count_ ++;
      
       if (alternative_cons_l_)
@@ -57,7 +57,7 @@ Unfolded_repeat_iterator::next_element ()
          current_iter_p_ = get_iterator_p (alternative_cons_l_->car_);
          do_main_b_ = false;
        }
          current_iter_p_ = get_iterator_p (alternative_cons_l_->car_);
          do_main_b_ = false;
        }
-      else if (done_count_ <  mus->repeats_i_ && full_unfold_b_)
+      else if (done_count_ <  mus->repeats_i_ && !mus->volta_fold_b_) 
        {
          current_iter_p_ = get_iterator_p (mus->repeat_body_p_);
          do_main_b_ = true;
        {
          current_iter_p_ = get_iterator_p (mus->repeat_body_p_);
          do_main_b_ = true;
@@ -73,20 +73,20 @@ Unfolded_repeat_iterator::next_element ()
        {
          done_mom_ += alternative_cons_l_->car_->length_mom ();
 
        {
          done_mom_ += alternative_cons_l_->car_->length_mom ();
 
-         if (!full_unfold_b_ || 
+         if (mus->volta_fold_b_ || 
              mus->repeats_i_ - done_count_  < alternative_count_i_)
            alternative_cons_l_ = alternative_cons_l_->next_;
          
          /*
            we've done the main body as well, but didn't go over the other
            increment.  */
              mus->repeats_i_ - done_count_  < alternative_count_i_)
            alternative_cons_l_ = alternative_cons_l_->next_;
          
          /*
            we've done the main body as well, but didn't go over the other
            increment.  */
-         if (full_unfold_b_)
+         if (mus->volta_fold_b_)
            done_count_ ++;
        }
       
       if (done_count_ < mus->repeats_i_ && alternative_cons_l_)
        {
            done_count_ ++;
        }
       
       if (done_count_ < mus->repeats_i_ && alternative_cons_l_)
        {
-         if (!full_unfold_b_)
+         if (mus->volta_fold_b_)
            current_iter_p_ = get_iterator_p (alternative_cons_l_->car_);
          else
            {
            current_iter_p_ = get_iterator_p (alternative_cons_l_->car_);
          else
            {
@@ -114,8 +114,6 @@ void
 Unfolded_repeat_iterator::construct_children ()
 {
   Repeated_music const* mus =dynamic_cast<Repeated_music const*> (music_l_);
 Unfolded_repeat_iterator::construct_children ()
 {
   Repeated_music const* mus =dynamic_cast<Repeated_music const*> (music_l_);
-  full_unfold_b_ = playback_b_ || (!mus->volta_fold_b_);
-  
   alternative_cons_l_ = (mus->alternatives_p_)
     ? mus->alternatives_p_->music_p_list_p_->head_
     : 0;
   alternative_cons_l_ = (mus->alternatives_p_)
     ? mus->alternatives_p_->music_p_list_p_->head_
     : 0;
@@ -167,7 +165,7 @@ void
 Unfolded_repeat_iterator::do_print () const
 {
 #ifndef NPRINT
 Unfolded_repeat_iterator::do_print () const
 {
 #ifndef NPRINT
-  DEBUG_OUT << "count " << done_count_ << "done time " << done_mom_ << '\n';
+  DEBUG_OUT << "count " << done_count_ << "done time " << Rational (done_mom_) << '\n';
   DEBUG_OUT << "current: ";
   current_iter_p_->print();
 #endif
   DEBUG_OUT << "current: ";
   current_iter_p_->print();
 #endif
index 9614f5b359f0e87139798111a37f879472be2537..2497fd4f59cc98d5b056c6b73870417f3be96fe3 100644 (file)
@@ -32,22 +32,22 @@ Vertical_align_engraver::do_creation_processing()
 void
 Vertical_align_engraver::do_removal_processing()
 {
 void
 Vertical_align_engraver::do_removal_processing()
 {
-  Scalar dist (get_property ("maxVerticalAlign", 0));
-  if (dist.length_i () && dist.isnum_b ())
+  SCM dist (get_property ("maxVerticalAlign", 0));
+  if (SCM_NUMBERP(dist))
     {
     {
-      valign_p_->threshold_interval_[BIGGER]  = Real (dist);
+      valign_p_->threshold_interval_[BIGGER]  = gh_scm2double (dist);
     }
 
   dist = get_property ("minVerticalAlign", 0);
     }
 
   dist = get_property ("minVerticalAlign", 0);
-  if (dist.length_i () && dist.isnum_b ())
+  if (SCM_NUMBERP(dist))
     {
     {
-      valign_p_->threshold_interval_[SMALLER]  = Real (dist);
+      valign_p_->threshold_interval_[SMALLER]  = gh_scm2double (dist);
     }
 
   dist = get_property ("alignmentReference",0);
     }
 
   dist = get_property ("alignmentReference",0);
-  if (dist.length_i () && dist.isnum_b ())
+  if (isdir_b (dist))
     {
     {
-      valign_p_->align_dir_ = (Direction)(int)dist;
+      valign_p_->align_dir_ = to_dir (dist);
     }
   valign_p_->set_bounds(RIGHT,get_staff_info().command_pcol_l ());
   typeset_element (valign_p_);
     }
   valign_p_->set_bounds(RIGHT,get_staff_info().command_pcol_l ());
   typeset_element (valign_p_);
index b4051d111a8e5059271082d6437b6980424e052f..c8caeabfd459a5cd7b28a2693715a100523f1a0b 100644 (file)
@@ -6,7 +6,7 @@
 % 16' = S
 %
 
 % 16' = S
 %
 
-\scmfile "accordion-script.scm";
+#(eval-string (ly-gulp-file "accordion-script.scm"))
 
 accDiscant = \script "accDiscant"
 accDiscantF = \script "accDiscantF"
 
 accDiscant = \script "accDiscant"
 accDiscantF = \script "accDiscantF"
index 71b2c55cabe8f78c064bda1a4fab687c900e58f9..c3f20c4886027718c985eef89114a7c304f98c2b 100644 (file)
@@ -1,7 +1,3 @@
-%%In the file ly/auto-beam-settings.ly, all necessary i-iii settings should
-%%be listed, here's a new version with more comments, (hw, please include).
-%%duh
-
 % auto-beam-settings.ly
 % setup for auto-beam engraver
 %
 % auto-beam-settings.ly
 % setup for auto-beam engraver
 %
 %   end beams each 1/2 note
 %   end beams with 16th notes each 1/4 note
 %   end beams with 32th notes each 1/8 note
 %   end beams each 1/2 note
 %   end beams with 16th notes each 1/4 note
 %   end beams with 32th notes each 1/8 note
-time3_2beamAutoEnd = "1/2";
-time3_2beamAutoEnd_16 = "1/4";
-time3_2beamAutoEnd_32 = "1/8";
 
 
-time3_4beamAutoBegin_8 = "1/4";
-time3_4beamAutoEnd = "3/4";
-time3_4beamAutoBegin_16 = "1/16";
-time3_4beamAutoEnd_16 = "1/4";
-%time3_4beamAutoBegin_32 = "1/8";
-time3_4beamAutoEnd_32 = "1/8";
+time3_2beamAutoEnd = #(make-moment 1 2)
+%time3_2beamAutoEnd_16 = #(make-moment 1 4)
+time3_2beamAutoEnd_16 = #(make-moment 1 4)
+time3_2beamAutoEnd_32 = #(begin (make-moment 1 8))
+
+time3_4beamAutoBegin_8 = #(begin (make-moment 1 4))
+time3_4beamAutoEnd = #(begin (make-moment 3 4))
+time3_4beamAutoBegin_16 = #(begin (make-moment 1 16))
+time3_4beamAutoEnd_16 = #(begin (make-moment 1 4))
+%time3_4beamAutoBegin_32 = #(begin (make-moment 1 8))
+time3_4beamAutoEnd_32 = #(begin (make-moment 1 8))
 
 
-time3_8beamAutoBegin = "1/8";
-time3_8beamAutoEnd = "3/8";
+time3_8beamAutoBegin = #(begin (make-moment 1 8))
+time3_8beamAutoEnd = #(begin (make-moment 3 8))
 
 % in common time:
 %   end beams each 1/2 note
 %   end beams with 32th notes each 1/8 note
 %   end beams with 1/8 triplets each 1/4 note
 
 
 % in common time:
 %   end beams each 1/2 note
 %   end beams with 32th notes each 1/8 note
 %   end beams with 1/8 triplets each 1/4 note
 
-time4_4beamAutoEnd = "1/2";
-time4_4beamAutoEnd_12 = "1/4";
-time4_4beamAutoEnd_16 = "1/4";
-time4_4beamAutoEnd_32 = "1/8";
+time4_4beamAutoEnd = #(begin (make-moment 1 2))
+time4_4beamAutoEnd_12 = #(begin (make-moment 1 4))
+time4_4beamAutoEnd_16 = #(begin (make-moment 1 4))
+time4_4beamAutoEnd_32 = #(begin (make-moment 1 8))
 
 
-time4_8beamAutoEnd = "1/4";
-time4_8beamAutoEnd_16 = "1/4";
-time4_8beamAutoEnd_32 = "1/8";
+time4_8beamAutoEnd = #(begin (make-moment 1 4))
+time4_8beamAutoEnd_16 = #(begin (make-moment 1 4))
+time4_8beamAutoEnd_32 = #(begin (make-moment 1 8))
 
 
-time4_16beamAutoEnd = "1/8";
+time4_16beamAutoEnd = #(begin (make-moment 1 8))
 
 
-time6_8beamAutoEnd = "3/8";
-time6_8beamAutoEnd_16 = "3/8";
-time6_8beamAutoEnd_32 = "1/8";
+time6_8beamAutoEnd = #(begin (make-moment 3 8))
+time6_8beamAutoEnd_16 = #(begin (make-moment 3 8))
+time6_8beamAutoEnd_32 = #(begin (make-moment 1 8))
 
 
-time9_8beamAutoEnd = "3/8";
-time9_8beamAutoEnd_16 = "3/8";
-time9_8beamAutoEnd_32 = "1/8";
+time9_8beamAutoEnd = #(begin (make-moment 3 8))
+time9_8beamAutoEnd_16 = #(begin (make-moment 3 8))
+time9_8beamAutoEnd_32 = #(begin (make-moment 1 8))
 
 
-time12_8beamAutoEnd = "3/8";
-time12_8beamAutoEnd_16 = "3/8";
-time12_8beamAutoEnd_32 = "1/8";
+time12_8beamAutoEnd = #(begin (make-moment 3 8))
+time12_8beamAutoEnd_16 = #(begin (make-moment 3 8))
+time12_8beamAutoEnd_32 = #(begin (make-moment 1 8))
 
 
 
 
 
 
@@ -70,10 +68,10 @@ time12_8beamAutoEnd_32 = "1/8";
 Users may override in most cases, simply by issuing
 
     % from here on consider ending beam every 1/4 note
 Users may override in most cases, simply by issuing
 
     % from here on consider ending beam every 1/4 note
-    \property Voice.beamAutoEnd = "1/4"
+    \property Voice.beamAutoEnd = #(make-moment 1 4)
 
     % no autobeaming
 
     % no autobeaming
-    \property Voice.beamAuto = "0"  
+    \property Voice.beamAuto = ##f  
 
 or, more globally, by doing:
 
 
 or, more globally, by doing:
 
@@ -81,7 +79,7 @@ or, more globally, by doing:
         \translator{
             \VoiceContext
             % consider ending beam at every 1/2 note
         \translator{
             \VoiceContext
             % consider ending beam at every 1/2 note
-            beamAutoEnd = "1/2";
+            beamAutoEnd = #(make-moment 1 2)
         }
     }
 
         }
     }
 
index a6e51b93952155554fd109fbc14b1925f14557c7..56438398937461dcee6b51decdc9b5741b66115e 100644 (file)
@@ -34,8 +34,8 @@ lydian = 7
 phrygian = 8
 dorian = 10
 
 phrygian = 8
 dorian = 10
 
-melisma = \property Staff.melismaBusy = "1"
-melismaEnd = \property Staff.melismaBusy = "0"
+melisma = \property Staff.melismaBusy = ##t
+melismaEnd = \property Staff.melismaBusy = ##f
 
 
 
 
 
 
index 1e8acfac4360827004782a0e34793cc5eb61b697..b323524d32614e8dd096722ea49fefdf1e9be54d 100644 (file)
@@ -5,8 +5,8 @@
 StaffContext=\translator {
        \type "Engraver_group_engraver";
        \name Staff ;
 StaffContext=\translator {
        \type "Engraver_group_engraver";
        \name Staff ;
-       barAuto = "1";
-       voltaVisibility = "1";
+       barAuto = ##t
+       voltaVisibility = ##t
 
        \consists "Multi_measure_rest_engraver";
        \consists "Bar_engraver";
 
        \consists "Multi_measure_rest_engraver";
        \consists "Bar_engraver";
@@ -33,16 +33,15 @@ StaffContext=\translator {
 %{
        \consists "Staff_margin_engraver";
 %}
 %{
        \consists "Staff_margin_engraver";
 %}
-       defaultClef = treble;
-
-       marginBreakPriority = "-5";
+       defaultClef = #"treble"
 
 
+       marginBreakPriority = #-5
 
        \consists "Separating_line_group_engraver";
        \consists "Font_size_engraver";
          
        \accepts "Voice";
 
        \consists "Separating_line_group_engraver";
        \consists "Font_size_engraver";
          
        \accepts "Voice";
-       dynamicStyle = "dynamic";
+       dynamicStyle = #"dynamic"
 };
 
 \translator{\StaffContext }
 };
 
 \translator{\StaffContext }
@@ -66,7 +65,8 @@ StaffContext=\translator {
 
 RhythmicStaffContext=\translator{
        \type "Engraver_group_engraver";
 
 RhythmicStaffContext=\translator{
        \type "Engraver_group_engraver";
-       numberOfStaffLines  = "1";
+       numberOfStaffLines  = #1
+       
        barSize = \staffheight;
        \consists "Pitch_squash_engraver";
        \consists "Separating_line_group_engraver";     
        barSize = \staffheight;
        \consists "Pitch_squash_engraver";
        \consists "Separating_line_group_engraver";     
@@ -82,7 +82,7 @@ RhythmicStaffContext=\translator{
 \translator{\RhythmicStaffContext}
 VoiceContext = \translator {
        \type "Engraver_group_engraver";
 \translator{\RhythmicStaffContext}
 VoiceContext = \translator {
        \type "Engraver_group_engraver";
-       dynamicPadding = "5.0";
+       dynamicPadding = #5.0
        \consists "Dynamic_engraver";   % must come before text_engraver.
        \name Voice ;
 
        \consists "Dynamic_engraver";   % must come before text_engraver.
        \name Voice ;
 
@@ -99,7 +99,7 @@ VoiceContext = \translator {
 
        % ugh.  Order matters here.
        \consists "Melisma_engraver";
 
        % ugh.  Order matters here.
        \consists "Melisma_engraver";
-       textScriptPadding = "3.0";
+       textScriptPadding = #3.0
        \consists "Text_engraver";
        \consists "Script_engraver";
        \consists "Script_column_engraver";
        \consists "Text_engraver";
        \consists "Script_engraver";
        \consists "Script_column_engraver";
@@ -122,6 +122,7 @@ GraceContext=\translator {
        \consists "Stem_engraver";
        \consists "Beam_engraver";
        \consists "Slur_engraver";
        \consists "Stem_engraver";
        \consists "Beam_engraver";
        \consists "Slur_engraver";
+       
        \consists "Auto_beam_engraver";
        \include "auto-beam-settings.ly";
        \consists "Align_note_column_engraver";
        \consists "Auto_beam_engraver";
        \include "auto-beam-settings.ly";
        \consists "Align_note_column_engraver";
@@ -129,11 +130,11 @@ GraceContext=\translator {
        \consists "Rhythmic_column_engraver";
        \consists "Dynamic_engraver";
 
        \consists "Rhythmic_column_engraver";
        \consists "Dynamic_engraver";
 
-       stemStyle = "grace";
-       weAreGraceContext = "1";
-       fontSize = "-1";
-       stemLength = "6.0";
-       verticalDirection = "1";
+       stemStyle = #"grace" 
+       weAreGraceContext = ##t 
+       fontSize = #-1
+       stemLength = #6.0
+       verticalDirection = \up ;
        graceAccidentalSpace= 1.5 * \interline;
 };
 
        graceAccidentalSpace= 1.5 * \interline;
 };
 
@@ -153,9 +154,7 @@ GrandStaffContext=\translator{
        \consists "Span_bar_engraver";
        \consists "Piano_bar_engraver";
 
        \consists "Span_bar_engraver";
        \consists "Piano_bar_engraver";
 
-
        \accepts "Staff";
        \accepts "Staff";
-
 };
 \translator{\GrandStaffContext}
 
 };
 \translator{\GrandStaffContext}
 
@@ -174,7 +173,6 @@ PianoStaffContext = \translator{\GrandStaffContext
 StaffGroupContext= \translator {
        \type "Engraver_group_engraver";
        \consists "Span_bar_engraver";
 StaffGroupContext= \translator {
        \type "Engraver_group_engraver";
        \consists "Span_bar_engraver";
-
        
        \consists "Staff_group_bar_engraver";
        \name StaffGroup;
        
        \consists "Staff_group_bar_engraver";
        \name StaffGroup;
@@ -186,6 +184,7 @@ StaffGroupContext= \translator {
        \accepts "Lyrics";
        \accepts "ChordNames";
 };
        \accepts "Lyrics";
        \accepts "ChordNames";
 };
+
 \translator { \StaffGroupContext }
 
 % UGH! JUNKME
 \translator { \StaffGroupContext }
 
 % UGH! JUNKME
@@ -248,8 +247,8 @@ StupidScore = \translator {
 
 BarNumberingStaffContext = \translator {
        \StaffContext
 
 BarNumberingStaffContext = \translator {
        \StaffContext
-       barColumnPriority = "0";
-       marginBreakPriority = "-4";
+       barColumnPriority = #0
+       marginBreakPriority = #-4
        \consists "Mark_engraver";
        \consists "Bar_number_engraver";
 };
        \consists "Mark_engraver";
        \consists "Bar_number_engraver";
 };
@@ -263,8 +262,8 @@ HaraKiriStaffContext = \translator {
 
 OrchestralPartStaffContext = \translator {
        \StaffContext
 
 OrchestralPartStaffContext = \translator {
        \StaffContext
-       barColumnPriority = "0";
-       marginBreakPriority = "-4";
+       barColumnPriority = #0
+       marginBreakPriority = #-4
        \consists "Mark_engraver";
        \consists "Bar_number_engraver";
 };
        \consists "Mark_engraver";
        \consists "Bar_number_engraver";
 };
@@ -280,8 +279,8 @@ ScoreContext = \translator {
        \consists "Spacing_engraver";
        \consists "Vertical_align_engraver";
        alignmentReference = \down;
        \consists "Spacing_engraver";
        \consists "Vertical_align_engraver";
        alignmentReference = \down;
-       defaultClef = treble;
-       defaultBarType = "|";
+       defaultClef = #"treble"
+       defaultBarType = #"|"
        \accepts "Staff";
        \accepts "StaffGroup";
        \accepts "RhythmicStaff";       
        \accepts "Staff";
        \accepts "StaffGroup";
        \accepts "RhythmicStaff";       
@@ -297,8 +296,8 @@ ScoreContext = \translator {
 OrchestralScoreContext= \translator {
        \ScoreContext
 
 OrchestralScoreContext= \translator {
        \ScoreContext
 
-       barScriptPadding = "2.0";       % dimension \pt
-       markScriptPadding = "4.0";
+       barScriptPadding = #2.0         % dimension \pt
+       markScriptPadding = #4.0
 
        \consists "Bar_number_engraver";
        \consists "Mark_engraver";
 
        \consists "Bar_number_engraver";
        \consists "Mark_engraver";
index 78fc35ed04ef4f0a2f516c32c3191d95ea2419f5..b5a6d360bdcd32e0166bd2320c3f21c90437c434 100644 (file)
@@ -1,13 +1,5 @@
 %{
  common dutch names for notes. "es" means flat, "is" means sharp
 %{
  common dutch names for notes. "es" means flat, "is" means sharp
-
-
-
-
- Please note that, while these names are used to enter *notes*, they
- actually are *melodic*s, i.e. they represent a pitch solely. Notes
- have a rhythmic part too. This is the reason that we don't write 'note { .. }'
-
 %}
 
 \notenames {
 %}
 
 \notenames {
@@ -56,6 +48,7 @@
        % upper case: 1 octave lower.
        %
 
        % upper case: 1 octave lower.
        %
 
+       %% deprecated.
 
        Ceses   = \musicalpitch { -2 0 -2 }
        Ces     = \musicalpitch { -2 0 -1 }
 
        Ceses   = \musicalpitch { -2 0 -2 }
        Ces     = \musicalpitch { -2 0 -1 }
index 96b0057fa82b2a8893ccdb8b23b5765cb45313da..a3e0eba66c45b9d161e120142ca21d2e8c3921de 100644 (file)
@@ -225,7 +225,7 @@ mmrest_x_minimum = 1.4*\staffheight;
 % chop off this much when next to pp / ff sign.
 crescendo_shorten = 4.0 * \interline;
 crescendo_thickness   = \stafflinethickness;
 % chop off this much when next to pp / ff sign.
 crescendo_shorten = 4.0 * \interline;
 crescendo_thickness   = \stafflinethickness;
-crescendo_height = 1.5 * \interline;
+crescendo_height = 0.666 * \interline;
 
 % in internote.
 restcollision_minimum_dist = 3.0;
 
 % in internote.
 restcollision_minimum_dist = 3.0;
index ea41ac9656b675a4665b2016e1986073985daca6..ddc99ba5078de2f4a7791bf45686df8fa330fd62 100644 (file)
@@ -8,7 +8,7 @@ SEE THE REFERENCE MANUAL FOR EXPLANATIONS.
 
 %}
 
 
 %}
 
-\version "1.2.0";
+\version "1.2.16";
 
 %hmm, (these) abbrevs suck, imo
 % i guess they're meant as some form of doco
 
 %hmm, (these) abbrevs suck, imo
 % i guess they're meant as some form of doco
@@ -17,52 +17,28 @@ stemup =        \property Voice.verticalDirection = \up
 stemboth=      \property Voice.verticalDirection = \center
 stemdown =     \property Voice.verticalDirection = \down
 
 stemboth=      \property Voice.verticalDirection = \center
 stemdown =     \property Voice.verticalDirection = \down
 
-slurup = \notes {
-       s1*0
-       \property Voice.slurVerticalDirection = \up 
-       }
-slurboth= \notes {
-       s1*0
-       \property Voice.slurVerticalDirection = \center
-}
-slurdown = \notes {    
-       s1*0
-       \property Voice.slurVerticalDirection = \down
-}
-
-shifton = \property Voice.horizontalNoteShift = 1
-shiftoff = \property Voice.horizontalNoteShift = 0
+slurup   = \property Voice.slurVerticalDirection = \up 
+slurboth = \property Voice.slurVerticalDirection = \center
+slurdown = \property Voice.slurVerticalDirection = \down
+shifton  = \property Voice.horizontalNoteShift = #1
+shiftoff = \property Voice.horizontalNoteShift = #0
 
 onevoice = {   
        \stemboth \shiftoff     
 }
 
 
 onevoice = {   
        \stemboth \shiftoff     
 }
 
-%{ THESE ARE DEPRECATED  %}
-voiceone = 
-       \context Voice = one  {
+voiceone = \stemup
+voicetwo = \stemdown
+voicethree = {
        \stemup
        \stemup
+       \shifton
 }
 
 }
 
-voicetwo = 
-       \context Voice = two {
-       \stemdown
-}
-
-voicethree = 
-       \context Voice = three {
-       \stemup
-
-}
-
-voicefour = 
-       \context Voice = four {
+voicefour = {
        \stemdown
        \shifton
 }
 
        \stemdown
        \shifton
 }
 
-%{ END OF DEPRECATED %}
-
-
 % ugh, cluttering global namespace...
 
 % ugh2. 
 % ugh, cluttering global namespace...
 
 % ugh2. 
@@ -97,26 +73,26 @@ slurnormal =
        \property Voice.slurDash = ""
 
 
        \property Voice.slurDash = ""
 
 
-slurdotted = 
+slurdotted =                           
        \property Voice.slurDash = 1
 
 
        \property Voice.slurDash = 1
 
 
-tupletoff = {
+tupletoff =
        \property Voice.tupletVisibility = 0
        \property Voice.tupletVisibility = 0
-}
-tupleton = {
+
+tupleton = 
        \property Voice.tupletVisibility = 3
        \property Voice.tupletVisibility = 3
-}
-tiny  = {
-       \property Voice.fontSize= "-2"
-}
 
 
-small  = {
-       \property Voice.fontSize= "-1"
-}
+tiny  = 
+       \property Voice.fontSize= -2
+
+
+small  = 
+       \property Voice.fontSize= -1
+
 
 normalsize = {
 
 normalsize = {
-       \property Voice.fontSize= "0"
+       \property Voice.fontSize= 0
 }
 
 normalkey = {
 }
 
 normalkey = {
@@ -130,13 +106,13 @@ specialkey = {
 % End the incipit and print a ``normal line start''.
 endincipit = \notes{
     \partial 16; s16  % Hack to handle e.g. \bar ".|"; \endincipit
 % End the incipit and print a ``normal line start''.
 endincipit = \notes{
     \partial 16; s16  % Hack to handle e.g. \bar ".|"; \endincipit
-    \property Staff.clefStyle = "fullSizeChanges" 
+    \property Staff.clefStyle = #"fullSizeChanges" 
     \nobreak \bar "";
 }
 
     \nobreak \bar "";
 }
 
-autoBeamOff = \property Voice.noAutoBeaming = "1"
-autoBeamOn = \property Voice.noAutoBeaming = ""
+autoBeamOff = \property Voice.noAutoBeaming = #t
+autoBeamOn = \property Voice.noAutoBeaming = ##f
 
 
 
 
-emptyText = \property Voice.textEmptyDimension = "1"
-fatText = \property Voice.textEmptyDimension = ""
+emptyText = \property Voice.textEmptyDimension = ##t
+fatText = \property Voice.textEmptyDimension = ##f
index 38f89853d243975e4f7e23f06cfc9e5bef20d61b..d6c35d9c554b3f6edb4f6da7794d71b1663a7e0c 100644 (file)
@@ -1,5 +1,6 @@
 
 
-\scmfile "script.scm";
+
+#(eval-string (ly-gulp-file "script.scm"))
 
 "dash-hat" = "marcato"
 "dash-plus" = "stopped"
 
 "dash-hat" = "marcato"
 "dash-plus" = "stopped"
@@ -44,4 +45,4 @@ prallmordent = \script "prallmordent"
 upprall = \script "upprall"
 downprall = \script "downprall"
 segno = \script "segno"
 upprall = \script "upprall"
 downprall = \script "downprall"
 segno = \script "segno"
-coda = \script "coda"
\ No newline at end of file
+coda = \script "coda"
index 74c0e642e9efe9969ed7a05d5130114c9af2a1a5..91c6e7ca026c3dfd1870caed25d9c2cff726faab 100644 (file)
@@ -22,10 +22,7 @@ Group: Applications/Publishing
 %description documentation
 @BLURB@
 
 %description documentation
 @BLURB@
 
-The documentation package is rather big, due to the many pictures and
-different documentation formats.  It is really a rip-off from the
-LilyPond website.  If you have direct internet access, you may always
-read the documentation documentation there: http://www.lilypond.org.
+The documentation of LilyPond, both in HTML and PostScript.
 
 %prep
 %setup
 
 %prep
 %setup
index 7bc061169dcfd41065ef58fad41f449d68cf37f3..35b8afd3be33d83ec672ba1ad70543dfd6b741a3 100644 (file)
@@ -2,12 +2,14 @@
 
 all: $(OUT_FILES)
 
 
 all: $(OUT_FILES)
 
-
 local-WWW: $(ly_examples) $(fly_examples) $(ps_examples) $(png_examples)
        (cd $(outdir); $(PYTHON) ../$(buildscripts)/mutopia-index.py --prefix=../ --suffix=/$(outdir) $(html_subdirs) $(all_examples))
        echo $^ > $(depth)/wwwlist
 #      $(footify) $(outdir)/index.html
 
 local-WWW: $(ly_examples) $(fly_examples) $(ps_examples) $(png_examples)
        (cd $(outdir); $(PYTHON) ../$(buildscripts)/mutopia-index.py --prefix=../ --suffix=/$(outdir) $(html_subdirs) $(all_examples))
        echo $^ > $(depth)/wwwlist
 #      $(footify) $(outdir)/index.html
 
+local-web:
+       $(MAKE) CONFIGSUFFIX=www local-WWW
+
 convert-mudela: local-convert-mudela
        $(LOOP)
 
 convert-mudela: local-convert-mudela
        $(LOOP)
 
index 2997e737835986d16ebe0034621e3d1d6ea95173..cbb9b6fba691f25094b5c1909ec853f55330b85f 100644 (file)
@@ -1,15 +1,15 @@
 Begin3
 Title: LilyPond
 Begin3
 Title: LilyPond
-Version: 1.2.15
-Entered-date: 18OCT99
+Version: 1.3.0
+Entered-date: 26OCT99
 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
 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.2.15.tar.gz 
+       1000k lilypond-1.3.0.tar.gz 
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
-       1000k lilypond-1.2.15.tar.gz 
+       1000k lilypond-1.3.0.tar.gz 
 Copying-policy: GPL
 End
 Copying-policy: GPL
 End
index 7105c3e1f6479477ed82fabb348f0269b56ee0fd..3e62d1f6d1ed04509dcffa5b95e7e7d3df9b9602 100644 (file)
@@ -1,9 +1,9 @@
 Name: lilypond
 Name: lilypond
-Version: 1.2.15
+Version: 1.3.0
 Release: 1
 Copyright: GPL
 Group: Applications/Publishing
 Release: 1
 Copyright: GPL
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.2.15.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.0.tar.gz
 Summary: A program for printing sheet music.
 URL: http://www.cs.uu.nl/~hanwen/lilypond
 Packager: Han-Wen Nienhuys <hanwen@cs.uu.nl>
 Summary: A program for printing sheet music.
 URL: http://www.cs.uu.nl/~hanwen/lilypond
 Packager: Han-Wen Nienhuys <hanwen@cs.uu.nl>
@@ -22,10 +22,7 @@ Group: Applications/Publishing
 %description documentation
 
 
 %description documentation
 
 
-The documentation package is rather big, due to the many pictures and
-different documentation formats.  It is really a rip-off from the
-LilyPond website.  If you have direct internet access, you may always
-read the documentation documentation there: http://www.lilypond.org.
+The documentation of LilyPond, both in HTML and PostScript.
 
 %prep
 %setup
 
 %prep
 %setup
index da8e76a773cba0ce01e88139c2f3ff5308fceb3a..473a743ecacd7c2677f33a626c791495bfe1c379 100644 (file)
@@ -1,6 +1,5 @@
 
 
 
 
-
 \version "1.2.0";
 
 \include "allemande-urtext.ly";
 \version "1.2.0";
 
 \include "allemande-urtext.ly";
index c6540da3b1b6ee6e90047f6f5d19e181057e514c..fb421f78908c3fe1a490f26d23f4870b4b570cb1 100644 (file)
@@ -15,7 +15,6 @@ EXTRA_DIST_FILES = TODO $(PO_FILES) $(POT_FILES)
 STEPMAKE_TEMPLATES=podir
 
 include $(depth)/make/stepmake.make 
 STEPMAKE_TEMPLATES=podir
 
 include $(depth)/make/stepmake.make 
-include $(stepdir)/po-rules.make
 
 default: $(MO_FILES)
 
 
 default: $(MO_FILES)
 
index 8eafa4922afbf34b7b1b0447da981bc4a41ce454..de499111543ca35a3d04fc2d47424ef10d70410f 100644 (file)
@@ -8,6 +8,9 @@
 ;(debug-enable 'backtrace)
 
 ;;; library funtions
 ;(debug-enable 'backtrace)
 
 ;;; library funtions
+
+; :use-module (ice-9 regex))
+
 (define
   (xnumbers->string l)
   (string-append 
 (define
   (xnumbers->string l)
   (string-append 
index 13280873875a98b9cbf61e9fa62bad0a95f6fa6f..59bde3bbd7dbd24d3c0f065c3d4050fed0c7492d 100644 (file)
@@ -682,7 +682,7 @@ def compile_all_files (chunks):
                system ('lilypond %s %s' % (lilyopts, texfiles))
 
        for e in eps:
                system ('lilypond %s %s' % (lilyopts, texfiles))
 
        for e in eps:
-               cmd = r"""tex %s; dvips -E -o %s %s""" % \
+               cmd = r"""tex '\nonstopmode \input %s'; dvips -E -o %s %s""" % \
                      (e, e + '.eps', e)
                system (cmd)
 
                      (e, e + '.eps', e)
                system (cmd)
 
index 3fc89f375fc4c0c287c96922079715fdccc195b9..927cb0999ef78c81708d47500889b4f751358f7c 100644 (file)
@@ -52,9 +52,23 @@ def help ():
                '  -T, --dir-to=TO      diff to directory TO\n'  
                )
 
                '  -T, --dir-to=TO      diff to directory TO\n'  
                )
 
+def cleanup ():
+       global from_diff, to_diff, prev_cwd
+       os.chdir ('/tmp/package-diff')
+       sys.stderr.write ('Cleaning ... ')
+       os.system ('rm -fr %s %s' % (from_diff, to_diff))
+       sys.stderr.write ('\n')
+       os.chdir (prev_cwd)
+
 def untar (fn):
        # os.system ('pwd');
 def untar (fn):
        # os.system ('pwd');
-       sys.stderr.write ('untarring ' + fn + '\n')
+       try:
+               open (fn)
+       except:
+               sys.stderr.write ("Can't find tarball: %s\n" % fn)
+               cleanup ()
+               sys.exit (1)
+       sys.stderr.write ("Untarring: %s\n" % fn)
        os.system ('gzip --quiet -dc ' + fn + '| tar xf - ')
        sys.stderr.flush ()
 
        os.system ('gzip --quiet -dc ' + fn + '| tar xf - ')
        sys.stderr.flush ()
 
@@ -62,8 +76,13 @@ def remove_automatic (dirnames):
        files = []
 
        for d in dirnames:
        files = []
 
        for d in dirnames:
-               for p in pats:
-                       files = files + find.find (p, d)
+               try:
+                       for p in pats:
+                               files = files + find.find (p, d)
+               except:
+                       sys.stderr.write ("Can't find dir: %s\n" % d)
+                       cleanup ()
+                       sys.exit (1)
 
        dirs = map (lambda d: find.find ('out', d), dirnames)
        dirs = reduce (lambda x,y:  x + y, dirs)
 
        dirs = map (lambda d: find.find ('out', d), dirnames)
        dirs = reduce (lambda x,y:  x + y, dirs)
@@ -271,10 +290,5 @@ else:
 os.chdir (to_diff)
 makediff (from_diff, to_diff, patch_name) 
 
 os.chdir (to_diff)
 makediff (from_diff, to_diff, patch_name) 
 
-os.chdir ('/tmp/package-diff')
-sys.stderr.write ('cleaning ... ')
-os.system ('rm -fr %s %s' % (from_diff, to_diff))
-sys.stderr.write ('\n')
-os.chdir (prev_cwd)
-
+cleanup ()
 
 
index 9cad7937483a27e047e00e04e6f1b6e7db127aa1..cc6d6ec5ed440c172e9e06a07b792199d2451e2a 100755 (executable)
@@ -60,6 +60,7 @@ except:
        pass
 os.link(orig,  os.path.join (package.release_dir, tarball))
 
        pass
 os.link(orig,  os.path.join (package.release_dir, tarball))
 
+# urg: howto check exit code?
 os.system(sys.executable + ' ' + package.topdir + '/stepmake/bin/package-diff.py --package=' + topdir)
 
 diffname = pn + '.diff.gz'
 os.system(sys.executable + ' ' + package.topdir + '/stepmake/bin/package-diff.py --package=' + topdir)
 
 diffname = pn + '.diff.gz'
@@ -67,6 +68,10 @@ rel_pn = package.patch_dir + diffname
 
 diffname = os.path.join (outdir, diffname)
 
 
 diffname = os.path.join (outdir, diffname)
 
-os.rename(diffname, rel_pn)
+try:
+       os.rename(diffname, rel_pn)
+except:
+       sys.stderr.write ("Can't find diff: %s\n" % diffname)
+       sys.exit (1)
 os.link(rel_pn, diffname)
 
 os.link(rel_pn, diffname)
 
index fc2d648a1f347407ace210535bbb66c28a64ce04..7223b973c4f13680f1eca3bfa3c077a456d58006 100644 (file)
@@ -1,14 +1,12 @@
 
 default:
 
 
 default:
 
-do-doc: $(OUTTXT_FILES) 
-
 
 local-WWW: $(OUTHTML_FILES)
        echo $^ > $(depth)/wwwlist
 
 
 local-WWW: $(OUTHTML_FILES)
        echo $^ > $(depth)/wwwlist
 
-doc: do-doc
-
+local-web:
+       $(MAKE) CONFIGSUFFIX=www local-WWW
 
 footify:
        $(footify) $(sort $(wildcard $(outdir)/*.html out/*.html out-www/*.html))
 
 footify:
        $(footify) $(sort $(wildcard $(outdir)/*.html out/*.html out-www/*.html))
index 82861d822779af2eabadd4357f66290363e28d34..6fb5343eaeb591949d67cc293869595d7ebbb2f8 100644 (file)
@@ -7,20 +7,3 @@ footify=$(PYTHON) $(step-bindir)/add-html-footer.py --name $(PACKAGE_NAME) --ver
 
 footify-all-command=$(footify) `$(FIND) . -name '*.html' -print`
 
 
 footify-all-command=$(footify) `$(FIND) . -name '*.html' -print`
 
-#
-YO_FILES := $(wildcard *.yo)
-POD_FILES := $(wildcard *.pod)
-TEXINFO_FILES := $(wildcard *.texinfo)
-OUTYO_FILES = $(addprefix $(outdir)/,$(YO_FILES))
-OUTPOD_FILES = $(addprefix $(outdir)/,$(POD_FILES))
-OUTTEXINFO_FILES = $(addprefix $(outdir)/,$(TEXINFO_FILES))
-
-#
-ALL_DOC_FILES = $(POD_FILES) $(TEXINFO_FILES) $(YO_FILES)
-OUTTXT_FILES = $(OUTYO_FILES:.yo=.txt) $(OUTIN_FILES:.yo=.txt)
-OUTHTML_FILES = $(OUTYO_FILES:.yo=.html) $(OUTIN_FILES:.yo=.html)
-
-OUTREADME_TXT_FILES=$(addprefix $(outdir)/,$(addsuffix .txt, $(README_TOP_FILES)))
-OUTREADME_HTML_FILES=$(addprefix $(outdir)/,$(addsuffix .html, $(README_TOP_FILES)))
-
-ALL_SOURCES += $(ALL_DOC_FILES)
index 327e1e9207e080ef58f02691d715bb1e1d144a9f..d2b2f9914d363d794a5efa02989d3057b9ebaaca 100644 (file)
@@ -82,10 +82,10 @@ Note that all commands recurse into SUBSDIRS\n\
 
 local-help:
 
 
 local-help:
 
-doc:
-#UGH
-       true #  $(MAKE) -C $(depth)/Documentation all
+doc: local-doc
+       $(LOOP)
 
 
+local-doc:
 
 # Ugh.  C++ specific.
 doc++:
 
 # Ugh.  C++ specific.
 doc++:
index 2ecf0bc232cf81c793f748d0a07e35cab45d64ce..7f820ab4e51689ab64ec32c732318aaf382b30ea 100644 (file)
@@ -9,5 +9,5 @@ mfplain.mem: $(MFPLAIN_MP)
 $(outdir)/%.pfa: $(outdir)/%.0
        $(PYTHON) $(depth)/buildscripts/ps-to-pfa.py --output $(basename $<).pfa $<
        rm -f $(basename $(@F)).[0-9]*
 $(outdir)/%.pfa: $(outdir)/%.0
        $(PYTHON) $(depth)/buildscripts/ps-to-pfa.py --output $(basename $<).pfa $<
        rm -f $(basename $(@F)).[0-9]*
-       rm -f $(basename $<).log $(basename $<).tfm
+       rm -f $(basename $<).log
 
 
diff --git a/stepmake/stepmake/pod-vars.make b/stepmake/stepmake/pod-vars.make
new file mode 100644 (file)
index 0000000..541da42
--- /dev/null
@@ -0,0 +1,3 @@
+
+POD_FILES := $(wildcard *.pod)
+OUTPOD_FILES = $(addprefix $(outdir)/,$(POD_FILES))
index 88793519644431b39004365caa1cd772faacd119..7b013a29e711630ac512c395723653f5782591cd 100644 (file)
@@ -19,3 +19,4 @@ $(outdir)/%.txt: $(outdir)/%.texi
 $(outdir)/%.texi: %.texi
        cp $< $@
 
 $(outdir)/%.texi: %.texi
        cp $< $@
 
+
index 313f8a23e7a22b9c35475c02d167e44edcbb319c..ca47789ef08357c2901c1e702ebee549413f7bf3 100644 (file)
@@ -1,3 +1,5 @@
 # empty
 
 local-WWW: $(addprefix $(outdir)/,$(TEXI_FILES:.texi=.html))
 # empty
 
 local-WWW: $(addprefix $(outdir)/,$(TEXI_FILES:.texi=.html))
+
+local-doc: $(OUTTXT_FILES)
index 3a7e7ae04c571c7f299ec73fe9f13676e636ae5d..2447edd7a664962d0108c77ac172975aa668b3fb 100644 (file)
@@ -1,4 +1,6 @@
 
 TEXI_FILES = $(wildcard *.texi)
 
 
 TEXI_FILES = $(wildcard *.texi)
 
-EXTRA_DIST_FILES += $(TEXI_FILES)
+ALL_SOURCES += $(TEXI_FILES)
+
+OUTTXT_FILES += $(addprefix $(outdir)/,$(TEXI_FILES:.texi=.txt))
diff --git a/stepmake/stepmake/yodl-vars.make b/stepmake/stepmake/yodl-vars.make
new file mode 100644 (file)
index 0000000..b97bb19
--- /dev/null
@@ -0,0 +1,6 @@
+
+YO_FILES := $(wildcard *.yo)
+OUTYO_FILES = $(addprefix $(outdir)/,$(YO_FILES))
+
+OUTTXT_FILES = $(OUTYO_FILES:.yo=.txt) $(OUTIN_FILES:.yo=.txt)
+OUTHTML_FILES = $(OUTYO_FILES:.yo=.html) $(OUTIN_FILES:.yo=.html)
index 72612a2cfbbfc568997d66a4900ce0d5b0e54d08..4de1e457397b41e20c23cf184dc937524df31b7f 100644 (file)
@@ -18,7 +18,7 @@ htmldoc:
        rm -f `find . -name \*.html~ -print`
        $(footify-all-command)
        find `find Documentation -type d -name 'out-www'` -not -name '*dvi' -not -name '*ly' -not -name '*tex' -not -name '*.ps' -not -name 'out-www' > wwwlist
        rm -f `find . -name \*.html~ -print`
        $(footify-all-command)
        find `find Documentation -type d -name 'out-www'` -not -name '*dvi' -not -name '*ly' -not -name '*tex' -not -name '*.ps' -not -name 'out-www' > wwwlist
-       tar cfz $(outdir)/htmldoc.tar.gz  `cat wwwlist` `ls *.png out-www/$(distname).diff.gz $(ERRORLOG)`  index.html
+       tar cfz $(outdir)/htmldoc.tar.gz  `cat wwwlist` `ls *.png $(ERRORLOG)`  index.html
 
 localclean:
        rm -f wwwlist
 
 localclean:
        rm -f wwwlist
index 876dff52139b82896293b82a6144872a22e83d7c..5b02ba912f9ce46da21a2b5c0c74d9fc0c8b6eaa 100644 (file)
@@ -14,7 +14,7 @@
 \def\theinstrument{}
 \def\theopus{}
 \def\thepiece{}
 \def\theinstrument{}
 \def\theopus{}
 \def\thepiece{}
-\def\themetre{}
+\def\themeter{}
 \def\thepoet{}
 %
 % duh.  LaTeX has a \title too.
 \def\thepoet{}
 %
 % duh.  LaTeX has a \title too.
@@ -25,7 +25,7 @@
 \newcommand*{\instrument}[1]{\def\theinstrument{#1}}
 \newcommand*{\opus}[1]{\def\theopus{#1}}
 \newcommand*{\piece}[1]{\def\thepiece{#1}}
 \newcommand*{\instrument}[1]{\def\theinstrument{#1}}
 \newcommand*{\opus}[1]{\def\theopus{#1}}
 \newcommand*{\piece}[1]{\def\thepiece{#1}}
-\newcommand*{\metre}[1]{\def\themetre{#1}}
+\newcommand*{\meter}[1]{\def\themeter{#1}}
 \newcommand*{\poet}[1]{\def\thepoet{#1}}
 %
 \newcommand*{\mudelatitle}[1]{\def\thetitle{#1}}
 \newcommand*{\poet}[1]{\def\thepoet{#1}}
 %
 \newcommand*{\mudelatitle}[1]{\def\thetitle{#1}}
@@ -35,8 +35,8 @@
 \newcommand*{\mudelainstrument}[1]{\def\theinstrument{#1}}
 \newcommand*{\mudelaopus}[1]{\def\theopus{#1}}
 \newcommand*{\mudelapiece}[1]{\def\thepiece{#1}}
 \newcommand*{\mudelainstrument}[1]{\def\theinstrument{#1}}
 \newcommand*{\mudelaopus}[1]{\def\theopus{#1}}
 \newcommand*{\mudelapiece}[1]{\def\thepiece{#1}}
-\newcommand*{\mudelametre}[1]{\def\themetre{#1}}
-\newcommand*{\mudelameter}[1]{\def\themetre{#1}}
+\newcommand*{\mudelametre}[1]{\def\themeter{#1}}
+\newcommand*{\mudelameter}[1]{\def\themeter{#1}}
 \newcommand*{\mudelapoet}[1]{\def\thepoet{#1}}
 %
 %
 \newcommand*{\mudelapoet}[1]{\def\thepoet{#1}}
 %
 %
@@ -53,7 +53,7 @@
   \edef\saveparskip{\parskip}\parskip-5mm
   \begin{minipage}[t]{0.45\textwidth}
         \ifx\mudelanull\thepoet\else{\thepoet}\\ \fi
   \edef\saveparskip{\parskip}\parskip-5mm
   \begin{minipage}[t]{0.45\textwidth}
         \ifx\mudelanull\thepoet\else{\thepoet}\\ \fi
-        \ifx\mudelanull\themetre\else{\themetre}\\ \fi
+        \ifx\mudelanull\themeter\else{\themeter}\\ \fi
   \end{minipage}\hspace*{\fill}
   \begin{minipage}[t]{0.45\textwidth}
       \begin{flushright}
   \end{minipage}\hspace*{\fill}
   \begin{minipage}[t]{0.45\textwidth}
       \begin{flushright}