From ebd181bdf74b864a670d12a0a8cc8392595f3408 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Tue, 9 Oct 2001 00:04:37 +0200 Subject: [PATCH] release: 1.5.16 =========== * Fixes for latest guile cvs. * Add --enable-optimising flag to configure (Huh?). * Only inline string utlis when optimising. * Compile fix. 1.5.15. --- CHANGES | 33 +- VERSION | 4 +- configure | 253 +++++----- input/test/accidentals.ly | 23 + input/test/ancient-font.ly | 11 +- lily/accidental-engraver.cc | 112 +++-- lily/beam.cc | 4 +- lily/folded-repeat-iterator.cc | 4 +- lily/include/lily-guile.hh | 2 + lily/include/music-sequence.hh | 15 +- lily/include/porrectus.hh | 1 + lily/include/repeated-music.hh | 2 +- lily/lily-guile.cc | 23 + lily/lyric-combine-music.cc | 16 +- lily/music-sequence.cc | 68 +-- lily/parser.yy | 57 +-- lily/part-combine-music.cc | 14 +- lily/porrectus-engraver.cc | 50 +- lily/porrectus.cc | 257 +++++++--- lily/repeated-music.cc | 22 +- lily/sequential-music.cc | 4 +- lily/simultaneous-music-iterator.cc | 3 +- lily/simultaneous-music.cc | 6 +- lily/unfolded-repeat-iterator.cc | 2 +- make/out/lilypond.lsm | 8 +- make/out/lilypond.mandrake.spec | 2 +- make/out/lilypond.redhat.spec | 4 +- make/out/lilypond.suse.spec | 4 +- modules/midi.c | 5 - scm/grob-description.scm | 5 +- scm/grob-property-description.scm | 1 + scm/music-property-description.scm | 10 +- scm/translator-description.scm | 635 ------------------------ scm/translator-property-description.scm | 5 + scripts/midi2ly.py | 1 + 35 files changed, 637 insertions(+), 1029 deletions(-) create mode 100644 input/test/accidentals.ly delete mode 100644 scm/translator-description.scm diff --git a/CHANGES b/CHANGES index 8f29695d35..7eac9d8357 100644 --- a/CHANGES +++ b/CHANGES @@ -9,8 +9,37 @@ * Compile fix. -1.5.15 -====== +1.5.15.rz1 +========== + +* added property autoReminders, automatically creating reminder + accidentals. - major changes to accidental-engraver. + +1.5.15.hwn1 +=========== + +* Junk translator-description.scm + +* Make Repeated_music use 'element and 'elements in stead of 'body and +'alternatives. Associated changes in parser and music-sequence.cc. + +* Change Part_combine_music and Lyric_combine_music to use 'elements +music property. + +* Porrectus patch (Juergen Reuter) + + - Rewrote code for vaticana style porrectus grob; the solid shape is + now drawn as a single bezier sandwich rather than composed from a + couple of misused slurs. Looks now much nicer. + + - Added code to forbid line-breaking inbetween a porrectus + (preliminary; to be moved to ligature engraver framework). + + - Added auto-properties property for automatic determination of grob + properties add-stem and stem-direction from musical context. + + - Small clean-ups. + 1.5.14.jcn6 =========== diff --git a/VERSION b/VERSION index e5b6a8e318..39881eb45d 100644 --- a/VERSION +++ b/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=5 -PATCH_LEVEL=15 -MY_PATCH_LEVEL=jcn1 +PATCH_LEVEL=16 +MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/configure b/configure index 3aab916d87..3f9f6b4dcd 100755 --- a/configure +++ b/configure @@ -71,6 +71,8 @@ ac_help="$ac_help --enable-checking set runtime checks (assert calls). Default: on" ac_help="$ac_help --enable-debugging compile with debugging info. Default: on" +ac_help="$ac_help + --enable-optimising compile with optimising. Default: on" ac_help="$ac_help --enable-profiling compile with gprof support. Default: off" ac_help="$ac_help @@ -626,12 +628,12 @@ fi fi echo $ac_n "checking Package""... $ac_c" 1>&6 -echo "configure:630: checking Package" >&5 +echo "configure:632: checking Package" >&5 if test "x$PACKAGE" = "xSTEPMAKE"; then echo "$ac_t""Stepmake package!" 1>&6 echo $ac_n "checking builddir""... $ac_c" 1>&6 -echo "configure:635: checking builddir" >&5 +echo "configure:637: checking builddir" >&5 if test "$srcdir" = "."; then builddir=. else @@ -669,7 +671,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. echo "$ac_t""$PACKAGE" 1>&6 echo $ac_n "checking builddir""... $ac_c" 1>&6 -echo "configure:673: checking builddir" >&5 +echo "configure:675: checking builddir" >&5 if test "$srcdir" = "."; then builddir=. srcdir_build=no @@ -689,7 +691,7 @@ echo "configure:673: checking builddir" >&5 fi echo $ac_n "checking for stepmake""... $ac_c" 1>&6 -echo "configure:693: checking for stepmake" >&5 +echo "configure:695: checking for stepmake" >&5 # Check for installed stepmake if test -d $stepmake; then echo "$ac_t""$stepmake" 1>&6 @@ -811,7 +813,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:815: checking host system type" >&5 +echo "configure:817: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -836,7 +838,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:840: checking for $ac_word" >&5 +echo "configure:842: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_MAKE'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -871,7 +873,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:875: checking for $ac_word" >&5 +echo "configure:877: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_FIND'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -908,7 +910,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:912: checking for $ac_word" >&5 +echo "configure:914: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_TAR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -943,7 +945,7 @@ test -n "$TAR" || TAR="error" # Extract the first word of "bash", so it can be a program name with args. set dummy bash; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:947: checking for $ac_word" >&5 +echo "configure:949: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_BASH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -983,7 +985,7 @@ fi # Extract the first word of "bash", so it can be a program name with args. set dummy bash; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:987: checking for $ac_word" >&5 +echo "configure:989: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_SHELL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1020,7 +1022,7 @@ fi # Extract the first word of "bash", so it can be a program name with args. set dummy bash; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1024: checking for $ac_word" >&5 +echo "configure:1026: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_BASH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1061,7 +1063,7 @@ fi # Extract the first word of "${PYTHON:-python}", so it can be a program name with args. set dummy ${PYTHON:-python}; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1065: checking for $ac_word" >&5 +echo "configure:1067: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PYTHON'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1227,6 +1229,13 @@ if test "${enable_debugging+set}" = set; then fi + # Check whether --enable-optimising or --disable-optimising was given. +if test "${enable_optimising+set}" = set; then + enableval="$enable_optimising" + optimise_b=$enableval +fi + + # Check whether --enable-profiling or --disable-profiling was given. if test "${enable_profiling+set}" = set; then enableval="$enable_profiling" @@ -1262,7 +1271,7 @@ EOF # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1266: checking for $ac_word" >&5 +echo "configure:1275: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1292,7 +1301,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1296: checking for $ac_word" >&5 +echo "configure:1305: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1343,7 +1352,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1347: checking for $ac_word" >&5 +echo "configure:1356: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1375,7 +1384,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1379: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:1388: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1386,12 +1395,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 1390 "configure" +#line 1399 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:1395: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1404: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1417,12 +1426,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1421: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1430: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1426: checking whether we are using GNU C" >&5 +echo "configure:1435: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1431,7 +1440,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1435: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1444: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1450,7 +1459,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1454: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:1463: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1488,7 +1497,7 @@ fi CPPFLAGS=${CPPFLAGS:-""} echo $ac_n "checking for IEEE-conformance compiler flags""... $ac_c" 1>&6 -echo "configure:1492: checking for IEEE-conformance compiler flags" >&5 +echo "configure:1501: checking for IEEE-conformance compiler flags" >&5 save_cflags="$CFLAGS" case "$host" in alpha*-*-*) @@ -1510,7 +1519,7 @@ echo "configure:1492: checking for IEEE-conformance compiler flags" >&5 # AC_HAVE_HEADERS(limits.h malloc.h string.h unistd.h values.h) echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1514: checking how to run the C preprocessor" >&5 +echo "configure:1523: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -1525,13 +1534,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1535: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1544: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -1542,13 +1551,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1552: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1561: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -1559,13 +1568,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1569: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1578: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -1593,17 +1602,17 @@ for ac_hdr in assert.h sys/stat.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1597: checking for $ac_hdr" >&5 +echo "configure:1606: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1607: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1616: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -1630,12 +1639,12 @@ fi done echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6 -echo "configure:1634: checking whether stat file-mode macros are broken" >&5 +echo "configure:1643: checking whether stat file-mode macros are broken" >&5 if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -1686,14 +1695,8 @@ EOF fi -DEFINES="$DEFINES -DSTRING_UTILS_INLINED" -cat >> confdefs.h <<\EOF -#define STRINGS_UTILS_INLINED 1 -EOF - - echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6 -echo "configure:1697: checking how to run the C++ preprocessor" >&5 +echo "configure:1700: checking how to run the C++ preprocessor" >&5 if test -z "$CXXCPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1706,12 +1709,12 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes cross_compiling=$ac_cv_prog_cxx_cross CXXCPP="${CXX-g++} -E" cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1715: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1718: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -1748,7 +1751,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1752: checking for $ac_word" >&5 +echo "configure:1755: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1780,7 +1783,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1784: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:1787: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1791,12 +1794,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 1795 "configure" +#line 1798 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:1800: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1803: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1822,12 +1825,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1826: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1829: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:1831: checking whether we are using GNU C++" >&5 +echo "configure:1834: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1836,7 +1839,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -1855,7 +1858,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:1859: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:1862: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1889,17 +1892,17 @@ fi ac_safe=`echo "FlexLexer.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for FlexLexer.h""... $ac_c" 1>&6 -echo "configure:1893: checking for FlexLexer.h" >&5 +echo "configure:1896: checking for FlexLexer.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1903: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1906: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -1936,7 +1939,7 @@ fi echo $ac_n "checking "g++ version"""... $ac_c" 1>&6 -echo "configure:1940: checking "g++ version"" >&5 +echo "configure:1943: checking "g++ version"" >&5 cxx_version=`$CXX --version` echo "$ac_t"""$cxx_version"" 1>&6 # urg, egcs: how to check for egcs >= 1.1? @@ -1954,12 +1957,12 @@ echo "configure:1940: checking "g++ version"" >&5 echo $ac_n "checking whether explicit instantiation is needed""... $ac_c" 1>&6 -echo "configure:1958: checking whether explicit instantiation is needed" >&5 +echo "configure:1961: checking whether explicit instantiation is needed" >&5 if eval "test \"`echo '$''{'lily_cv_need_explicit_instantiation'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < struct foo { static int baz; }; @@ -1969,7 +1972,7 @@ int main() { return foo::baz; ; return 0; } EOF -if { (eval echo configure:1973: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1976: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* lily_cv_need_explicit_instantiation=no else @@ -1996,7 +1999,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2000: checking for $ac_word" >&5 +echo "configure:2003: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2039,7 +2042,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2043: checking for $ac_word" >&5 +echo "configure:2046: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_BISON'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2074,7 +2077,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2078: checking for $ac_word" >&5 +echo "configure:2081: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_FLEX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2142,7 +2145,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2146: checking for $ac_word" >&5 +echo "configure:2149: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2175,7 +2178,7 @@ test -n "$AR" || AR="error" # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2179: checking for $ac_word" >&5 +echo "configure:2182: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2230,7 +2233,7 @@ fi echo $ac_n "checking language""... $ac_c" 1>&6 -echo "configure:2234: checking language" >&5 +echo "configure:2237: checking language" >&5 case "$language" in En* | en* | Am* | am* | US* | us*) lang=English;; @@ -2266,7 +2269,7 @@ EOF echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6 -echo "configure:2270: checking for gettext in -lintl" >&5 +echo "configure:2273: checking for gettext in -lintl" >&5 ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2274,7 +2277,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lintl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2295: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2318,12 +2321,12 @@ fi for ac_func in gettext do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2322: checking for $ac_func" >&5 +echo "configure:2325: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2356: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -2381,7 +2384,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2385: checking for $ac_word" >&5 +echo "configure:2388: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2412,7 +2415,7 @@ done test -n "$MSGFMT" || MSGFMT="\$(SHELL) \$(step-bindir)/fake-msgfmt.sh " echo $ac_n "checking whether msgfmt accepts -o""... $ac_c" 1>&6 -echo "configure:2416: checking whether msgfmt accepts -o" >&5 +echo "configure:2419: checking whether msgfmt accepts -o" >&5 msgfmt_output="`msgfmt -o bla 2>&1 | grep usage`" if test "$msgfmt_output" = ""; then echo "$ac_t""yes" 1>&6 @@ -2440,7 +2443,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2444: checking for $ac_word" >&5 +echo "configure:2447: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_METAFONT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2476,7 +2479,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2480: checking for $ac_word" >&5 +echo "configure:2483: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_MFONT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2514,7 +2517,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2518: checking for $ac_word" >&5 +echo "configure:2521: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_METAPOST'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2550,7 +2553,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2554: checking for $ac_word" >&5 +echo "configure:2557: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_MPOST'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2589,7 +2592,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2593: checking for $ac_word" >&5 +echo "configure:2596: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_INIMETAFONT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2625,7 +2628,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2629: checking for $ac_word" >&5 +echo "configure:2632: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_INIMFONT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2663,7 +2666,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2667: checking for $ac_word" >&5 +echo "configure:2670: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_INIMETAPOST'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2699,7 +2702,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2703: checking for $ac_word" >&5 +echo "configure:2706: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_INIMPOST'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2733,7 +2736,7 @@ test -n "$INIMPOST" || INIMPOST="-echo no inimp or inimpost" fi echo $ac_n "checking for working metafont mode""... $ac_c" 1>&6 -echo "configure:2737: checking for working metafont mode" >&5 +echo "configure:2740: checking for working metafont mode" >&5 modelist='ljfour lj4 lj3 lj2 ljet laserjet' for MFMODE in $modelist; do $METAFONT "\mode:=$MFMODE; mode_setup; end." > /dev/null 2>&1 @@ -2744,7 +2747,7 @@ echo "configure:2737: checking for working metafont mode" >&5 echo "$ac_t""$MFMODE" 1>&6 echo $ac_n "checking for mfplain.mp""... $ac_c" 1>&6 -echo "configure:2748: checking for mfplain.mp" >&5 +echo "configure:2751: checking for mfplain.mp" >&5 # # For now let people define these in their environments # @@ -2752,7 +2755,7 @@ echo "configure:2748: checking for mfplain.mp" >&5 echo "$ac_t""$MFPLAIN_MP" 1>&6 echo $ac_n "checking for inimetapost flags""... $ac_c" 1>&6 -echo "configure:2756: checking for inimetapost flags" >&5 +echo "configure:2759: checking for inimetapost flags" >&5 if test ${INIMETAPOST} = "inimp" ; then : ${INIMETAPOST_FLAGS=''} else @@ -2785,7 +2788,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2789: checking for $ac_word" >&5 +echo "configure:2792: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_KPSEWHICH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2816,7 +2819,7 @@ done test -n "$KPSEWHICH" || KPSEWHICH="no" echo $ac_n "checking for tfm path""... $ac_c" 1>&6 -echo "configure:2820: checking for tfm path" >&5 +echo "configure:2823: checking for tfm path" >&5 TFM_FONTS="cmr msam" @@ -2844,13 +2847,13 @@ echo "configure:2820: checking for tfm path" >&5 ## First, let's just see if we can find Guile at all. echo $ac_n "checking "for guile-config"""... $ac_c" 1>&6 -echo "configure:2848: checking "for guile-config"" >&5 +echo "configure:2851: checking "for guile-config"" >&5 for guile_config in guile-config $target-guile-config $build-guile-config; do echo "$ac_t"""$guile_config"" 1>&6 if ! $guile_config --version > /dev/null 2>&1 ; then echo "configure: warning: "cannot execute $guile_config"" 1>&2 echo $ac_n "checking "if we are cross compiling"""... $ac_c" 1>&6 -echo "configure:2854: checking "if we are cross compiling"" >&5 +echo "configure:2857: checking "if we are cross compiling"" >&5 guile_config=error else break @@ -2861,7 +2864,7 @@ echo "configure:2854: checking "if we are cross compiling"" >&5 exit 1 fi echo $ac_n "checking "Guile version"""... $ac_c" 1>&6 -echo "configure:2865: checking "Guile version"" >&5 +echo "configure:2868: checking "Guile version"" >&5 need_guile_version="1.3.4" need_guile_version_numeric=100304 guile_version=`$guile_config --version 2>&1 | awk '{print $NF}'` @@ -2882,7 +2885,7 @@ else {last =0}} ## The GUILE_FLAGS macro. echo $ac_n "checking for Guile""... $ac_c" 1>&6 -echo "configure:2886: checking for Guile" >&5 +echo "configure:2889: checking for Guile" >&5 if ! $guile_config link > /dev/null ; then echo "$ac_t"""cannot execute $guile_config"" 1>&6 { echo "configure: error: "cannot find guile-config; is Guile installed?"" 1>&2; exit 1; } @@ -2897,7 +2900,7 @@ echo "configure:2886: checking for Guile" >&5 # Extract the first word of "guile", so it can be a program name with args. set dummy guile; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2901: checking for $ac_word" >&5 +echo "configure:2904: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_GUILE'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2958,17 +2961,17 @@ fi do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2962: checking for $ac_hdr" >&5 +echo "configure:2965: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2972: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2975: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2995,7 +2998,7 @@ fi done echo $ac_n "checking for kpse_find_file in -lkpathsea""... $ac_c" 1>&6 -echo "configure:2999: checking for kpse_find_file in -lkpathsea" >&5 +echo "configure:3002: checking for kpse_find_file in -lkpathsea" >&5 ac_lib_var=`echo kpathsea'_'kpse_find_file | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3003,7 +3006,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lkpathsea $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3024: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3047,12 +3050,12 @@ fi for ac_func in kpse_find_file do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3051: checking for $ac_func" >&5 +echo "configure:3054: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3085: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3105,7 +3108,7 @@ done fi echo $ac_n "checking whether to use kpathsea""... $ac_c" 1>&6 -echo "configure:3109: checking whether to use kpathsea" >&5 +echo "configure:3112: checking whether to use kpathsea" >&5 if test "$kpathsea_b" != no; then echo "$ac_t""yes" 1>&6 KPATHSEA=1 @@ -3126,7 +3129,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3130: checking for $ac_word" >&5 +echo "configure:3133: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_BIBTEX2HTML'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3166,8 +3169,18 @@ test -n "$BIBTEX2HTML" || BIBTEX2HTML="error" +if test "$optimise_b" = yes; then + DEFINES="$DEFINES -DSTRING_UTILS_INLINED" + cat >> confdefs.h <<\EOF +#define STRINGS_UTILS_INLINED 1 +EOF + +fi + + + echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6 -echo "configure:3171: checking for 8-bit clean memcmp" >&5 +echo "configure:3184: checking for 8-bit clean memcmp" >&5 if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3175,7 +3188,7 @@ else ac_cv_func_memcmp_clean=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_func_memcmp_clean=yes else @@ -3206,12 +3219,12 @@ echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6 test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}" echo $ac_n "checking for vprintf""... $ac_c" 1>&6 -echo "configure:3210: checking for vprintf" >&5 +echo "configure:3223: checking for vprintf" >&5 if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3254: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_vprintf=yes" else @@ -3261,12 +3274,12 @@ fi if test "$ac_cv_func_vprintf" != yes; then echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 -echo "configure:3265: checking for _doprnt" >&5 +echo "configure:3278: checking for _doprnt" >&5 if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func__doprnt=yes" else @@ -3319,12 +3332,12 @@ fi for ac_func in memmem snprintf vsnprintf gettext isinf do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3323: checking for $ac_func" >&5 +echo "configure:3336: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3367: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3390,7 +3403,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3394: checking for $ac_word" >&5 +echo "configure:3407: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_MAKEINFO'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3422,7 +3435,7 @@ test -n "$MAKEINFO" || MAKEINFO="error" if test "$MAKEINFO" != "error"; then echo $ac_n "checking whether makeinfo can split html by @node""... $ac_c" 1>&6 -echo "configure:3426: checking whether makeinfo can split html by @node" >&5 +echo "configure:3439: checking whether makeinfo can split html by @node" >&5 mkdir -p out makeinfo --html --output=out/split <&6 -echo "configure:3454: checking for $ac_word" >&5 +echo "configure:3467: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3488,17 +3501,17 @@ for ac_hdr in python2.0/Python.h python2/Python.h python/Python.h python1.5/Pyth do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:3492: checking for $ac_hdr" >&5 +echo "configure:3505: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3502: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3515: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* diff --git a/input/test/accidentals.ly b/input/test/accidentals.ly new file mode 100644 index 0000000000..294ca11db3 --- /dev/null +++ b/input/test/accidentals.ly @@ -0,0 +1,23 @@ +% \version "1.5.15.rz1" + +mel = \notes { + d4 dis dis d | d dis disis dis | d des disis d | dis deses d dis ~ | dis dis ~ dis dis ~ | \break + dis dis cis c | c cis cisis cis | c ces cisis c | cis ceses c cis ~ | cis cis ~ cis cis \bar "|." | \break +} + +\score { \notes \context Staff \transpose c''' { + \key d \major + \mel + \property Score.autoReminders = #'cautionary + < s1^"$\\backslash$property Score.autoReminders = \\#'cautionary" \mel > + \property Score.autoReminders = #'accidental + < s1^"$\\backslash$property Score.autoReminders = \\#'accidental" \mel > + \property Score.autoReminders = ##f + \property Score.forgetAccidentals = ##t + < s1^"$\\backslash$property Score.forgetAccidentals = \\#\\#t" \mel > + \property Score.forgetAccidentals = ##f + \property Score.noResetKey = ##t + < s1^"$\\backslash$property Score.noResetKey = \\#\\#t" \mel > + } +} + diff --git a/input/test/ancient-font.ly b/input/test/ancient-font.ly index cfc7e498a3..33e234db23 100644 --- a/input/test/ancient-font.ly +++ b/input/test/ancient-font.ly @@ -31,6 +31,7 @@ upperVoice = \context Staff = upperVoice < \property Voice.Porrectus \override #'solid = ##t \property Voice.Porrectus \override #'add-stem = ##t \property Voice.Porrectus \override #'stem-direction = #-1 + \property Voice.Porrectus \override #'line-thickness = #0.5 \key es \major \clef "vaticana_fa2" c!1 des! e! f! ges! @@ -44,7 +45,7 @@ upperVoice = \context Staff = upperVoice < a! b! \property Staff.BarLine \override #'bar-size = #3.0 \bar "|" \property Voice.NoteHead \override #'style = #'vaticana_virga - ces' b! ces'! \~ ges! \~ fes! + ces' b! des'! \~ ges! \~ fes! \breathe \clef "vaticana_fa1" \property Voice.NoteHead \override #'style = #'vaticana_quilisma @@ -129,7 +130,8 @@ lowerVoice = \context Staff = lowerNotes < \property Voice.Porrectus \override #'add-stem = ##t \property Voice.Porrectus \override #'stem-direction = #1 \property Voice.Porrectus \override #'line-thickness = #0.7 - % \property Voice.Porrectus \override #'porrectus-width = #3.0 +% \property Voice.Porrectus \override #'auto-properties = ##t +% \property Voice.Porrectus \override #'porrectus-width = #3.0 \key a \major % IMPORTANT NOTE: @@ -186,11 +188,6 @@ lowerVoice = \context Staff = lowerNotes < e2 f g \clef "mensural_g" - % FIXME: In the second and all subsequent lines of score, the - % stems and accidentals of the junked notes keep visible on - % porrectus grobs. Is this an initialization bug in the line - % breaking algorithm? - bes'! \~ as'! \~ cis''! bes'! \~ fis'! as'! \~ ges'! \property Staff.forceClef = ##t diff --git a/lily/accidental-engraver.cc b/lily/accidental-engraver.cc index 46914f6d20..e9daee13c3 100644 --- a/lily/accidental-engraver.cc +++ b/lily/accidental-engraver.cc @@ -1,7 +1,8 @@ /* - local-key-engraver.cc -- implement accidental_engraver + accidental-engraver.cc -- implement accidental_engraver (c) 1997--2001 Han-Wen Nienhuys + Modified 2001 by Rune Zedeler */ #include "musical-request.hh" @@ -38,6 +39,7 @@ protected: virtual void acknowledge_grob (Grob_info); virtual void stop_translation_timestep (); virtual void initialize (); + virtual int number_accidentals (SCM sig, Note_req *); virtual void create_grobs (); virtual void finalize (); public: @@ -69,6 +71,34 @@ Accidental_engraver::initialize () { last_keysig_ = get_property ("keySignature"); daddy_trans_l_->set_property ("localKeySignature", last_keysig_); + daddy_trans_l_->set_property ("lazyKeySignature", last_keysig_); +} + +/** calculates the number of accidentals on basis of the current local time sig + * (passed as argument). + * Returns number of accidentals (0, 1 or 2). + * Negative (-1 or -2) if accidental has changed. + **/ +int +Accidental_engraver::number_accidentals (SCM sig, Note_req * note_l) +{ + int n = unsmob_pitch (note_l->get_mus_property ("pitch"))->notename_i_; + int o = unsmob_pitch (note_l->get_mus_property ("pitch"))->octave_i () ; + int a = unsmob_pitch (note_l->get_mus_property ("pitch"))->alteration_i_; + + SCM prev = scm_assoc (gh_cons (gh_int2scm (o), gh_int2scm (n)), sig); + if (prev == SCM_BOOL_F) + prev = scm_assoc (gh_int2scm (n), sig); + SCM prev_acc = (prev == SCM_BOOL_F) ? gh_int2scm (0) : ly_cdr (prev); + bool different = !gh_equal_p (prev_acc , gh_int2scm (a)); + int p = gh_number_p (prev_acc) ? gh_scm2int (prev_acc) : 0; + + int num; + if (a==p && !to_boolean (note_l->get_mus_property ("force-accidental"))) num=0; + else if ( (abs(a)get_mus_property ("pitch"))->notename_i_; - int o = unsmob_pitch (note_l->get_mus_property ("pitch"))->octave_i () ; - int a = unsmob_pitch (note_l->get_mus_property ("pitch"))->alteration_i_; - + int local_num = number_accidentals(localsig,note_l); + bool local_diff = local_num<0; local_num = abs(local_num); + int lazy_num = number_accidentals(lazysig,note_l); + bool lazy_diff = lazy_num<0; lazy_num = abs(lazy_num); + + int num = local_num;; + bool different= local_diff; + bool cautionary = to_boolean (note_l->get_mus_property ("cautionary")); + if (to_boolean (get_property ("noResetKey"))) { + num = lazy_num; + different = lazy_diff; + } + else if (gh_equal_p (get_property ("autoReminders"),ly_symbol2scm("cautionary")) + || gh_equal_p (get_property ("autoReminders"),ly_symbol2scm("accidental"))) { + num = max(local_num,lazy_num); + if (gh_equal_p (get_property ("autoReminders"),ly_symbol2scm("cautionary")) + && lazy_num>local_num) + cautionary = true; + } + /* see if there's a tie that "changes" the accidental */ /* works because if there's a tie, the note to the left is of the same pitch as the actual note */ - SCM prev = scm_assoc (gh_cons (gh_int2scm (o), gh_int2scm (n)), localsig); - if (prev == SCM_BOOL_F) - prev = scm_assoc (gh_int2scm (n), localsig); - SCM prev_acc = (prev == SCM_BOOL_F) ? gh_int2scm (0) : ly_cdr (prev); - bool different = !gh_equal_p (prev_acc , gh_int2scm (a)); - int p = gh_number_p (prev_acc) ? gh_scm2int (prev_acc) : 0; Grob *tie_break_reminder = 0; bool tie_changes = false; @@ -115,17 +156,7 @@ Accidental_engraver::create_grobs () break; } - /* When do we want accidentals: - - 1. when property force-accidental is set, and not - tie_changes - 2. when different and not tie-changes - 3. maybe when at end of a tie: we must later see if - we're after a line break */ - if (( (to_boolean (note_l->get_mus_property ("force-accidental")) - || different) - && !tie_changes) - || tie_break_reminder) + if (num) { if (!key_item_p_) { @@ -142,37 +173,36 @@ Accidental_engraver::create_grobs () } - bool extra_natural = - sign (p) * (p - a) == 1 - && abs (p) == 2; - Local_key_item::add_pitch (key_item_p_, *unsmob_pitch (note_l->get_mus_property ("pitch")), - to_boolean (note_l->get_mus_property ("cautionary")), - extra_natural, + cautionary, + num==2, tie_break_reminder); Side_position_interface::add_support (key_item_p_,support_l); } + /* We should not record the accidental if it is the first note and it is tied from the previous measure. Checking whether it is tied also works mostly, but will it always do the correct thing? - + (???? -Rune ) */ + int n = unsmob_pitch (note_l->get_mus_property ("pitch"))->notename_i_; + int o = unsmob_pitch (note_l->get_mus_property ("pitch"))->octave_i () ; + int a = unsmob_pitch (note_l->get_mus_property ("pitch"))->alteration_i_; + SCM ON = gh_cons (gh_int2scm (o), gh_int2scm (n)); bool forget = to_boolean (get_property ("forgetAccidentals")); if (tie_changes) { /* Remember an alteration that is different both from that of the tied note and of the key signature. - + (????? -Rune ) */ - localsig = scm_assoc_set_x (localsig, gh_cons (gh_int2scm (o), - gh_int2scm (n)), - SCM_BOOL_T); - + localsig = scm_assoc_set_x (localsig, ON, SCM_BOOL_T); + lazysig = scm_assoc_set_x (lazysig, ON, SCM_BOOL_T); } else if (!forget) { @@ -180,17 +210,13 @@ Accidental_engraver::create_grobs () not really really correct if there are more than one noteheads with the same notename. */ - localsig = scm_assoc_set_x (localsig, gh_cons (gh_int2scm (o), - gh_int2scm (n)), - gh_int2scm (a)); - + localsig = scm_assoc_set_x (localsig, ON, gh_int2scm (a)); + lazysig = scm_assoc_set_x (lazysig, ON, gh_int2scm (a)); } } - - - daddy_trans_l_->set_property ("localKeySignature", localsig); + daddy_trans_l_->set_property ("lazyKeySignature", lazysig); } @@ -274,11 +300,11 @@ Accidental_engraver::process_music () if (last_keysig_ != sig) { daddy_trans_l_->set_property ("localKeySignature", ly_deep_copy (sig)); + daddy_trans_l_->set_property ("lazyKeySignature", ly_deep_copy (sig)); last_keysig_ = sig; } else if (!mp.to_bool () ) { - if (!to_boolean (get_property ("noResetKey"))) daddy_trans_l_->set_property ("localKeySignature", ly_deep_copy (sig)); } } diff --git a/lily/beam.cc b/lily/beam.cc index 9e433827b6..f744b4fff6 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -14,7 +14,9 @@ -* shorter! (now +- 1000 lines) -* less hairy code - + + -* Remove #'direction from beam. The beam has no direction per se. + It may only set directions for stems. */ diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc index 18cfe09204..58b1decf54 100644 --- a/lily/folded-repeat-iterator.cc +++ b/lily/folded-repeat-iterator.cc @@ -118,8 +118,8 @@ Folded_repeat_iterator::enter_alternative () { Simultaneous_music_iterator * s = new Simultaneous_music_iterator; s->separate_contexts_b_ = true; - s->init_translator (mus->alternatives (), report_to_l ()); - + s->init_translator (mus, report_to_l ()); + alternative_iter_p_ = s; alternative_iter_p_->construct_children (); } diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh index 30c154cac5..7cc9232bf2 100644 --- a/lily/include/lily-guile.hh +++ b/lily/include/lily-guile.hh @@ -75,6 +75,8 @@ SCM ly_last (SCM list); SCM ly_str02scm (char const*c); SCM ly_write2scm (SCM s); SCM ly_deep_copy (SCM); +SCM ly_truncate_list (int k, SCM l ); + #define CACHE_SYMBOLS #ifdef CACHE_SYMBOLS diff --git a/lily/include/music-sequence.hh b/lily/include/music-sequence.hh index b22d029582..699098fab4 100644 --- a/lily/include/music-sequence.hh +++ b/lily/include/music-sequence.hh @@ -25,19 +25,18 @@ public: VIRTUAL_COPY_CONS (Music); Pitch do_relative_octave (Pitch p, bool b); + static void transpose_list (SCM , Pitch); + static void compress_list (SCM, Moment); + virtual void transpose (Pitch ); - void truncate (int k); virtual void compress (Moment); - int length_i () const; - Moment cumulative_length () const; - Moment maximum_length () const; - Moment first_start () const; - Moment minimum_start () const; + static Moment cumulative_length (SCM) ; + static Moment maximum_length (SCM) ; + static Moment first_start (SCM list) ; + static Moment minimum_start (SCM list); protected: virtual Pitch to_relative_octave (Pitch); - - }; #endif diff --git a/lily/include/porrectus.hh b/lily/include/porrectus.hh index 3b4a97a046..9fa037ab9c 100644 --- a/lily/include/porrectus.hh +++ b/lily/include/porrectus.hh @@ -30,6 +30,7 @@ private: static Molecule brew_mensural_molecule (Item *, Real, bool, Real, Real, bool, Direction); + static Molecule brew_bezier_sandwich (Bezier, Bezier); static Molecule brew_horizontal_slope (Real, Real, Real); static Molecule create_ledger_line (Interval, Grob *); static Molecule create_streepjes (Grob *, int, int, Interval); diff --git a/lily/include/repeated-music.hh b/lily/include/repeated-music.hh index 61c9661823..4b84bb140e 100644 --- a/lily/include/repeated-music.hh +++ b/lily/include/repeated-music.hh @@ -50,7 +50,7 @@ class Repeated_music : public Music { public: Music * body () const; - Music_sequence * alternatives () const; + SCM alternatives () const; /// how often do we repeat? int repeat_count ( ) const; diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index f554b13f9d..77c3ce5506 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -519,3 +519,26 @@ parse_symbol_list (const char * list) free (orig); return create_list; } + + +SCM +ly_truncate_list (int k, SCM l ) +{ + if (k == 0) + { + l = SCM_EOL; + } + else + { + SCM s = l; + k--; + for (; gh_pair_p (s) && k--; s = ly_cdr (s)) + ; + + if (gh_pair_p (s)) + { + gh_set_cdr_x (s, SCM_EOL); + } + } + return l; +} diff --git a/lily/lyric-combine-music.cc b/lily/lyric-combine-music.cc index de706373bd..b7b6196418 100644 --- a/lily/lyric-combine-music.cc +++ b/lily/lyric-combine-music.cc @@ -46,16 +46,28 @@ Lyric_combine_music::compress (Moment m) music_l ()->compress (m); } + + Music* Lyric_combine_music::music_l () const { - return unsmob_music (get_mus_property ("music")); + SCM l = get_mus_property ("elements"); + if (!gh_pair_p (l)) + return 0; + return unsmob_music (gh_car (l)); } + Music* Lyric_combine_music::lyrics_l () const { - return unsmob_music (get_mus_property ("lyrics")); + SCM l = get_mus_property ("elements"); + if (!gh_pair_p (l)) + return 0; + l = gh_cdr (l); + if (!gh_pair_p (l)) + return 0; + return unsmob_music (gh_car (l)); } Lyric_combine_music::Lyric_combine_music () diff --git a/lily/music-sequence.cc b/lily/music-sequence.cc index 2079133314..5ea3514611 100644 --- a/lily/music-sequence.cc +++ b/lily/music-sequence.cc @@ -11,29 +11,6 @@ #include "pitch.hh" -void -Music_sequence::truncate (int k) -{ - SCM l = get_mus_property ("elements"); - if (k == 0) - { - l = SCM_EOL; - } - else - { - SCM s = l; - k--; - for (; gh_pair_p (s) && k--; s = ly_cdr (s)) - ; - - if (gh_pair_p (s)) - { - gh_set_cdr_x (s, SCM_EOL); - } - } - set_mus_property ("elements", l); -} - SCM Music_sequence::music_list ()const { @@ -59,20 +36,23 @@ Music_sequence::Music_sequence (SCM l) void Music_sequence::transpose (Pitch rq) { - for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s)) - unsmob_music (ly_car (s))->transpose (rq); + transpose_list (music_list (), rq); } - - +void +Music_sequence::transpose_list (SCM l, Pitch rq) +{ + for (SCM s = l; gh_pair_p (s); s = ly_cdr (s)) + unsmob_music (ly_car (s))->transpose (rq); +} Moment -Music_sequence::cumulative_length () const +Music_sequence::cumulative_length (SCM l) { Moment cumulative; - - Moment last_len ; - for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s)) + Moment last_len; + + for (SCM s = l; gh_pair_p (s); s = ly_cdr (s)) { Moment l = unsmob_music (ly_car (s))->length_mom (); if (last_len.grace_part_ && l.main_part_) @@ -97,10 +77,10 @@ Music_sequence::to_relative_octave (Pitch p) Moment -Music_sequence::maximum_length () const +Music_sequence::maximum_length (SCM l) { Moment dur = 0; - for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s)) + for (SCM s = l; gh_pair_p (s); s = ly_cdr (s)) { Music * m = unsmob_music (ly_car (s)); Moment l = m->length_mom (); @@ -109,11 +89,7 @@ Music_sequence::maximum_length () const return dur; } -int -Music_sequence::length_i () const -{ - return scm_ilength (music_list ()); -} + Pitch Music_sequence::do_relative_octave (Pitch p, bool ret_first) @@ -138,7 +114,13 @@ Music_sequence::do_relative_octave (Pitch p, bool ret_first) void Music_sequence::compress (Moment m) { - for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s)) + compress_list (music_list (), m); +} + +void +Music_sequence::compress_list (SCM l, Moment m) +{ + for (SCM s = l; gh_pair_p (s); s = ly_cdr (s)) unsmob_music (ly_car (s))->compress (m); } @@ -151,11 +133,11 @@ Music_sequence::Music_sequence () } Moment -Music_sequence::minimum_start () const +Music_sequence::minimum_start (SCM l) { Moment m; - for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s)) + for (SCM s = l; gh_pair_p (s); s = ly_cdr (s)) { m = m start_mom (); } @@ -163,11 +145,11 @@ Music_sequence::minimum_start () const } Moment -Music_sequence::first_start () const +Music_sequence::first_start (SCM l) { Moment m; - for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s)) + for (SCM s = l; gh_pair_p (s); s = ly_cdr (s)) { Music * mus = unsmob_music (ly_car (s)); Moment l = mus->length_mom (); diff --git a/lily/parser.yy b/lily/parser.yy index 7bdcee9d0d..85278a58f7 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -275,7 +275,8 @@ yylex (YYSTYPE *s, void * v_l) %type request_with_dir request_that_take_dir verbose_request %type sub_quotes sup_quotes %type simple_element request_chord command_element Simple_music Composite_music -%type Alternative_music Repeated_music +%type Repeated_music +%type Alternative_music %type tremolo_type %type bare_int bare_unsigned %type script_dir @@ -296,7 +297,7 @@ yylex (YYSTYPE *s, void * v_l) %type duration_length fraction %type embedded_scm scalar -%type Music Sequential_music Simultaneous_music Music_sequence +%type Music Sequential_music Simultaneous_music %type relative_music re_rhythmed_music part_combined_music %type property_def translator_change %type Music_list @@ -663,6 +664,13 @@ tempo_request: } ; +/* +The representation of a list is the + + (LIST . LAST-CONS) + + to have efficient append. +*/ Music_list: /* empty */ { $$ = gh_cons (SCM_EOL, SCM_EOL); } @@ -688,41 +696,35 @@ Music: Alternative_music: /* empty */ { - $$ = 0; + $$ = SCM_EOL; } - | ALTERNATIVE Music_sequence { - $$ = $2; - $2->set_spot (THIS->here_input ()); + | ALTERNATIVE '{' Music_list '}' { + $$ = $3; } ; - - - Repeated_music: REPEAT string bare_unsigned Music Alternative_music { - Music_sequence* alts = dynamic_cast ($5); - if (alts && $3 < alts->length_i ()) - $5->origin ()->warning (_ ("More alternatives than repeats. Junking excess alternatives.")); Music *beg = $4; int times = $3; + SCM alts = gh_pair_p ($5) ? gh_car ($5) : SCM_EOL; + if (times < scm_ilength (alts)) { + unsmob_music (gh_car (alts)) + ->origin ()->warning ( + _("More alternatives than repeats. Junking excess alternatives.")); + alts = ly_truncate_list (times, alts); + } Repeated_music * r = new Repeated_music (SCM_EOL); - if (beg) { - r-> set_mus_property ("body", beg->self_scm ()); + r-> set_mus_property ("element", beg->self_scm ()); scm_gc_unprotect_object (beg->self_scm ()); } r->set_mus_property ("repeat-count", gh_int2scm (times >? 1)); - if (alts) - { - alts->truncate (times); - r-> set_mus_property ("alternatives", alts->self_scm ()); - scm_gc_unprotect_object (alts->self_scm ()); - } + r-> set_mus_property ("elements",alts); SCM func = scm_primitive_eval (ly_symbol2scm ("repeat-name-to-ctor")); SCM result = gh_call1 (func, $2); @@ -733,12 +735,6 @@ Repeated_music: } ; -Music_sequence: '{' Music_list '}' { - $$ = new Music_sequence (SCM_EOL); - $$->set_mus_property ("elements", ly_car ($2)); - } - ; - Sequential_music: SEQUENTIAL '{' Music_list '}' { $$ = new Sequential_music (SCM_EOL); @@ -852,8 +848,6 @@ Composite_music: $$->set_mus_property ("element", $2->self_scm ()); scm_gc_unprotect_object ($2->self_scm ()); #endif - - } | CONTEXT string '=' string Music { Context_specced_music *csm = new Context_specced_music (SCM_EOL); @@ -971,8 +965,7 @@ relative_music: re_rhythmed_music: ADDLYRICS Music Music { Lyric_combine_music * l = new Lyric_combine_music (SCM_EOL); - l->set_mus_property ("music", $2->self_scm ()); - l->set_mus_property ("lyrics", $3->self_scm ()); + l->set_mus_property ("elements", gh_list ($2->self_scm (), $3->self_scm (), SCM_UNDEFINED)); scm_gc_unprotect_object ($3->self_scm ()); scm_gc_unprotect_object ($2->self_scm ()); $$ = l; @@ -984,13 +977,11 @@ part_combined_music: Part_combine_music * p = new Part_combine_music (SCM_EOL); p->set_mus_property ("what", $2); - p->set_mus_property ("one", $3->self_scm ()); - p->set_mus_property ("two", $4->self_scm ()); + p->set_mus_property ("elements", gh_list ($3->self_scm (),$4->self_scm (), SCM_UNDEFINED)); scm_gc_unprotect_object ($3->self_scm ()); scm_gc_unprotect_object ($4->self_scm ()); - $$ = p; } ; diff --git a/lily/part-combine-music.cc b/lily/part-combine-music.cc index 316d4a117b..11ccc59f85 100644 --- a/lily/part-combine-music.cc +++ b/lily/part-combine-music.cc @@ -50,13 +50,23 @@ Part_combine_music::compress (Moment m) Music* Part_combine_music::first_l () const { - return unsmob_music (get_mus_property ("one")); + SCM l = get_mus_property ("elements"); + if (!gh_pair_p (l)) + return 0; + return unsmob_music (gh_car (l)); } + Music* Part_combine_music::second_l () const { - return unsmob_music (get_mus_property ("two")); + SCM l = get_mus_property ("elements"); + if (!gh_pair_p (l)) + return 0; + l = gh_cdr (l); + if (!gh_pair_p (l)) + return 0; + return unsmob_music (gh_car (l)); } diff --git a/lily/porrectus-engraver.cc b/lily/porrectus-engraver.cc index 4cc35e910c..28166e63ea 100644 --- a/lily/porrectus-engraver.cc +++ b/lily/porrectus-engraver.cc @@ -15,30 +15,19 @@ * * TODO: Hufnagel support. * - * TODO: Fine-tuning of vaticana-style porrectus shape; in particular, - * ensure solidity if solid is set to #t and thickness is very small. - * - * TODO: For white mensural (i.e. #'style=#'mensural, #'solid=##f) - * porrectus grobs, it is possible to automatically determine all - * porrectus specific properties (add-stem, stem-direction) solely - * from the duration of the contributing notes and time-signature. - * Introduce a boolean grob property called auto-config, so that, if - * turned on, lily automatically sets the properties add-stem and - * stem-direction properly. - * * TODO: The following issues are currently not handled by this - * engraver: (1) accidentals placement, (2) avoiding line breaking - * inbetween porrectus, (3) spacing. (Han-Wen says: for (2), look at - * beam engraver.) For example, currently only the accidental for the - * second note (cp. the above FIXME) is printed. These issues should - * be resolved by some sort of ligature context that encloses use of - * this engraver, using syntax like: \ligature { e \~ c }. + * engraver: (1) accidentals placement, (2) spacing. For example, + * currently only the accidental for the second note (cp. the above + * FIXME) is printed. These issues should be resolved by some sort of + * ligature context that encloses use of this engraver, using syntax + * like: \ligature { e \~ c }. * * TODO: Do not allow a series of adjacent porrectus requests, as in: * e \~ d \~ c. * * TODO: Junk duplicate (or rather triple) implementation of - * create_ledger_line in porrectus.cc, custos.cc and note-head.cc. */ + * create_ledger_line in porrectus.cc, custos.cc and note-head.cc. + */ #include "staff-symbol-referencer.hh" #include "porrectus.hh" @@ -47,7 +36,9 @@ #include "rhythmic-head.hh" #include "item.hh" #include "engraver.hh" +#include "score-engraver.hh" #include "pqueue.hh" +#include "warn.hh" // TODO: PHead_melodic_tuple is duplicated code from tie-engraver.cc. // Maybe put this into public class? @@ -74,6 +65,7 @@ public: protected: virtual bool try_music (Music *req_l); + virtual void process_music (); virtual void create_grobs (); virtual void stop_translation_timestep (); virtual void start_translation_timestep (); @@ -104,6 +96,28 @@ Porrectus_engraver::try_music (Music *m) return false; } +void +Porrectus_engraver::process_music () +{ + if (porrectus_req_l_) + { + // TODO: Move code that forbids breaking into ligature music + // wrapper? + Score_engraver *engraver = 0; + for (Translator *translator = daddy_grav_l (); + translator && !engraver; + translator = translator->daddy_trans_l_) + { + engraver = dynamic_cast (translator); + } + + if (!engraver) + programming_error ("No score engraver!"); + else + engraver->forbid_breaks (); + } +} + void Porrectus_engraver::acknowledge_grob (Grob_info info_l_) { diff --git a/lily/porrectus.cc b/lily/porrectus.cc index a227330e00..e05da73520 100644 --- a/lily/porrectus.cc +++ b/lily/porrectus.cc @@ -157,6 +157,15 @@ Porrectus::brew_molecule (SCM smob) { Item *me = (Item *)unsmob_grob (smob); + Item *left_head = get_left_head (me); + Item *right_head = get_right_head (me); + if (!left_head || !right_head) + { + warning (_ ("junking lonely porrectus")); + me->suicide (); + return SCM_EOL; + } + SCM scm_style = me->get_grob_property ("style"); String style; if ((gh_symbol_p (scm_style)) && (scm_style != SCM_EOL)) @@ -175,13 +184,45 @@ Porrectus::brew_molecule (SCM smob) if (!stem_direction) stem_direction = DOWN; - Item *left_head = get_left_head (me); - Item *right_head = get_right_head (me); - if (!left_head || !right_head) + bool auto_properties = to_boolean (me->get_grob_property ("auto-properties")); + if (auto_properties) + // determine add_stem and stem_direction automatically from durations { - warning (_ ("junking lonely porrectus")); - me->suicide (); - return SCM_EOL; + if (String::compare_i (style, "mensural") != 0) + warning (String("auto-property should be used for\r\n") + + String("mensural style porrectus only; trying anyway")); + + int left_duration = + gh_scm2int (left_head->get_grob_property ("duration-log")); + int right_duration = + gh_scm2int (right_head->get_grob_property ("duration-log")); + + if ((left_duration == -1) && (right_duration == -1)) + { + // brevis -- brevis: + // cum proprietate et sine perfectione (c.s.) + add_stem = true; + stem_direction = DOWN; + } + else if ((left_duration == -2) && (right_duration == -1)) + { + // longa -- brevis: + // sine proprietate et sine perfectione (s.s.) + add_stem = false; + } + else if ((left_duration == 0) && (right_duration == 0)) + { + // semibrevis -- semibrevis: + // cum opposita proprietate (c.o.p.) + add_stem = true; + stem_direction = UP; + } + else + { + warning (String("auto-property: failed determining porrectus\r\n") + + String("properties due to improper durations; ") + + String("using user-supplied properties")); + } } Real left_position_f = Staff_symbol_referencer::position_f (left_head); @@ -255,27 +296,32 @@ Porrectus::brew_vaticana_molecule (Item *me, bool add_stem, Direction stem_direction) { - Real space = Staff_symbol_referencer::staff_space (me); - Molecule molecule = Molecule (); - if (interval >= 0.0) { warning (_ ("ascending vaticana style porrectus")); } + Real space = Staff_symbol_referencer::staff_space (me); + Molecule molecule = Molecule (); + Real right_height = 0.6 * space; + + // Compensate thickness that appears to be smaller in steep section + // of bend. + Real left_height = right_height + min (0.12 * abs(interval), 0.3) * space; + if (add_stem) { bool consider_interval = stem_direction * interval > 0.0; - Interval stem_box_x (-thickness/2, +thickness/2); + Interval stem_box_x (0, thickness); Interval stem_box_y; if (consider_interval) - { - Real y_length = interval / 2.0; - if (y_length < 1.2 * space) - y_length = 1.2 * space; + { + Real y_length = max (abs(interval)/2.0*space + + (right_height-left_height), + 1.2*space); stem_box_y = Interval (0, y_length); } else @@ -283,8 +329,8 @@ Porrectus::brew_vaticana_molecule (Item *me, Real y_correction = (stem_direction == UP) ? - 0.3 * space : - - 0.3 * space - stem_box_y.length(); + +0.5*left_height : + -0.5*left_height - stem_box_y.length(); Box stem_box (stem_box_x, stem_box_y); Molecule stem = Lookup::filledbox (stem_box); @@ -292,36 +338,66 @@ Porrectus::brew_vaticana_molecule (Item *me, molecule.add_molecule(stem); } - Box vertical_edge (Interval (-thickness/2, +thickness/2), - Interval (-4*thickness/2, +4*thickness/2)); - Molecule left_edge = Lookup::filledbox (vertical_edge); - Molecule right_edge = Lookup::filledbox (vertical_edge); - right_edge.translate_axis (width, X_AXIS); - right_edge.translate_axis (interval / 2.0, Y_AXIS); - molecule.add_molecule(left_edge); - molecule.add_molecule(right_edge); - - Bezier bezier; - bezier.control_[0] = Offset (0.00 * width, 0.0); - bezier.control_[1] = Offset (0.33 * width, interval / 2.0); - bezier.control_[2] = Offset (0.66 * width, interval / 2.0); - bezier.control_[3] = Offset (1.00 * width, interval / 2.0); - - Molecule slice; - slice = Lookup::slur (bezier, 0.0, thickness); - slice.translate_axis (-3 * thickness/2, Y_AXIS); - molecule.add_molecule (slice); + // Compensate optical illusion regarding vertical position of left + // and right endings due to curved shape. + Real ypos_correction = -0.1*space * sign(interval); + Real interval_correction = 0.2*space * sign(interval); + Real corrected_interval = interval*space + interval_correction; + + // middle curve of vaticana style porrectus + Bezier curve; + curve.control_[0] = Offset (0.00 * width, 0.0); + curve.control_[1] = Offset (0.33 * width, corrected_interval / 2.0); + curve.control_[2] = Offset (0.66 * width, corrected_interval / 2.0); + curve.control_[3] = Offset (1.00 * width, corrected_interval / 2.0); + + Bezier top_curve = curve, bottom_curve = curve; + for (int i = 0; i < 4; i++) + { + Real thickness = 0.33 * ((3 - i)*left_height + i*right_height); + top_curve.control_[i] += Offset (0, +0.5*thickness); + bottom_curve.control_[i] += Offset (0, -0.5*thickness); + } + if (solid) - for (int i = -2; i < +2; i++) - { - slice = Lookup::slur (bezier, 0.0, thickness); - slice.translate_axis (i * thickness/2, Y_AXIS); - molecule.add_molecule (slice); - } - slice = Lookup::slur (bezier, 0.0, thickness); - slice.translate_axis (+3 * thickness/2, Y_AXIS); - molecule.add_molecule (slice); + { + Molecule solid_head = + brew_bezier_sandwich (top_curve, bottom_curve); + molecule.add_molecule (solid_head); + } + else // outline + { + Bezier inner_top_curve = top_curve; + inner_top_curve.translate (Offset (0.0, -thickness)); + Molecule top_edge = + brew_bezier_sandwich (top_curve, inner_top_curve); + molecule.add_molecule(top_edge); + Bezier inner_bottom_curve = bottom_curve; + inner_bottom_curve.translate (Offset (0.0, +thickness)); + Molecule bottom_edge = + brew_bezier_sandwich (bottom_curve, inner_bottom_curve); + molecule.add_molecule(bottom_edge); + + // TODO: Use horizontal slope with proper slope value rather + // than filled box for left edge, since the filled box stands + // out from the porrectus shape if the interval is big and the + // line thickness small. The difficulty here is to compute a + // proper slope value, as it should roughly be equal with the + // slope of the left end of the bezier curve. + Box left_edge_box (Interval (0, thickness), + Interval (-0.5*left_height, +0.5*left_height)); + Molecule left_edge = Lookup::filledbox (left_edge_box); + molecule.add_molecule(left_edge); + + Box right_edge_box (Interval (-thickness, 0), + Interval (-0.5*right_height, +0.5*right_height)); + Molecule right_edge = Lookup::filledbox (right_edge_box); + right_edge.translate_axis (width, X_AXIS); + right_edge.translate_axis (corrected_interval / 2.0, Y_AXIS); + molecule.add_molecule(right_edge); + } + molecule.translate_axis (ypos_correction, Y_AXIS); return molecule; } @@ -335,13 +411,11 @@ Porrectus::brew_mensural_molecule (Item *me, Direction stem_direction) { Real space = Staff_symbol_referencer::staff_space (me); + Real height = 0.6 * space; Molecule molecule = Molecule (); if (add_stem) { - // Uugh. This is currently the same as in - // brew_vaticana_molecule, but may eventually be changed. - bool consider_interval = stem_direction * interval > 0.0; @@ -350,9 +424,7 @@ Porrectus::brew_mensural_molecule (Item *me, if (consider_interval) { - Real y_length = interval / 2.0; - if (y_length < 1.2 * space) - y_length = 1.2 * space; + Real y_length = max (interval/2.0*space, 1.2*space); stem_box_y = Interval (0, y_length); } else @@ -360,8 +432,8 @@ Porrectus::brew_mensural_molecule (Item *me, Real y_correction = (stem_direction == UP) ? - 0.3 * space : - - 0.3 * space - stem_box_y.length(); + +0.5*height : + -0.5*height - stem_box_y.length(); Box stem_box (stem_box_x, stem_box_y); Molecule stem = Lookup::filledbox (stem_box); @@ -369,7 +441,7 @@ Porrectus::brew_mensural_molecule (Item *me, molecule.add_molecule(stem); } - Real slope = (interval / 2.0) / width; + Real slope = (interval / 2.0 * space) / width; // Compensate optical illusion regarding vertical position of left // and right endings due to slope. @@ -380,41 +452,95 @@ Porrectus::brew_mensural_molecule (Item *me, if (solid) { Molecule solid_head = - brew_horizontal_slope (width, corrected_slope, 0.6*space); + brew_horizontal_slope (width, corrected_slope, height); molecule.add_molecule (solid_head); } - else + else // outline { Molecule left_edge = - brew_horizontal_slope (thickness, corrected_slope, 0.6*space); + brew_horizontal_slope (thickness, corrected_slope, height); molecule.add_molecule(left_edge); Molecule right_edge = - brew_horizontal_slope (thickness, corrected_slope, 0.6*space); + brew_horizontal_slope (thickness, corrected_slope, height); right_edge.translate_axis (width-thickness, X_AXIS); right_edge.translate_axis (corrected_slope * (width-thickness), Y_AXIS); molecule.add_molecule(right_edge); Molecule bottom_edge = brew_horizontal_slope (width, corrected_slope, thickness); - bottom_edge.translate_axis (-0.3*space, Y_AXIS); + bottom_edge.translate_axis (-0.5*height, Y_AXIS); molecule.add_molecule (bottom_edge); Molecule top_edge = brew_horizontal_slope (width, corrected_slope, thickness); - top_edge.translate_axis (+0.3*space, Y_AXIS); + top_edge.translate_axis (+0.5*height, Y_AXIS); molecule.add_molecule (top_edge); } molecule.translate_axis (ypos_correction, Y_AXIS); return molecule; } +/* + * Bezier Sandwich: + * + * .| + * . | + * top . | + * . curve | + * . | + * . | + * . | + * | | + * | .| + * | . + * | bottom . + * | . curve + * | . + * | . + * | . + * | . + * |. + * | + * + */ +// TODO: Move this to class Lookup? +Molecule +Porrectus::brew_bezier_sandwich (Bezier top_curve, Bezier bottom_curve) +{ + /* + Need the weird order b.o. the way PS want its arguments + */ + SCM list = SCM_EOL; + list = gh_cons (ly_offset2scm (bottom_curve.control_[3]), list); + list = gh_cons (ly_offset2scm (bottom_curve.control_[0]), list); + list = gh_cons (ly_offset2scm (bottom_curve.control_[1]), list); + list = gh_cons (ly_offset2scm (bottom_curve.control_[2]), list); + list = gh_cons (ly_offset2scm (top_curve.control_[0]), list); + list = gh_cons (ly_offset2scm (top_curve.control_[3]), list); + list = gh_cons (ly_offset2scm (top_curve.control_[2]), list); + list = gh_cons (ly_offset2scm (top_curve.control_[1]), list); + + SCM horizontal_bend = scm_list_n (ly_symbol2scm ("bezier-sandwich"), + ly_quote_scm (list), + gh_double2scm (0.0), + SCM_UNDEFINED); + + Interval x_extent = top_curve.extent (X_AXIS); + x_extent.unite (bottom_curve.extent (X_AXIS)); + Interval y_extent = top_curve.extent (Y_AXIS); + y_extent.unite (bottom_curve.extent (Y_AXIS)); + Box b (x_extent, y_extent); + + return Molecule (b, horizontal_bend); +} + /* * Horizontal Slope: * * /| ^ * / | | - * / | | thickness + * / | | height * / | | * / | v * | / @@ -426,16 +552,17 @@ Porrectus::brew_mensural_molecule (Item *me, * <-----> * width */ +// TODO: Move this to class Lookup? Molecule -Porrectus::brew_horizontal_slope(Real width, Real slope, Real thickness) +Porrectus::brew_horizontal_slope (Real width, Real slope, Real height) { SCM width_scm = gh_double2scm (width); SCM slope_scm = gh_double2scm (slope); - SCM thickness_scm = gh_double2scm (thickness); + SCM height_scm = gh_double2scm (height); SCM horizontal_slope = scm_list_n (ly_symbol2scm ("beam"), - width_scm, slope_scm, - thickness_scm, SCM_UNDEFINED); + width_scm, slope_scm, + height_scm, SCM_UNDEFINED); Box b (Interval (0, width), - Interval (-thickness/2, thickness/2 + width*slope)); + Interval (-height/2, height/2 + width*slope)); return Molecule (b, horizontal_slope); } diff --git a/lily/repeated-music.cc b/lily/repeated-music.cc index 13471ed256..550424c5d0 100644 --- a/lily/repeated-music.cc +++ b/lily/repeated-music.cc @@ -15,13 +15,13 @@ Music * Repeated_music::body ()const { - return unsmob_music (get_mus_property ("body")); + return unsmob_music (get_mus_property ("element")); } -Music_sequence* +SCM Repeated_music::alternatives ()const { - return dynamic_cast (unsmob_music (get_mus_property ("alternatives"))); + return get_mus_property ("elements"); } @@ -40,7 +40,7 @@ Repeated_music::to_relative_octave (Pitch p) Pitch last = p ; if (alternatives ()) - for (SCM s = alternatives ()->music_list (); gh_pair_p (s); s = ly_cdr (s)) + for (SCM s = alternatives (); gh_pair_p (s); s = ly_cdr (s)) unsmob_music (ly_car (s))->to_relative_octave (p); @@ -53,8 +53,7 @@ Repeated_music::transpose (Pitch p) if (body ()) body ()->transpose (p); - if (alternatives ()) - alternatives ()->transpose (p); + Music_sequence::transpose_list (get_mus_property ("elements"), p); } void @@ -63,8 +62,7 @@ Repeated_music::compress (Moment p) if (body ()) body ()->compress (p); - if (alternatives ()) - alternatives ()->compress (p); + Music_sequence::compress_list (alternatives (), p); } Moment @@ -74,17 +72,17 @@ Repeated_music::alternatives_length_mom (bool fold) const return 0; if (fold) - return alternatives ()->maximum_length (); + return Music_sequence::maximum_length (alternatives ()); Moment m =0; int done =0; - SCM p = alternatives ()->music_list (); + SCM p = alternatives (); while (gh_pair_p (p) && done < repeat_count ()) { m = m + unsmob_music (ly_car (p))->length_mom (); done ++; - if (repeat_count () - done < alternatives ()->length_i ()) + if (repeat_count () - done < scm_ilength (alternatives ())) p = ly_cdr (p); } return m; @@ -101,7 +99,7 @@ Repeated_music::alternatives_volta_length_mom () const return 0; Moment m; - SCM p = alternatives ()->music_list (); + SCM p = alternatives (); while (gh_pair_p (p)) { m = m + unsmob_music (ly_car (p))->length_mom (); diff --git a/lily/sequential-music.cc b/lily/sequential-music.cc index 8e38c38c8e..0933d28e53 100644 --- a/lily/sequential-music.cc +++ b/lily/sequential-music.cc @@ -19,12 +19,12 @@ Sequential_music::Sequential_music () Moment Sequential_music::length_mom () const { - return cumulative_length (); + return Music_sequence::cumulative_length (get_mus_property ("elements")); } ADD_MUSIC (Sequential_music); Moment Sequential_music::start_mom () const { - return first_start (); + return Music_sequence::first_start (get_mus_property ("elements")); } diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index 390849e226..ca309ecff8 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -49,9 +49,8 @@ void Simultaneous_music_iterator::construct_children () { int j = 0; - Music_sequence const *sim = dynamic_cast (music_l ()); - SCM i = sim->music_list (); + SCM i = music_l ()->get_mus_property ("elements"); for (; gh_pair_p (i); i = ly_cdr (i), j++) { Music *mus = unsmob_music (ly_car (i)); diff --git a/lily/simultaneous-music.cc b/lily/simultaneous-music.cc index 51bc213974..85a3b8136f 100644 --- a/lily/simultaneous-music.cc +++ b/lily/simultaneous-music.cc @@ -7,17 +7,15 @@ Moment Simultaneous_music::length_mom () const { - return maximum_length (); + return Music_sequence::maximum_length (get_mus_property ("elements")); } Moment Simultaneous_music::start_mom () const { - return minimum_start (); + return Music_sequence::minimum_start (get_mus_property ("elements")); } - - Simultaneous_music::Simultaneous_music (SCM head) : Music_sequence (head) { diff --git a/lily/unfolded-repeat-iterator.cc b/lily/unfolded-repeat-iterator.cc index 46ad0a4be9..315149a478 100644 --- a/lily/unfolded-repeat-iterator.cc +++ b/lily/unfolded-repeat-iterator.cc @@ -259,7 +259,7 @@ Unfolded_repeat_iterator::construct_children () Repeated_music * mus =dynamic_cast (music_l ()); alternative_cons_ = (mus->alternatives ()) - ? mus->alternatives ()->music_list () + ? mus->alternatives () : SCM_EOL; for (SCM p = alternative_cons_; gh_pair_p (p); p = ly_cdr (p)) diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index eb46045429..d9edc07d9c 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,15 +1,15 @@ Begin3 Title: LilyPond -Version: 1.5.15 -Entered-date: 05OKT01 +Version: 1.5.16 +Entered-date: 09OKT01 Description: @BLURB@ Keywords: music notation typesetting midi fonts engraving Author: hanwen@cs.uu.nl (Han-Wen Nienhuys) janneke@gnu.org (Jan Nieuwenhuizen) Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys) Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert - 1000k lilypond-1.5.15.tar.gz + 1000k lilypond-1.5.16.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 1000k lilypond-1.5.15.tar.gz + 1000k lilypond-1.5.16.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.mandrake.spec b/make/out/lilypond.mandrake.spec index f1add83b52..552f298cac 100644 --- a/make/out/lilypond.mandrake.spec +++ b/make/out/lilypond.mandrake.spec @@ -1,5 +1,5 @@ %define name lilypond -%define version 1.5.15 +%define version 1.5.16 %define release 1mdk Name: %{name} diff --git a/make/out/lilypond.redhat.spec b/make/out/lilypond.redhat.spec index 7ee9630603..6017b93fb2 100644 --- a/make/out/lilypond.redhat.spec +++ b/make/out/lilypond.redhat.spec @@ -1,11 +1,11 @@ %define info yes Name: lilypond -Version: 1.5.15 +Version: 1.5.16 Release: 1 License: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.15.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.16.tar.gz Summary: Create and print music notation URL: http://www.lilypond.org/ BuildRoot: /tmp/lilypond-install diff --git a/make/out/lilypond.suse.spec b/make/out/lilypond.suse.spec index 1aa450a475..25c3b2d41d 100644 --- a/make/out/lilypond.suse.spec +++ b/make/out/lilypond.suse.spec @@ -14,11 +14,11 @@ Distribution: SuSE Linux 7.0 (i386) Name: lilypond -Version: 1.5.15 +Version: 1.5.16 Release: 2 Copyright: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.15.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.16.tar.gz # music notation software for.. ? Summary: A program for printing sheet music. URL: http://www.lilypond.org/ diff --git a/modules/midi.c b/modules/midi.c index 28216e66b7..e3cbea7201 100644 --- a/modules/midi.c +++ b/modules/midi.c @@ -279,11 +279,6 @@ midi_parse_track (unsigned char **track, unsigned char *track_end) debug_print ("%s", "\n"); track_size = track_end - *track; -#if 0 - /* need this for direct midi.parse_track (s) on midi file */ - if (strcmp (*track, "MTrk")) - *track = memmem (*track, track_size - 1, "MTrk", 4); -#endif debug_print ("%s", "\n"); if (strcmp (*track, "MTrk")) diff --git a/scm/grob-description.scm b/scm/grob-description.scm index 3683ebda1e..55cece0c44 100644 --- a/scm/grob-description.scm +++ b/scm/grob-description.scm @@ -323,15 +323,14 @@ (Porrectus . ( (style . mensural) - (auto-properties . #t) + (auto-properties . #f) (solid . #f) (porrectus-width . 2.4) (line-thickness . 1.0) (add-stem . #t) (stem-direction . 1) (molecule-callback . ,Porrectus::brew_molecule) - (meta . ,(grob-description - porrectus-interface)) + (meta . ,(grob-description porrectus-interface)) )) (RehearsalMark . ( diff --git a/scm/grob-property-description.scm b/scm/grob-property-description.scm index 3f808ba8bf..85a6b931f4 100644 --- a/scm/grob-property-description.scm +++ b/scm/grob-property-description.scm @@ -55,6 +55,7 @@ terms of note head bounding box.") '(LEFT-offset . RIGHT-offset). This offset is added to the attachments to prevent ugly slurs. [fixme: we need more documentation here]. .") +(grob-property-description 'auto-properties boolean? "if true, as many properties of this grob as possible will be determined automatically from the musical context.") (grob-property-description 'auto-knee-gap number-or-boolean? "the minimal smallest gap between two adjacent beamed chords for which beam will create auto-knees. Set to false for no auto knees." ) (grob-property-description 'axes list? "list of axis numbers. In the case of alignment grobs, this should contain only one number.") diff --git a/scm/music-property-description.scm b/scm/music-property-description.scm index bcc035a1c4..39957ee441 100644 --- a/scm/music-property-description.scm +++ b/scm/music-property-description.scm @@ -25,7 +25,6 @@ (music-property-description 'duration duration? "Duration of this note/lyric.") (music-property-description 'metronome-count number? "How many beats in a minute?") (music-property-description 'span-type symbol? "What kind of spanner should be created?") -(music-property-description 'alternatives music? "Music_sequence of alternatives for repeated music.") (music-property-description 'articulation-type symbol? "key for scriptDefinitions alist") (music-property-description 'bass boolean? "Set if this note is a bass note in a chord") (music-property-description 'body music? "The body of a repeat ") @@ -37,18 +36,16 @@ (music-property-description 'denominator integer? "denominator in a time signature") (music-property-description 'direction dir? "Print this up or down?") (music-property-description 'text-type symbol? "Particular type of text script (eg. finger, dynamic).") -(music-property-description 'element music? "The single child of a Music_wrapper music object.") +(music-property-description 'element music? "The single child of a Music_wrapper music object, or the body of a repeat.") +(music-property-description 'elements list? "A list of elements for sequential of simultaneous music, or the alternatives of repeated music. ") +(music-property-description 'force-accidental boolean? "If set, a cautionary accidental should always be printed on this note") (music-property-description 'grob-property symbol? "The symbol of the grob property to set. ") (music-property-description 'grob-value scheme? "The value of the grob property to set") -(music-property-description 'elements list? "A list of elements for sequential of simultaneous music") -(music-property-description 'force-accidental boolean? "If set, a cautionary accidental should always be printed on this note") (music-property-description 'inversion boolean? "If set, this chord note is inverted.") (music-property-description 'label string? "label of a mark.") (music-property-description 'last-pitch pitch? "The last pitch after relativization.") (music-property-description 'length procedure? "How to compute the duration of this music") -(music-property-description 'lyrics music? "second argument of a addlyrics") (music-property-description 'numerator integer? "numerator of a time signature") -(music-property-description 'one music? "first argument of partcombine."); part-combine, fixme, naming. (music-property-description 'origin ly-input-location? "where was this piece of music defined?") (music-property-description 'penalty number? "Penalty for break hint.") (music-property-description 'pitch pitch? "the pitch of this note") @@ -60,6 +57,5 @@ (music-property-description 'symbols list? "List of Grob names (symbols) to perform an override/revert on.") (music-property-description 'text string? "markup expression to be printed");; markup? (music-property-description 'tremolo-type integer? "") -(music-property-description 'two music? "2nd argument of a part-combine"); part-combine, fixme, naming. (music-property-description 'what string? "What to change for auto-change. FIXME, naming") diff --git a/scm/translator-description.scm b/scm/translator-description.scm deleted file mode 100644 index 3e5f63ab05..0000000000 --- a/scm/translator-description.scm +++ /dev/null @@ -1,635 +0,0 @@ - -;; -;; TODO: this should come from the C++ code, really. -;; -(define engraver-description-alist-old -'((A2_engraver - (name . "A2_engraver") - (description . "Part combine engraver for orchestral scores. - -The markings @emph{a2}, @emph{Solo} and @emph{Solo II}, are -created by this engraver. It also acts upon instructions of the part -combiner. Another thing that the this engraver, is forcing of stem, -slur and tie directions, always when both threads are not identical; -up for the musicexpr called @code{one}, down for the musicexpr called -@code{two}. - -") - (grobs-created TextScript) - (interfaces-acked all) - (properties-read combineParts noDirection soloADue soloText soloIIText aDueText split-interval unison solo unisilence unirhythm) - ) - (Arpeggio_engraver - - (name . "Arpeggio_engraver") - (description . "Generate an Arpeggio from a Arpeggio_req") - (grobs-created Arpeggio) - (interfaces-acked grob-interface) - (properties-read) - ) - (Auto_beam_engraver - - (name . "Auto_beam_engraver") - (description . "Generate beams based on measure characteristics and observed -Stems. Uses beatLength, measureLength and measurePosition to decide -when to start and stop a beam. Overriding beaming is done through -@ref{Stem_engraver} properties stemLeftBeamCount and -stemRightBeamCount. -") - (grobs-created Beam) - (interfaces-acked grob-interface) - (properties-read noAutoBeaming autoBeamSettings) - ) - (Axis_group_engraver - - (name . "Axis_group_engraver") - (description . "Group all objects created in this context in a VerticalAxisGroup spanner.") - (grobs-created VerticalAxisGroup) - (interfaces-acked grob-interface) - (properties-read VerticalExtent MinimumVerticalExtent ExtraVerticalExtent) - ) - (Bar_engraver - - (name . "Bar_engraver") - (description . "Create barlines. This engraver is controlled through the -@code{whichBar} property. If it has no bar line to create, it will forbid a linebreak at this point") - (grobs-created BarLine) - (interfaces-acked grob-interface) - (properties-read whichBar stavesFound) - ) - (Bar_number_engraver - - (name . "Bar_number_engraver") - (description . "A bar number is created whenever measurePosition is zero. It is -put on top of all staves, and appears only at left side of the staff.") - (grobs-created BarNumber) - (interfaces-acked grob-interface) - (properties-read currentBarNumber) - ) - (Beam_engraver - - (name . "Beam_engraver") - (description . "Handles Beam_requests by engraving Beams. If omitted, then notes will be -printed with flags instead of beams.") - (grobs-created Beam) - (interfaces-acked grob-interface) - (properties-read beamMelismaBusy) - ) - (Break_align_engraver - - (name . "Break_align_engraver") - (description . "Align grobs with corresponding break-align-symbols into groups, and order the groups according to breakAlignOrder") - (grobs-created BreakAlignment BreakAlignGroup LeftEdge) - (interfaces-acked grob-interface) - (properties-read breakAlignOrder) - ) - (Breathing_sign_engraver - - (name . "Breathing_sign_engraver") - (description . "") - (grobs-created BreathingSign) - (interfaces-acked grob-interface) - (properties-read) - ) - (Chord_name_engraver - - (name . "Chord_name_engraver") - (description . "Catch Note_req's, Tonic_reqs, Inversion_reqs, Bass_req -and generate the appropriate chordname.") - (grobs-created ChordName) - (interfaces-acked grob-interface) - (properties-read chordChanges) - ) - (Chord_tremolo_engraver - - (name . "Chord_tremolo_engraver") - (description . "Generates beams for tremolo repeats.") - (grobs-created Beam) - (interfaces-acked grob-interface) - (properties-read) - ) - (Clef_engraver - - (name . "Clef_engraver") - (description . "Determine and set reference point for pitches") - (grobs-created Clef OctavateEight) - (interfaces-acked grob-interface) - (properties-read clefPosition clefGlyph centralCPosition clefOctavation explicitClefVisibility) - ) - (Collision_engraver - - (name . "Collision_engraver") - (description . "") - (grobs-created NoteCollision) - (interfaces-acked grob-interface) - (properties-read) - ) - (Custos_engraver - - (name . "Custos_engraver") - (description . "") - (grobs-created Custos) - (interfaces-acked grob-interface) - (properties-read) - ) - (Dot_column_engraver - - (name . "Dot_column_engraver") - (description . " Engraves dots on dotted notes shifted to the right of the note. -If omitted, then dots appear on top of the notes. -") - (grobs-created DotColumn) - (interfaces-acked grob-interface) - (properties-read) - ) - (Dynamic_engraver - - (name . "Dynamic_engraver") - (description . "") - (grobs-created DynamicLineSpanner DynamicText Hairpin TextSpanner) - (interfaces-acked grob-interface) - (properties-read) - ) - (Engraver_group_engraver - - (name . "Engraver_group_engraver") - (description . "A group of engravers taken together") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read) - ) - (Extender_engraver - - (name . "Extender_engraver") - (description . "Create lyric extenders") - (grobs-created LyricExtender) - (interfaces-acked grob-interface) - (properties-read) - ) - (Font_size_engraver - (name . "Font_size_engraver") - (description . "Puts fontSize into font-relative-size grob property.") - (grobs-created ) - (interfaces-acked grob-interface) - (properties-read fontSize) - ) - (Hara_kiri_engraver - - (name . "Hara_kiri_engraver") - (description . "Like Axis_group_engraver, but make a hara kiri spanner, and add -interesting items (ie. note heads, lyric syllables and normal rests) -") - (grobs-created HaraKiriVerticalGroup) - (interfaces-acked grob-interface) - (properties-read) - ) - (Hyphen_engraver - - (name . "Hyphen_engraver") - (description . "Create lyric hyphens") - (grobs-created LyricHyphen) - (interfaces-acked grob-interface) - (properties-read) - ) - (Instrument_name_engraver - - (name . "Instrument_name_engraver") - (description . " Prints the name of the instrument (specified by -@code{Staff.instrument} and @code{Staff.instr}) -at the left of the -staff.") - (grobs-created InstrumentName) - (interfaces-acked bar-line-interface dynamic-interface axis-group-interface) - (properties-read instrument instr) - ) - (Key_engraver - - (name . "Key_engraver") - (description . "") - (grobs-created KeySignature) - (interfaces-acked grob-interface) - (properties-read keySignature explicitKeySignatureVisibility createKeyOnClefChange keyAccidentalOrder keySignature) - ) - (Local_key_engraver - (name . "Local_key_engraver") - (description . "Make accidentals. Catches note heads, ties and notices key-change -events. Due to interaction with ties (which don't come together -with note heads), this needs to be in a context higher than Tie_engraver. FIXME") - (grobs-created Accidentals) - (interfaces-acked grob-interface) - (properties-read localKeySignature forgetAccidentals noResetKey) - ) - (Lyric_engraver - - (name . "Lyric_engraver") - (description . "") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read) - ) - (Lyric_phrasing_engraver - - (name . "Lyric_phrasing_engraver") - (description . "") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read automaticPhrasing melismaEngraverBusy associatedVoice phrasingPunctuation) - ) - (Mark_engraver - - (name . "Mark_engraver") - (description . "") - (grobs-created RehearsalMark) - (interfaces-acked grob-interface) - (properties-read rehearsalMark stavesFound) - ) - (Melisma_engraver - - (name . "Melisma_engraver") - (description . "") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read melismaBusy slurMelismaBusy tieMelismaBusy beamMelismaBusy) - ) - (Multi_measure_rest_engraver - - (name . "Multi_measure_rest_engraver") - (description . "Engraves multi-measure rests that are produced with @code{R}. Reads -measurePosition and currentBarNumber to determine what number to print over the MultiMeasureRest -") - (grobs-created MultiMeasureRest) - (interfaces-acked grob-interface) - (properties-read currentBarNumber currentCommandColumn measurePosition) - ) - (Note_head_line_engraver - - (name . "Note_head_line_engraver") - (description . "Engrave a line between two note heads, for example a glissando. -If followVoice is set, staff switches also generate a line.") - (grobs-created Glissando VoiceFollower) - (interfaces-acked grob-interface) - (properties-read followVoice) - ) - (Note_heads_engraver - - (name . "Note_heads_engraver") - (description . "Generate one or more noteheads from Music of type Note_req.") - (grobs-created NoteHead Dots) - (interfaces-acked grob-interface) - (properties-read) - ) - (Note_name_engraver - - (name . "Note_name_engraver") - (description . "") - (grobs-created NoteName) - (interfaces-acked grob-interface) - (properties-read) - ) - (Output_property_engraver - - (name . "Output_property_engraver") - (description . "Interpret Music of Output_property type, and apply a function -to any Graphic objects that satisfies the predicate.") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read) - ) - (Percent_repeat_engraver - (name . "Percent_repeat_engraver") - (description . "Make beat, whole bar and double bar repeats.") - (grobs-created PercentRepeat RepeatSlash DoublePercentRepeat) - (interfaces-acked grob-interface) - (properties-read measureLength currentCommandColumn) - ) - - (Piano_pedal_engraver - (name . "Piano_pedal_engraver") - (description . "Engrave piano pedal symbols.") - (grobs-created SostenutoPedal SustainPedal UnaCordaPedal) - (interfaces-acked rhythmic-head-interface stem-interface) - (properties-read pedalSostenutoStrings pedalSustainStrings pedalUnaCordaStrings) - ) - (Pitch_squash_engraver - (name . "Pitch_squash_engraver") - (description . "Treat all pitches as middle C. Note that the notes move, but -the locations of accidentals stay the same. -Set the position field of all note heads to zero. This useful for -making a single line staff that demonstrates the rhythm of a melody.") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read squashedPosition) - ) - (Phrasing_slur_engraver - (name . "Phrasing_slur_engraver") - (description . "Print phrasing slurs. Similar to Slur_engraver") - (grobs-created PhrasingSlur) - (interfaces-acked grob-interface) - (properties-read slurBeginAttachment slurEndAttachment slurMelismaBusy) - ) - (Porrectus_engraver - - (name . "Porrectus_engraver") - (description . "Join adjacent notes to a porrectus ligature.") - (grobs-created Porrectus) - (interfaces-acked grob-interface) - (properties-read) - ) - (Property_engraver - - (name . "Property_engraver") - (description . "This is a engraver that converts property settings into -back-end grob-property settings. Example: Voice.stemLength will set -#'length in all Stem objects. - -Due to CPU and memory requirements, the use of this engraver is deprecated.") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read Generic_property_list) - ) - (Repeat_acknowledge_engraver - - (name . "Repeat_acknowledge_engraver") - (description . "Acknowledge repeated music, and convert the contents of -repeatCommands ainto an appropriate setting for whichBar") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read repeatCommands whichBar) - ) - (Rest_collision_engraver - - (name . "Rest_collision_engraver") - (description . "Handles collisions of rests.") - (grobs-created RestCollision) - (interfaces-acked grob-interface) - (properties-read) - ) - (Rest_engraver - - (name . "Rest_engraver") - (description . "") - (grobs-created Rest Dots) - (interfaces-acked grob-interface) - (properties-read) - ) - (Rhythmic_column_engraver - - (name . "Rhythmic_column_engraver") - (description . "Generates NoteColumn, an objects that groups stems, noteheads and rests.") - (grobs-created NoteColumn) - (interfaces-acked grob-interface) - (properties-read) - ) - (Score_engraver - - (name . "Score_engraver") - (description . "Top level engraver. Takes care of generating columns and the complete system (ie. LineOfScore) - - -This engraver decides whether a column is breakable. The default is -that a column is always breakable. However, when every Bar_engraver -that does not have a barline at a certain point will call -Score_engraver::forbid_breaks to stop linebreaks. In practice, this -means that you can make a breakpoint by creating a barline (assuming -that there are no beams or notes that prevent a breakpoint.) - - -") - (grobs-created LineOfScore PaperColumn NonMusicalPaperColumn) - (interfaces-acked grob-interface) - (properties-read currentMusicalColumn currentCommandColumn) - ) - (Script_column_engraver - - (name . "Script_column_engraver") - (description . "") - (grobs-created ScriptColumn) - (interfaces-acked grob-interface) - (properties-read) - ) - (Script_engraver - - (name . "Script_engraver") - (description . " Handles note ornaments generated by @code{\\script}. -") - (grobs-created Script) - (interfaces-acked grob-interface) - (properties-read scriptDefinitions scriptHorizontal) - ) - (Separating_line_group_engraver - - (name . "Separating_line_group_engraver") - (description . "Generates objects for computing spacing parameters.") - (grobs-created SeparationItem SeparatingGroupSpanner) - (interfaces-acked grob-interface) - (properties-read) - ) - (Skip_req_swallow_translator - - (name . "Skip_req_swallow_translator") - (description . "") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read) - ) - (Slur_engraver - - (name . "Slur_engraver") - (description . "Build slurs from Slur_reqs") - (grobs-created Slur) - (interfaces-acked grob-interface) - (properties-read slurBeginAttachment slurEndAttachment slurMelismaBusy) - ) - (Spacing_engraver - - (name . "Spacing_engraver") - (description . "make a SpacingSpanner and do bookkeeping of shortest starting and playing notes ") - (grobs-created SpacingSpanner) - (interfaces-acked grob-interface) - (properties-read) - ) - (Span_arpeggio_engraver - - (name . "Span_arpeggio_engraver") - (description . "") - (grobs-created Arpeggio) - (interfaces-acked grob-interface) - (properties-read connectArpeggios) - ) - (Span_bar_engraver - - (name . "Span_bar_engraver") - (description . "This engraver makes cross-staff barlines: It catches all normal -bar lines, and draws a single span-bar across them.") - (grobs-created SpanBar) - (interfaces-acked grob-interface) - (properties-read) - ) - (Staff_symbol_engraver - - (name . "Staff_symbol_engraver") - (description . "create the constellation of five (default) -staff lines.") - (grobs-created Sta - ffSymbol) - (interfaces-acked grob-interface) - (properties-read) - ) - (Stanza_number_engraver - - (name . "Stanza_number_engraver") - (description . "") - (grobs-created StanzaNumber) - (interfaces-acked grob-interface) - (properties-read stz stanza) - ) - (Stem_engraver - - (name . "Stem_engraver") - (description . "Create stems and single-stem tremolos. It also works together with -the beam engraver for overriding beaming.") - (grobs-created Stem StemTremolo) - (interfaces-acked rhythmic-head-interface) - (properties-read tremoloFlags stemLeftBeamCount stemRightBeamCount) - ) - (System_start_delimiter_engraver - - (name . "System_start_delimiter_engraver") - (description . "creates a system start delimiter (ie. SystemStart@{Bar,Brace,Bracket@} spanner") - (grobs-created SystemStartBar SystemStartBrace SystemStartBracket) - (interfaces-acked grob-interface) - (properties-read) - ) - (Text_engraver - - (name . "Text_engraver") - (description . "Create text-scripts") - (grobs-created TextScript) - (interfaces-acked grob-interface) - (properties-read scriptHorizontal textNonEmpty) - ) - (Text_spanner_engraver - - (name . "Text_spanner_engraver") - (description . "Create text spanner from a Span_req ") - (grobs-created TextSpanner) - (interfaces-acked grob-interface) - (properties-read) - ) - (Thread_devnull_engraver - - (name . "Thread_devnull_engraver") - (description . "Kill elements whenever we are Voice called `two' and either -unison, unisilence or soloADue is set.@footnote{On unix systems, the -file @file{/dev/null} is special device: anything written to it is -discarded.}. This engraver works closely together with the part -combiner. When the part combiner notices that two threads are -identical, it tells the @code{Thread_devnull_engraver} to discard -everything in the second thread. -") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read) - ) - (Tie_engraver - - (name . "Tie_engraver") - (description . "Generate ties between noteheads of equal pitch.") - (grobs-created Tie TieColumn) - (interfaces-acked grob-interface) - (properties-read sparseTies tieMelismaBusy) - ) - (Time_signature_engraver - - (name . "Time_signature_engraver") - (description . "Create a TimeSignature whenever @code{timeSignatureFraction} changes") - (grobs-created TimeSignature) - (interfaces-acked grob-interface) - (properties-read) - ) - (Timing_engraver - - (name . "Timing_engraver") - (description . " Responsible for synchronizing timing information from staves. -Normally in @code{Score}. In order to create polyrhythmic music, -this engraver should be removed from @code{Score} and placed in -@code{Staff}.") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read timeSignatureFraction barCheckNoSynchronize barNonAuto whichBar barAlways defaultBarType skipBars timing oneBeat measureLength measurePosition currentBarNumber) - ) - (Tuplet_engraver - - (name . "Tuplet_engraver") - (description . "Catch Time_scaled_music and generate appropriate bracket ") - (grobs-created TupletBracket) - (interfaces-acked grob-interface) - (properties-read tupletNumberFormatFunction tupletSpannerDuration tupletInvisible) - ) - (Vertical_align_engraver - - (name . "Vertical_align_engraver") - (description . "Catch Vertical axis groups and stack them.") - (grobs-created VerticalAlignment) - (interfaces-acked grob-interface) - (properties-read) - ) - (Voice_devnull_engraver - - (name . "Voice_devnull_engraver") - (description . "Kill off certain items and spanners if we're Voice `two' and unison or unisilence is set.") - (grobs-created) - (interfaces-acked grob-interface) - (properties-read) - ) - (Volta_engraver - - (name . "Volta_engraver") - (description . "Make volta brackets") - (grobs-created VoltaBracket) - (interfaces-acked grob-interface) - (properties-read repeatCommands voltaSpannerDuration) - ) - ) -) -(define (aliststring (car x)) - (symbol->string (car y)))) - -;(set! engraver-description-alist -; (sort engraver-description-alist aliststring (car l))) - (else (string-append (symbol->string (car l)) " " (human-listify (cdr l))) - - ))) - -(define (print-entry x) - (define (mungle x) - (string-append (string-downcase (regexp-substitute/global #f "_" x 'pre "-" 'post)) ".cc")) - - (let ((cop (open-file (mungle (car x)) "a"))) - (define (w y) - (write y cop)) - (define (d y) - (display y cop)) - - (d "ENTER_DESCRIPTION(") - (d (car x)) - (d ",\n/* descr */ ") - (w (cdr (assoc 'description (cdr x)))) - (d ",\n/* creats*/ ") - (w (human-listify (cdr (assoc 'grobs-created (cdr x))))) - (d ",\n/* acks */ ") - (w (human-listify (cdr (assoc 'interfaces-acked (cdr x))))) - (d ",\n/* reads */ ") - (w (human-listify (cdr (assoc 'properties-read (cdr x))))) - (d ",\n/* write */ \"\");\n") -)) - -;(map print-entry engraver-description-alist) - diff --git a/scm/translator-property-description.scm b/scm/translator-property-description.scm index ed548ddeee..97abc27d8d 100644 --- a/scm/translator-property-description.scm +++ b/scm/translator-property-description.scm @@ -90,6 +90,9 @@ set, \addlyrics will assume that beams, slurs and ties signal melismata, and align lyrics accordingly. ") +(translator-property-description 'autoReminders symbol? "If set to @samp{accidental} or @samp{cautionary}, +a (reminder) accidental automatically is inserted whenever an accidental is reverted - even after a bar.") + (translator-property-description 'barAlways boolean? " If set to true a bar line is drawn after each note. ") (translator-property-description 'barCheckNoSynchronize boolean? "If set, don't reset measurePosition when finding a bbarcheck. This @@ -308,6 +311,8 @@ is erased. .") (translator-property-description 'stemRightBeamCount integer? "idem, for the right side.") (translator-property-description 'stz string? "Abbreviated form for a stanza, see also Stanza property.") +(translator-property-description 'subdivideBeams boolean? "If set, multiple beams will be subdivided at beat +positions - by only drawing one beam over the beat.") (translator-property-description 'textNonEmpty boolean? " If set to true then text placed above or below the staff is not assumed to have zero width. @code{\fatText} and @code{\emptyText} are predefined diff --git a/scripts/midi2ly.py b/scripts/midi2ly.py index ec72a6a07a..0c3b42ae05 100644 --- a/scripts/midi2ly.py +++ b/scripts/midi2ly.py @@ -289,6 +289,7 @@ def convert_midi (f): str = open (f).read () midi_dump = midi.parse (str) + tracks = [] for t in midi_dump[1]: tracks.append (split_track (t)) -- 2.39.2