--- /dev/null
+\input texinfo @c -*-texinfo-*-
+@setfilename README-W32.info
+@settitle LilyPond on W32
+
+
+@node Top, , , (dir)
+
+@chapter LilyPond on W32
+
+FIXME: remove yodl refs.
+
+[FIXME: THIS DOCUMENTED IS OUTDATED]
+
+No, there's no reason to be concered, Lily should work in
+Windows-NT(/95/98?) too. The setup may not be easy or smooth. This
+document will help you getting started.
+
+
+@section DISCLAIMER
+
+If you have the Cygnus gnu-windows32 port of the GNU utils, LilyPond
+will work in Windows-NT (/95/98?).
+
+We still recommend you use Unix. In particular, use GNU/Linux: We've
+been there, and we've seen it happen several times. It is @strong{much}
+easier and quicker to install RedHat Linux and LilyPond than to
+obtain, compile and install all the necessary tools to compile and run
+LilyPond on Windows.
+
+``Ok, thanks for the suggestions. I can't run Linux or I don't want
+to run Unix. What can I expect?''
+
+@itemize @bullet
+@item LilyPond development is moving quite fast, and all developers use Unix.
+ Newly added features may require some attention to get them to work.
+@item LilyPond depends on a number of other packages that usually are
+ available on Unix boxes, but are not installed by default on Windows.
+@end itemize
+
+
+LilyPond will now install/extract in a unix-like tree:
+@example
+
+ usr/[local/]bin/
+ usr/[local/]share/lilypond/*
+
+@end example
+
+etc.
+
+Lily runs in a the unix-like Cygnus gnu-windows environment;
+hopefully Cygnus will adopt the @file{/usr/[local/]} tree too.
+
+@*
+If you really don't want usr/ in your root directory, but rather scatter
+your programs and packages all over your harddisk, do something like:
+@example
+
+ md lilypond
+ cd lilypond
+ unzip ../lilypond-0.1.77.exe.zip
+
+@end example
+
+and add @file{lilypond/usr/bin} to your @file{PATH} and
+@file{lilypond/usr/share/lilypond} to your @file{LILYINCLUDE}.
+
+
+If you've received a binary release of LilyPond (@file{.exe.zip}),
+you may skip the following sections.
+
+
+It can be done! Occasionally, the Cygnus b19.1 cross compiler and
+utilities under GNU/Linux are used to make the binary @file{.exe.zip}
+releases (some makefile hacking was needed to build this stuff). Jeffrey
+Reed tries to keep-up with LilyPond development, and is doing quite
+well. His latest release is available on
+@uref{http://home.austin.rr.com/jbr/jeff/lilypond/}.
+
+
+I have heard of such tools that think they're probably much smarter than the
+packager and thus decide for themselves that they don't need to unpack certain
+files (e.g., empty directories such as bin/out).
+
+To unpack the lilypond sources, you should do something like: @example
+
+ tar zxf releases/lilypond-x.y.z.tar.gz
+
+@end example
+
+
+If you're familiar with the GNU/Cygnus development package, you may skip
+this.
+
+Don't forget to set
+@example
+
+ /start/settings/control-panel/system/environment/system-variables:
+ GCC_EXEC_PREFIX=/Cygnus/b19/H-i386-cygwin32/lib/gcc-lib/
+ MAKE_MODE=UNIX
+
+@end example
+
+You want to run bash, while building Lily:
+@example
+
+ c:\bash
+ bash-2.01$
+
+@end example
+
+The install instructions mention something like:
+@example
+
+ configure
+ make
+ make install
+
+@end example
+
+Now for a small UNIX lesson: The current working directory (cwd) is
+by default not in your PATH, like it is under DOS (for security reasons).
+Check this by looking at the output of:
+@example
+
+ echo $PATH
+
+@end example
+
+The cwd looks like @code{'::'} or @code{':.'}. If it's not there, you may
+add the cwd to your path:
+@example
+
+ PATH=$PATH:.
+
+@end example
+
+or you must use './' when issuing a command in th cwd, try:
+@example
+
+ ./configure
+ make
+
+@end example
+
+My point of reference comes from 15 odd years working with a variety
+of @code{UNIX} platforms. I am relatively new to Windows-NT and, even
+though I am a card carrying @code{UNIX} bigot, I am excited about the
+NT OS. My goals for lilypond are to give back to the Free Software
+Foundation a little of what they have given me over the years and to
+contribute to the lilypond project by supporting a Windows-NT port. I
+hope that someday we can distribute and run lilypond on the NT OS in a
+much more native fashion.
+
+@itemize @bullet
+
+@item Building lilypond on Windows-NT
+@item Maintaining lilypond on Windows-NT
+@item Running lilypond on Windows-NT
+
+@end itemize
+
+
+Currently as stated above lilypond is primarily a @code{UNIX} thing.
+The Windows-NT port is based on the @code{UNIX} environment provided by
+@uref{http://www.cygnus.com,Cygnus}. Therefore the first step is to
+download and install the Cygnus development kit:
+
+@uref{http://www.cygnus.com/misc/gnu-win32/}
+
+Please follow the documentation Cygnus has on there web site for
+downloading and installing. The important part is that you down load
+the entire development kit. I believe it is @file{full.exe}. The
+installation will ask you where you want to install it. I will refer
+to Cygnus installation directory as @file{/gnuwin32/cygwin-b20}. There
+should be a @file{README} file that contains installation instructions.
+After the installation is complete you should have a @emph{Cygnus}
+shortcut in your @emph{Program} section of your @emph{Start Menu}. This
+shortcut is your door to the @code{UNIX} world and I will refer to the
+resulting window as a @file{bash} shell.
+
+The shortcut points to @file{/gnuwin32/cygwin-b20/cygnus.bat}. The
+following is my @file{cygnus.bat} file.
+
+@example
+
+@@ECHO OFF
+rem default environment
+
+rem GNU cygnus installation
+
+SET CYGREL=B19.1
+SET MAKE_MODE=unix
+SET LOCAL_ROOT=d:\gnuwin32
+SET LOCAL_FS=d:/gnuwin32
+SET LOCAL_DIR=d:/gnuwin32/cygwin-b20
+SET CYGROOT=%LOCAL_ROOT%\cygwin-b20
+SET CYGFS=%LOCAL_FS%/cygwin-b20
+SET TCL_LIBRARY=%CYGROOT%\share\tcl8.0
+rem
+rem This was not in the original but is needed by lots of packages
+rem
+SET BISON_SIMPLE=%CYGFS%/share/bison.simple
+
+rem
+rem I place the cygnus stuff in front of /WINNT
+rem
+
+SET PATH=d:\bin;%LOCAL_ROOT%\bin;%CYGROOT%\H-i586-cygwin32\bin;%PATH%
+SET MANPATH=%LOCAL_ROOT%\man;%LOCAL_ROOT%\cygwin-b20\full-man\man
+SET INFOPATH=%LOCAL_FS%/cygwin-b20/full-man/info;%LOCAL_FS%/cygwin-b20/info;%LOCAL_DIR%/info
+
+rem General tools not included with Cygnus Development Kit
+
+rem CVS
+
+SET PATH=%PATH%;%LOCAL_ROOT%\cvs-1.9.28\bin
+SET INFOPATH=%INFOPATH%;%LOCAL_FS%/cvs-1.9.28/info
+SET MANPATH=%MANPATH%;%LOCAL_ROOT%\cvs-1.9.28\man
+
+rem EMACS
+
+SET PATH=%PATH%;%LOCAL_ROOT%\emacs-19.34\bin
+SET INFOPATH=%INFOPATH%;%LOCAL_FS%/emacs-19.34/info
+
+rem VIM
+
+SET VIM=%LOCAL_ROOT%\vim-4.6\doc
+SET PATH=%PATH%;%LOCAL_ROOT%\vim-4.6
+
+rem TeX
+
+SET PATH=%PATH%;%LOCAL_ROOT%\texmf\miktex\bin
+
+rem a2ps
+
+SET PATH=%PATH%;%LOCAL_ROOT%\a2ps-4.10\bin
+SET INFOPATH=%INFOPATH%;%LOCAL_FS%/a2ps-4.10/info
+SET MANPATH=%MANPATH%;%LOCAL_ROOT%\a2ps-4.10\man
+
+rem python
+
+SET PATH=%PATH%;\Program Files\Python
+
+rem perl
+
+SET PATH=%PATH%;\qub
+
+rem yodl
+
+uname -sv
+bash -login
+
+@end example
+
+Please look over this carefully. Be careful with the forward and
+backward slash notations. The paths specified were done for good
+reasons. Maybe someday we will all be using @code{UNC}. Note the
+@code{BISON} entry and the @code{PATH} ordering in particular. Also note
+that the generic @file{cygnus.bat} you will be looking at does not
+include alot of the packages listed. We will be installing some of
+these.
+
+The installation also suggests that you create a directory @file{/bin}
+and copy @file{/gnuwin32/cygwin-b20/H-i586-cygwin32/bin/sh.exe} to
+@file{/bin}. The @file{sh.exe} shell provided by Cygnus is a descendant
+of the @file{ash} shell. The @file{sh.exe} shell has improved greatly
+and is much faster than the @file{bash} shell for script invocations.
+So this is my recommendation for post installation steps. From a
+@file{bash} shell:
+
+@itemize @bullet
+@item @code{cd /}
+@item @code{mkdir bin}
+@item @code{cd /bin}
+@item @code{cp /gnuwin32/cygwin-b20/H-i586-cygwin32/bin/sh.exe sh.exe}
+@item @code{cp /gnuwin32/cygwin-b20/H-i586-cygwin32/bin/bash.exe bash.exe}
+@item @code{cd /}
+@item @code{mkdir /tmp}
+@item @code{chmod a+rwx tmp}
+@item @code{mkdir /etc}
+@item @code{cd /etc}
+@item @code{mkpasswd -l > passwd}
+@item @code{mkgroup -l > group}
+@end itemize
+
+
+There is also some discussion of how you want to @emph{mount} the Cygnus
+development kit. @emph{mount} is a @code{UNIX} term that refers to the
+mechanism used to provide a disk resource to the filesystem. Cygnus
+supplies a mechinism for @emph{mounting} a filesystem as a @code{DOS} like
+resource or a @code{UNIX} like resource. Among other things this
+attempts to deal with the text file carriage return line feed on
+@code{DOS} versus the line feed on @code{UNIX} and the issue that @code{DOS}
+has two file types, text and binary. Where @code{UNIX} deals with a
+single streams type. My opinion on this matter currently is to use
+binary mounts only. This can be accomplished by:
+
+@itemize @bullet
+@item From a bash shell, umount /
+@item mount -b d: /
+@end itemize
+
+If you have other disks that you intend to use for data generated by
+cygnus tools you will have to mount those devices with the @emph{-b}
+switch.
+
+
+@uref{http://www.xraylith.wisc.edu/~khan/software/gnu-win32/egcs.html}
+
+Cygnus now distributes the ecgs compiler with cygwin-b20.
+
+
+@uref{http://www.gnu.org/order/ftp.html}
+
+Considering the origin of the major contributors of lilypond, this is a
+must. However before we actually do a @strong{GNU} build we have to
+discuss some caveats of the Windows-NT OS in particular the naming of
+executable files. @code{Windows-NT} uses a .exe extension where @code{UNIX}
+does not use an extension. This causes a problem during the
+installation portion of a @strong{GNU} build. The following script can be
+used to help alleviate this problem.
+
+@example
+
+#!/bin/sh
+
+realinstall=/gnuwin32/cygwin-b20/H-i586-cygwin32/bin/install.exe
+args=''
+while [ $# -ne 0 ]
+do
+ case $1 in
+ -*) args="$args $1"
+ ;;
+
+ *) if [ -f $1.exe ]; then
+ args="$args $1.exe"
+ else
+ args="$args $1"
+ fi
+ ;;
+ esac
+ shift
+done
+
+$realinstall $args
+
+@end example
+
+I place this in script @file{~/bin}. The LilyPond configure, build,
+and install process handles this with it's own install script. In
+addition there are patches to the cygnus install command that also
+deals with this problem. Having said that, here is how one
+might build the @emph{gettext} package.
+
+@itemize @bullet
+@item download the package from one of the ftp sites.
+@item From a bash shell, cd ~/usr/src.
+@item tar zxf gettext-0.10.tar.gz
+@item cd gettext-0.10
+@item ./configure --prefix=$CYGFS/H-i586-cygwin32
+@item make
+@item make install
+@end itemize
+
+
+@uref{http://www.gnu.org/order/ftp.html}
+
+Following the instructions for @emph{gettext} package to download, build,
+and install the @emph{groff} package.
+
+
+@uref{http://www.python.org}
+
+Python is the scripting language of choice for a lilypond build.
+There is a native @code{Windows-NT} self extracting binary distribution
+available. I recommend installing Python in a directory that does
+@strong{not} have spaces. And then place it in the bash shell path by
+editing $CYGFS/cygnus.bat.
+
+
+@uref{http://www.cpan.org}
+
+I believe perl is used in some legacy scripts to date. There is a
+native @code{Windows-NT} self extracting binary distribution available.
+I recommend installing Perl in a directory that does @strong{not} have
+spaces. And then place it in the bash shell path by editing
+$CYGFS/cygnus.bat.
+
+The development methodology of @emph{LilyPond} relies on a the following
+directory structure:
+
+
+@example
+
+$HOME/usr/src/
+ |-releases/
+ |-patches/
+ |-test/
+
+@end example
+
+@table @samp
+
+@item releases/ Downloaded and generated releases live here. For
+example @file{lilypond-1.1.17.tar.gz}.
+
+@item patches/ Downloaded and generated patches live here. For
+example @file{lilypond-1.1.17.diff.gz}.
+
+@item test/ This directory is used to generate releases and patches.
+
+@end table
+
+I strongly recommend using this file structure to build @emph{yodl} and
+@emph{lilypond}.
+
+@itemize @bullet
+@item download the package from
+@uref{http://www.xs4all.nl/~jantien/yodl/} to
+@file{$HOME/usr/src/releases}.
+@item From a bash shell, cd @file{$HOME/usr/src}.
+@item tar zxf releases/yodl-@emph{<version>}.tar.gz
+@item cd yodl-@emph{<version>}
+@item ./configure --prefix=/gnuwin32/yodl-@emph{<version>} --srcdir=.
+Since @emph{yodl} is under development I choose to install it in a
+version rooted directory. This allows me to test newly released
+versions without losing a known working version.
+
+@item make
+@item make install
+@item place it in the bash shell path by editing $CYGFS/cygnus.bat.
+For example:
+@example
+rem yodl
+
+SET PATH=%PATH%;%LOCAL_ROOT%\yodl-1.31.7\bin
+
+
+@end example
+
+@end itemize
+
+
+
+GUILE, GNU's Ubiquitous Intelligent Language for Extension, is a
+library that implements the Scheme language plus various convenient
+facilities. It's designed so that you can link it into an application
+or utility to make it extensible. GNU's plan is to link this library
+into all GNU programs that call for extensibility.
+
+@itemize @bullet
+@item download guile-1.3 patch from
+@uref{http://home.austin.rr.com/jbr/jeff/lilypond/guile.patch} and save it
+to @file{/tmp/guile.patch}.
+@item download guile-1.3 from one of GNU's ftp sites.
+@item From a bash shell, tar zxf guile-1.3.tar.gz
+@item cd guile-1.3
+@item patch -p2 < /tmp/guile.patch
+@item LD=/gnuwin32/cygwin-b20/H-i586-cygwin32/bin/ld \ @*
+ ./configure --prefix=$CYGFS/H-i586-cygwin32
+@item make sure bin_PROGRAMS macro in libguile/Makefile does @emph{not} have the
+.exe extension during the build
+@item make
+@item make sure bin_PROGRAMS in libguile/Makefile @emph{does} have the
+.exe extension during the install. Yuck.
+@item make install
+@end itemize
+
+
+@itemize @bullet
+@item download the package from
+@uref{http://www.cs.uu.nl/people/hanwen/lilypond/} to
+@file{$HOME/usr/src/releases}.
+@item From a bash shell, cd @file{$HOME/usr/src}.
+@item tar zxf releases/lilypond-@emph{<version>}.tar.gz
+@item cd lilypond-@emph{<version>}
+@item ./configure --prefix=/gnuwin32/lilypond-@emph{<version>} \ @*
+ --srcdir=. @*
+Since @emph{lilypond} is under development I choose to install it in a
+version rooted directory. This allows me to test newly released
+versions without losing a known working version.
+@item make
+@item make install
+@item place it in the bash shell path by editing $CYGFS/cygnus.bat.
+For example:
+@example
+rem lilypond
+
+SET PATH=%PATH%;%LOCAL_ROOT%\lilypond-1.1.17\bin
+
+
+@end example
+
+@end itemize
+
+
+If you have built @emph{lilypond} on @code{Windows-NT} using the directory
+ and the process described
+in section FIXME, then you are ready to maintain
+@emph{lilypond}. It can not be that easy!? Well, there is one caveat.
+Currently to use the @file{stepmake/bin/release.py} and
+@file{stepmake/bin/package-diff.py} scripts you need to obtain/build a
+version of @emph{python} that was built with @strong{Cygnus} development kit.
+The process I used is as follows:
+
+@itemize @bullet
+@item obtain python source from @uref{http://www.python.org}
+@item tar zxf /tmp/python-@emph{<version>}.tar.gz
+@item cd python-@emph{<version>}
+@item configure --prefix=/gnuwin32/Python-@emph{<version>}
+@item edit toplevel @file{Makefile} @code{EXE} macro so it reads @code{EXE=.exe}
+@item make
+@item make install
+@item place it in the bash shell path by editing $CYGFS/cygnus.bat.
+For example:
+@example
+rem python
+
+SET PATH=%PATH%;%LOCAL_ROOT%\python-1.5.1\bin
+
+
+@end example
+
+@end itemize
+
+I choose to build @emph{lilypond} with the standard @code{Windows-NT}
+@emph{python} and use the @strong{Cygnus} version for using the release
+scripts. This way I can make sure the @code{Windows-NT} @emph{python}
+version is able to build @emph{lilypond}. Currently there are several
+issues with the release scripts. Using @code{os.link} and
+@code{os.system(set -x;...)} are to name a few.
+
+To generate a new release and patch you must use the directory
+. And follow the
+instructions found in @file{PATCH.txt}. Editing
+@file{Documentation/AUTHORS.yo}, @file{VERSION}, and @file{NEWS} is also
+required. When my edits are complete and tested I:
+
+@itemize @bullet
+@item Edit @file{config.make} and change @emph{python} path to the
+@strong{Cygnus} version: @code{PYTHON=/gnuwin32/Python-1.5.1/bin/python}.
+@item make release
+@end itemize
+
+The new release is placed in @file{releases} directory and the patch is
+placed in the @file{patches} directory. I email the new patch to
+@email{gnu-music-discuss@@gnu.org}. More than one patch a day can be
+generated by:
+
+@itemize @bullet
+@item cd $HOME/usr/src
+@item tar zxf releases/lilypond-@emph{<version>}.@emph{<patchlevel>}
+@item use your normal configure
+@item make edits
+@item Change @file{VERSION} to increment @emph{<patchlevel>}
+@item Change @file{NEWS}
+@item make release
+@end itemize
+
+
+We are now distributing a formated binary distribution for
+Windows-NT. Please refer to
+@uref{http://home.austin.rr.com/jbr/jeff/lilypond/} for current news,
+download, installation, and running information.
+
+Jeffrey B. Reed @email{daboys@@austin.rr.com}
+
+@section RUNNING LILYPOND -- by Dominique Cretel
+
+You may want to refer to section FIXME, for more current
+information about downloading, installing, and running the Windows-NT
+binary distribution.
+
+@enumerate i
+@item First, I have download tha 0.1.64 version of LilyPond music software.
+
+@item Then I extract it in a temp directory, and I move the directory
+"lilypond-0.1.64" to the root directory of my D drive.
+
+@item I go to the D:\Lilypond-0.1.64\tex directory to modify the
+lilyponddefs.tex file (lines 75 and 84), and comment all
+cmbx15 ans cmbx14, and replace them by cmbx12.
+
+@item build a command file like this:
+Note: I use MiKTeX to process the tex file generated.
+
+@example
+
+---begin ly2dvi.bat
+echo off
+set ver=0.1.64
+set path=%path%;d:\lilypond-%ver%\bin
+lilypond -I d:\lilypond-%ver%\init %1
+rem *** pause
+
+set path=c:\texmf\miktex\bin;%path%
+set TEXINPUTS=%TEXINPUTS%;d:\lilypond-%ver%\tex
+set MFINPUTS=%MFINPUTS%;d:\lilypond-%ver%\mf
+tex %1.tex
+rem *** pause
+
+dvips %1.dvi
+rem *** pause
+
+set path=%path%;d:\gstools\gsview
+gsview32 %1.ps
+---end ly2dvi.bat
+
+@end example
+
+@item execute lilypond by doing:
+@example
+
+ly2ps silly <Enter>
+
+@end example
+
+@end enumerate
+
+Note:
+@*
+You'll better have to put the SET commands lines in a separate command
+file to avoid consumming each time environnment ressources.
+
+Bye,@*
+Dominique Cretel @email{dominique.cretel@@cfwb.be}
+
+@section PROBLEMS AND ANWSWERS
+
+This is all to confusing. I have:
+@enumerate i
+@item downloaded @file{/tmp/lilypond-0.1.78.tar.gz}
+@item @example
+
+ cd ~/usr/src
+
+@end example
+
+@item @example
+
+ tar zxf /tmp/lilypond-0.1.78.tar.gz
+
+@end example
+
+@item @example
+
+ ./configure --prefix=/users/jeff/lilypond-0.1.78 \--enable-tex-prefix=/users/jeff/lilypond-0.1.78/texmf \--enable-tex-dir=/users/jeff/lilypond-0.1.78/texmf/tex \--enable-mf-dir=/users/jeff/lilypond-0.1.78/texmf/mf
+
+@end example
+
+@item @example
+
+ make
+
+@end example
+
+@item @example
+
+ make install
+
+@end example
+
+@end enumerate
+
+I did have a problem with lilypond.info. And I will look into this
+further. After mending lilypond.info issue, it compiled and install
+with no problems.
+
+I have 64 Meg of physical memory and 64 Meg of swap. Actually I need
+to increase the swap space. If a memory problem is occuring it most
+likely is during the link process of lilypond. There is a boat load
+of objects to link.
+
+Jan the mount -b stuff is confussing to me. I have the entire system
+mounted _without_ -b and only use -b on certain paths for programs
+that create binary files that do not use O_BINARY open option. By the
+way the midi file open is one of these cases, I need to look into
+that. I have had no problems with this methodology.
+
+
+The windows multiroot filesystem is an utterly broken concept. Please
+do everything on one (urg) drive, C:.
+
+@example
+
+> configure
+> creating cache ./config.cache
+> [..]
+> creating config.make
+> creating config.hh
+> cd: lstat /d failed
+
+@end example
+
+Ok, this looks like another stupid windows problem.
+You're working on 'drive D:', right?
+
+I can think of some solutions, but i don't know if they work;
+i just had to do some work in windows some time ago. If you
+have problems with this, please ask @email{gnu-win32@@cygnus.com}.
+I'll start with the simplest:
+@itemize @bullet
+ @item do everything on drive C:, or
+ @item explicitely mount drive d:, work from there:
+ @example
+
+ mkdir -p /mnt/d
+ mount d: /mnt/d
+ cd /mnt/d/lilypond-x.y.z/
+
+@end example
+
+ @item make d:/ the root of cygnus, in cmd.exe/command.exe do:
+ @example
+
+ umount /
+ mount d: /
+
+@end example
+
+@end itemize
+
+
+> - First I have installed Python (for win32) "Pyth151.exe" and "Configure
+@*
+> don't find it. I had to put it in the path for configure find it?
+@*
+
+Yes, of course. It should be possible to have different versions of tools
+installed (e.g. perl 4 and perl 5). The best way to tell people (or tools
+like configure) which one to use is to put it in the path?
+
+Another small unix lesson: Where under dos each program installs itself
+into a nice directory
+@example
+
+ c:\DosProgram\*
+
+@end example
+
+under unix, installation is handled centrally. Executables go in
+@file{/usr/bin} (or @file{/usr/local/bin}), and are always in your path.
+
+
+@example
+
+> 4. make -C lily don't work. I get an error (see below). I get several
+> object files in the ./lily/out directory (34 files: 17 *.dep, 16 *.o,
+> and 1 *.hh):
+> [...]
+> include/engraver-group.hh:35: virtual memory exhausted
+> make: *** [out/bar-grav.o] Error 1
+> bash-2.01$
+
+
+@end example
+
+Ok, so everything works now, there's only some error with one of the
+source files. Lets see which one (and now the cc's now why they're
+reading this :-)
+
+It looks like you've run out of memory. You should compile without
+optimisation, gcc/egcs need a lot of memory for optimising.
+Reconfigure without optimisation:
+@example
+
+ configure --disable-optimise
+
+@end example
+
+or edit @file{config.make}:
+@example
+
+ ## USER_CXXFLAGS = -g # -O no optimise!
+ USER_CXXFLAGS = -g
+
+@end example
+
+There are some other things to look at: how much RAM do you have
+(please say something > 8Mb :-)? Although it might be an egcs bug,
+you should have a look at the size of your swap file.
+For an US version of windows, you should find it here:
+@example
+
+ /start/settings/control-panel/system/performance/virtual-memory
+
+@end example
+
+you see, amongst others, these entries:
+@example
+
+ paging file size for selected drive:
+
+ space-available: xx
+ initial-size: xx
+ maximum-size: xx
+
+ total paging file size for all drives
+
+ currently allocated: xx
+
+@end example
+
+Try to set:
+@example
+
+ initial-size: 64
+ maximum-size: 128
+
+@end example
+
+Make sure that:
+@itemize @bullet
+@item maximum-size >= 128 Mb
+@item urrently-allocated + space-available >= 128 Mb
+@end itemize
+
+
+@bye
@mudelafile{tie.ly}
-When tieing notes with accidentals across a bar boundary, the
-accidental must not be drawn on the note in the new bar.
-Instead, the next note of the same pitch in this bar should always show the
-accidental (even if it's natural).
-Well, and slurring a accidentaled note to a natural one across bar
-boundaries should be explicit...
+When tieing notes with accidentals across a bar boundary, the accidental
+must not be drawn on the note in the new bar. Instead, the next note of
+the same pitch in this bar should always show the accidental (even if
+it's natural). Slurring a accidentaled note to a natural one across bar
+boundaries should be explicit.
+
+Pitches can be verified by printing them with the @code{NoteNames} context.
@mudelafile{tie-accidental.ly}
-\score { \notes
- \relative cis' {
-
-\time 4/4;
-gis'2 gis ~ |
+thenotes = \notes \relative cis' { \time 4/4; gis'2 gis ~ |
gis gis4 gis |
g2 gis ~ |
gis g4 gis |
g2 gis( |
-)g gis4 gis |
-}}
+)g gis4 gis | }
+
+\score { < \context Staff \thenotes
+ \context NoteNames \thenotes
+ >
+}
--- /dev/null
+
+
+% \property Score. measurePosition = #(make-moment -1 4)
+\partial 4;
+c''4 c4 c4 c2 c1
+\cadenzaOn [c8 d e f] [g a b c b c b c]
+\cadenzaOff
+c4 c4 c4 c4
+\property Score. measureLength = #(make-moment 5 4)
+
+c1 c4
+c1 c4
+c4 c4
+\property Score. measurePosition = #(make-moment -3 8)
+b8 b b
+c4 c1
if (!timer_l_)
return;
- Time_description const *time = &timer_l_->time_;
- int num = time->whole_per_measure_ / time->one_beat_;
- int den = time->one_beat_.den_i ();
+ int num;
+ int den;
+ timer_l_->get_time_signature (&num, &den);
+
String time_str = String ("time") + to_str (num) + "_" + to_str (den);
String type_str;
/*
first guess: end beam at end of beat
*/
- Moment end_mom = time->one_beat_;
+ Moment end_mom = timer_l_->one_beat_;
/*
second guess: property generic time exception
Rational r;
if (end_mom)
- r = time->whole_in_measure_.mod_rat (end_mom);
+ r = timer_l_->measure_position ().mod_rat (end_mom);
else
r = Moment (1);
return;
if (begin_mom)
- r = time->whole_in_measure_.mod_rat (begin_mom);
+ r = timer_l_->measure_position ().mod_rat (begin_mom);
if (!stem_l_arr_p_ && (!begin_mom || !r))
begin_beam ();
}
assert (!grouping_p_);
grouping_p_ = new Beaming_info_list;
beam_start_moment_ = now_mom ();
- beam_start_location_ = timer_l_->time_.whole_in_measure_;
+ beam_start_location_ = timer_l_->measure_position ();
}
Beam*
if (!bar_p_)
{
bar_p_ = new Staff_bar;
- bar_p_->set_elt_property ("break-priority", gh_int2scm (0));
+ bar_p_->set_elt_property ("break-aligned", SCM_BOOL_T);
// urg: "" != empty...
SCM default_type = get_property ("defaultBarType", 0);
#include "bar-number-engraver.hh"
-#include "time-description.hh"
+#include "timing-translator.hh"
#include "timing-engraver.hh"
#include "engraver-group-engraver.hh"
#include "text-item.hh"
Bar_number_engraver::do_process_requests ()
{
Translator *tr = daddy_grav_l ()->get_simple_translator ("Timing_engraver");
- Timing_translator *timer = dynamic_cast<Timing_translator*>(tr);
- Time_description *time = &timer->time_;
+ Timing_translator *time = dynamic_cast<Timing_translator*>(tr);
- if (!time->whole_in_measure_ && !time->cadenza_b_ && now_mom () > Moment (0))
+ // todo include (&&!time->cadenza_b_ )
+ if (!time->measure_position () && now_mom () > Moment (0))
{
create_items (0);
- text_p_->text_str_ = to_str (time->bars_i_);
+ text_p_->text_str_ = to_str (time->bars_i ());
}
}
{
spanbar_p_ =0;
use_priority_b_ = true;
- break_priority_i_ = 0;
}
Span_bar*
if (use_priority_b_)
{
- spanbar_p_->set_elt_property ("break-priority",
- gh_int2scm (break_priority_i_));
+ spanbar_p_->set_elt_property ("break-aligned", SCM_BOOL_T);
}
else
{
#include "beam.hh"
#include "stem.hh"
#include "warn.hh"
-#include "time-description.hh"
+#include "timing-translator.hh"
#include "beaming.hh"
#include "score-engraver.hh"
Translator * t = daddy_grav_l ()->get_simple_translator ("Timing_engraver");
Timing_engraver *timer = dynamic_cast<Timing_engraver*> (t);
- beam_start_location_ = (t) ? timer->time_.whole_in_measure_ : Moment (0);
+ beam_start_location_ = (t) ? timer->measure_position () : Moment (0);
beam_start_mom_ = now_mom();
beam_info_p_ = new Beaming_info_list;
--- /dev/null
+/*
+ break-align-engraver.cc -- implement Break_align_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+#include "engraver.hh"
+#include "protected-scm.hh"
+#include "break-align-item.hh"
+#include "axis-group-item.hh"
+
+class Break_align_engraver : public Engraver
+{
+ Break_align_item *align_l_;
+ Protected_scm column_alist_;
+protected:
+ virtual void acknowledge_element(Score_element_info i);
+ virtual void do_pre_move_processing ();
+ void add_column (SCM);
+
+public:
+ VIRTUAL_COPY_CONS(Translator);
+ Break_align_engraver ();
+};
+
+
+
+ADD_THIS_TRANSLATOR(Break_align_engraver);
+
+void
+Break_align_engraver::add_column (SCM smob)
+{
+ Score_element * e = SMOB_TO_TYPE (Score_element, smob);
+ align_l_->add_element (e);
+ typeset_element (e);
+}
+
+void
+Break_align_engraver::do_pre_move_processing ()
+{
+ SCM order = get_property ("breakAlignOrder", 0);
+ for (; gh_pair_p (order); order = gh_cdr (order))
+ {
+ SCM p = scm_assoc ( gh_car (order), column_alist_);
+ if (gh_pair_p (p))
+ {
+ add_column (gh_cdr (p));
+ column_alist_ = scm_assoc_remove_x (column_alist_, gh_car (order));
+ }
+ }
+
+ for (SCM p = column_alist_; gh_pair_p (p); p = gh_cdr (p))
+ {
+ SCM pair = gh_car (p);
+ add_column (gh_cdr (pair));
+ }
+
+
+ column_alist_ = SCM_EOL;
+
+ if (align_l_)
+ {
+ typeset_element (align_l_);
+ align_l_ = 0;
+ }
+}
+
+
+Break_align_engraver::Break_align_engraver ()
+{
+ column_alist_ = SCM_EOL;
+ align_l_ =0;
+}
+
+void
+Break_align_engraver::acknowledge_element (Score_element_info inf)
+{
+ if (Item * item_l = dynamic_cast <Item *> (inf.elem_l_))
+ {
+ if (item_l->empty_b (X_AXIS) || item_l->parent_l (X_AXIS))
+ return;
+
+ SCM bp=item_l->remove_elt_property ("breakable");
+ bool breakable = (gh_boolean_p (bp) && gh_scm2bool (bp));
+ if (!breakable)
+ return ;
+
+ SCM al = item_l->remove_elt_property ("break-aligned");
+ if (!gh_boolean_p (al ) || !gh_scm2bool (al))
+ return ;
+
+
+ if (!align_l_)
+ {
+ align_l_ = new Break_align_item;
+ align_l_->set_elt_property ("breakable", SCM_BOOL_T);
+ announce_element (Score_element_info (align_l_,0));
+ }
+
+ SCM name = ly_str02scm (inf.elem_l_->name());
+ SCM s = scm_assoc (name, column_alist_);
+
+ Axis_group_item * group = 0;
+ if (s != SCM_BOOL_F)
+ {
+ Score_element *e = SMOB_TO_TYPE(Score_element, gh_cdr(s));
+ group = dynamic_cast<Axis_group_item*> (e);
+ }
+ else
+ {
+ group = new Axis_group_item;
+ group->set_axes (X_AXIS,X_AXIS);
+ group->set_elt_property ("origin", name);
+ group->set_parent (align_l_, Y_AXIS);
+ announce_element (Score_element_info (group, 0));
+ column_alist_ = scm_assoc_set_x (column_alist_, name, group->self_scm_);
+ }
+ group->add_element (item_l);
+ }
+}
stacking_dir_ = RIGHT;
set_axis (X_AXIS);
}
-
-void
-Break_align_item::add_breakable_item (Item *it)
-{
- SCM pr = it->remove_elt_property ("break-priority");
-
- if (pr == SCM_UNDEFINED)
- return;
-
- int priority = gh_scm2int (pr);
-
- Score_element * column_l = get_elt_by_priority (priority);
- Axis_group_item * hg=0;
- if (column_l)
- {
- hg = dynamic_cast<Axis_group_item*> (column_l);
- }
- else
- {
- hg = new Axis_group_item;
- hg->set_axes (X_AXIS,X_AXIS);
-
- /*
- this is quite ridiculous, but we do this anyway, to ensure that no
- warning bells about missing Y refpoints go off later on.
- */
- hg->set_parent (this, Y_AXIS);
- hg->set_elt_property ("origin", ly_str02scm (it->name ()));
-
- pscore_l_->typeset_element (hg);
- add_element_priority (hg, priority);
-
- if (priority == 0)
- center_l_ = hg;
- }
-
- hg->add_element (it);
-}
-
*/
#include "duration-convert.hh"
-#include "time-description.hh"
+#include "timing-translator.hh"
#include "chord-tremolo-engraver.hh"
#include "stem.hh"
#include "beam.hh"
#include "clef-item.hh"
#include "debug.hh"
#include "command-request.hh"
-#include "time-description.hh"
+#include "timing-translator.hh"
#include "note-head.hh"
#include "key-item.hh"
#include "local-key-item.hh"
if (!clef_p_)
{
Clef_item *c= new Clef_item;
+ c->set_elt_property ("break-aligned", SCM_BOOL_T);
announce_element (Score_element_info (c, clef_req_l_));
clef_p_ = c;
}
#include "debug.hh"
#include "musical-request.hh"
-void
-Cadenza_req::do_print () const
-{
-#ifndef NPRINT
- DEBUG_OUT << (int)on_b_;
-#endif
-}
-
-bool
-Cadenza_req::do_equal_b (Request const *r) const
-{
- Cadenza_req const*cad = dynamic_cast <Cadenza_req const *> (r);
- return cad && cad->on_b_ == on_b_;
-}
-
-Cadenza_req::Cadenza_req (bool b)
-{
- on_b_ =b;
-}
-
-
bool
Bar_req::do_equal_b (Request const *r) const
type_str_ = s;
}
-Partial_measure_req::Partial_measure_req (Moment m)
-{
- length_mom_ =m;
-}
-bool
-Partial_measure_req::do_equal_b (Request const* r) const
-{
- Partial_measure_req const*p = dynamic_cast <Partial_measure_req const*> (r);
-
- return p&& p->length_mom_ == length_mom_;
-}
bool
Barcheck_req::do_equal_b (Request const *r) const
clef_str_ = s;
}
-void
-Partial_measure_req::do_print () const
-{
- DEBUG_OUT << length_mom_;
-}
void
Time_signature_change_req::do_print () const
Global_translator::Global_translator()
{
- last_mom_ = 0;
}
void
Global_translator::add_moment_to_process (Moment m)
{
- if (m > last_mom_)
+ if (m > final_mom_)
return;
for (int i=0; i < extra_mom_pq_.size(); i++)
void
Global_translator::prepare (Moment m)
{
+ prev_mom_ = now_mom_;
now_mom_ = m;
}
document usage of this.
*/
class Align_element : public virtual Axis_group_element {
+
+ /*
+ ugh. JUNKME
+
+ */
Hash_table<Score_element*,int> priority_i_hash_;
public:
Interval threshold_interval_ ;
horizontal alignment priority, otherwise, hang the spanbar on the
acknowledged bar. */
bool use_priority_b_;
- int break_priority_i_;
virtual void acknowledge_element (Score_element_info);
virtual void do_pre_move_processing();
protected:
virtual void do_pre_processing();
public:
- void add_breakable_item (Item *it);
-
Break_align_item ();
VIRTUAL_COPY_CONS(Score_element);
-
};
#endif // BREAK_ALIGN_ITEM_HH
bool do_equal_b (Request const *) const;
};
-class Partial_measure_req : public Timing_req {
-public:
- Moment length_mom_;
-
- Partial_measure_req (Moment);
-protected:
- VIRTUAL_COPY_CONS(Music);
- virtual void do_print () const;
- bool do_equal_b (Request const *) const;
-};
/**
todo: allow C time_signature
VIRTUAL_COPY_CONS(Music);
};
-/// toggle Cadenza mode
-class Cadenza_req : public Timing_req {
-public:
- /// turn on?
- bool on_b_;
- Cadenza_req (bool);
-protected:
- virtual void do_print () const;
-
- bool do_equal_b (Request const *) const;
- VIRTUAL_COPY_CONS(Music);
-};
/// check if we're at start of a measure.
class Barcheck_req : public Timing_req {
#include "flower-debug.hh"
#include "warn.hh"
-void error_t (const String& s, Time_description const & t_tdes);
-void error_t (String const &s, const Moment &when);
-
// progress
extern ostream *mlog;
PQueue<Moment> extra_mom_pq_;
public:
VIRTUAL_COPY_CONS(Translator);
- Moment last_mom_;
+ Moment final_mom_;
+ Moment prev_mom_;
Moment now_mom_;
Global_translator();
JUNKME.
*/
struct Staff_info {
- Time_description const *time_C_;
Score_column *musical_l_;
Score_column *command_l_;
#ifndef TIME_SIG_ENGRAVER_HH
#define TIME_SIG_ENGRAVER_HH
+
#include "engraver.hh"
-#include "time-description.hh"
/**
generate time_signatures.
Time_signature * time_signature_p_;
Time_signature_engraver();
-
};
#endif // TIME_SIG_ENGRAVER_HH
Bar_req * bar_req_l_;
protected:
- virtual void fill_staff_info (Staff_info&);
virtual bool do_try_music (Music * );
virtual void do_post_move_processing ();
public:
#ifndef TIMING_TRANSLATOR_HH
#define TIMING_TRANSLATOR_HH
+#include "moment.hh"
#include "translator.hh"
-#include "time-description.hh"
+
#include "parray.hh"
class Timing_translator : public virtual Translator
public:
VIRTUAL_COPY_CONS(Translator);
Time_signature_change_req * time_signature_req_l () const;
-
- Time_description time_;
-
+ Timing_translator ();
Link_array<Timing_req> timing_req_l_arr_;
protected:
- virtual void do_print () const;
virtual void do_creation_processing ();
virtual bool do_try_music (Music *req_l);
virtual void do_process_requests();
virtual void do_pre_move_processing();
virtual void do_post_move_processing();
+public:
+ /// how long is one beat?
+ Moment one_beat_;
+
+ /// JUNKME
+ int bars_i () const;
+
+ Moment measure_position () const;
+ Moment measure_length () const;
+ void set_time_signature (int, int);
+ void get_time_signature (int *, int*) const;
+
};
#endif // TIMING_TRANSLATOR_HH
#include "musical-request.hh"
#include "local-key-item.hh"
#include "bar.hh"
-#include "time-description.hh"
+#include "timing-translator.hh"
Key_engraver::Key_engraver ()
{
if (!item_p_)
{
item_p_ = new Key_item;
- item_p_->set_elt_property ("break-priority", gh_int2scm(-1)); // ugh
+ item_p_->set_elt_property ("break-aligned", SCM_BOOL_T); // ugh
+
item_p_->multi_octave_b_ = key_.multi_octave_b_;
announce_element (Score_element_info (item_p_,keyreq_l_));
#include "key-item.hh"
#include "tie.hh"
#include "note-head.hh"
-#include "time-description.hh"
+#include "timing-translator.hh"
#include "engraver-group-engraver.hh"
#include "grace-align-item.hh"
void
Local_key_engraver::do_process_requests()
{
- Time_description const * time_C_ = get_staff_info().time_C_;
- if (time_C_ && !time_C_->whole_in_measure_)
+ Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh
+ Timing_translator * time_C_ = dynamic_cast<Timing_translator*> (tr);
+
+ if (time_C_ && !time_C_->measure_position ())
{
SCM n = get_property ("noResetKey",0);
bool no_res = gh_boolean_p (n) && gh_scm2bool (n);
#include "multi-measure-rest.hh"
#include "multi-measure-rest-engraver.hh"
#include "score-column.hh"
-#include "time-description.hh"
+#include "engraver-group-engraver.hh"
+#include "timing-translator.hh"
#include "bar.hh"
{
if (multi_measure_req_l_ && !mmrest_p_)
{
- Time_description const *time = get_staff_info().time_C_;
+
+ Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh
+ Timing_translator * time = dynamic_cast<Timing_translator*> (tr);
+
mmrest_p_ = new Multi_measure_rest;
if(dynamic_cast<Repetitions_req *> (multi_measure_req_l_))
mmrest_p_->set_elt_property ("alt-symbol",
ly_str02scm ("scripts-repeatsign"));
announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_));
- start_measure_i_ = time->bars_i_;
+ start_measure_i_ = time->bars_i ();
}
}
Multi_measure_rest_engraver::do_pre_move_processing ()
{
Moment now (now_mom ());
- Time_description const *time = get_staff_info().time_C_;
+ Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh
+ Timing_translator * time = dynamic_cast<Timing_translator*> (tr);
+
+
if (mmrest_p_ && (now >= rest_moments_[START])
- && !time->whole_in_measure_
+ && !time->measure_position ()
&& (mmrest_p_->column_arr_.size () >= 2))
{
typeset_element (mmrest_p_);
void
Multi_measure_rest_engraver::do_post_move_processing ()
{
- Time_description const *time = get_staff_info().time_C_;
+ Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh
+ Timing_translator * time = dynamic_cast<Timing_translator*> (tr);
+
Moment now (now_mom ());
- if (mmrest_p_ && !time->whole_in_measure_)
+ if (mmrest_p_ && !time->measure_position ())
{
lastrest_p_ = mmrest_p_;
- lastrest_p_->measures_i_ = time->bars_i_ - start_measure_i_;
+ lastrest_p_->measures_i_ = time->bars_i () - start_measure_i_;
mmrest_p_ = 0;
}
while (o--)
s += to_str (',');
}
-#if 0
- if (octave_i_)
- s += String ((octave_i_> 0)? "^": "_") + to_str (octave_i_);
-#endif
-
+
+
return s;
}
--- /dev/null
+/*
+ note-name-engraver.cc -- implement Note_name_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#include "engraver.hh"
+#include "musical-request.hh"
+#include "text-item.hh"
+
+class Note_name_engraver : public Engraver
+{
+public:
+ VIRTUAL_COPY_CONS(Translator);
+ Link_array<Note_req> req_l_arr_;
+ Link_array<Text_item> texts_;
+ virtual bool do_try_music (Music*m);
+ virtual void do_process_requests ();
+ virtual void do_pre_move_processing ();
+};
+
+bool
+Note_name_engraver::do_try_music (Music *m)
+{
+ if (Note_req *r = dynamic_cast<Note_req* > (m))
+ {
+ req_l_arr_.push (r);
+ return true;
+ }
+ return false;
+}
+
+
+void
+Note_name_engraver::do_process_requests ()
+{
+ String s ;
+ for (int i=0; i < req_l_arr_.size (); i++)
+ {
+ if (i)
+ s += " ";
+ s += req_l_arr_[i]->pitch_.str ();
+ }
+ if (s.length_i())
+ {
+ Text_item * t = new Text_item;
+ t->text_str_ = s;
+ announce_element (Score_element_info (t, req_l_arr_[0]));
+ texts_.push (t);
+ }
+}
+
+void
+Note_name_engraver::do_pre_move_processing ()
+{
+ for (int i=0; i < texts_.size (); i++)
+ {
+ typeset_element (texts_[i]);
+ }
+ texts_.clear() ;
+ req_l_arr_.clear ();
+}
+
+ADD_THIS_TRANSLATOR(Note_name_engraver);
#include "musical-request.hh"
#include "multi-measure-rest.hh"
#include "command-request.hh"
-#include "time-description.hh"
+#include "timing-translator.hh"
#include "engraver-group-engraver.hh"
#include "repeated-music.hh"
-#include "time-description.hh"
+#include "timing-translator.hh"
#include "volta-spanner.hh"
#include "note-column.hh"
#include "paper-def.hh"
return s;
}
+/*
+ UGH. assoc vs. assq
+ */
void
Score_element::set_elt_property (String k, SCM v)
{
return ;
}
*mlog << '\n' << _("Interpreting music...") << flush;
- trans_p->last_mom_ = music_p_->length_mom ();
+ trans_p->final_mom_ = music_p_->length_mom ();
Music_iterator * iter = Music_iterator::static_get_iterator_p (music_p_);
{
Span_bar*s = new Span_bar;
s->type_str_ = "scorebar";
- s->set_elt_property ("break-priority",
- gh_int2scm (-4));
+ s->set_elt_property ("break-aligned",SCM_BOOL_T);
return s;
}
Span_score_bar_engraver::Span_score_bar_engraver ()
{
use_priority_b_ = true;
- break_priority_i_ = -4;
}
Span_bar*
Staff_info::Staff_info()
{
- time_C_ = 0;
command_l_ =0;
musical_l_ =0;
}
#include "staff-margin-engraver.hh"
#include "bar.hh"
-#include "time-description.hh"
+#include "timing-translator.hh"
#include "text-item.hh"
#include "staff-side.hh"
/*
- time-description.cc -- implement Time_description
+ timing-translator.cc -- implement Timing_translator
source file of the GNU LilyPond music typesetter
(c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-#include "time-description.hh"
+#include "timing-translator.hh"
+#include "translator-group.hh"
#include "debug.hh"
-
-String
-Time_description::str () const
-{
- String s ("Time_description { ");
- if (cadenza_b_)
- s += String ("(") + _("cadenza") + ")";
- s += "at ";
- s += when_.str ();
- s +="\ntime_signature " + (whole_per_measure_/one_beat_).str () +":" +
- (Moment (Moment (1)/one_beat_)).str ();
- s += "\nposition " + to_str (bars_i_) + ":"+ whole_in_measure_.str () +"\n}\n";
- return s;
-}
-
-void
-Time_description::print() const
-{
-#ifndef NPRINT
- DEBUG_OUT << str ();
-#endif
-}
-
-void
-Time_description::OK() const
-{
-#ifndef NDEBUG
- if (!cadenza_b_)
- assert (whole_in_measure_ < whole_per_measure_);
- assert (Moment (0) <= whole_in_measure_);
- assert (one_beat_);
-#endif
-}
-
-void
-Time_description::set_cadenza (bool b)
-{
- if (cadenza_b_ && !b)
- {
- if (whole_in_measure_)
- {
- bars_i_ ++; // should do?
- whole_in_measure_ = 0;
- }
- }
- cadenza_b_ = b ;
-}
-
-Time_description::Time_description()
-{
- whole_per_measure_ = 1;
- whole_in_measure_ =0;
- one_beat_ = Moment (1,4);
- when_ = 0;
- bars_i_ = 1; // musician start counting at 1
- cadenza_b_ = false;
-}
-
-void
-Time_description::add (Moment dt)
-{
- assert (dt >= Moment (0));
- when_ += dt;
- whole_in_measure_ += dt;
-
- while (!cadenza_b_ && whole_in_measure_ >= whole_per_measure_)
- {
- whole_in_measure_ -= whole_per_measure_;
- bars_i_ ++;
- }
-}
-
-void
-Time_description::set_time_signature (int l, int o)
-{
- assert (o);
- one_beat_ = Moment (1)/Moment (o);
- whole_per_measure_ = Moment (l) * one_beat_;
-}
-
-bool
-Time_description::allow_time_signature_change_b()
-{
- return!(whole_in_measure_);
-}
-
-/**
- retrieve error messages.
- @return
- error messages if not possible, "" if possible
- */
-String
-Time_description::try_set_partial_str (Moment p) const
-{
- if (p<Moment (0))
- return (_ ("Partial measure must be non-negative"));
- if (p > whole_per_measure_)
- return (_ ("partial measure too large"));
- return "";
-}
-
-void
-Time_description::setpartial (Moment p)
-{
- whole_in_measure_ = whole_per_measure_ - p;
-}
-
-Moment
-Time_description::barleft() const
-{
- assert (!cadenza_b_);
- return whole_per_measure_-whole_in_measure_;
-}
-
-Moment
-Time_description::next_bar_moment() const
-{
- return when_ + barleft();
-}
args.push (req->beats_i_);
args.push (req->one_beat_i_);
- time_signature_p_ = new Time_signature ();
+ time_signature_p_ = new Time_signature;
time_signature_p_->args_ = args;
- time_signature_p_->set_elt_property ("break-priority", gh_int2scm (1)); // 1
+ time_signature_p_->set_elt_property ("break-aligned", SCM_BOOL_T);
}
{
if (time_signature_p_)
{
-
typeset_element (time_signature_p_);
time_signature_p_ =0;
}
#include "score-element-info.hh"
#include "multi-measure-rest.hh"
-void
-Timing_engraver::fill_staff_info (Staff_info &inf)
-{
- inf.time_C_ = &time_;
-}
ADD_THIS_TRANSLATOR(Timing_engraver);
if (!gh_boolean_p (nonauto) && gh_scm2bool (nonauto))
{
SCM always = get_property ("barAlways", 0);
- if (!time_.whole_in_measure_ || gh_boolean_p (always) && gh_scm2bool (always))
+ if (!measure_position ()
+ || (gh_boolean_p (always) && gh_scm2bool (always)))
{
SCM def=get_property ("defaultBarType" ,0);
return (gh_string_p (def))? ly_scm2string (def) : "";
/*
timing-translator.cc -- implement Timing_translator
+
source file of the GNU LilyPond music typesetter
(c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
+#include "debug.hh"
#include "timing-translator.hh"
#include "command-request.hh"
#include "translator-group.hh"
{
int b_i= m_l->beats_i_;
int o_i = m_l->one_beat_i_;
- if (! time_.allow_time_signature_change_b())
- tr_l->warning (_ ("time signature change not allowed here"));
- else
- {
- time_.set_time_signature (b_i, o_i);
- }
- }
- else if (Partial_measure_req *pm = dynamic_cast <Partial_measure_req *> (tr_l))
- {
- Moment m = pm->length_mom_;
- String error = time_.try_set_partial_str (m);
- if (error.length_i ())
- {
- tr_l->warning (error);
- }
- else
- time_.setpartial (m);
+ set_time_signature (b_i, o_i);
}
else if (dynamic_cast <Barcheck_req *> (tr_l))
{
- if (time_.whole_in_measure_)
+ if (measure_position ())
{
tr_l ->warning (_f ("barcheck failed at: %s",
- time_.whole_in_measure_.str ()));
+ measure_position ().str ()));
+ // resync
+ daddy_trans_l_->set_property("measurePosition",
+ (new Moment)->smobify_self ());
+
- time_.whole_in_measure_ = 0; // resync
}
}
- else if (Cadenza_req *cr = dynamic_cast <Cadenza_req *> (tr_l))
- {
- time_.set_cadenza (cr->on_b_);
- }
}
- Translator_group * tr=0;
- SCM barn = get_property ("currentBarNumber", &tr);
- if (gh_number_p(barn))
- {
- time_.bars_i_ = gh_scm2int (barn);
- tr->set_property ("currentBarNumber", SCM_UNDEFINED);
- }
}
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)
- global_l->add_moment_to_process (time_.next_bar_moment ());
+ SCM tim = get_property ("timing", 0);
+ bool timb = gh_boolean_p (tim) && gh_scm2bool ( tim);
+
+
+ if (timb && allbars)
+ {
+ Moment barleft = (measure_length () - measure_position ());
+
+ if (barleft < Moment (0))
+ barleft = 0;
+
+ global_l->add_moment_to_process (now_mom () + barleft);
+ }
}
void
Timing_translator::do_creation_processing()
{
- time_.when_ = now_mom ();
+ daddy_trans_l_->set_property ("timing" , SCM_BOOL_T);
+ daddy_trans_l_->set_property ("currentBarNumber" , gh_int2scm (1));
+ daddy_trans_l_->set_property("measurePosition",
+ (new Moment)->smobify_self());
+ daddy_trans_l_->set_property("measureLength",
+ (new Moment (1))->smobify_self());
+
}
+Moment
+Timing_translator::measure_length () const
+{
+ SCM l = get_property("measureLength",0);
+ if (SMOB_IS_TYPE_B(Moment, l))
+ return *SMOB_TO_TYPE (Moment, l);
+ else
+ return Moment (1);
+}
+
+
void
-Timing_translator::do_post_move_processing()
+Timing_translator::get_time_signature (int *n, int *d) const
{
- time_.add (now_mom () - time_.when_);
+ *n = measure_length () / one_beat_;
+ *d = one_beat_.den_i ();
+}
+void
+Timing_translator::set_time_signature (int l, int o)
+{
+ one_beat_ = Moment (1)/Moment (o);
+ Moment len = Moment (l) * one_beat_;
+ daddy_trans_l_->set_property ("measureLength",
+ (new Moment (len))->smobify_self ());
+}
+
+Timing_translator::Timing_translator()
+{
+ one_beat_ = Moment( 1,4);
+}
+
+
+Moment
+Timing_translator::measure_position () const
+{
+ SCM sm = get_property ("measurePosition",0);
+
+ Moment m =0;
+ if (SMOB_IS_TYPE_B (Moment, sm))
+ {
+ m = *SMOB_TO_TYPE (Moment, sm);
+ while (m < Moment (0))
+ m += measure_length ();
+ }
+
+ return m;
}
void
-Timing_translator::do_print () const
+Timing_translator::do_post_move_processing()
+{
+ Translator *t = this;
+ Global_translator *global_l =0;
+ do
+ {
+ t = t->daddy_trans_l_ ;
+ global_l = dynamic_cast<Global_translator*> (t);
+ }
+ while (!global_l);
+
+ Moment dt = global_l->now_mom_ - global_l -> prev_mom_;
+ if (dt < Moment (0))
+ {
+ programming_error ("Moving backwards in time");
+ dt = 0;
+ }
+
+ if (!dt)
+ return;
+
+ Moment * measposp =0;
+
+ SCM s = get_property ("measurePosition", 0);
+ if (SMOB_IS_TYPE_B (Moment, s))
+ {
+ measposp = SMOB_TO_TYPE (Moment,s);
+ }
+ else
+ {
+ measposp = new Moment;
+ daddy_trans_l_->set_property ("measurePosition", measposp->smobify_self ());
+ }
+
+ *measposp += dt;
+ // don't need to set_property
+
+ Translator_group * tr =daddy_trans_l_;
+ SCM barn = get_property ("currentBarNumber", &tr);
+ int b = 0;
+ if (gh_number_p(barn))
+ {
+ b = gh_scm2int (barn);
+ }
+
+ SCM cad = get_property ("timing", 0);
+ bool c= gh_boolean_p (cad ) && gh_scm2bool (cad);
+
+ Moment len = measure_length ();
+ while (c && *measposp >= len)
+ {
+ *measposp -= len;
+ b ++;
+ }
+
+ tr->set_property ("currentBarNumber", gh_int2scm (b));
+}
+
+
+
+int
+Timing_translator::bars_i () const
{
-#ifndef NPRINT
- time_.print ();
-#endif
+ return gh_scm2int (get_property ("currentBarNumber", 0));
}
#include "debug.hh"
#include "my-lily-lexer.hh"
#include "moment.hh"
-#include "time-description.hh"
+#include "timing-translator.hh"
#include "source-file.hh"
#include "source.hh"
#include "main.hh"
ostream *mlog (&cerr);
-
-void
-error_t (String const & s, Moment const & r)
-{
- String t_mom = r.trunc_rat ().str () + (r - r.trunc_rat ()).str ();
- String e=s+ " (t = " + t_mom + ")";
- error (e);
-}
-
-void
-error_t (String const & s, Time_description const &t_tdes)
-{
- String e=s+ " (at t=" + to_str (t_tdes.bars_i_) + ": " + (t_tdes.whole_in_measure_).str () + ")\n";
- error (e);
-}
% end beams with 16th notes each 1/4 note
% end beams with 32th notes each 1/8 note
+
+%{
+
+UGH UGH.
+
+Fixme: should use an alist
+
+autoBeamSettings = (list
+ (cons (list (make-moment MEASURE) TIME-SIGNATURE) (make-moment INTERVAL)
+ ..
+
+ )
+
+
+
+%}
+
+
+
+
+
+
+
+
+
+
time3_2beamAutoEnd = #(make-moment 1 2)
%time3_2beamAutoEnd_16 = #(make-moment 1 4)
time3_2beamAutoEnd_16 = #(make-moment 1 4)
\consists "Timing_engraver";
\consists "Span_score_bar_engraver";
- \consists "Score_priority_engraver";
+% \consists "Score_priority_engraver";
+ \consists "Break_align_engraver";
+ breakAlignOrder = #'(
+ "Span_bar"
+ "Breathing_sign"
+ "Clef_item"
+ "Key_item"
+ "Staff_bar"
+ "Time_signature"
+ )
\consists "Spacing_engraver";
\consists "Vertical_align_engraver";
alignmentReference = \down;
\accepts "GrandStaff";
\accepts "ChoirStaff";
\accepts "PianoStaff";
+ \accepts "NoteNames";
clefBreakPriority = #-2
breathingSignBreakPriority = #-4
\accepts "HaraKiriStaff";
};
+
+\translator {
+ \type "Engraver_group_engraver";
+ \name NoteNames;
+ \consistsend "Axis_group_engraver";
+ \consists "Note_name_engraver";
+}
(list
(list 'breathingSignVerticalDirection dir? 'direction)
(list 'verticalDirection dir? 'direction)
- (list 'breathingSignBreakPriority number? 'break-priority
- ))))
+ )))
(define generic-clef-properties
(cons "Clef_item"
(list
- (list 'clefBreakPriority number? 'break-priority)
(list 'clefStyle string? 'style))
)
)
conversions.append ((1,2,1), conv,
'dynamicDir -> dynamicDirection')
+if 1:
+ def conv(str):
+ str = re.sub ('\\\\cadenza *0 *;', '\\\\cadenzaOff', str)
+ str = re.sub ('\\\\cadenza *1 *;', '\\\\cadenzaOn', str)
+
+ return str
+
+ conversions.append ((1,3,4), conv,
+ '\\cadenza -> \cadenza{On|Off}')
+
############################