From 45a036ab8ce7968a0c35fdf5352dc1faed1ffb2b Mon Sep 17 00:00:00 2001 From: fred Date: Wed, 10 Nov 1999 12:35:06 +0000 Subject: [PATCH] lilypond-1.3.5 --- Documentation/programmer/README-W32.texi | 820 ++++++++++++++++++++++++++ Documentation/programmer/regression-test.tely | 13 +- input/test/tie-accidental.ly | 14 +- input/test/timing.fly | 16 + lily/auto-beam-engraver.cc | 15 +- lily/bar-engraver.cc | 2 +- lily/bar-number-engraver.cc | 10 +- lily/base-span-bar-engraver.cc | 4 +- lily/beam-engraver.cc | 4 +- lily/break-align-engraver.cc | 122 ++++ lily/break-align-item.cc | 39 -- lily/chord-tremolo-engraver.cc | 2 +- lily/clef-engraver.cc | 3 +- lily/command-request.cc | 37 -- lily/global-translator.cc | 4 +- lily/include/align-element.hh | 5 + lily/include/base-span-bar-engraver.hh | 1 - lily/include/break-align-item.hh | 3 - lily/include/command-request.hh | 22 - lily/include/debug.hh | 3 - lily/include/global-translator.hh | 3 +- lily/include/staff-info.hh | 1 - lily/include/time-signature-engraver.hh | 3 +- lily/include/timing-engraver.hh | 1 - lily/include/timing-translator.hh | 20 +- lily/key-engraver.cc | 5 +- lily/local-key-engraver.cc | 8 +- lily/multi-measure-rest-engraver.cc | 25 +- lily/musical-pitch.cc | 7 +- lily/note-name-engraver.cc | 67 +++ lily/repeat-engraver.cc | 4 +- lily/score-element.cc | 3 + lily/score.cc | 2 +- lily/span-score-bar-engraver.cc | 4 +- lily/staff-info.cc | 1 - lily/staff-margin-engraver.cc | 2 +- lily/time-description.cc | 140 +---- lily/time-signature-engraver.cc | 5 +- lily/timing-engraver.cc | 8 +- lily/timing-translator.cc | 176 ++++-- lily/warn.cc | 17 +- ly/auto-beam-settings.ly | 26 + ly/engraver.ly | 19 +- scm/generic-property.scm | 4 +- scripts/convert-mudela.py | 10 + 45 files changed, 1326 insertions(+), 374 deletions(-) create mode 100644 Documentation/programmer/README-W32.texi create mode 100644 input/test/timing.fly create mode 100644 lily/break-align-engraver.cc create mode 100644 lily/note-name-engraver.cc rewrite lily/time-description.cc (94%) diff --git a/Documentation/programmer/README-W32.texi b/Documentation/programmer/README-W32.texi new file mode 100644 index 0000000000..8abbb88413 --- /dev/null +++ b/Documentation/programmer/README-W32.texi @@ -0,0 +1,820 @@ +\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{}.tar.gz +@item cd yodl-@emph{} +@item ./configure --prefix=/gnuwin32/yodl-@emph{} --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{}.tar.gz +@item cd lilypond-@emph{} +@item ./configure --prefix=/gnuwin32/lilypond-@emph{} \ @* + --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{}.tar.gz +@item cd python-@emph{} +@item configure --prefix=/gnuwin32/Python-@emph{} +@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{}.@emph{} +@item use your normal configure +@item make edits +@item Change @file{VERSION} to increment @emph{} +@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 + +@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 diff --git a/Documentation/programmer/regression-test.tely b/Documentation/programmer/regression-test.tely index f878b78586..3675d89ca7 100644 --- a/Documentation/programmer/regression-test.tely +++ b/Documentation/programmer/regression-test.tely @@ -129,12 +129,13 @@ The horizontal middle should not overlap with a staffline. @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} diff --git a/input/test/tie-accidental.ly b/input/test/tie-accidental.ly index 15722ba403..162e23d8cf 100644 --- a/input/test/tie-accidental.ly +++ b/input/test/tie-accidental.ly @@ -1,12 +1,12 @@ -\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 + > +} diff --git a/input/test/timing.fly b/input/test/timing.fly new file mode 100644 index 0000000000..e73d89a6cb --- /dev/null +++ b/input/test/timing.fly @@ -0,0 +1,16 @@ + + +% \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 diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index fd519c340c..294a1d2858 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -54,9 +54,10 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom) 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; @@ -104,7 +105,7 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom) /* 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 @@ -160,7 +161,7 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom) 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); @@ -175,7 +176,7 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom) 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 (); } @@ -189,7 +190,7 @@ Auto_beam_engraver::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* diff --git a/lily/bar-engraver.cc b/lily/bar-engraver.cc index e5a61176a6..e8b29882f8 100644 --- a/lily/bar-engraver.cc +++ b/lily/bar-engraver.cc @@ -32,7 +32,7 @@ Bar_engraver::create_bar () 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); diff --git a/lily/bar-number-engraver.cc b/lily/bar-number-engraver.cc index e7df04ae89..c8a0aa01bb 100644 --- a/lily/bar-number-engraver.cc +++ b/lily/bar-number-engraver.cc @@ -8,7 +8,7 @@ #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" @@ -25,14 +25,14 @@ void Bar_number_engraver::do_process_requests () { Translator *tr = daddy_grav_l ()->get_simple_translator ("Timing_engraver"); - Timing_translator *timer = dynamic_cast(tr); - Time_description *time = &timer->time_; + Timing_translator *time = dynamic_cast(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 ()); } } diff --git a/lily/base-span-bar-engraver.cc b/lily/base-span-bar-engraver.cc index 24ba35b14b..5b3ea4437e 100644 --- a/lily/base-span-bar-engraver.cc +++ b/lily/base-span-bar-engraver.cc @@ -16,7 +16,6 @@ Base_span_bar_engraver::Base_span_bar_engraver() { spanbar_p_ =0; use_priority_b_ = true; - break_priority_i_ = 0; } Span_bar* @@ -59,8 +58,7 @@ Base_span_bar_engraver::acknowledge_element (Score_element_info i) 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 { diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc index 8f0f52cf1c..e98ab84552 100644 --- a/lily/beam-engraver.cc +++ b/lily/beam-engraver.cc @@ -13,7 +13,7 @@ #include "beam.hh" #include "stem.hh" #include "warn.hh" -#include "time-description.hh" +#include "timing-translator.hh" #include "beaming.hh" #include "score-engraver.hh" @@ -93,7 +93,7 @@ Beam_engraver::do_process_requests () Translator * t = daddy_grav_l ()->get_simple_translator ("Timing_engraver"); Timing_engraver *timer = dynamic_cast (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; diff --git a/lily/break-align-engraver.cc b/lily/break-align-engraver.cc new file mode 100644 index 0000000000..20909e5b03 --- /dev/null +++ b/lily/break-align-engraver.cc @@ -0,0 +1,122 @@ +/* + break-align-engraver.cc -- implement Break_align_engraver + + source file of the GNU LilyPond music typesetter + + (c) 1999 Han-Wen Nienhuys + + */ +#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 (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 (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); + } +} diff --git a/lily/break-align-item.cc b/lily/break-align-item.cc index 2718fdcd94..dd6ab6490d 100644 --- a/lily/break-align-item.cc +++ b/lily/break-align-item.cc @@ -145,42 +145,3 @@ Break_align_item::Break_align_item () 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 (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); -} - diff --git a/lily/chord-tremolo-engraver.cc b/lily/chord-tremolo-engraver.cc index 8888625421..567c31ec6a 100644 --- a/lily/chord-tremolo-engraver.cc +++ b/lily/chord-tremolo-engraver.cc @@ -8,7 +8,7 @@ */ #include "duration-convert.hh" -#include "time-description.hh" +#include "timing-translator.hh" #include "chord-tremolo-engraver.hh" #include "stem.hh" #include "beam.hh" diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc index deaac87548..3d33c6cc7e 100644 --- a/lily/clef-engraver.cc +++ b/lily/clef-engraver.cc @@ -17,7 +17,7 @@ #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" @@ -175,6 +175,7 @@ Clef_engraver::create_clef() 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; } diff --git a/lily/command-request.cc b/lily/command-request.cc index 35f0cdac4c..c9f75ead85 100644 --- a/lily/command-request.cc +++ b/lily/command-request.cc @@ -10,27 +10,6 @@ #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 (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 @@ -52,18 +31,7 @@ Bar_req::Bar_req (String s) 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 (r); - - return p&& p->length_mom_ == length_mom_; -} bool Barcheck_req::do_equal_b (Request const *r) const @@ -85,11 +53,6 @@ Clef_change_req::Clef_change_req (String s) clef_str_ = s; } -void -Partial_measure_req::do_print () const -{ - DEBUG_OUT << length_mom_; -} void Time_signature_change_req::do_print () const diff --git a/lily/global-translator.cc b/lily/global-translator.cc index 997b34e482..9728a4c0f2 100644 --- a/lily/global-translator.cc +++ b/lily/global-translator.cc @@ -12,13 +12,12 @@ 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++) @@ -45,6 +44,7 @@ Global_translator::moments_left_i() const void Global_translator::prepare (Moment m) { + prev_mom_ = now_mom_; now_mom_ = m; } diff --git a/lily/include/align-element.hh b/lily/include/align-element.hh index 4f5434d55d..ff8dddf6f6 100644 --- a/lily/include/align-element.hh +++ b/lily/include/align-element.hh @@ -24,6 +24,11 @@ document usage of this. */ class Align_element : public virtual Axis_group_element { + + /* + ugh. JUNKME + + */ Hash_table priority_i_hash_; public: Interval threshold_interval_ ; diff --git a/lily/include/base-span-bar-engraver.hh b/lily/include/base-span-bar-engraver.hh index 87a24103c3..b4caf237d0 100644 --- a/lily/include/base-span-bar-engraver.hh +++ b/lily/include/base-span-bar-engraver.hh @@ -37,7 +37,6 @@ protected: 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(); diff --git a/lily/include/break-align-item.hh b/lily/include/break-align-item.hh index 120f14920d..f5b8378a3b 100644 --- a/lily/include/break-align-item.hh +++ b/lily/include/break-align-item.hh @@ -19,10 +19,7 @@ class Break_align_item : public Axis_align_item { 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 diff --git a/lily/include/command-request.hh b/lily/include/command-request.hh index ee64d1fe27..9b24ac4b35 100644 --- a/lily/include/command-request.hh +++ b/lily/include/command-request.hh @@ -55,16 +55,6 @@ protected: 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 @@ -81,18 +71,6 @@ protected: 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 { diff --git a/lily/include/debug.hh b/lily/include/debug.hh index ef6f87e0dd..63df6b6afc 100644 --- a/lily/include/debug.hh +++ b/lily/include/debug.hh @@ -13,9 +13,6 @@ #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; diff --git a/lily/include/global-translator.hh b/lily/include/global-translator.hh index 00f8ed8204..fbb8f8d37e 100644 --- a/lily/include/global-translator.hh +++ b/lily/include/global-translator.hh @@ -22,7 +22,8 @@ class Global_translator : public virtual Translator_group{ PQueue extra_mom_pq_; public: VIRTUAL_COPY_CONS(Translator); - Moment last_mom_; + Moment final_mom_; + Moment prev_mom_; Moment now_mom_; Global_translator(); diff --git a/lily/include/staff-info.hh b/lily/include/staff-info.hh index 3eaa1a4e48..5484f4fb97 100644 --- a/lily/include/staff-info.hh +++ b/lily/include/staff-info.hh @@ -17,7 +17,6 @@ JUNKME. */ struct Staff_info { - Time_description const *time_C_; Score_column *musical_l_; Score_column *command_l_; diff --git a/lily/include/time-signature-engraver.hh b/lily/include/time-signature-engraver.hh index 9567489243..39770351c7 100644 --- a/lily/include/time-signature-engraver.hh +++ b/lily/include/time-signature-engraver.hh @@ -9,8 +9,8 @@ #ifndef TIME_SIG_ENGRAVER_HH #define TIME_SIG_ENGRAVER_HH + #include "engraver.hh" -#include "time-description.hh" /** generate time_signatures. @@ -24,6 +24,5 @@ public: Time_signature * time_signature_p_; Time_signature_engraver(); - }; #endif // TIME_SIG_ENGRAVER_HH diff --git a/lily/include/timing-engraver.hh b/lily/include/timing-engraver.hh index 99621579ec..bcbbfd6e51 100644 --- a/lily/include/timing-engraver.hh +++ b/lily/include/timing-engraver.hh @@ -21,7 +21,6 @@ class Timing_engraver : public Timing_translator, public Engraver 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: diff --git a/lily/include/timing-translator.hh b/lily/include/timing-translator.hh index ad2517ee22..afe7d20316 100644 --- a/lily/include/timing-translator.hh +++ b/lily/include/timing-translator.hh @@ -10,8 +10,9 @@ #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 @@ -19,17 +20,26 @@ 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_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 diff --git a/lily/key-engraver.cc b/lily/key-engraver.cc index c7b1675fa1..f69786091b 100644 --- a/lily/key-engraver.cc +++ b/lily/key-engraver.cc @@ -13,7 +13,7 @@ #include "musical-request.hh" #include "local-key-item.hh" #include "bar.hh" -#include "time-description.hh" +#include "timing-translator.hh" Key_engraver::Key_engraver () { @@ -33,7 +33,8 @@ Key_engraver::create_key () 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_)); diff --git a/lily/local-key-engraver.cc b/lily/local-key-engraver.cc index 85c857f369..32d793d6d8 100644 --- a/lily/local-key-engraver.cc +++ b/lily/local-key-engraver.cc @@ -13,7 +13,7 @@ #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" @@ -153,8 +153,10 @@ Local_key_engraver::acknowledge_element (Score_element_info info) 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 (tr); + + if (time_C_ && !time_C_->measure_position ()) { SCM n = get_property ("noResetKey",0); bool no_res = gh_boolean_p (n) && gh_scm2bool (n); diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index e4e115b4dc..cd6efa3172 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -10,7 +10,8 @@ #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" @@ -71,13 +72,16 @@ Multi_measure_rest_engraver::do_process_requests () { 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 (tr); + mmrest_p_ = new Multi_measure_rest; if(dynamic_cast (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 (); } } @@ -85,9 +89,12 @@ void 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 (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_); @@ -105,13 +112,15 @@ Multi_measure_rest_engraver::do_pre_move_processing () 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 (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; } diff --git a/lily/musical-pitch.cc b/lily/musical-pitch.cc index fedf7adcb0..409c71d92b 100644 --- a/lily/musical-pitch.cc +++ b/lily/musical-pitch.cc @@ -107,11 +107,8 @@ Musical_pitch::str () const while (o--) s += to_str (','); } -#if 0 - if (octave_i_) - s += String ((octave_i_> 0)? "^": "_") + to_str (octave_i_); -#endif - + + return s; } diff --git a/lily/note-name-engraver.cc b/lily/note-name-engraver.cc new file mode 100644 index 0000000000..46c7ab52d6 --- /dev/null +++ b/lily/note-name-engraver.cc @@ -0,0 +1,67 @@ +/* + note-name-engraver.cc -- implement Note_name_engraver + + source file of the GNU LilyPond music typesetter + + (c) 1999 Han-Wen Nienhuys + + */ + +#include "engraver.hh" +#include "musical-request.hh" +#include "text-item.hh" + +class Note_name_engraver : public Engraver +{ +public: + VIRTUAL_COPY_CONS(Translator); + Link_array req_l_arr_; + Link_array 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 (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); diff --git a/lily/repeat-engraver.cc b/lily/repeat-engraver.cc index 3be9fb02e2..b389d92ee5 100644 --- a/lily/repeat-engraver.cc +++ b/lily/repeat-engraver.cc @@ -12,10 +12,10 @@ #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" diff --git a/lily/score-element.cc b/lily/score-element.cc index 85254c4278..fd619447f0 100644 --- a/lily/score-element.cc +++ b/lily/score-element.cc @@ -122,6 +122,9 @@ Score_element::remove_elt_property (String key) return s; } +/* + UGH. assoc vs. assq + */ void Score_element::set_elt_property (String k, SCM v) { diff --git a/lily/score.cc b/lily/score.cc index b517950721..cc73e09c1c 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -57,7 +57,7 @@ Score::run_translator (Music_output_def *odef_l) 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_); diff --git a/lily/span-score-bar-engraver.cc b/lily/span-score-bar-engraver.cc index 1c6a21541c..770aa4c4c5 100644 --- a/lily/span-score-bar-engraver.cc +++ b/lily/span-score-bar-engraver.cc @@ -17,8 +17,7 @@ Span_score_bar_engraver::get_span_bar_p () const { 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; } @@ -27,7 +26,6 @@ Span_score_bar_engraver::get_span_bar_p () const Span_score_bar_engraver::Span_score_bar_engraver () { use_priority_b_ = true; - break_priority_i_ = -4; } Span_bar* diff --git a/lily/staff-info.cc b/lily/staff-info.cc index a527bc3c18..da993f9d95 100644 --- a/lily/staff-info.cc +++ b/lily/staff-info.cc @@ -13,7 +13,6 @@ Staff_info::Staff_info() { - time_C_ = 0; command_l_ =0; musical_l_ =0; } diff --git a/lily/staff-margin-engraver.cc b/lily/staff-margin-engraver.cc index 13c9c7f9e6..44dfb2df24 100644 --- a/lily/staff-margin-engraver.cc +++ b/lily/staff-margin-engraver.cc @@ -8,7 +8,7 @@ #include "staff-margin-engraver.hh" #include "bar.hh" -#include "time-description.hh" +#include "timing-translator.hh" #include "text-item.hh" #include "staff-side.hh" diff --git a/lily/time-description.cc b/lily/time-description.cc dissimilarity index 94% index 7bff5347e2..2874444da4 100644 --- a/lily/time-description.cc +++ b/lily/time-description.cc @@ -1,129 +1,11 @@ -/* - time-description.cc -- implement Time_description - - source file of the GNU LilyPond music typesetter - - (c) 1997--1999 Han-Wen Nienhuys -*/ - -#include "time-description.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 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(); -} +/* + timing-translator.cc -- implement Timing_translator + + source file of the GNU LilyPond music typesetter + + (c) 1997--1999 Han-Wen Nienhuys +*/ + +#include "timing-translator.hh" +#include "translator-group.hh" +#include "debug.hh" diff --git a/lily/time-signature-engraver.cc b/lily/time-signature-engraver.cc index e30d1619e2..bba35fe2b1 100644 --- a/lily/time-signature-engraver.cc +++ b/lily/time-signature-engraver.cc @@ -39,9 +39,9 @@ Time_signature_engraver::do_process_requests() 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); } @@ -54,7 +54,6 @@ Time_signature_engraver::do_pre_move_processing() { if (time_signature_p_) { - typeset_element (time_signature_p_); time_signature_p_ =0; } diff --git a/lily/timing-engraver.cc b/lily/timing-engraver.cc index 29ee1d6d8c..ac2373da6a 100644 --- a/lily/timing-engraver.cc +++ b/lily/timing-engraver.cc @@ -12,11 +12,6 @@ #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); @@ -57,7 +52,8 @@ Timing_engraver::which_bar () 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) : ""; diff --git a/lily/timing-translator.cc b/lily/timing-translator.cc index 03479ed5b8..4e4ef89a6b 100644 --- a/lily/timing-translator.cc +++ b/lily/timing-translator.cc @@ -1,11 +1,13 @@ /* timing-translator.cc -- implement Timing_translator + source file of the GNU LilyPond music typesetter (c) 1997--1999 Han-Wen Nienhuys */ +#include "debug.hh" #include "timing-translator.hh" #include "command-request.hh" #include "translator-group.hh" @@ -58,48 +60,24 @@ Timing_translator::do_process_requests() { 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 (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 (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 (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); - } } @@ -121,8 +99,19 @@ Timing_translator::do_pre_move_processing() 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); + } } @@ -131,21 +120,128 @@ ADD_THIS_TRANSLATOR(Timing_translator); 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 (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)); } diff --git a/lily/warn.cc b/lily/warn.cc index 532d2e3fb8..3623178380 100644 --- a/lily/warn.cc +++ b/lily/warn.cc @@ -10,7 +10,7 @@ #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" @@ -20,18 +20,3 @@ ostream &warnout (cerr); 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); -} diff --git a/ly/auto-beam-settings.ly b/ly/auto-beam-settings.ly index c3f20c4886..50044c786e 100644 --- a/ly/auto-beam-settings.ly +++ b/ly/auto-beam-settings.ly @@ -18,6 +18,32 @@ % 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) diff --git a/ly/engraver.ly b/ly/engraver.ly index cd6f98cf44..8fec27817a 100644 --- a/ly/engraver.ly +++ b/ly/engraver.ly @@ -309,7 +309,16 @@ ScoreContext = \translator { \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; @@ -323,6 +332,7 @@ ScoreContext = \translator { \accepts "GrandStaff"; \accepts "ChoirStaff"; \accepts "PianoStaff"; + \accepts "NoteNames"; clefBreakPriority = #-2 breathingSignBreakPriority = #-4 @@ -341,3 +351,10 @@ OrchestralScoreContext= \translator { \accepts "HaraKiriStaff"; }; + +\translator { + \type "Engraver_group_engraver"; + \name NoteNames; + \consistsend "Axis_group_engraver"; + \consists "Note_name_engraver"; +} diff --git a/scm/generic-property.scm b/scm/generic-property.scm index 88b6b6a3e1..e12646599d 100644 --- a/scm/generic-property.scm +++ b/scm/generic-property.scm @@ -40,13 +40,11 @@ (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)) ) ) diff --git a/scripts/convert-mudela.py b/scripts/convert-mudela.py index b23b0e6cdd..7daa574c62 100644 --- a/scripts/convert-mudela.py +++ b/scripts/convert-mudela.py @@ -377,6 +377,16 @@ if 1: 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}') + ############################ -- 2.11.4.GIT