From 71fb71437fc91cef2c41d9ee17856ea1031cfb10 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Fri, 25 Jun 1999 11:50:41 +0200 Subject: [PATCH] release: 1.1.50 --- AUTHORS.txt | 24 +- Documentation/faq.yo | 52 +-- Documentation/mail.yo | 2 +- Documentation/man/lilypond.yo | 3 +- Documentation/man/out/lilypond.1 | 31 +- Documentation/tex/engraving.bib | 12 - Documentation/tex/glossary-table.data | 9 +- Documentation/tex/lilypond-regtest.doc | 31 ++ Documentation/tex/mudela-book-doc.doc | 1 + Documentation/tex/refman.yo | 300 +++++++++++------- Documentation/topdocs/AUTHORS.yo | 2 + Documentation/topinfo.yo | 7 + NEWS | 34 +- TODO | 234 ++++---------- VERSION | 4 +- buildscripts/lilypond.sh | 18 ++ input/bugs/rep.ly | 2 +- input/bugs/threads.ly | 201 ++++++++++++ input/bugs/unfold.ly | 2 +- input/test/breathing-sign.ly | 16 + input/test/coda-kludge.ly | 2 +- input/test/dynamics.fly | 1 + input/test/repeat-semifold.ly | 10 + input/test/repeat-unfold.ly | 9 + input/test/reps.ly | 10 + input/test/rest-collision.ly | 6 +- input/von-guten-maechten.ly | 110 +++++++ lily/audio-item.cc | 3 - lily/bar.cc | 2 +- lily/bow.cc | 8 +- lily/breathing-sign-engraver.cc | 72 +++++ lily/breathing-sign.cc | 59 ++++ lily/dynamic-engraver.cc | 7 +- lily/include/beam.hh | 5 +- lily/include/breathing-sign-engraver.hh | 34 ++ lily/include/breathing-sign.hh | 32 ++ lily/include/command-request.hh | 3 + lily/include/music-list.hh | 4 +- lily/include/new-repeated-music.hh | 6 +- lily/include/spring-spacer.hh | 5 +- lily/include/unfolded-repeat-iterator.hh | 5 +- lily/midi-walker.cc | 3 + lily/music-list.cc | 5 + lily/music-sequence.cc | 5 + lily/musical-request.cc | 1 - lily/my-lily-lexer.cc | 1 + lily/note-column.cc | 37 ++- lily/note-head.cc | 8 +- lily/paper-outputter.cc | 73 ++++- lily/paper-stream.cc | 1 + lily/parser.yy | 29 +- ...iterator.cc => repeated-music-iterator.cc} | 0 ...ew-repeated-music.cc => repeated-music.cc} | 20 +- lily/specialty-engraver.cc | 32 ++ lily/spring-spacer.cc | 5 + lily/unfolded-repeat-iterator.cc | 32 +- ly/engraver.ly | 1 + ly/paper16.ly | 4 +- ly/paper20.ly | 4 +- ly/script.ly | 7 +- make/out/lelievijver.lsm | 8 +- make/out/lilypond.lsm | 8 +- make/out/lilypond.spec | 4 +- mutopia/E.Satie/gnossienne-4.ly | 145 +++++---- mutopia/F.Schubert/standchen.ly | 164 +++++----- scm/lily.scm | 5 + scripts/abc-2-ly.py | 81 ++++- scripts/ly2dvi.py | 6 +- 68 files changed, 1441 insertions(+), 626 deletions(-) create mode 100644 buildscripts/lilypond.sh create mode 100644 input/bugs/threads.ly create mode 100644 input/test/breathing-sign.ly create mode 100644 input/test/repeat-semifold.ly create mode 100644 input/test/repeat-unfold.ly create mode 100644 input/test/reps.ly create mode 100644 input/von-guten-maechten.ly create mode 100644 lily/breathing-sign-engraver.cc create mode 100644 lily/breathing-sign.cc create mode 100644 lily/include/breathing-sign-engraver.hh create mode 100644 lily/include/breathing-sign.hh rename lily/{new-repeated-music-iterator.cc => repeated-music-iterator.cc} (100%) rename lily/{new-repeated-music.cc => repeated-music.cc} (85%) create mode 100644 lily/specialty-engraver.cc diff --git a/AUTHORS.txt b/AUTHORS.txt index fcae67073e..292a11b1fa 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -31,28 +31,32 @@ o Donald Ervin Knuth, http://www-cs-staff.stan- ford.edu/~knuth/ mf/ital-*.mf (these were taken from the CM fonts) -o Werner Lemberg , misc +o Michael Krause , breathing + signs + +o Werner Lemberg , misc bugfixes, some Beam and Stem code. -o David R. Linn , Mailing list +o David R. Linn , Mailing list maintenance. -o Adrian Mariano <> Reference manual, tutorial fixes, +o Adrian Mariano <> Reference manual, tutorial fixes, glossary. o Han-Wen Nienhuys , - http://www.cs.uu.nl/~hanwen/ Main author (initials: + http://www.cs.uu.nl/~hanwen/ Main author (initials: HWN). -o Jan Nieuwenhuizen , - http://www.xs4all.nl/~jantien/ Main author (initials: +o Jan Nieuwenhuizen , + http://www.xs4all.nl/~jantien/ Main author (initials: JCN). -o Alexandre Oliva , http://sun- +o Alexandre Oliva , http://sun- site.unicamp.br/~oliva/ testing -o Franc,ois Pinard , parts of - Documentation/Vocab*, started internationalization +o Franc,ois Pinard , parts of + Documentation/Vocab*, started internationalization + stuff o Jeffrey B. Reed , Windows-NT sup- @@ -60,5 +64,5 @@ o Jeffrey B. Reed , Windows-NT sup- o Shay Rojanski Some mudela source. -Your name could be here! If you want to fix something, do +Your name could be here! If you want to fix something, do it, and send us a patch! diff --git a/Documentation/faq.yo b/Documentation/faq.yo index a878886610..f20726e49b 100644 --- a/Documentation/faq.yo +++ b/Documentation/faq.yo @@ -14,8 +14,8 @@ Note: relative paths are meant to be relative to the source directory sect(Installing) -question(If I install the .exe file on my DOS/windows 3.11 machine, it -doesn't work.) +COMMENT(look out: can't have line breaks in subsect() macro) +question(If I install the .exe file on my DOS/windows 3.11 machine, it doesn't work) The DOS port is done with the cygnus gnu/windows32 port of the GNU utils. It does em(not) work with windows 3.x; you need Windows-NT (95/98?). This @@ -206,9 +206,8 @@ question(How do I change the TeX layout?) See file(lilyponddefs.tex), it has some comments. Or use file(ly2dvi). -question(How do I place lyrics under em(each) of the staves in a -score, as choral music. I can work out how to put lyrics for each line -all under the top line, or at the bottom but not between!) +COMMENT(look out: can't have line breaks in subsect() macro) +question(How do I place lyrics under em(each) of the staves in a score, as choral music. I can work out how to put lyrics for each line all under the top line, or at the bottom but not between!) You change the order lyrics and staves. You have to name all staves (lyric and melodic), otherwise they will end up in the same @@ -251,15 +250,14 @@ See file(input/test/bar-scripts.ly). sect(Development) -question(Could you implement feature XXXX? It is really easy, just extend -the syntax to allow YYYY!) +COMMENT(look out: can't have line breaks in subsect() macro) +question(Could you implement feature XXXX? It is really easy, just extend the syntax to allow YYYY!) If it is reasonable, I'll add XXXX to the TODO list. In general finding a cute syntax (such as YYYY) isn't very hard. The complicated issue how to adapt the internals to do XXXX. The parser is really a simple front end to the complicated internals. - question(Can I join in on LilyPond development? How do I do this?) LilyPond development is open for anyone who wants to join. We try @@ -288,14 +286,21 @@ easier or quicker to use than mudela. But for composing a graphical environment probably is indispensable. In any case email(Derek Wyatt)(wyatt@scar.utoronto.edu) is working on -GTK based editor, but that is still in an embryonal stage (see -lurl(http://harmonia.scar.utoronto.ca). There is also a GUI package -RoseGarden that could be extended to output mudela. +GTK based editor, but that effort practically died. (see +lurl(http://harmonia.scar.utoronto.ca). + +Matthew Hiller is working on extending Midiscore to handle mudela. +lurl(http://zoo.cs.yale.edu/~meh25/MISClily/MISClily-0.0.3.tar.gz) + + +There is also a GUI package RoseGarden that could be extended to +output mudela. If you want to work on this, please send e-mail to the mailing list email(gnu-music-discuss@gnu.org). + question(I want to implement XXXX! How should I do this?) Your best bet of getting us to include code, is to present it as a @@ -352,8 +357,8 @@ question(Why GPL?) Yes. -question(Your make system does not adhere to GNU coding standards, could you -please fix it?) +COMMENT(look out: can't have line breaks in subsect() macro) +question(Your make system does not adhere to GNU coding standards, could you please fix it?) No. We have evaluated the standard GNU combination for compiling programs (autoconf, automake, libtool) and found to be inadequate in @@ -380,24 +385,22 @@ having to support other compilers saves us a em(lot) of trouble. sect(Running) -question(I use dvilj4, and there are lots of warning messages for the -printing) +question(I use dvilj4, and there are lots of warning messages for the printing) You should use dvips and ghostscript to print the code(dvi) output: the slurs and beams are PS code(\special) commands. -question(My symbols are all messed up after I upgraded, I get the -wrong symbols and dvi-checksum errors!) +COMMENT(look out: can't have line breaks in subsect() macro) +question(My symbols are all messed up after I upgraded, I get the wrong symbols and dvi-checksum errors!) We obviously mucked with the fonts in the upgrade. Remove em(all) previous fonts, including the file(.pk) and file(.tfm) fonts in file(/var/lib/texmf). A script automating this has been included, see file(buildscripts/clean-fonts.sh). -question(all the pk and tfm -fonts are created in the directory where the mudela file is, not in -"/var/spool/texmf" where I think they should be.) +COMMENT(look out: can't have line breaks in subsect() macro) +question(all the pk and tfm fonts are created in the directory where the mudela file is, not in "/var/spool/texmf" where I think they should be.) Mats Bengtsson writes: @@ -470,8 +473,8 @@ verb( The bf(-M) option was added to LilyPond because processing the \paper block is so slow. -question(A lot of musical stuff doesn't make it to the MIDI file, eg. -dynamics, articulation, etc.) +COMMENT(look out: can't have line breaks in subsect() macro) +question(A lot of musical stuff doesn't make it to the MIDI file, eg. dynamics, articulation, etc.) The MIDI output was originally put in as a proof that MIDI could be done, and as a method of proof"reading" the input. The MIDI support @@ -480,8 +483,8 @@ is by no means finished. Patches appreciated. sect(Copyright) -question(How does copyright for sheet music work? Can I enter and -spread my newly bought Bach urtext?) +COMMENT(look out: can't have line breaks in subsect() macro) +question(How does copyright for sheet music work? Can I enter and spread my newly bought Bach urtext?) Silas S. Brown : @@ -586,4 +589,3 @@ They may lag several versions behind the latest version. question(But i want a native DOS/Windows-NT/95 port) Reconsider. Try Linux. It's fun! - diff --git a/Documentation/mail.yo b/Documentation/mail.yo index c3d4e894a9..c11d059563 100644 --- a/Documentation/mail.yo +++ b/Documentation/mail.yo @@ -35,7 +35,7 @@ dit(gnu-music-discuss@gnu.org,) mail with subject "subscribe" to email(gnu-music-discuss-request@gnu.org) This list is archived at - lurl(http://www.mail-archive.org/gnu-music-discuss@gnu.org) + lurl(http://www.mail-archive.com/gnu-music-discuss@gnu.org) ) Announces of new versions will be sent to info-gnu-music and diff --git a/Documentation/man/lilypond.yo b/Documentation/man/lilypond.yo index d680277e43..6c5bcce306 100644 --- a/Documentation/man/lilypond.yo +++ b/Documentation/man/lilypond.yo @@ -116,7 +116,7 @@ dit(file(init.ly)) The initialisation file with symbol tables etc. It includes files from the directory file(PREFIX/share/lilypond/ly/). (file(PREFIX) typically is file(/usr/local) -) +)) manspagesection(environment) @@ -198,4 +198,3 @@ it()nemail(Jan Nieuwenhuizen)(janneke@gnu.org) Please consult the documentation file file(AUTHORS) for more detailed information, and small contributions. - diff --git a/Documentation/man/out/lilypond.1 b/Documentation/man/out/lilypond.1 index d3e8212ed2..036db66e6e 100644 --- a/Documentation/man/out/lilypond.1 +++ b/Documentation/man/out/lilypond.1 @@ -116,9 +116,9 @@ The initialisation file with symbol tables etc\&. It includes files from the directory \fBPREFIX/share/lilypond/ly/\fP\&. (\fBPREFIX\fP typically is \fB/usr/local\fP ) -.IP +.PP manspagesection(environment) -.IP +.PP .IP "LILYINCLUDE" additional directories for finding lilypond data\&. The format is like the format of \fBPATH\fP\&. @@ -126,34 +126,34 @@ format is like the format of \fBPATH\fP\&. [FIXME] .IP "LANG" selects the language for the warning messages of LilyPond\&. -.IP +.PP .SH "BUGS" -.IP +.PP Lots of them\&. See \fBTODO\fP and \fBBUGS\fP -.IP +.PP .SH "SEE ALSO" -.IP +.PP LilyPond comes with various other documentation files, but most are in the form of manual pages\&. They are included in the source package\&. Interesting documents include -.IP +.PP .IP "MANIFESTO" Goals of the GNU LilyPond project\&. .IP "FAQ" The GNU LilyPond FAQ list -.IP +.PP A further source for information is the website, which can be found at http://www\&.lilypond\&.org/\&. The website contains on-line versions of the documentation -.IP +.PP GNU LilyPond is updated very frequently, the latest version is always available at: ftp://ftp\&.cs\&.uu\&.nl/pub/GNU/LilyPond\&. This FTP site is mirrored at a number of sites; consult the project web pages for information about mirrors\&. -.IP +.PP For programs which are part of the GNU music project, the following mailing list have been setup: -.IP +.PP .IP "info-gnu-music@gnu\&.org" For information on the GNU Music project, to subscribe: send mail with subject "subscribe" to info-gnu-music-request@gnu\&.org @@ -169,14 +169,14 @@ bug-gnu-music-request@gnu\&.org For discussions concerning the GNU Music project, to subscribe: send mail with subject "subscribe" to gnu-music-discuss-request@gnu\&.org -.IP +.PP Announces of new versions will be sent to info-gnu-music and gnu-music-discuss\&. -.IP +.PP .SH "REMARKS" -.IP +.PP GNU LilyPond has no connection with the music package Rosegarden, other -than the names being similar :- +than the names being similar :-) .PP .SH "AUTHOR" .PP @@ -189,4 +189,3 @@ http://www\&.xs4all\&.nl/~jantien .PP Please consult the documentation file \fBAUTHORS\fP for more detailed information, and small contributions\&. -.PP diff --git a/Documentation/tex/engraving.bib b/Documentation/tex/engraving.bib index 7552b11c18..ab4099acce 100644 --- a/Documentation/tex/engraving.bib +++ b/Documentation/tex/engraving.bib @@ -39,18 +39,6 @@ } -@Book{banter, - author = {Harald Banter}, - title = {Akkord Lexikon}, - publisher = {Schott's S\"ohne}, - year = {1987}, - isbn = {ISBN 3-7957-2095-8}, - note = {Comprehensive overview of commonly used - chords. Suggests (and uses) a unification for all different kinds - of chord names.}, - address = {Mainz, Germany}, -} - @Book {read78, note = {Sound (boring) review of the various hairy rhythmic notations used by avant-garde composers HWN}, diff --git a/Documentation/tex/glossary-table.data b/Documentation/tex/glossary-table.data index 4a830e0d5d..2fdb482110 100644 --- a/Documentation/tex/glossary-table.data +++ b/Documentation/tex/glossary-table.data @@ -21,13 +21,15 @@ backfall, forefall@accent, chute, port de voix@Vorschlag@@korte voorslag@appogia bar line@barre (de mesure)@Taktstrich@@maatstreep@stanghetta@ bar; measure@mesure@Takt@@maat, maatstreep@@ baritone@bariton@Bariton@@bariton@@ -bass clef@clé de fa@Bass-Schlüssel, F-Schlüssel@@F sleutel, bas sleutel@chiave di basso@ +@@F-Schlüssel@@F sleutel@@A clef shaped as a curl with two dots. The position between the dots is the line of the F below central C. +bass clef@clé de fa@Bass-Schlüssel@@bas sleutel@chiave di basso@A clef setting with central C on the first top ledger line. bass@basse@Bass@@bas@@ beam@barre@Balken@@waardestreep/balk@barra@ beat@temps@Takt(-schlag)@@tel@@ brace@accolade@Klammer@@accolade, haak@accolada@Symbol at the start of a system that connects staffs. brass@@Blechbläser@@koper (blazers)@@ -C clef@clé d'ut@Altschlüssel, C-Schlüssel@@C sleutel, alt sleutel@chiave di tenore@ +alto clef@clé d'ut@Altschlüssel@@alt sleutel@chiave di tenore@Clef setting that has central C on the middle staff line. +C clef@@@@C sleutel. @@A clef symbol that looks like a horizontally mirrored 3. It indicates the position of the central C. Used in different positions. C@do@c@@C@@ C@ut@c@@@@ cadence@cadence@Kadenz@@cadens@@ @@ -231,7 +233,8 @@ tonality@tonalit tone@ton@Ton@@toon@@ tonic@tonique@Tonika@@tonica@@ transposition@transposition@Transposition@@transpositie@@Shifting a melody up or down in pitch, while keeping the same relative pitches. -treble clef@clé de sol@Violinschlüssel, G-Schlüssel@@G sleutel, viool sleutel@chiave di violino@ +G clef@@@@G sleutel@@A clef symbol with a loop at the top and a spiral in the center. The center of the spiral indicates the G above central C. +treble clef@clé de sol@Violinschlüssel@@viool sleutel@chiave di violino@Clef setting where the second lowest line is the G above central C. tremolo@trèmolo@Tremolo@@tremolo@tremolo@ trill; shake@trille, tremblement, battement (cadence)@Triller@@triller@trillo@ triple meter@temps ternaire@@@driedelige maatsoort@@ diff --git a/Documentation/tex/lilypond-regtest.doc b/Documentation/tex/lilypond-regtest.doc index bc70c38b3d..37452d42b9 100644 --- a/Documentation/tex/lilypond-regtest.doc +++ b/Documentation/tex/lilypond-regtest.doc @@ -38,6 +38,10 @@ tremolo must be parallel to the beam. If the stem is invisible \mudelafile{stem-tremolo.ly} +Beams, stems and noteheads often have communication troubles, since +the two systems for y dimensions (1 unit = staffspace, 1 unit = 1 +point) are mixed. + \section{Beams, slurs and other spanners} @@ -64,6 +68,25 @@ centered in the gap in the bracket. \mudelafile{tup.ly} +\section{Repeats} + +LilyPond has three modes for repeats: folded, unfolded and +semi-unfolded. Unfolded repeats are fully written out. Semi unfolded +repeats have the body written and all alternatives sequentially. +Folded repeats have the body written and all alternatives +simultaneously. If the number of alternatives is larger than the +repeat count, the excess alternatives are ignored. If the number of +alternatives is smaller, the first alternative is multiplied to get to +the number of repeats. + +Unfolded behavior: + +\mudelafile{repeat-unfold.ly} + +Semi (un)0folded behavior: + +\mudelafile{repeat-semifold.ly} + \section{Multiple notes} Rests should not collide with beams, stems and noteheads. Rests may @@ -107,6 +130,14 @@ PianoStaff \mudelafile{staff-margin.ly} +Breathing signs, also used for phrasing, do normally not influence +global spacing -- only if space gets tight, notes are shifted to make +room for the breathing sign. Breathing signs break beams running +through their voice. In the following example, the notes in the first +two bars all have the same distance from each other: + +\mudelafile{breathing-sign.ly} + \section{Clefs and Time Signatures} diff --git a/Documentation/tex/mudela-book-doc.doc b/Documentation/tex/mudela-book-doc.doc index b905979a1b..95a439f6d7 100644 --- a/Documentation/tex/mudela-book-doc.doc +++ b/Documentation/tex/mudela-book-doc.doc @@ -9,6 +9,7 @@ %\sloppy \def\postMudelaExample{\setlength{\parindent}{3.25ex}} \title{Mudela-book tutorial} +\author{TCA} \begin{document} \maketitle %\printparam diff --git a/Documentation/tex/refman.yo b/Documentation/tex/refman.yo index 1ab6933237..8b1259b003 100644 --- a/Documentation/tex/refman.yo +++ b/Documentation/tex/refman.yo @@ -10,25 +10,23 @@ redef(code)(1)(tt(ARG1)) COMMENT( -questions: - long lyrics don't get any space at the end - lyrics and scripts collide - \key b; \time 4/4; looks bad---no space between key sig and clef - \portato still DOES NOT WORK! - \cadenza vs. barNonAuto ? - not enough space for \key b; - I noticed that ledger lines in the previewer looked like they had - a double line (of different lengths). On printed output, I think - I can see a slight thickening of the ledger lines in the middle. - Is this supposed to happen? + BUGS: + + Causes segfault: + + \score{ + \notes{ \context Voice { + \repeat fold 2 { a b c d } {} + } + } + } + + restStyle=mensural doesn't seem to work (lots of characters not found for rests.fly) - what happened to the Staff.textalignment and Lyrics.textalignment - properties? - TODO: - autobeamer + thread paper size? paper variables the explanation of how lyrics mode parses words seems ridiculous. @@ -37,28 +35,6 @@ TODO: accordion symbols interstaff beams (beam-interstaff.ly) interstaff slurs (see preludes-1.ly) - - Current list of undocumented properties: - - "alignmentReference" to do with minVerticalAlign, etc? - "beamAuto" - "beamAutoBegin" - "beamAutoBegin" + type_str - "beamAutoEnd" - "beamAutoEnd" + type_str - "createInitdefaultClef" - "dynamicStyle" - "postBreakPadding" - "staffLineLeading" - "stemLeftBeamCount" - "stemRightBeamCount" - time_str + "beamAutoBegin" - time_str + "beamAutoBegin" + type_str - time_str + "beamAutoEnd" - time_str + "beamAutoEnd" + type_str - type_ + "Direction" - type_ + "HangOnClef" - type_ + "ScriptPadding" ) @@ -81,7 +57,7 @@ latexlayoutcmds( whentexinfo(notableofcontents()) -article(Mudela 1.0.14 / LilyPond 1.1.40 Reference Manual) +article(Mudela 1.0.21 / LilyPond 1.1.49 Reference Manual) (Adrian Mariano, Han-Wen Nienhuys and Jan Nieuwenhuizen) (nop()PIPETHROUGH(date "+%B %d, %Y")()()nop()) @@ -226,9 +202,11 @@ and code(< c e g >) represents a chord. These items can be nested any way you like. This simple example shows how three chords can be expressed in two different ways: mudela(fragment,verbatim,center)( -\notes<{a b c'}{c' d' e'}{e' f' g'}> -\notes{} -) +\notes{ + c + + <{a b c'}{c' d' e'}{e' f' g'}> +}) ) @@ -244,23 +222,24 @@ identifier in terms of its old value: code(foo = \foo * 2.0). Identifier assignments must appear at the top level in the Mudela file. Note that semicolons are forbidden after assignments appearing at the top level but they are obligatory after assignments appearing -elsewhere. +elsewhere. (Semicolons are also forbidden after code(\property) assignments.) An identifier can be created with any string for its name, but you will only be able to refer to identifiers whose names begin with a letter and are entirely alphanumeric. It is also impossible to refer to an identifier whose name is the same as the name of a keyword. The following words are keywords: -verb(absdynamic duration mark property skip -accepts font midi pt spandynamic -alternative grouping mm relative tempo -bar header musicalpitch remove time -cadenza in name repeat times -chordmodifiers include notenames scm translator -chords key notes scmfile transpose -clef keysignature paper score type -cm lyrics partial script version -consists maininput penalty shape) +verb(accepts duration midi relative textscript +alternative font mm remove time +bar grouping musicalpitch repeat times +cadenza header name scm translator +chordmodifiers in notenames scmfile transpose +chords include notes score type +clef key paper script version +cm keysignature partial shape +consists lyrics penalty skip +consistsend maininput property spanrequest +context mark pt tempo) The right hand side of an identifier assignment is parsed completely when the assignment is made. It therefore must have any context @@ -493,7 +472,37 @@ mudela(fragment,verbatim,center)( R1*3 c'1 d' ) + +subsect(Automatic Beam Generation) +label(autobeam) + +By default, Lilypond will generate beams automatically. This feature can be +disabled by setting the code(Voice.beamAuto) property to 0. It can be +overridden for specific cases by specifying explicit beams as +described in Section ref(manualbeam). + +In order to decide how to generate beams, Lilypond uses a large number +of Voice properties, whose default values appear in +file(auto-beam-settings.ly). In general, beams can begin anywhere, +but their ending location is significant. Beams can end on a beat, or +at durations specified by the code(Voice.beamAutoEnd) property. To +end beams every quarter note, for example, you could use set +code(Voice.beamAutoEnd) equal to code("1/4"). To end beams every +three eighth notes you would set it to code("3/8"). The same syntax +can be used to specify beam starting points using code(Voice.beamAutoBegin). + +To allow different settings for different time signatures, these +property names can start with code(time)var(N)code(_)var(M) to +restrict the definition to var(N)code(/)code(M) time. So for example, +to specify beams ending only for 6/8 time you would use the property +code(Voice.time6_8beamAutoEnd). To allow different endings for notes +of different durations, the duration can be tacked onto the end of the +property. To specify beam endings for beams that contain 32nd notes, +you would use code(Voice.beamAutoEnd_32). + + subsect(Note Spanners: Beams, Slurs and Ties) +label(manualbeam) A beam is specified by surrounding the beamed notes with brackets code([) and code(]). @@ -545,6 +554,7 @@ mudela(fragment,verbatim,center)( ) + subsect(Note Ornaments) A variety of symbols can appear above and below notes to indicate @@ -596,13 +606,13 @@ mudela()( c''4-^_"c-\\^{ }" s4 } \paper { linewidth = 12.\cm; }}) -Dynamic marks are specified by using an identifier after a note -without a dash: code(c4 \ff). Note that this syntax is inconsistent -with the syntax for other types of ornaments. The available dynamic -marks are: code(\pppppp), code(\ppppp), code (\pppp), code(\ppp), code(\pp), -code(\p), code(\mp), code(\mf), code(\f), code(\ff), code(\fff), -code(\ffff), code(\fffff), code(\ffffff), -code(\fp), code(sf), code(\sff), code(\sp), code(\spp), (\sfz) and code (\rfz). +Dynamic marks are specified by using an identifier after a note without a dash: +code(c4 \ff). Note that this syntax is inconsistent with the syntax for other +types of ornaments. The available dynamic marks are: code(\pppppp), +code(\ppppp), code(\pppp), code(\ppp), code(\pp), code(\p), code(\mp), +code(\mf), code(\f), code(\ff), code(\fff), code(\ffff), code(\fffff), +code(\ffffff), code(\fp), code(\sf), code(\sff), code(\sp), code(\spp), +code(\sfz) and code(\rfz). A crescendo mark is started with code(\cr) and terminated with code(\rc). A decrescendo mark is started with code(\decr) and @@ -691,7 +701,7 @@ determine the first note of the next chord. But other notes within the second chord are determined by looking at the immediately preceeding note. mudela(fragment,verbatim,center)( -\relative c' { +\relative c' { c } ) @@ -888,7 +898,8 @@ Because LilyPond knows the durations of all musical elements, the time signature enables LilyPond to draw bar lines automatically. The time signature is specified with the code(\time) keyword: code(\time 3/4). If no time signature is given, LilyPond assumes 4/4. The automatic -generation of bar lines can toggled with the code(\cadenza) keyword, +generation of bar lines can toggled with the code(\cadenza) keyword or the +code(Staff.barNonAuto) property, and an incomplete measure at the start of the music can be created using the code(\partial) keyword: code(\partial 8*2;) creates a starting measure lasting two eighth notes. @@ -976,27 +987,30 @@ END OF COMMENT ) sect(Repeats) - -OUTDATED. FIXME - In order to specify repeats, use the code(\repeat) keyword. By default, repeats are printed with repeat symbols. mudela(fragment,verbatim,center)( c'1 -\repeat 2 { c'4 d' e' f' } -\repeat 2 { f' e' d' c' }) +\repeat semi 2 { c'4 d' e' f' } +\repeat semi 2 { f' e' d' c' }) In order to specify alternate endings, use the code(\alternative) keyword. mudela(fragment,verbatim,center)( c'1 -\repeat 2 {c'4 d' e' f'} +\repeat semi 2 {c'4 d' e' f'} +\alternative { {d'2 d'} {f' f} }) +The code(semi) specifies that normal repeats will be printed. If +code(fold) is used instead then the alternatives will be stacked: +mudela(fragment,verbatim,center)( +c'1 +\repeat fold 2 {c'4 d' e' f'} \alternative { {d'2 d'} {f' f} }) When the repeats involve partial measures, it will be necessary to use code(\partial) keywords in a somewhat unexpected way to indicate some measure lengths. mudela(fragment,verbatim)( \context Staff { \relative c'{ - \repeat 2 { \partial 4; e | c2 d2 | e2 f2 | } + \repeat semi 2 { \partial 4; e | c2 d2 | e2 f2 | } \alternative { { g4 g g } {\partial 1; a a a a | b1 } } }}) Repeats can be unfolded by setting the property Staff.unfoldRepeats. @@ -1008,7 +1022,7 @@ first alternative is assumed to be repeated enough to equal to specified number of repeats. mudela(fragment,verbatim)( \context Staff { \relative c'{ - \repeat 3 { \partial 4; e | c2 d2 | e2 f2 | } + \repeat semi 3 { \partial 4; e | c2 d2 | e2 f2 | } \alternative { { g4 g g } {\partial 1; e4 e e } {\partial 1; a a a a | b1 } } }}) @@ -1056,8 +1070,8 @@ has no effect on the MIDI output. dit(code(\cadenza) var(togglevalue)code(;)) Toggles the automatic generation of bar lines. If var(togglevalue) is 0 then bar line generation is -turne off. If var(togglevalue) is 1 then a bar is immediately -printed and bar generation is turned on. +turned off. If var(togglevalue) is 1 then a bar is immediately +printed and bar generation is turned on. dit(code(\clef) var(clefname)code(;)) Allowed only in music. Sets the current clef. The argument is @@ -1106,6 +1120,16 @@ code(\translator) block. It specifies that an engraver or performer named var(string) should be added to the translator. See Section ref(translators). +dit(code(\consistsend) var(string)code(;)) Unknown function. + +dit(code(\context) var(contexttype) [code(=) var(contextname)] +var(music) or code(\context) var(translatortype)code(;)) The first +variant is used only within music to create an instance of a +context. The new context can optionally be given a name. The +specified var(music) is processed in the new context. The second +variant appears within a code(\translator) block and specifies the +type of translator being created. + dit(code(\duration) code({) var(length) var(dotcount) code(})) Specify note duration. The parameter var(length) is the negative logarithm (base 2) of duration: 1 is a half note, 2 is a quarter note, 3 is an eighth @@ -1202,7 +1226,7 @@ the music lasts only for the specified duration. Use also to specify the duration of the first measure of the argument to code(\alternative). -dit(code(\penalty) code(=) var(int)code(;)) Allowed only in music. +dit(code(\penalty) var(int)code(;)) Allowed only in music. Discourage or encourage line breaks. See identifiers code(\break) and code(\nobreak) in Section ref(ident). @@ -1227,10 +1251,12 @@ dit(code(\remove) var(string)code(;)) Can appear only in a code(\translator) block. Specifies that a performer or engraver named var(string) should be removed. See Section ref(translators). -dit(code(\repeat) var(count) code({) var(music) code(})) +dit(code(\repeat) var(style) var(count) code({) var(music) code(})) Repeats the specified music var(count) times. Alternative endings can be specified by adding a -code(\alternative) keyword after the code(\repeat). +code(\alternative) keyword after the code(\repeat). The var(style) +parameter should be either code(semi), for regular repeats, or +code(fold) for repeats displayed vertically. dit(code(\scm) var(scheme)code(;)) Embeds specified Scheme code. @@ -1266,22 +1292,13 @@ var(duration). A gap will be left for the skipped time with no notes printed. It works in Note Mode or Lyrics Mode (but generates a mysterious error in lyrics). -OBSOLETE - -dit(code(\spandynamic) code({) var(kind) var(toggle) code(})) Internal -keyword for crescendo and decrescendo symbols. The first parameter -var(kind) is set to 1 for a crescendo and -1 for a decrescendo. The -second parameter is set to 1 to start the mark and 2 to stop it. -Users should use the abbreviations which are defined in the +dit(code(\spanrequest) var(startstop) var(type)). Define a spanning request +var(startstop) is either -1 (code(\start)) or 1 (code(\stop)). The var(type) +parameter is a string that describes what should be started. Supported types +are "crescendo", "decrescendo", "beam", "slur". This is an internal command. +Users should use the abbreviations which are defined in the initialization file file(dynamic.ly). -FIXME: - -code(\spanrequest) var(startstop) var(type). Define a -spanning request var(startstop) is either -1 (start) or 1 -(stop). var(type) is a string that describes what should be started. -Supported types are "crescendo", "decrescendo", "beam", "slur". - dit(code(\tempo) var(duration) = var(perminute)code(;)) Used within code(\midi) or within music to specify the tempo. For example, `code(\midi { \tempo 4 = 76;})' requests output with 76 quarter notes @@ -1289,6 +1306,9 @@ per minute. Note that if the music contains several tempo commands, only the last one is used to set the tempo for the entire MIDI output. COMMENT(Is this true?) +dit(code(\textscript) var(text) var(style)) Print the specified text as a +script in the specified style. + dit(code(\time) var(numerator)code(/)var(denominator)code(;)) Change the time signature. The default time signature is 4/4. @@ -1315,13 +1335,8 @@ and if it appears inside code(\relative), then any notes specified for transposition should be specified inside another code(\relative). See Section ref(transpose). -dit(code(\context) var(contexttype) [code(=) var(contextname)] -var(music) or code(\context) var(translatortype)code(;)) The first -variant is used only within music to create an instance of a -context. The new context can optionally be given a name. The -specified var(music) is processed in the new context. The second -variant appears within a code(\translator) block and specifies the -type of translator being created. +dit(code(\type) var(string)code(;)) Use inside code(\translator) to +specify the type of the translator. dit(code(\version) var(string)) Specify the version of Mudela that a file was written for. The argument is the version number, for example @@ -1423,10 +1438,6 @@ when using code(\property) in Lyrics mode. Because of the way strings are parsed, either put quotes around the arguments to code(\property) or be sure to leave a space on both sides of the dot. -GONE dit(code(textalignment)) Controls alignment of lyrics. Set to code(\left) -to align the left end of the lyric with the note; set to code(\right) to -align the right end of the lyric with the note. Set to code(\center) to -align the center of the lyric with the note. ) @@ -1434,6 +1445,22 @@ subsubsubsect(Voice properties) description( +dit(code(stemLeftBeamCount)) Specify the number of beams to draw on +the left side of the next note. + +dit(code(stemRightBeamCount)) Specify the number of beams to draw on +the right side of the next note. + +dit(code(beamAuto)) If set to 1 then beams are generated +automatically. If set to zero then no beams will be automatically +generated. The default value is 1. + +dit(code(beamAutoEnd)) Specifies when automatically generated beams +can end. See Section ref(autobeam). + +dit(code(beamAutoBegin)) Specifies when automatically generated beams +can start. See Section ref(autobeam). + dit(code(textEmptyDimension)) If set to 1 then text placed above or below the staff is assumed to have zero width. @@ -1477,7 +1504,7 @@ the number of half-steps to transpose by. dit(code(oldTieBehavior)) Set to 1 in order to get old tie behavior where ties would connect unequal pitches. -dit(code(ydirection)) Determines the direction of stems, subscripts, +dit(code(verticalDirection)) Determines the direction of stems, subscripts, beams, slurs, and ties. Set to code(\down) to force them down, code(\up) to force them up, or code(\free) to let LilyPond decide. This can be used to distinguish between voices on the same staff. The @@ -1485,12 +1512,12 @@ code(\stemdown), code(\stemup), and code(\stemboth) identifiers set this property. See also the identifiers code(\voiceone), code(\voicetwo), code(\voicethree) and code(\voicefour). -dit(code(slurydirection)) Set to code(\free) for free choice of slur +dit(code(slurVerticalDirection)) Set to code(\free) for free choice of slur direction, set to code(\up) to force slurs up, set to code(\down) to force slurs down. The shorthands code(\slurup), code(\slurdown), and code(\slurboth) are available. -dit(code(tieydirection)) Set to code(\free) for free choice of tie +dit(code(tieVerticalDirection)) Set to code(\free) for free choice of tie direction, set to code(\up) to force ties up, set to code(\down) to force ties down. @@ -1498,19 +1525,17 @@ dit(code(slurdash)) Set to 0 for normal slurs, 1 for dotted slurs, and a larger value for dashed slurs. Identifiers code(\slurnormal) and code(\slurdotted) are predefined to set the first two settings. -dit(code(hshift)) Set to 1 to enable LilyPond to shift notes +dit(code(horizontalNoteShift)) Set to 1 to enable LilyPond to shift notes horizontally if they collide with other notes. This is useful when typesetting many voices on one staff. The identifier code(\shift) is -defined to enable this. +defined to enable this. If there are several voices, every voice must +have a distinct value of this property or no shifting will occur. dit(code(dynamicDir)) Determines location of dynamic marks. Set to code(\up) to print marks above the staff; set to code(\down) to print marks below the staff. -GONE dit(code(textalignment)) Controls alignment of superscripted and -subscripted text. Set to \left to align the left end of the text with -the note; set to \right to align the right end of the text with the -note. Set to \center to align the center of the text with the note. +dit(code(dynamicStyle)) Set the text style for dynamics. dit(code(textStyle)) Set the text style for superscripts and subscripts. See above for list of text styles. @@ -1553,6 +1578,39 @@ subsubsubsect(Staff properties) description( +dit(code(createInitdefaultClef)) Specify whether clefs are created on +default? (Doesn't seem to do anything.) + +dit(code(barNumberDirection)) Set to code(\up) or code(\down) to put +bar numbers above or below the staff. + +dit(code(barNumberHangOnClef)) Set to 1 to cause bar numbers to appear +above or below the clef instead of on the bar line. + +dit(code(barNumberScriptPadding)) Sets extra space between the bar +number and the bar it labels. + +dit(code(markHangOnClef)) Set to 1 to cause marks to appear by clefs +instead of by bar lines. + +dit(code(marginDirection)) Set to code(\left) or code(\right) to +specify location of marginal scripts. + +dit(code(marginScriptPadding)) Specify extra space for marginal scripts. + +dit(code(forgetAccidentals)) Causes accidentals to be printed at every +note instead of remembered for the duration of a measure. + +dit(code(noResetKey)) Do not reset the key at the start of a measure. +Accidentals will be printed only once and are in effect until +overridden, possibly many measures later. + +dit(code(staffLineLeading)) Specifies the distance (in points) between lines +of the staff. + +dit(code(postBreakPadding)) Extra space in points to be added after +the clef, time signature and key signature on the staff. + dit(code(barAtLineStart)) Set to 1 to produce a bar line after the clef at the start of each line (but not at the beginning of the music). @@ -1570,6 +1628,9 @@ than the music given in an code(\alternative). dit(code(barNonAuto)) If set to 1 then bar lines will not be printed automatically; they must be explicitly created with code(\bar) keywords. +Unlike with the code(\cadenza) keyword, measures are still counted. Bar +generation will resume according to that count if this property is set to +zero. dit(code(defaultClef)) Determines the default clef. See code(\clef) keyword. @@ -1656,6 +1717,10 @@ subsubsubsect(GrandStaff properties) description( +dit(code(alignmentReference)) Set to code(\center) for vertical +alignment reference point to be in the center of the vertical group. +Set to code(\up) to put the reference point at the top of the group. + dit(code(maxVerticalAlign)) Set the maximum vertical distance between staffs. @@ -1766,25 +1831,25 @@ dit(code(\sf)) Print a subito-forte symbol on preceeding note. dit(code(\sff)) Print a subito-fortissimo symbol on preceeding note. dit(code(\sfz)) Print a sforzato symbol on preceeding note. dit(code(\shiftoff)) Disable horizontal shifting of note heads that collide. -Sets the Voice.hshift property. +Sets the Voice.horizontalNoteShift property. dit(code(\shifton)) Enable note heads that collide with other note heads -to be shifted horiztonally. Sets the Voice.hshift property. +to be shifted horiztonally. Sets the Voice.horizontalNoteShift property. dit(code(\slurboth)) Allow slurs to be above or below notes. This -sets the Voice.slurydirection property. +sets the Voice.slurVerticalDirection property. dit(code(\slurdown)) Force slurs to be below notes. This sets the -Voice.slurydirection property. +Voice.slurVerticalDirection property. dit(code(\slurup)) Force slurs to be above notes. This sets the -Voice.slurydirection property. +Voice.slurVerticalDirection property. dit(code(\sp)) Print a subito-piano symbol on preceeding note. dit(code(\spp)) Print a subito-forte symbol on preceeding note. dit(code(\specialkey)) Allow keys signatures do differ in different octaves. This sets the Staff.keyoctaviation property. dit(code(\stemboth)) Allow stems, beams, and slurs to point either -direction. This sets the Voice.ydirection property. +direction. This sets the Voice.verticalDirection property. dit(code(\stemdown)) Force stems, beams, and slurs to point down. -This sets the Voice.ydirection property. +This sets the Voice.verticalDirection property. dit(code(\stemup)) Force stems, beams and slurs to point up. This -sets the Voice.ydirection property. +sets the Voice.verticalDirection property. dit(code(\traditional)) Used for setting the Score.beamquantisation property. Is equal to 2. dit(code(\up)) Used for setting various direction properties. Is @@ -1879,6 +1944,7 @@ majority selection is used. If set to 3.0, then mean selection is used based on the mean center distance. If set to 4.0 then median selection is used, based on the median center distance. dit(code(castingalgorithm)) +dit(code(crescendo_shorten)) dit(code(forced_stem_shorten)) Stems that have been forced to go the unnatural direction are shortened by this amount. Equal to dit(code(forced_stem_shorten0)) @@ -1926,7 +1992,7 @@ dit(code(tie_x_minimum)) subsect(MIDI Instrument Names) label(midilist) -The MIDI instrument name is set by the code(Staff."midiInstrument") +The MIDI instrument name is set by the code(Staff.midiInstrument) property or, if that property is not set, the code(Staff.instrument) property. The instrument name should be chosen from this list. If string does not exactly match one from this list then LilyPond uses diff --git a/Documentation/topdocs/AUTHORS.yo b/Documentation/topdocs/AUTHORS.yo index 844103c86f..5594db317c 100644 --- a/Documentation/topdocs/AUTHORS.yo +++ b/Documentation/topdocs/AUTHORS.yo @@ -22,6 +22,8 @@ it()nemail(Neil Jerram)(nj104@cus.cam.ac.uk). parts of Documentation/Vocab* it()Donald Ervin Knuth, lurl(http://www-cs-staff.stanford.edu/~knuth/) mf/ital-*.mf (these were taken from the CM fonts) +it()nemail(Michael Krause)(m.krause@tu-harburg.de), + breathing signs it()nemail(Werner Lemberg)(xlwy01@uxp1.hrz.uni-dortmund.de), misc bugfixes, some Beam and Stem code. it()nemail(David R. Linn)(drl@vuse.vanderbilt.edu), diff --git a/Documentation/topinfo.yo b/Documentation/topinfo.yo index 88f16caa22..9e0980fcae 100644 --- a/Documentation/topinfo.yo +++ b/Documentation/topinfo.yo @@ -21,6 +21,7 @@ redef(htmlbodyopt)(2)() COMMENT(redef(includefile)(1)(INCLUDEFILE(man/ARG1))) includefile(programs.yo) +nodeprefix() redef(article)(3)(nodeprefix()chapter(ARG1)nodeprefix(Tutorial )) COMMENT(yodl2texinfo should be able to cope now, although ugly...) redef(article)(3)(chapter(ARG1)) @@ -39,9 +40,15 @@ redef(article)(3)(nodeprefix()chapter(ARG1)nodeprefix(Mutopia )) COMMENT(yodl2texinfo should be able to cope now, although ugly...) redef(article)(3)(chapter(ARG1)) +COMMENT( + +dropped? --jcn + redef(includefile)(1)(INCLUDEFILE(ARG1)) includefile(mutopia.yo) +) + nchapter(Concept Index) COMMENT( urg makeindex()) printindex() diff --git a/NEWS b/NEWS index 291186ca29..d96fac1137 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,38 @@ +pl 49.mb1 + - bf: ly2dvi -N + - Added dynamicPadding property (applies only to dynamic marks, + not (de)crescendi. + +pl 49.jcn4 + - resurrected gnossienne-4 + - Documentation fixes (for texinfo get yodl-1.31.13, tbr) + - minor abc2ly fixes; successfully converted some simple abc files from + http://faeryland.tamu-commerce.edu/joyce/ + - www.mail-archive.COM + +pl 49.jcn1 + - guile scm_gc_mark () workaround: + - via scm output wrapper buildscripts/lilypond.sh, set: + PATH=$LILYPONDPREFIX/buildscripts/out:$PATH + - scm output fixes + +pl 48.hwn2 + - bf: rest-collisions. + - cleaned up standchen + - bf: slur dims. + - bf: unfold without enough alternatives. + - Use Lily version for \version. + + pl 49.uu1 - - ran purify. Fixed some small problems + - ran purify. Fixed some small problems, plugged some leaks. + - bf: linebreak at |: + - doc updates by Adrian Mariano +pl 49-rst + - Breathing signs by Michael Krause + +************ pl 48.hwn1 - \property hshift -> \property horizontalNoteShift (mudela 1.0.21) diff --git a/TODO b/TODO index 3ad59da047..c59decc257 100644 --- a/TODO +++ b/TODO @@ -9,46 +9,10 @@ Most of the items are marked in the code as well Grep for TODO and ugh/ugr/urg. .* BUGS -. * junk separate mudela versioning. . * indent = 0.0 with linewidth=-1.0 . * PostScript . * header for PS enteredby = "bla " . * ps/lily.ps see comments. -. * By the way, I'm not sure the translation of 'C, G, and F clef' -> should include Alto, Violin, Bass . -[..] - -I understand your point. It should be changed. - - -> -> The terms C-clef, G-clef, F-clef stand for the signs, being -> mutated forms of a C, a G and an F. -> -> The terms Violin Clef etc. stand for the signs being used in -> special positions on the staff. -> -> The G-clef-sign indicates g' on the line around which the -> snake centers. It is a Violin Clef if it is centered around the -> second line (from below), and a French Violin Clef if it is -> centered around the lowest. -> -> The C-clef indicates c' on the line that gets -> 'pinched' by it. It is a Soprano, Mezzosoprano (English?), Alto, Tenor -> and (don't remember exactly, maybe Baritone) Clef, depending on -> the line (from highest to lowest). -> -> The F-clef-sign indicates f on the line between -> the two dots. If it's on the second line from above, it is called -> Bass Clef. If it's on the middle line, it is called (maybe -> Baritone) Clef too, because it indicates the same pitches as the -> C-Clef on the highest line. So, you could write an Alto Clef by -> putting the F-clef sign on the lowest line (but that's _very_ -> uncommon). -> -> Sorry, this is written very messy because I'm in a hurry, -> but I hope you understand what I want to say. -> . * didot / big point. . * midi key. . * Repeats @@ -60,11 +24,25 @@ I understand your point. It should be changed. . * kind of 'initial property' iso fold/volta(semi)/unfold strings . * fix singleStaffBracket . * declare performers in \midi +. * input/test/stem-spacing.ly: 12/4 touches first note +4 too high? . * fix MIDI . * \shape 1st dim skipped? . * turn slope-damping on/off . * We need feta-din*.mf files for more sizes than 10. . * fix dynamics decently, ie. use kerning & ligatures. +. * +BUGS: +> + +> + Causes segfault: +> + +> + \score{ +> + \notes{ \context Voice { +> + \repeat fold 2 { a b c d } {} +> + } +> + } +> + } +> + . * dots & rest collisions? . * mudela-book.py . * fix \mudelafile{} to have decent functionality @@ -74,18 +52,8 @@ this fragment is floating eps, than 1, otherwise 2). say preMudelaExample[eps]{}, and change it in document body sometimes. . * use less RE's . * slurs colllide with lyrics. -. * Is there any reasonable way to do this: I would like to have one file -that can generate the same tune in two different modes without having -to go through and rewrite all the music in the other mode. - -Lyrics and scripts collide. -. * Phrasing: Indicating the textual underlay of a piece, or -otherwise dividing a piece into phrases. - -There are distinct ways of specifying the first two (although at -present, they're not properly distinguished) but no distinct way to -specify the third. Should there be? -. * rest collision minimum dist. +. * junk _ in lyric mode for " " +. * Lyrics and scripts collide. . * a note with a circle after it, meaning: note + circle = note + 1/4 of its length @@ -96,14 +64,16 @@ specify the third. Should there be? possible with lily? . * tuplets that are written as "number : note", for example "3 : [image of a half note here]". possible? -. * repeat engraver, gallina.ly . * Matanya's tips: +. * don't shorten stems/staffs closer to each other. . * accidentals closer to note head . * to space the staffs/staffgroups contained in the score. . * heavier beams? .* Cleanups needed +. * \$ and $ identifier syntax. +. * Y dimension units: staffspace vs. Point . * Beam . * Stem . * Slur @@ -139,7 +109,6 @@ specify the third. Should there be? . * Abstraction for engravers: . * make "in-between" engraver (Tie, Extender) . * make wide_spanner_engraver (line_group_spanner, staff_symbol) -. * remove Interval dim_ from Dimension_cache and rename the struct. . * do scaled fonts generally . * The Lilypond accidental symbols are available through the TeX macros, \textflat, \textsharp and \textnatural defined in the init file @@ -148,14 +117,11 @@ where XX corresponds to the size. I don't know where (or even if) they are installed but they are generated in the mf/out/ directory during the compilation. . * make dependencies () a virtual function. -. * one big ly2dvi input that includes *all* tests. . * store req -> element, element -> element causes for warnings . * include examples in RPM. . * fix partial measures in meaningful way. -. * add scripts to bars eg. |^"bla" . * relative mode for mi2mu . * uniformise recent feta contributions. -. * use SCM and Molecules for {accordeon stuff, } . * bigger and fatter 4/4 C . * sort out directory stuff. . * --prefix option? @@ -167,11 +133,6 @@ compilation. . * do --safe for PS output? . * convert-mudela --output . * Staff_margin (with a partial measure.) -. * fix pletvisibility properties: -. * bracket on/off/no-bracket-when-beam -. * num on/off/no-num-when-beam -. * fix: standchen. -. * junk text{sharp,flat,etc} . * fix convert-mudela manpage . * decimal point in \paper {} . * { \voiceone [g''8 fis'' e''] d''4 |} @@ -182,7 +143,6 @@ compilation. . * scm-ify \property values. . * move class Lookup {} into scm . * msgfmt -o check? -. * \breathmark TeX macro . * add new glyphs to font.ly . * formatting of input stuff. . * \notes{ a \< b \cr } vs \notes{ a \< b \! } @@ -203,6 +163,38 @@ compilation. .* STUFF . * compulsory hshift +. * +My wish list for lyrics. I dream of a time when I will have enough time to +become familiar enough with the source code to be able to implement some of +these myself, but I don't know when that will be, so I thought I'd "publish" +my suggestions in case someone else is in a position to give them some +priority. Otherwise, perhaps they could go on the todo list? + +If any of these are already implemented, please let me what the syntax is to +use them! + +1. Stanza numbering. Numbering at the beginning of a song with the number +set to the left of the first note. It would also be nice (but not as +important) to be able to have some form of automatic numbering at the +beginning of each new line. This would make it easier to follow songs with a +large number of stanzas. + +2. Hyphens between syllables. At the moment there appears to be no easy way +to position a hyphen mid-way between the syllables it breaks. + +3. Notes centred above/below lyrics rather than left-aligned. + +4. It would be very nice to be able to build some kind of phrasing into the +lyrics of hymns, etc, so that the first words of a phrase are left aligned +with each other, the last words are right aligned, and the words in between +are centred. + +5. In a song, with (say) four stanzas and a chorus, it would be nice to be +able to vertically align the chorus midway between the staves. + +6. It would be nice to be able to put vertical brackets either side of a +repeated section with different words for each repeat. + . * Give # lines in linebreaking. . * arrows on slurs. . * rewrite context defs using Scheme @@ -251,9 +243,9 @@ compilation. . * add mudela-book-doc source to webstie. . * Rethink Time_description \cadenza , \meter, \grouping should all be \properties +. * fix singleStaffBracket . * rename . * measure -> bar -. * abbrev -> tremolo . * abbreviation-beam -> (measured/unmeasured) tremolo . * partial -> anacrouse . * robustify Beam (in case of no stems, 32nd notes) @@ -298,6 +290,16 @@ touching it. small sizes. .* 3RD PARTY BUGS +. * UMR: Uninitialized memory read + This is occurring while in: + qst [qsort.c] + qsort [libc.so.1] + Keyword_table::Keyword_table(Keyword_ent*) [keyword.cc:28] + My_lily_lexer::My_lily_lexer() [my-lily-lexer.cc:78] + My_lily_parser::parse_file(String,String) [my-lily-parser.cc:54] + do_one_file(String,String) [scores.cc:124] + Reading 4 bytes from 0xefffeca8 on the stack. + Address 0xefffeca8 is 728 bytes below frame pointer in function . * GNU diff 2.7: diff -rN does not see a new directory with empty file . * mf-to-table -> add space before ; in AFM output. (-> check AFM spec. Is this a bug in afm2tfm?) @@ -490,16 +492,15 @@ hesitate to ask. . * specify number of lines .* INPUTLANGUAGE -. * \rhythms 4 16 16 16 16; c c c c c -> c4 c16 etc. +. * \rhythms 4 16 16 16 16; c c c c c -> c4 c16 etc. +. * convention for slurs vs. phrasing marks. . * Language: . * \translator -> ? . * fix \partial . * \bla {} vs \bla ; . * mix engraver hacking with music ? . * \once\property KEY = VAL -. * \addtranslator, \removetranslator -. * junk ^ and _ for scripts -. * junk _ for lyrics. +. * input property . * abstract grammar. . * Figure out semicolons. . * c4 4 4 4 for c4 c4 c4 c4? @@ -529,8 +530,6 @@ hesitate to ask. . * lyric in staff (sharpsharp in staff, text below) -. * half sharps/flats - . * write Dynamic_line (to group dynamics horizontally) . * use Real for all y positions. @@ -543,8 +542,6 @@ hesitate to ask. . * midi esp.: use I32 iso int where 32 bits are needed (or assumed...) -. * stafftypes: voice names/ instrument names. - . * lily \tempo . * % toe to bheel four to five @@ -556,11 +553,8 @@ hesitate to ask. (where "to" is a tiny bow) . * auxilliary file for caching info. - . * Text_crescendo -. * revise calcideal - .* IDEAS . * Output data structures of Mudela in XML/SGML. . * create libmudela, or liblily_frontend @@ -568,104 +562,6 @@ hesitate to ask. . * Spacing_request for manually adjusting spacing . * caching breakpoints . * used fixedpoint arithmetic for min. energy. -. * move towards incremental algorithms. -. * versioning stuff (cvt mudela, mudela, etc.) -. * dynamic loading of engravers? -.* SMOBS -Han-Wen Nienhuys writes: - -> class Foo_class { -> Foo_smob *smob_ptr_; -> } -> -> struct Foo_smob { -> Foo_class *class_ptr_ -> } - -Usually you can get away without having this interlinked structure. -One piece of information you need when exporting objects to scheme is -the smob tag for your class. You might store this value (a long) into -a class static variable, or a file static variable. I'll use a class -static variable in this example. - -I typically use code that works like this (untested code ahead): - -class Foo_class { - static long *Foo_smob_tag; - SCM obj; // representation as a scheme object, description comes later -} - -// call this once on startup -void init_Foo_class { - static scm_smobfuns type_rec; - - type_rec.mark = foo_mark; - type_rec.free = foo_free; - type_rec.print = foo_display; - type_rec.equalp = 0; - Foo_class::Foo_smob_tag = new int(scm_new_smob(type_rec)); -} - -When you want to export an object to scheme, you put a pointer to the -object itself in the cdr of the cell, and the tag in the car of the -cell. The code looks like this: - -// Is this a Foo? -static int -foo_p(SCM obj) -{ - return(SCM_NIMP(obj) && SCM_CAR(obj) == Foo_class::Foo_smob_tag); -} - -// given a Scheme representation, return, a C++ representation -static Foo_class * -foo_unbox(SCM obj) -{ - return((Foo_class*)SCM_CDR(obj)); -} - -// the SCM representation of the object is stored inside itself -// this will become useful when destructor gets called -static SCM -foo_box(Foo_class *foo) -{ - SCM_DEFER_INTS; - SCM_NEWCELL(foo->obj); - SCM_SETCAR(foo->obj, Foo_class::Foo_smob_tag); - SCM_SETCDR(foo->obj, (SCM)foo); - SCM_ALLOW_INTS; - return foo->obj; -} - -> C++ determines life time, so what is the strategy? - -What happens now when the destructor gets called? Lets set the cdr to -NULL, and then check for that in all of the primitive functions that -use your smob. We'll call this notion 'live'; a scheme object is -'live' if the C++ representation still exists, it's dead if the C++ -object is gone. You can still have references to dead objects in -scheme code; it's just an error to use them. This idea is stolen from -Emacs's handling of buffers ('buffer-live-p' and friends). - -Add another function, foo_live_p: - -static int -foo_live_p(SCM obj) -{ - return(foo_p(obj) && SCM_CDR(obj) != NULL); -} - -In you destructor, you need to do: - -~Foo_class() -{ - SCM_CDR(this->obj, NULL); -} - -When writing new primitives, now just check foo_live_p(). - -I hope the above helps, - * OUTLINE SETUP .* .EMACS diff --git a/VERSION b/VERSION index 12a299d774..0e7b01172e 100644 --- a/VERSION +++ b/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=1 -PATCH_LEVEL=49 -MY_PATCH_LEVEL=uu1 +PATCH_LEVEL=50 +MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/buildscripts/lilypond.sh b/buildscripts/lilypond.sh new file mode 100644 index 0000000000..e3d8e70b63 --- /dev/null +++ b/buildscripts/lilypond.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# via scm wrapper + +foo=lilypond.$$ +trap "rm $foo" 1 2 15 +touch lilypond.$$ + +$LILYPONDPREFIX/lily/out/lilypond -f scm $* +scm=`find . -maxdepth 1 -cnewer $foo -and -name '*.scm'` +for i in $scm; do + dir=`dirname $i` + base=`basename $i .scm` + file=$dir/$base.tex + rm -f $file + guile -s $i > $file +done +rm -f $scm +rm $foo diff --git a/input/bugs/rep.ly b/input/bugs/rep.ly index b829282123..a6739d325e 100644 --- a/input/bugs/rep.ly +++ b/input/bugs/rep.ly @@ -4,7 +4,7 @@ c4 d e f \repeat semi 3 { g a b c } \alternative { { c b a g } { f e d c } } c c c c - \alternative { { c b a g } { f e d c } { c d e f } } +% \alternative { { c b a g } { f e d c } { c d e f } } g g g g \repeat semi 2 { c c c c } \repeat semi 2 { c c c c } diff --git a/input/bugs/threads.ly b/input/bugs/threads.ly new file mode 100644 index 0000000000..845fea6b6b --- /dev/null +++ b/input/bugs/threads.ly @@ -0,0 +1,201 @@ +%K1 +rh = {\property Thread.noteHeadStyle = ""} +lh = {\property Thread.noteHeadStyle = "diamond"} +\score { +\notes { +\context Staff = staffOne < +\property Staff.numberOfStaffLines = "11" +%\property Staff.timeSignatureStyle = "C" +\keysignature bes; +\time 4/4; +\clef alto; +\context ThreadedVoice = vOne < +\context Thread=tOne{ +\stemup \slurup +%1 +\rh [d''16 e'' f'' g''][a'' a' cis'' a'] d''4. e''8| +%2 +[f''16 d'' g'' e''][a'' f'' e'' d''][cis''8 a''] a''4^\prall~ +%3 +[a''16 g'' f'' e''][d'' c'' bes' a'][bes'8 \lh g''] g''4^\prall~ +%4 +[g''16 f'' e'' d''][c'' bes' a' g'][a'8 \rh f''] f''4^\prall~ +%5 +[f''16 e'' d'' c''][bes' a' g' f'][g'8 \lh e''] e''4^\prall~ +%6 +[e''16 d'' cis'' b'][a' g' f' \rh e'] [f' d' g' e'][a' f' e' d']| +%7 +[cis'16 a d' b][e' cis' f' d'][g' e' a' f'][b' g' cis'' a']| +%8 +[d''16 b' e'' cis''][f'' d'' g'' e''] a''4 g''^\prall| +%9 +\lh a''4 g''^\prall \rh a'' g''^\prall| +%10 +[f''16 d'' g'' e''][a'' f'' e'' d''] [cis'' a' d'' b'][e'' g' f' e']| +%11 +[f'16 d' g' e'][a' f' e' d'][cis' a d' b][e' cis' f' d']| +%12 +[g'16 g' f' e'][f'8 g'16^\prall f'32 g'][a'16 e' f' d'][e' cis' \lh f'8]| +%13 +[e'8 d'] cis'16 s8. s2 \bar "||"; +%14 +\rh [a'16 b' cis'' d''][e'' cis'' f'' d''] e''4. a'8| +%15 +[b'16 g' cis'' a'][d'' b' e'' cis''][fis'' d'' g'' e''][a'' c'' bes' a']| +%16 +[bes'16 g' c'' a'][d'' bes' a' g'][fis' d' g' e'][a' c' bes a]| +%17 +\lh [bes16 g c' a][d' bes e' c'][f' d' g' e'][a' f' bes' g']| +%18 +\rh c''4 bes'^\prall \lh c'' bes'^\prall| +%19 +\rh [c''8 f''][bes' e''][a'16 f' c'' a'][f'' c'' a'' f'']| +%20 +[e''16 g'' c'' e''][g' c'' bes' a'] \lh [bes' g' d'' bes'][g'' d'' bes'' g'']| +%21 +[f''16 a'' d'' f''][a' d'' c'' b'] \rh [c'' a' e'' c''][a'' e'' c''' a'']| +%22 +[gis''16 b'' e'' gis''][b' d'' cis'' b'][cis''8 a''] a''4^\prall^"\\textflat"~ +%23 +[a''16 g'' f'' e''][d'' c'' \lh bes' a'] [bes'8 \rh g''] g''4^\prall~ +%24 +[g''16 f'' e'' d''][c'' bes' \lh a' g'][a'8 \rh f''] f''4^\prall~ +%25 +[f''16 e'' d'' c''][bes' a' \lh g' f'][g'8 \rh e''] e''4^\prall~ +%26 +[e''16 d'' cis'' b'][a' g' f' e'] [f' d' g' e'][a' f' bes' g']| +%27 +\lh [f'16 d' g' e'][a' f' bes' g'] \rh [f' d' g' e'][a' f' bes' g']| +%28 +[a'8 d''][g' cis''] \lh [a' f''][g' e'']| +%29 +\rh [a'8 d''][g' e''][f'16 d' g'16 e'][a' f' b' g']| +%30 +[cis''16 a' d'' e''][f'' d'' e'' cis''][d'' a' bes' g'][a' f' \lh bes'8]| +%31 +[a'8 g'] f'16 s8. s2 \bar "|."; +} +\context Thread=tTwo{ +s1*9| +%10 +d''16 s4.. a'16 s4..| +%11 +d'16 s2...| +s1*3| +%15 +s2 d''16 s4..| +%16 +g'16 s4.. d'16 s4..| +s1*2| +%19 +s8 \rh a'' s g'' s2| +s1*8 +%28 +s8 f'' s e'' s d'' s cis''| +%29 +s8 f'' s cis'' +}> +\context ThreadedVoice = vTwo < +\context Thread=tThree{ +\stemdown \slurdown +%1 +\lh s2 [d'16 e' f' g'][a' a cis' a]| +%2 +[d'8 e' f' g'][a' a' a' a']| +%3 +[a'8 a' a' f'][g \rh bes' bes' bes']| +%4 +[g'8 g' g' e'][f \lh a' f' a']| +%5 +[d'8 f' d' d'][e \rh g' g' g']| +%6 +[e'8 e' e' a] [d' \lh e f g]| +%7 +a8 s [cis' d'][e' f'][g' a']| +%8 +[b'8 cis''][d'' e''][f''16 d'' bes' g'][e'' cis'' a' cis'']| +%9 +\rh [f''16 d'' bes' g'][e'' cis'' a' cis''] \lh [f'' d'' bes' g'][e'' cis'' a' cis'']| +%10 +[d'8 e' f' g'][a b cis' a]| +%11 +[d8 e f g][a b][cis' d']| +%12 +[e16 e' d' cis'][d'8 bes] \stemup a,4 \stemdown s8 \rh [d'16 b]| +%13 +[cis'16 a b gis][a16 e cis e] \lh \stemup a,4^\prall^"\\textnatural" r^\fermata| +%14 +\stemdown s2 [a16 b cis' d'][e' cis' f' d']| +%15 +[g'8 a'][b' cis''][d' e' fis' d']| +%16 +[g8 a bes c'][d e fis d]| +%17 +\rh [g8 a][bes c'][d' e'][f' g']| +%18 +\lh [a'16 f' d' bes][g' e' c' e'] \rh [a' f' d' bes][g' e' c' e']| +%19 +\lh [a'16 f' d' bes][g' e' c' e'][f'8 f f f,]| +%20 +[c8 c' c' fis'] \rh [g' g g g,]| +%21 +[d8 d' d' gis'] \lh [a' a a a,]| +%22 +[e8 e, e, e,][a, a' a' a']| +%23 +[f,8 a' a' f'][\rh g, \lh bes' bes' bes']| +%24 +[e,8 e' g' e'][\rh f, \lh a' a' a']| +%25 +[d,8 f' f' d'][\rh e, \lh g' g' g']| +%26 +[a,8 a e' a] [d' e'][f' g']| +%27 +[d'8 e'][f' g'] \rh [d' e'][f' g']| +%28 +\lh [f'16 d' bes g][e' cis' a cis'] \rh [f' d' bes g][e' cis' a cis']| +%29 +\lh [f'16 d' bes g][e' cis' a cis'][d8 e][f g]| +%30 +[a8 g a a,] \stemup d4 \stemdown s8 \rh [g'16 e']| +%31 +[f'16 d' e' cis'][d'16 a f a] \lh \stemup d4^\prall r4^\fermata| +} +\context Thread=tFour{ +s1*2| +%3 +\lh f'8 f' f' s4 \rh g'8 g' g'| +%4 +e'8 e' e' s4 \lh f'8 a' f'| +%5 +f'8 d' f' s4 \rh e'8 e' e'| +%6 +a8 a a s d s4.| +s1*16| +%23 +\lh s8 f' f' s4 g'8 g' g'| +%24 +s8 g' e' s4 f'8 f' f'| +%25 +s8 d' d' s4 e'8 e' e'| +%26 +s8 e' a s s2| +s1*2| +%29 +s2 d'8 +}> +\context ThreadedVoice = vThree < +\context Thread=tFive{ +\stemdown \slurdown +s1*25| +%26 +\stemup s2 \rh d''4 s| +%27 +\lh d''4 s \rh d''4 +}> +>} +\paper{barsize=50.0; indent=0.0; +\translator {\VoiceContext beamAuto=0; \remove Auto_beam_engraver;} +\translator {\StaffContext \consists Bar_number_engraver;} + \translator {\VoiceContext \remove Tuplet_engraver;} +}} diff --git a/input/bugs/unfold.ly b/input/bugs/unfold.ly index 76ccc3d8cb..be41b7f906 100644 --- a/input/bugs/unfold.ly +++ b/input/bugs/unfold.ly @@ -1,5 +1,5 @@ \score{ \context Staff \notes\relative c'{ - \repeat unfold 4 { g a b c } + \repeat unfold 4 { g a b c }%\alternative {c1 d e f} } } diff --git a/input/test/breathing-sign.ly b/input/test/breathing-sign.ly new file mode 100644 index 0000000000..9cc99442af --- /dev/null +++ b/input/test/breathing-sign.ly @@ -0,0 +1,16 @@ +\version "1.0.21"; + +\score { + \notes \relative c' { + \key es; \time 3/4; + < \context Voice = two { \stemdown es4 bes es } + \context Voice = one { \stemup g4 as g } + > | + < \context Voice = two { \stemdown es4 \breathe bes es } + \context Voice = one { \stemup g4 as g } + > | + es8 d es f g4 \breathe | + es8 d \breathe es f g f | + es2 r4 \bar "||"; + } +} diff --git a/input/test/coda-kludge.ly b/input/test/coda-kludge.ly index b9c09685d8..2dab828183 100644 --- a/input/test/coda-kludge.ly +++ b/input/test/coda-kludge.ly @@ -51,4 +51,4 @@ Hi, } -\version "1.0.16"; +%\version "1.0.16"; diff --git a/input/test/dynamics.fly b/input/test/dynamics.fly index 4b586d5c07..01bbcd6633 100644 --- a/input/test/dynamics.fly +++ b/input/test/dynamics.fly @@ -1,2 +1,3 @@ c''4 \p c \ff c^\ff +\property Voice.dynamicPadding = 10 c \p \< \! c \ff\> c \!c-\p diff --git a/input/test/repeat-semifold.ly b/input/test/repeat-semifold.ly new file mode 100644 index 0000000000..58d03f8cc8 --- /dev/null +++ b/input/test/repeat-semifold.ly @@ -0,0 +1,10 @@ + +% no alts. +\score { \notes\context Staff\relative c'' { +\repeat semi 3 { c^"3$\\times$ 0alt" d } +% less alts than body +\repeat semi 4 { c^"4$\\times$ 2alt" d } \alternative { e f } +% more alts than body +\repeat semi 2 { c^"2$\\times$ 3alt" d } \alternative { e f g } +}} + diff --git a/input/test/repeat-unfold.ly b/input/test/repeat-unfold.ly new file mode 100644 index 0000000000..78c35be450 --- /dev/null +++ b/input/test/repeat-unfold.ly @@ -0,0 +1,9 @@ + +\score { \notes\context Staff\relative c'' { +\repeat unfold 3 { c^"3$\\times$ 0alt" d } +% less alts than body +\repeat unfold 4 { c^"4$\\times$ 2alt" d } \alternative { e f } +% more alts than body +\repeat unfold 2 { c^"2$\\times$ 3alt" d } \alternative { e f g } +}} + diff --git a/input/test/reps.ly b/input/test/reps.ly new file mode 100644 index 0000000000..58d03f8cc8 --- /dev/null +++ b/input/test/reps.ly @@ -0,0 +1,10 @@ + +% no alts. +\score { \notes\context Staff\relative c'' { +\repeat semi 3 { c^"3$\\times$ 0alt" d } +% less alts than body +\repeat semi 4 { c^"4$\\times$ 2alt" d } \alternative { e f } +% more alts than body +\repeat semi 2 { c^"2$\\times$ 3alt" d } \alternative { e f g } +}} + diff --git a/input/test/rest-collision.ly b/input/test/rest-collision.ly index 607f1daf2b..b97610a4ca 100644 --- a/input/test/rest-collision.ly +++ b/input/test/rest-collision.ly @@ -22,9 +22,13 @@ restsII = \context Staff \notes { \stemup \transpose c'' { [c''8 r8 c''8 c''8] [c8 r8 c8 c8] + [c8 r8 r8 c'''8] \stemdown [c8 r8 c8 c8] - [c''8 r8 c''8 c''8] } + [c''8 r8 c''8 c''8] + [c'8 r8 r8 c'''8] + + } } \score{ diff --git a/input/von-guten-maechten.ly b/input/von-guten-maechten.ly new file mode 100644 index 0000000000..a29e3a4690 --- /dev/null +++ b/input/von-guten-maechten.ly @@ -0,0 +1,110 @@ + +\include "paper16.ly" +\include "deutsch.ly" + +melodie = \notes \relative c' { + d2 d4 e f2 f g4 f e d e2 e \breathe | + f d4 e f g a2 b g4 g f2 r2 | + c'2 c4 c a2 d c4 b a g f2 g \breathe | + a d,4 d g2 g f4 d e2 e d2-\fermata \bar "|."; +} + +righthand = \notes \relative c' { + a2 a4 cis4 | d2 d2 | d4 c2 a4 | d4 h cis2 \breathe | + d2 a4 c4 | c4 e f2 | f2 f4 e | c2 r2 | + e4 f g2 | f2 f2 | e4 d f e | d2. e4 \breathe | + f4 d b4 b | d2 d | d4 c d h | cis2 a2 | +} + +lefthand = \notes \relative c { + f2 f4 a | a2 a2 | b4 a g f | a2 a \breathe | + a2 f4 g | a c c2 | d2 c4 c | a2 r2 | + g2 c4 c | c2 b2 | g4 f c' c | a4 b2 cis4 \breathe | + d4 a f f | b2 b | a4 a a2 | a2 fis2 | +} + +pedal = \notes \relative c { + d2 d4 a d2 d g,4 a c d a2 a \breathe | + d2 d4 c f c f2 b,4 g c c f2 r2 | + c4 d e c f2 b, c4 d f c d b a2 \breathe | + d4 c b2 g4 a b2 d2 a a d_\fermata \bar "|."; +} + +\score { + < + \context PianoStaff < + \context Staff = treble < + \notes { \key f; \time 2/2; } + \context Voice = melody { + \stemup \melodie + } + \context Voice = right { + \stemdown \righthand + } + > + \context Staff = bass { + \notes { \key f; \clef "bass"; } + \lefthand + } + > + \context Staff = pedal { + \notes { \key f; \clef "bass"; } + \pedal + } + > + + \header { + title = "Von guten Mächten treu und still umgeben"; + composer = "Satz: Michael Krause 1999 (*1977)"; + enteredby = "Michael Krause"; + copyright = "dunno"; + poet = "Dietrich Bonhoeffer 1944"; + } + + \paper{ +% \paper_sixteen +% linewidth = 18.0 \cm; +% textheight = 28.0 \cm; + indent = 0.0 \mm; + \translator { \OrchestralScoreContext } + } +} + +\score { + \context StaffGroup < + \context Staff = treble < + \notes { \key f; \time 2/2; } + \context Voice = sop { + \stemup \melodie + } + \context Voice = alt { + \stemdown \righthand + } + > + \context Staff = bass < + \notes { \key f; \clef "bass"; } + \context Voice = ten { + \stemup \lefthand + } + \context Voice = bas { + \stemdown \pedal + } + > + > + + \header { + title = "Von guten Mächten treu und still umgeben"; + composer = "Satz: Michael Krause 1999 (*1977)"; + enteredby = "Michael Krause"; + copyright = "dunno"; + poet = "Dietrich Bonhoeffer 1944"; + } + + \paper{ +% \paper_sixteen +% linewidth = 18.0 \cm; +% textheight = 28.0 \cm; + indent = 0.0 \mm; + } +} + diff --git a/lily/audio-item.cc b/lily/audio-item.cc index 36e11807b0..7adf3de060 100644 --- a/lily/audio-item.cc +++ b/lily/audio-item.cc @@ -96,9 +96,6 @@ Audio_text::midi_item_p() return text_str_.length_i() ? new Midi_text(this) : 0; } - - - void Audio_item::do_print () const { diff --git a/lily/bar.cc b/lily/bar.cc index ac4f39243c..dd4e90efb8 100644 --- a/lily/bar.cc +++ b/lily/bar.cc @@ -56,7 +56,7 @@ static char const *bar_breaks[][3] ={ {":|", ":|:", "|:"}, {"|", "|", ""}, {"", "|s", "|"}, - {"", "|:", "|:"}, + {"|", "|:", "|:"}, {"|.", "|.", ""}, {":|", ":|", ""}, {"||", "||", ""}, diff --git a/lily/bow.cc b/lily/bow.cc index 046a95ee98..6553412fa1 100644 --- a/lily/bow.cc +++ b/lily/bow.cc @@ -48,17 +48,13 @@ Bow::do_brew_molecule_p () const } a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT])); - Molecule* mol_p = new Molecule; - mol_p->add_molecule (a); - - return mol_p; + return new Molecule (a); } Offset Bow::center () const { Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]; - Real dx = extent(X_AXIS).length (); return Offset (dx / 2, dy); @@ -76,7 +72,7 @@ Bow::do_height () const Array c (get_controls()); for (int i=0; i < c.size (); i++) { - Real y = c[i][Y_AXIS]; + Real y = c[i][Y_AXIS] + dy_f_drul_[LEFT]; iv.unite (Interval (y,y)); } return iv; diff --git a/lily/breathing-sign-engraver.cc b/lily/breathing-sign-engraver.cc new file mode 100644 index 0000000000..d7a1a05d11 --- /dev/null +++ b/lily/breathing-sign-engraver.cc @@ -0,0 +1,72 @@ +/* + breathing_sign-engraver.cc -- implement Breathing_sign_engraver + + Copyright (C) 1999 Michael Krause + + written for the GNU LilyPond music typesetter + +TODO: + + . Cancel any beams running through the breathing sign + ([e8 \breathe f e f] should become [e8] \breathe [f e f]) + . Spacing is not yet completely pretty + +*/ + +#include "breathing-sign-engraver.hh" +#include "breathing-sign.hh" +#include "musical-request.hh" +#include "command-request.hh" +#include "engraver-group.hh" +#include "note-head.hh" +#include "local-key-item.hh" + +#include + +Breathing_sign_engraver::Breathing_sign_engraver() +{ + breathing_sign_p_ = 0; + breathing_sign_req_l_ = 0; +} + +bool +Breathing_sign_engraver::do_try_music (Music*r_l) +{ + if (Breathing_sign_req * b= dynamic_cast (r_l)) { + breathing_sign_req_l_ = b; + return true; + } + + return false; +} + +void +Breathing_sign_engraver::do_process_requests() +{ + if(breathing_sign_req_l_) { + breathing_sign_p_ = new Breathing_sign; + + Scalar prop = get_property ("verticalDirection", 0); + if(prop.isnum_b()) + breathing_sign_p_->set_vertical_position((Direction)int(prop)); + + announce_element (Score_element_info (breathing_sign_p_, breathing_sign_req_l_)); + } +} + +void +Breathing_sign_engraver::do_pre_move_processing() +{ + if(breathing_sign_p_) { + typeset_element(breathing_sign_p_); + breathing_sign_p_ = 0; + } +} + +void +Breathing_sign_engraver::do_post_move_processing() +{ + breathing_sign_req_l_ = 0; +} + +ADD_THIS_TRANSLATOR(Breathing_sign_engraver); diff --git a/lily/breathing-sign.cc b/lily/breathing-sign.cc new file mode 100644 index 0000000000..c9f3b1fd28 --- /dev/null +++ b/lily/breathing-sign.cc @@ -0,0 +1,59 @@ +/* + breathing_sign.cc -- implement Breathing_sign + + Copyright (C) 1999 Michael Krause + + written for the GNU LilyPond music typesetter + +TODO: --> see breathing-sign-engraver.cc + +*/ + +#include "breathing-sign.hh" +#include "string.hh" +#include "molecule.hh" +#include "paper-def.hh" +#include "lookup.hh" +#include "debug.hh" +#include "dimensions.hh" +#include "direction.hh" + +#include + +Breathing_sign::Breathing_sign () +{ + vertical_position_i_ = UP; + set_elt_property (breakable_scm_sym, SCM_BOOL_T); + set_elt_property (break_priority_scm_sym, gh_int2scm (-4)); + set_elt_property (visibility_lambda_scm_sym, + gh_eval_str ("non_postbreak_visibility")); +} + +void +Breathing_sign::set_vertical_position (Direction updown) +{ + assert(updown >= -1 && updown <= +1); + + if(updown != 0) + vertical_position_i_ = updown; +} + +Molecule* +Breathing_sign::do_brew_molecule_p () const +{ + Real dl = staff_line_leading_f(); + Interval i1(0, dl / 6), i2(-dl / 2, dl / 2); + Box b(i1, i2); + + Molecule *output = new Molecule (lookup_l()->filledbox(b)); + + return output; +} + +void +Breathing_sign::do_post_processing() +{ + Real dl = staff_line_leading_f(); + + translate_axis(2.0 * dl * vertical_position_i_, Y_AXIS); +} diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index b0670d5236..e02325ee5e 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -133,7 +133,12 @@ Dynamic_engraver::do_process_requests() staff_side_p_->dir_ = (Direction) (int) prop; } - + prop = get_property ("dynamicPadding", 0); + if (prop.isnum_b ()) + { + staff_side_p_->set_elt_property (padding_scm_sym, + gh_double2scm(Real(prop))); + } announce_element (Score_element_info (text_p_, absd)); announce_element (Score_element_info (staff_side_p_, absd)); } diff --git a/lily/include/beam.hh b/lily/include/beam.hh index 1fdb8362a6..e8458196eb 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -35,7 +35,10 @@ public: enum Dir_algorithm { /* DOWN=-1, UP=1, */ MAJORITY=2, MEAN, MEDIAN }; Link_array stems_; - /// the slope of the beam in posns / point (dimension) + /** + the slope of the beam in (staffpositions) per (X-dimension, in PT). + UGH. standardise this for once and for all. + */ Real slope_f_; /// position of leftmost end of beam diff --git a/lily/include/breathing-sign-engraver.hh b/lily/include/breathing-sign-engraver.hh new file mode 100644 index 0000000000..3c003081e5 --- /dev/null +++ b/lily/include/breathing-sign-engraver.hh @@ -0,0 +1,34 @@ +/* + breathing-sign-engraver.hh -- declare Breathing_Sign_engraver + + Copyright (C) 1999 Michael Krause + + written for the GNU LilyPond music typesetter + +*/ + +#ifndef BREATHING_SIGN_ENGRAVER_HH +#define BREATHING_SIGN_ENGRAVER_HH + +#include "engraver.hh" +#include "command-request.hh" +#include "breathing-sign.hh" + +class Breathing_sign_engraver : public Engraver { +public: + Breathing_sign_engraver(); + VIRTUAL_COPY_CONS(Translator); + +protected: + virtual bool do_try_music (Music *req_l); + virtual void do_process_requests(); + + virtual void do_pre_move_processing(); + virtual void do_post_move_processing(); + +private: + Breathing_sign_req * breathing_sign_req_l_; + Breathing_sign * breathing_sign_p_; +}; + +#endif // BREATHING_SIGN_ENGRAVER_HH diff --git a/lily/include/breathing-sign.hh b/lily/include/breathing-sign.hh new file mode 100644 index 0000000000..c2f99c8e89 --- /dev/null +++ b/lily/include/breathing-sign.hh @@ -0,0 +1,32 @@ +/* + breathing-sign.hh + + Copyright (C) 1999 Michael Krause + + written for the GNU LilyPond music typesetter + +*/ + +#ifndef BREATHING_SIGN_HH +#define BREATHING_SIGN_HH + +#include "item.hh" +#include "staff-symbol-referencer.hh" +#include "parray.hh" + +class Breathing_sign : public Item, public Staff_symbol_referencer { +public: + VIRTUAL_COPY_CONS(Score_element); + Breathing_sign (); + + void set_vertical_position (Direction); + +protected: + virtual void do_post_processing (); + virtual Molecule* do_brew_molecule_p () const; + +private: + Direction vertical_position_i_; +}; + +#endif // BREATHING_SIGN_HH diff --git a/lily/include/command-request.hh b/lily/include/command-request.hh index 9e065963ce..805f100031 100644 --- a/lily/include/command-request.hh +++ b/lily/include/command-request.hh @@ -124,6 +124,9 @@ protected: VIRTUAL_COPY_CONS(Music); }; +class Breathing_sign_req : public Request { + VIRTUAL_COPY_CONS(Music); +}; /** Handle key changes. diff --git a/lily/include/music-list.hh b/lily/include/music-list.hh index f1de4e7f39..5f40c5dc6b 100644 --- a/lily/include/music-list.hh +++ b/lily/include/music-list.hh @@ -41,9 +41,11 @@ public: virtual void transpose (Musical_pitch ); virtual void compress (Moment); void add_music (Music *music_p); - + int length_i () const; Moment cumulative_length () const; Moment maximum_length () const; + virtual ~Music_sequence (); + protected: virtual Musical_pitch to_relative_octave (Musical_pitch); virtual void do_print() const; diff --git a/lily/include/new-repeated-music.hh b/lily/include/new-repeated-music.hh index 7488e3883c..8185180203 100644 --- a/lily/include/new-repeated-music.hh +++ b/lily/include/new-repeated-music.hh @@ -41,12 +41,10 @@ If the number of repeats is smaller than the number of alternatives, then - - FIXME + the excess alternatives are ignored for all timing purposes. If the number of repeats is bigger than the number of alternatives, then - - FIXME + the first alternative is assumed to be repeated. */ class New_repeated_music : public Music diff --git a/lily/include/spring-spacer.hh b/lily/include/spring-spacer.hh index 19b973edce..a76c7d47aa 100644 --- a/lily/include/spring-spacer.hh +++ b/lily/include/spring-spacer.hh @@ -46,7 +46,8 @@ class Spring_spacer : public Line_spacer { friend class Durations_iter; - +private: + Spring_spacer (Spring_spacer const&){} Cons *ideal_p_list_; Array cols_; Array loose_col_arr_; @@ -86,6 +87,7 @@ public: static Line_spacer *constructor(); Real energy_normalisation_f_; Spring_spacer (); + virtual ~Spring_spacer (); virtual void solve (Column_x_positions*) const; virtual void lower_bound_solution (Column_x_positions*) const; virtual void add_column (Paper_column *, bool fixed=false, Real fixpos=0.0); @@ -95,7 +97,6 @@ public: virtual void OK() const; virtual void print() const; virtual void prepare(); - virtual ~Spring_spacer(){} }; #endif // SPRING_SPACER_HH diff --git a/lily/include/unfolded-repeat-iterator.hh b/lily/include/unfolded-repeat-iterator.hh index 1e3e19eb92..42e78e0487 100644 --- a/lily/include/unfolded-repeat-iterator.hh +++ b/lily/include/unfolded-repeat-iterator.hh @@ -24,6 +24,7 @@ public: */ int done_count_; + /// are we busy doing the body? bool do_main_b_; @@ -31,8 +32,10 @@ public: This excludes the elt currently being iterated. */ Moment done_mom_; - + int alternative_count_i_; Music_iterator * current_iter_p_; + + /// pointer to the alternative that will be processed next. Cons *alternative_cons_l_; ~Unfolded_repeat_iterator(); Unfolded_repeat_iterator (); diff --git a/lily/midi-walker.cc b/lily/midi-walker.cc index acbde20646..2caa202576 100644 --- a/lily/midi-walker.cc +++ b/lily/midi-walker.cc @@ -109,6 +109,9 @@ Midi_walker::process() Audio_item* ptr = (*item_l_arr_l_)[index_]; do_stop_notes (ptr->audio_column_l_->at_mom ()); + /* + THIS IS A MEMORY LEAK. FIXME. + */ Midi_item* p = ptr->midi_item_p (); if (!p) return; diff --git a/lily/music-list.cc b/lily/music-list.cc index 1d32d1d08d..c3cf8fab26 100644 --- a/lily/music-list.cc +++ b/lily/music-list.cc @@ -119,3 +119,8 @@ Request_chord::to_relative_octave (Musical_pitch last) Music_list::Music_list () { } + +Music_sequence::~Music_sequence () +{ + delete music_p_list_p_; +} diff --git a/lily/music-sequence.cc b/lily/music-sequence.cc index d828884429..60e6459a20 100644 --- a/lily/music-sequence.cc +++ b/lily/music-sequence.cc @@ -73,3 +73,8 @@ Music_sequence::maximum_length () const return dur; } +int +Music_sequence::length_i () const +{ + return cons_list_size_i (music_p_list_p_->head_); +} diff --git a/lily/musical-request.cc b/lily/musical-request.cc index 2716822b03..65b7221404 100644 --- a/lily/musical-request.cc +++ b/lily/musical-request.cc @@ -9,7 +9,6 @@ #include "musical-request.hh" #include "misc.hh" #include "debug.hh" - #include "music-list.hh" void diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc index 8a16827ba2..eee264255d 100644 --- a/lily/my-lily-lexer.cc +++ b/lily/my-lily-lexer.cc @@ -25,6 +25,7 @@ static Keyword_ent the_key_tab[]={ {"accepts", ACCEPTS}, {"alternative", ALTERNATIVE}, {"bar", BAR}, + {"breathe", BREATHE}, {"cadenza", CADENZA}, {"chordmodifiers", CHORDMODIFIERS}, {"chords", CHORDS}, diff --git a/lily/note-column.cc b/lily/note-column.cc index 5f63501a47..282ab3cdd1 100644 --- a/lily/note-column.cc +++ b/lily/note-column.cc @@ -114,7 +114,7 @@ Note_column::add_head (Rhythmic_head *h) } /** - translate the rest symbols + translate the rest symbols vertically by amount DY_I. */ void Note_column::translate_rests (int dy_i) @@ -139,16 +139,16 @@ Note_column::set_dotcol (Dot_column *d) add_element (d); } - /* - [TODO] - handle rest under beam (do_post: beams are calculated now) - what about combination of collisions and rest under beam. +/* + [TODO] + handle rest under beam (do_post: beams are calculated now) + what about combination of collisions and rest under beam. - Should lookup + Should lookup - rest -> stem -> beam -> interpolate_y_position () + rest -> stem -> beam -> interpolate_y_position () - */ +*/ void Note_column::do_post_processing () @@ -157,26 +157,25 @@ Note_column::do_post_processing () return; Beam * b = stem_l_->beam_l_; - if (!b) + if (!b || !b->stems_.size ()) return; - - /* ugh. Should be done by beam. */ - Real x = stem_l_->hpos_f (); + + /* ugh. Should be done by beam. */ Direction d = stem_l_->get_dir (); - Real beamy = x * b->slope_f_ + b->left_y_; - Interval restdim = extent (Y_AXIS); + Real beamy = (stem_l_->hpos_f () - b->stems_[0]->hpos_f ()) * b->slope_f_ + b->left_y_; Real staff_space = rest_l_arr_[0]->staff_line_leading_f (); - Real internote_f = staff_space/2; + Real rest_dim = extent (Y_AXIS)[d]*2.0 /staff_space ; + Real minimum_dist - = paper_l ()->get_var ("restcollision_minimum_beamdist") * internote_f; + = paper_l ()->get_var ("restcollision_minimum_beamdist") ; Real dist = - minimum_dist + -d * (beamy - restdim[d]) >? 0; + minimum_dist + -d * (beamy - rest_dim) >? 0; int stafflines = rest_l_arr_[0]->lines_i (); - + // move discretely by half spaces. - int discrete_dist = int (ceil (dist / (0.5 *staff_space))); + int discrete_dist = int (ceil (dist )); // move by whole spaces inside the staff. if (discrete_dist < stafflines+1) diff --git a/lily/note-head.cc b/lily/note-head.cc index f881c6134c..9561ba341f 100644 --- a/lily/note-head.cc +++ b/lily/note-head.cc @@ -55,7 +55,6 @@ Note_head::do_width () const Molecule* Note_head::do_brew_molecule_p() const { - Molecule*out = 0; Real inter_f = staff_line_leading_f ()/2; int sz = lines_i ()-1; @@ -71,15 +70,12 @@ Note_head::do_brew_molecule_p() const type = ly_scm2string (SCM_CDR(style)); } - Molecule head (lookup_l()->notehead (balltype_i_, type)); - - - out = new Molecule (Molecule (head)); + Molecule* out = new Molecule (lookup_l()->notehead (balltype_i_, type)); if (streepjes_i) { Direction dir = sign (position_i_); - Interval hd = head.dim_[X_AXIS]; + Interval hd = out->dim_[X_AXIS]; Real hw = hd.length ()/4; Molecule ledger diff --git a/lily/paper-outputter.cc b/lily/paper-outputter.cc index 96ba69012f..d22f151e1c 100644 --- a/lily/paper-outputter.cc +++ b/lily/paper-outputter.cc @@ -26,8 +26,12 @@ #include "lily-version.hh" #include "atom.hh" +// urg +static SCM port = 0; + Paper_outputter::Paper_outputter (Paper_stream *s) { + port = 0; outstream_l_ = s; output_header (); } @@ -36,6 +40,16 @@ Paper_outputter::~Paper_outputter () { SCM scm = gh_list (ly_symbol ("end-output"), SCM_UNDEFINED); output_scheme (scm); + + if (String (output_global_ch) == "scm") + { +#if 1 + scm_display (gh_str02scm (")))\n"), port); + scm_fflush (port); +#else + *outstream_l_->os << ")"; +#endif + } } void @@ -47,7 +61,7 @@ Paper_outputter::output_header () // gh_eval_str ("(set! security-paranoia #t)"); } String s = String ("(eval (") + output_global_ch + "-scm 'all-definitions))"; - gh_eval_str (s.ch_C()); + gh_eval_str (s.ch_C ()); String creator; if (no_timestamps_global_b) @@ -158,7 +172,11 @@ Paper_outputter::output_scheme (SCM scm) { if (String (output_global_ch) == "scm") { - static SCM port = 0; +#if 1 + /* + we'd rather use C++ i/o iso Guile's, but how? + and: they can't be mixed (or synchronised) easily? + */ // urg if (!port) @@ -169,13 +187,58 @@ Paper_outputter::output_scheme (SCM scm) fd = of->rdbuf()->fd(); FILE *file = fdopen (fd, "a"); port = scm_standard_stream_to_port (file, "a", ""); - scm_display (gh_str02scm ("(load 'lily.scm)\n"), port); + scm_display (gh_str02scm ( + "(primitive-load-path 'lily.scm)\n" + "(eval (tex-scm 'all-definitions))\n" + ";(eval (ps-scm 'all-definitions))\n" + "(display (map (lambda (x) (string-append (eval x) \"%\\n\")) '(\n" + ), port); } - scm_display (gh_str02scm ("("), port); scm_write (scm, port); - scm_display (gh_str02scm (")\n"),port); + // duh + scm_display (gh_str02scm ("\n"), port); scm_fflush (port); +#else + static bool first = true; + if (first) + { + *outstream_l_->os << "" + "(primitive-load-path 'lily.scm)\n" + "(eval (tex-scm 'all-definitions))\n" + ";(eval (ps-scm 'all-definitions))\n" + "(display (map (lambda (x) (string-append (eval x) \"\\n\")) '(\n" + ; + } + + /* + why doesn't this work? + + ERROR: In procedure gh_scm2newstr: + ERROR: Wrong type argument in position 3: + (header "GNU LilyPond 1.1.49.jcn1" ", at Tue Jun 22 20:58:17 1999") + + or: + + ERROR: In procedure symbol->string: + ERROR: Wrong type argument in position 1: + (header "GNU LilyPond 1.1.49.jcn2" ", at Wed Jun 23 18:42:14 1999") + + eg, two ways to print '(foo bar)' + + SCM scm = gh_list (ly_symbol ("foo"), gh_str2scm ("bar"), SCM_UNDEFINED); + scm_write (scm, port); + puts (gh_xxx2newstr (scm, 0)); + */ + + char* p; + //p = gh_scm2newstr (scm, 0); + //p = gh_symbol2newstr (scm, 0); + //p = gh_scm2newstr (scm_symbol_to_string (scm), 0); + //p = gh_symbol2newstr (scm_symbol_to_string (scm), 0); + //*outstream_l_->os << p << endl; + *outstream_l_->os << symbol_to_string (scm) << endl; +#endif } else { diff --git a/lily/paper-stream.cc b/lily/paper-stream.cc index ef1616a382..0102377824 100644 --- a/lily/paper-stream.cc +++ b/lily/paper-stream.cc @@ -105,6 +105,7 @@ Paper_stream::operator << (Scalar s) void Paper_stream::break_line () { + // aaargh *os << "%\n"; *os << to_str (' ', nest_level); line_len_i_ = 0; diff --git a/lily/parser.yy b/lily/parser.yy index 2bbb8cf18c..70f1b62846 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -52,10 +52,13 @@ #include "transposed-music.hh" #include "time-scaled-music.hh" #include "new-repeated-music.hh" +#include "version.hh" + // mmm Mudela_version oldest_version ("1.0.20"); -Mudela_version version ("1.0.21"); +Mudela_version version ( MAJOR_VERSION "." MINOR_VERSION "." PATCH_LEVEL ); + void print_mudela_versions (ostream &os) @@ -65,26 +68,6 @@ print_mudela_versions (ostream &os) // needed for bison.simple's malloc() and free() #include -struct Assignment { - String *name_p_; - Identifier *id_p_; - ~Assignment () { - delete name_p_; - delete id_p_; - } - Assignment () { - name_p_ = 0; - id_p_ =0; - } - Assignment (Assignment const&s) - { - name_p_ = new String (*s.name_p_); - id_p_ = s.id_p_->clone (); - } -}; - -Paper_def* current_paper = 0; - #ifndef NDEBUG #define YYDEBUG 1 #endif @@ -156,6 +139,7 @@ yylex (YYSTYPE *s, void * v_l) %token ACCEPTS %token ALTERNATIVE %token BAR +%token BREATHE %token CADENZA %token CHORDMODIFIERS %token CHORDS @@ -939,6 +923,9 @@ abbrev_command_req: b->span_type_str_ = "beam"; $$ = b; } + | BREATHE { + $$ = new Breathing_sign_req; + } ; diff --git a/lily/new-repeated-music-iterator.cc b/lily/repeated-music-iterator.cc similarity index 100% rename from lily/new-repeated-music-iterator.cc rename to lily/repeated-music-iterator.cc diff --git a/lily/new-repeated-music.cc b/lily/repeated-music.cc similarity index 85% rename from lily/new-repeated-music.cc rename to lily/repeated-music.cc index 15bd06f660..19a700504c 100644 --- a/lily/new-repeated-music.cc +++ b/lily/repeated-music.cc @@ -88,13 +88,23 @@ New_repeated_music::compress (Moment p) Moment New_repeated_music::alternatives_length_mom () const { - if (alternatives_p_) + if (!alternatives_p_ ) + return 0; + + if (fold_b_) + alternatives_p_->maximum_length (); + + Moment m =0; + int done =0; + Cons *p = alternatives_p_->music_p_list_p_->head_; + while (p && done < repeats_i_) { - return (fold_b_) - ? alternatives_p_->maximum_length () - : alternatives_p_->cumulative_length (); + m = m + p->car_->length_mom (); + done ++; + if (repeats_i_ - done < alternatives_p_->length_i ()) + p = p->next_; } - return 0; + return m; } Moment diff --git a/lily/specialty-engraver.cc b/lily/specialty-engraver.cc new file mode 100644 index 0000000000..163dfe9a72 --- /dev/null +++ b/lily/specialty-engraver.cc @@ -0,0 +1,32 @@ +/* + specialty-engraver.cc -- implement Specialty_engraver + + source file of the GNU LilyPond music typesetter + + (c) 1999 Han-Wen Nienhuys + + */ + + +#include "engraver.hh" + +class Specialty_engraver : public Engraver +{ + +public: + VIRTUAL_COPY_CONS(Translator); +protected: + void acknowledge_element (Score_element_info); +}; + + +void +Specialty_engraver::acknowledge_element (Score_element_info i) +{ + /* + We could do groovy stuff, by inserting our own custom (FUNC,FONT) + pairs (Atoms in fact) into acknowledged elements. + + But not yet. This would be cleaner if we had SCM as properties. + */ +} diff --git a/lily/spring-spacer.cc b/lily/spring-spacer.cc index c9ecb2492e..e890602869 100644 --- a/lily/spring-spacer.cc +++ b/lily/spring-spacer.cc @@ -515,3 +515,8 @@ Spring_spacer::constructor() + +Spring_spacer::~Spring_spacer() +{ + delete ideal_p_list_; +} diff --git a/lily/unfolded-repeat-iterator.cc b/lily/unfolded-repeat-iterator.cc index 0550a46f06..4b6d40d16e 100644 --- a/lily/unfolded-repeat-iterator.cc +++ b/lily/unfolded-repeat-iterator.cc @@ -24,6 +24,7 @@ Unfolded_repeat_iterator::Unfolded_repeat_iterator () done_count_ =0; current_iter_p_ =0; do_main_b_ = false; + alternative_count_i_ =0; } /** @@ -47,21 +48,42 @@ Unfolded_repeat_iterator::next_element () if (do_main_b_) { done_mom_ += mus->repeat_body_p_->length_mom (); + + if (!mus->semi_fold_b_) + done_count_ ++; + if (alternative_cons_l_) { current_iter_p_ = get_iterator_p (alternative_cons_l_->car_); do_main_b_ = false; } + else if (done_count_ < mus->repeats_i_ && !mus->semi_fold_b_) + { + current_iter_p_ = get_iterator_p (mus->repeat_body_p_); + do_main_b_ = true; + } } else { + /* + we're not in the main part. So we're either in an alternative, or + we just finished. + */ if (alternative_cons_l_) { done_mom_ += alternative_cons_l_->car_->length_mom (); - alternative_cons_l_ = alternative_cons_l_->next_; - done_count_ ++; - } + if (mus->semi_fold_b_ || + mus->repeats_i_ - done_count_ < alternative_count_i_) + alternative_cons_l_ = alternative_cons_l_->next_; + + /* + we've done the main body as well, but didn't go over the other + increment. */ + if (mus->semi_fold_b_) + done_count_ ++; + } + if (done_count_ < mus->repeats_i_ && alternative_cons_l_) { if (mus->semi_fold_b_) @@ -75,6 +97,7 @@ Unfolded_repeat_iterator::next_element () } } + bool Unfolded_repeat_iterator::ok () const { @@ -95,6 +118,9 @@ Unfolded_repeat_iterator::construct_children () ? mus->alternatives_p_->music_p_list_p_->head_ : 0; + for (Cons *p = alternative_cons_l_; p; p = p->next_) + alternative_count_i_ ++; + if (mus->repeat_body_p_) { current_iter_p_ = get_iterator_p (mus->repeat_body_p_); diff --git a/ly/engraver.ly b/ly/engraver.ly index 7374759171..85e811b5e3 100644 --- a/ly/engraver.ly +++ b/ly/engraver.ly @@ -96,6 +96,7 @@ VoiceContext = \translator { \name Voice ; beamAuto = "1"; + \consists "Breathing_sign_engraver"; \consists "Rest_engraver"; \consists "Dot_column_engraver"; \consists "Stem_engraver"; diff --git a/ly/paper16.ly b/ly/paper16.ly index e439ab17b3..cb2f9f3cf1 100644 --- a/ly/paper16.ly +++ b/ly/paper16.ly @@ -25,8 +25,8 @@ paper_sixteen = \paper { arithmetic_multiplier = 4.8\pt; texsetting = "\\input lilyponddefs \\musixsixteendefs "; pssetting = "(lilyponddefs.ps) findlibfile {exch pop //systemdict /run get exec} { /undefinedfilename signalerror } ifelse\n"; - scmsetting = "(display \"(lilyponddefs.ps) findlibfile {exch pop //systemdict /run get exec} { /undefinedfilename signalerror } ifelse\");\n"; - scmsetting = "(display \"\\\\input lilyponddefs \\\\musixsixteendefs\");\n"; + scmsetting = "\"(lilyponddefs.ps) findlibfile {exch pop //systemdict /run get exec} { /undefinedfilename signalerror } ifelse\";\n"; + scmsetting = "\"\\\\input lilyponddefs \\\\musixsixteendefs\";\n"; 0 = \font "feta16" -1 = \font "feta13" diff --git a/ly/paper20.ly b/ly/paper20.ly index 90bebc6d7d..86df45795e 100644 --- a/ly/paper20.ly +++ b/ly/paper20.ly @@ -33,8 +33,8 @@ paper_twenty = \paper { texsetting = "\\input lilyponddefs \\musixtwentydefs "; pssetting = "(lilyponddefs.ps) findlibfile {exch pop //systemdict /run get exec} { /undefinedfilename signalerror } ifelse\n"; % urg, debugging only - scmsetting = "(display \"(lilyponddefs.ps) findlibfile {exch pop //systemdict /run get exec} { /undefinedfilename signalerror } ifelse\");\n"; - scmsetting = "(display \"\\\\input lilyponddefs \\\\musixtwentydefs\");\n"; + scmsetting = "\"(lilyponddefs.ps) findlibfile {exch pop //systemdict /run get exec} { /undefinedfilename signalerror } ifelse\";\n"; + scmsetting = "\"\\\\input lilyponddefs \\\\musixtwentydefs\";\n"; -2 = \font "feta13" -1 = \font "feta16" diff --git a/ly/script.ly b/ly/script.ly index c96f3e588a..eea258c9d1 100644 --- a/ly/script.ly +++ b/ly/script.ly @@ -14,7 +14,12 @@ accent = \script "accent" marcato = \script "marcato" staccatissimo = \script "staccatissimo" -% portato is indicated by slurred & dotted notes. Not really supported. +% portato is indicated +% either by +% * slurred & dotted notes. +%or by +% * slur and dash notes. +% Neither are really supported, but c4-.-- should work. % portato = \script "portato" fermata = \script "fermata" diff --git a/make/out/lelievijver.lsm b/make/out/lelievijver.lsm index ae3de9afdb..7d8962208c 100644 --- a/make/out/lelievijver.lsm +++ b/make/out/lelievijver.lsm @@ -1,15 +1,15 @@ Begin3 Titel: LilyPond -Versie: 1.1.49 -Inschrijf datum: 21JUN99 +Versie: 1.1.50 +Inschrijf datum: 25JUN99 Beschrijving: @FLAPTEKST@ Trefwoorden: muziek typezetten midi notatie Auteur: hanwen@stack.nl (Han-Wen Nienhuys) janneke@gnu.org (Jan Nieuwenhuizen) Onderhouden door: hanwen@cs.ruu.nl (Han-Wen Nienhuys) Voornaamste plek: sunsite.unc.edu /pub/Linux/apps - 770k lilypond-1.1.49.tar.gz + 770k lilypond-1.1.50.tar.gz Oorspronkelijke plek: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 770k lilypond-1.1.49.tar.gz + 770k lilypond-1.1.50.tar.gz Copi-eer voorwaarden: GPL End diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 2de95469e3..65c7688fa9 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,7 +1,7 @@ Begin3 Title: LilyPond -Version: 1.1.49 -Entered-date: 21JUN99 +Version: 1.1.50 +Entered-date: 25JUN99 Description: LilyPond is the GNU Project music typesetter. This program can print beautiful sheet music from a music definition file. It can also play @@ -14,8 +14,8 @@ Author: hanwen@cs.ruu.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 - 770k lilypond-1.1.49.tar.gz + 770k lilypond-1.1.50.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 770k lilypond-1.1.49.tar.gz + 770k lilypond-1.1.50.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index 3a3d179375..159a0f9376 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -1,9 +1,9 @@ Name: lilypond -Version: 1.1.49 +Version: 1.1.50 Release: 1 Copyright: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.49.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.50.tar.gz Summary: A program for printing sheet music. URL: http://www.cs.uu.nl/~hanwen/lilypond Packager: Han-Wen Nienhuys diff --git a/mutopia/E.Satie/gnossienne-4.ly b/mutopia/E.Satie/gnossienne-4.ly index fc2f0b7a1e..e1bd1a22e7 100644 --- a/mutopia/E.Satie/gnossienne-4.ly +++ b/mutopia/E.Satie/gnossienne-4.ly @@ -9,10 +9,10 @@ } %{ - Tested Features: cross staff beams and slurs, grace notes, no bars + Tested Features: cross staff auto beams and slurs, grace notes, no bars %} -\version "1.0.21"; +\version "1.0.20"; \include "nederlands.ly" @@ -24,101 +24,112 @@ global = \notes { \bar ".|"; } +x = \context Voice=x \notes { + % no beams in grace notes + \property Voice.beamAuto = "0" +} + upper = \context Staff=treble \notes\relative c''{ \clef violin; \stemup \context Voice=one r2 r r r2 r r - r4 [a'8--(\< a--] [a-- a-- c-- \!b--] [a--\> gis f \!e] + r4 a'8--(\< a-- a-- a-- c-- \!b-- a--\> gis f \!e % grace hack - < { [es8 )c] } \context Voice=x { \stemup s8*1/2 \tiny b8*1/2 ~ } > r4 r2 r + < { es8 )c } \context Voice=x { \stemup s8*1/2 \tiny b8*1/2 ~ } > r4 r2 r r2 r r - r4 [a'8--(\< a--] [a-- a-- c-- \!b--] [a--\> gis f \!e] - < { [es8 )c] } \context Voice=x { \stemup s8*1/2 \tiny b8*1/2 ~ } > r4 r2 r - r4 [g16( a bes a] [g a bes a g a bes a] [g a bes a g fis es fis] - )d4 \tiny fis8*1/2 ~ \normalsize gis4*3/4 ~ gis8 r r4 r2 - r4 [g16( a bes a] [g a bes a g a bes a] [g a bes a g fis es fis] - )d4 \tiny fis8*1/2 ~ \normalsize gis4*3/4 ~ gis8 r r4 r2 - \tiny a8*1/2 ~ \normalsize f4*3/4 ~ f8 r r2 r - r2 r4 [a8( b][c d c b] \tiny b8*1/2 ~ \normalsize - < { [e8*1/2 )g,8] } \context Voice=x { \stemup s8*1/4 \tiny a8*1/2 ~ } > r4 r2 r - r2 r4 [a8( b][c d c b] [a b c d][c b a b][c d c b] - \tiny b8*1/2 ~ \normalsize - < { [e8*1/2 )g,8] } \context Voice=x { \stemup s8*1/4 \tiny a8*1/2 ~ } > r4 r2 r - a2( \tiny e'8*1/2 ~ \normalsize f4*3/4 ~ )f8 r r2 + r4 a'8--(\< a-- a-- a-- c-- \!b-- a--\> gis f \!e + < { es8 )c } \context Voice=x { \stemup s8*1/2 \tiny b8*1/2 ~ } > r4 r2 r + r4 g16( a bes a g a bes a g a bes a g a bes a g fis es fis + % urg, what a syntax + )d4 \tiny fis8 ( *1/2 \normalsize ) gis4*3/4 ~ gis8 r r4 r2 + r4 g16( a bes a g a bes a g a bes a g a bes a g fis es fis + )d4 \tiny fis8(*1/2 \normalsize )gis4*3/4 ~ gis8 r r4 r2 + \tiny a8(*1/2 \normalsize )f4*3/4 ~ f8 r r2 r + r2 r4 a8( b c d c b \tiny b8(*1/2 \normalsize + < { )e8*1/2 )g,8 } \context Voice=x { \stemup s8*1/4 \tiny a8*1/2 ~ } > r4 r2 r + r2 r4 a8( b c d c b a b c d c b a b c d c b + \tiny b8(*1/2 \normalsize + < { )e8*1/2 )g,8 } \context Voice=x { \stemup s8*1/4 \tiny a8*1/2 ~ } > r4 r2 r + a2( \tiny e'8(*1/2 \normalsize )f4*3/4 ~ )f8 r r2 r2 r r fis,4( \tiny dis8*1/2 \normalsize <)cis4*3/4 ais> r2 r - \tiny b'8*1/2 ~ \normalsize - < { [a8*1/2 a8] } \context Voice=x { \stemup s8*1/4 \tiny b8*1/2 ~ } > r4 r2 r - r4 [a'8--(\< a--] [a-- a-- c-- \!b--] [a--\> gis f \!e] - < { [es8 )c] } \context Voice=x { \stemup s8*1/2 \tiny b8*1/2 ~ } > r4 r2 r - d,4( \tiny fis8*1/2 ~ \normalsize gis4*3/4 ~ )gis8 r r4 r2 + \tiny b'8(*1/2 \normalsize + < { )a8*1/2 a8 } \context Voice=x { \stemup s8*1/4 \tiny b8*1/2 ~ } > r4 r2 r + r4 a'8--(\< a-- a-- a-- c-- \!b-- a--\> gis f \!e + < { es8 )c } \context Voice=x { \stemup s8*1/2 \tiny b8*1/2 ~ } > r4 r2 r + d,4( \tiny fis8(*1/2 \normalsize )gis4*3/4 ~ )gis8 r r4 r2 f4 ~ f8 r r2 r - [f'8( g a b][a g f g][a b a g] - \tiny f8*1/2 ~ \normalsize - < { [g8*1/2 )e8] } \context Voice=x { \stemup s8*1/4 \tiny d8*1/2 ~ } > r4 r2 r - [f8( g a b][a g f g][a b a g] - \tiny f8*1/2 ~ \normalsize - < { [g8*1/2 )e8] } \context Voice=x { \stemup s8*1/4 \tiny d8*1/2 ~ } > r4 r2 r - a,2( \tiny e'8*1/2 ~ \normalsize f4*3/4 ~ )f8 r r2 + f'8( g a b a g f g a b a g + \tiny f8(*1/2 \normalsize + < { )g8*1/2 )e8 } \context Voice=x { \stemup s8*1/4 \tiny d8*1/2 ~ } > r4 r2 r + f8( g a b a g f g a b a g + \tiny f8(*1/2 \normalsize + < { )g8*1/2 )e8 } \context Voice=x { \stemup s8*1/4 \tiny d8*1/2 ~ } > r4 r2 r + a,2( \tiny e'8(*1/2 \normalsize )f4*3/4 ~ )f8 r r2 r2 r r fis,4( \tiny dis8*1/2 \normalsize <)cis4*3/4 ais> r2 r ~ } basloopje = \notes\relative c{ - d,8( a' d f a d f d a f d )a +% \property Voice.beamAutoEnd = "1/2" +% d,8( a' d f a d f d a f d )a + d,8( a' d f a \translator Staff=treble d f d \translator Staff=bass a f d )a } +%{ bassbeam = \notes{ [s2] [s8 \translator Staff=treble s s s] [\translator Staff=bass s2] % [s2] [s2] [s2] } +%} + lower = \context Voice=two \notes \relative c{ \stemdown \property Staff.slurVerticalDirection = 1 % snapnie, hoevaak relative c heeft ze nodig? - < \notes\relative c \basloopje \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \transpose bes \notes\relative c{ \basloopje } \bassbeam > - < \transpose bes \notes\relative c{ \basloopje } \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \transpose bes \notes\relative c{ \basloopje } \bassbeam > - < \transpose bes \notes\relative c{ \basloopje } \bassbeam > - < \transpose a \notes\relative c{ \basloopje } \bassbeam > - < \transpose bes \notes\relative c{ \basloopje } \bassbeam > - < \transpose a \notes\relative c{ \basloopje } \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \notes\relative c \basloopje \bassbeam > + \notes\relative c \basloopje + \notes\relative c \basloopje + \notes\relative c \basloopje + \transpose bes \notes\relative c{ \basloopje } + \transpose bes \notes\relative c{ \basloopje } + \notes\relative c \basloopje + \transpose bes \notes\relative c{ \basloopje } + \transpose bes \notes\relative c{ \basloopje } + \transpose a \notes\relative c{ \basloopje } + \transpose bes \notes\relative c{ \basloopje } + \transpose a \notes\relative c{ \basloopje } + \notes\relative c \basloopje + \notes\relative c \basloopje % huh? d' - < \transpose d' \notes\relative c{ \basloopje } \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \transpose d' \notes\relative c{ \basloopje } \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \transpose e' \notes\relative c{ \basloopje } \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \transpose bes \notes\relative c{ \basloopje } \bassbeam > - < \transpose a \notes\relative c{ \basloopje } \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \transpose d' \notes\relative c{ \basloopje } \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \transpose d' \notes\relative c{ \basloopje } \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \notes\relative c \basloopje \bassbeam > - < \transpose e' \notes\relative c{ \basloopje } \bassbeam > + \transpose d' \notes\relative c{ \basloopje } + \notes\relative c \basloopje + \notes\relative c \basloopje + \transpose d' \notes\relative c{ \basloopje } + \notes\relative c \basloopje + \notes\relative c \basloopje + \transpose e' \notes\relative c{ \basloopje } + \notes\relative c \basloopje + \notes\relative c \basloopje + \transpose bes \notes\relative c{ \basloopje } + \transpose a \notes\relative c{ \basloopje } + \notes\relative c \basloopje + \notes\relative c \basloopje + \transpose d' \notes\relative c{ \basloopje } + \notes\relative c \basloopje + \transpose d' \notes\relative c{ \basloopje } + \notes\relative c \basloopje + \notes\relative c \basloopje + \transpose e' \notes\relative c{ \basloopje } < e1 b' e> ~ < e b' e> } \score { - \context GrandStaff < + \context PianoStaff < \context Staff = treble < \global \upper @@ -138,11 +149,9 @@ lower = \context Voice=two \notes \relative c{ % no slur damping slur_slope_damping = 100.0; - \translator{ \OrchestralScoreContext } - \translator{ - \GrandStaffContext - minVerticalAlign = 3.0*\staffheight; - maxVerticalAlign = 3.0*\staffheight; + \translator{ + \VoiceContext + beamAutoEnd = "1/2"; } \translator{ \StaffContext diff --git a/mutopia/F.Schubert/standchen.ly b/mutopia/F.Schubert/standchen.ly index d76cc6f888..cca14da911 100644 --- a/mutopia/F.Schubert/standchen.ly +++ b/mutopia/F.Schubert/standchen.ly @@ -18,17 +18,12 @@ Note: Original key F. \version "1.0.21"; -$vocal_verse1 = \notes\relative c''{ - % ugh: treble/bass - % ? - \clef treble; +vocalVerse = \notes\relative c''{ \property Voice.dynamicdir=1 \times 2/3 { [ g8( )as] g } c4. g8 | \times 2/3 { [ f8( )g] f } c'4 f,8 r | g4.-> f8 \times 2/3 { [ f( )es] d } | es2 r4 | - % ugh: a whole should be a measure - %r1 | R2. | R2. | \times 2/3 { [ g8( )as] g } es'4. g,8 | @@ -58,7 +53,7 @@ $vocal_verse1 = \notes\relative c''{ c!2. | } -$vocal_through = \notes\relative c{ +vocalThrough = \notes\relative c{ \property Voice.dynamicdir=1 g''8. g16 b8. b16 d8. d16 | c4 b r | @@ -81,21 +76,21 @@ $vocal_through = \notes\relative c{ e2 r4 | } -$lyric_verse1 = \lyrics{ +lyricVerse1 = \lyrics{ % 5 \times 2/3 { Lei-4 se8 } fleh-4. en8 | - \times 2/3 { mei-4 ne8 } Lie-4 der8 _8 | + \times 2/3 { mei-4 ne8 } Lie-4 der8 " "8 | Durch4. die8 \times 2/3 { Nacht4 zu8 } | - dir;2 _4 | - _4 _ _ | - _ _ _ | + dir;2 " "4 | + " "4 " " " " | + " " " " " " | % 11 \times 2/3 { In4 den8 } stil-4. len8 | \times 2/3 { Hain4 her-8 } nie-4. der8 | Lieb-4. chen,8 \times 2/3 { komm4 zu8 } | - mir!2 _4 | - _4 _ _ | - _ _ _ | + mir!2 " "4 | + " "4 " " " " | + " " " " " " | % 17 Fl\"us-8. ternd16 schlan-4. ke8 | Wip-8. fel16 rau-4. schen8 | @@ -112,22 +107,22 @@ $lyric_verse1 = \lyrics{ nicht.2. | } -$lyric_verse2 = \lyrics{ +lyricVerse2 = \lyrics{ % 5 \times 2/3 { H\"orst4 die8 } Nach-4. ti-8 - \times 2/3 { gal-4 len8 } schla-4 gen?8 _8 + \times 2/3 { gal-4 len8 } schla-4 gen?8 " "8 ach!4. sie8 \times 2/3 { fleh-4 en8 } - dich,2 _4 - _4 _ _ - _4_ _ + dich,2 " "4 + " "4 " " " " + " "4" " " " % 11 \times 2/3 { Mit4 der8 } T\"o-4. ne8 - \times 2/3 { s\"u-4 "\ss{}en"8 } Kla-4. gen8 + \times 2/3 { s\"u-4 "\ss en"8 } Kla-4. gen8 Fleh-4. en8 \times 2/3 { sie4 f\"ur8 } - mich2 _4 - _4_ _ - _4_ _ + mich2 " "4 + " "4" " " " + " "4" " " " % 17 Sie-8. ver-16 stehn4. des8 @@ -146,30 +141,29 @@ $lyric_verse2 = \lyrics{ Herz.2. } -$lyric_through = \lyrics{ +lyricThrough = \lyrics{ % 37 La\ss8. auch16 dir8. die16 Brust8. be-16 | - we-4 gen _ | + we-4 gen " " | Lieb-4. chen,8 h\"o-8. re16 | - mich!2 _4 | + mich!2 " "4 | Be-4. bend8 \times 2/3 { harr'4 ich8} | - dir8. ent-16 ge-4 gen!8 _8 | - _2. | - _2. | + dir8. ent-16 ge-4 gen!8 " "8 | + " "2. | + " "2. | \times 2/3 { Komm4 be-8 } gl\"u4. cke8 | mich!2. | \times 2/3 { Komm4 be-8 } gl\"u4. cke8 | mich,2. __ | - _2 be-4 | + " "2 be-4 | gl\"u-2. | cke2. | - mich!2 _4 | + mich!2 " "4 | } -$treble_intro = \notes\relative c{ +trebleIntro = \notes\relative c{ \clef violin; % ugh: id like to type this! - %r8\pp [ ] | r8^"\bf m\\\"assig"\pp [ ] | r8 [ ] | r8 [ ] | @@ -177,8 +171,7 @@ $treble_intro = \notes\relative c{ \break } -$treble_verse1 = \notes\relative c{ -% \clef violin; +trebleVerse1 = \notes\relative c{ %5 r8 [ ] | r8 [ ] | @@ -192,7 +185,7 @@ $treble_verse1 = \notes\relative c{ r8 [ ] | r8 [ ] | r8 [ ] - <{ es'~ | d4. ~ f8}{ c'~ | bes4. ~ as8 } > + <{ es'( ) d4.() f8}{ c' | bes4. as8 } > \times 2/3 { < [f( as> <)d f] > } | %16 | @@ -214,7 +207,7 @@ $treble_verse1 = \notes\relative c{ < {a4.- > )f8} { a4. f8 } > | } -$treble_eentje = \notes \relative c'{ +trebleEentje = \notes \relative c'{ | [( c> <)f16 )as>] | [ ] | @@ -227,23 +220,21 @@ $treble_eentje = \notes \relative c'{ | } -$treble_through = \notes \relative c'{ +trebleThrough = \notes \relative c'{ | %61 R2. | [ <\! b16\> b'16> ] | < { c4( )b } { c'4( )b } > \!r | -% ugh -% [ d->> c16] | + [ d,-> > c16] | -% ugh ugh: connecting chords %65 < { d,2.\f a'2} { e2. ~ e2 } { b'2. c,2 }> r4 | \context Staff < { \voiceone - [a8. b16] c4-> ~ a8 r | - [a8. b16] c4-> ~ a8 r | + [a8. b16] c4-> () a8 r | + [a8. b16] c4-> () a8 r | } { \voicetwo @@ -277,7 +268,7 @@ $treble_through = \notes \relative c'{ | } -$bass_intro = \notes\relative c{ +bassIntro = \notes\relative c{ \clef bass; \property Voice.dynamicdir=1 %1 @@ -287,7 +278,7 @@ $bass_intro = \notes\relative c{ r4 | } -$bass_verse1 = \notes\relative c{ +bassVerse1 = \notes\relative c{ % \clef bass; \property Voice.dynamicdir=1 %5 @@ -319,7 +310,7 @@ $bass_verse1 = \notes\relative c{ c,8 [ ] | } -$bass_eentje = \notes\relative c{ +bassEentje = \notes\relative c{ \property Voice.dynamicdir=1 [ ] | c,8 [ ] | @@ -331,7 +322,7 @@ $bass_eentje = \notes\relative c{ c,8 [ ] | } -$bass_through = \notes\relative c{ +bassThrough = \notes\relative c{ \property Voice.dynamicdir=1 %61 [ b-> d->> ] | @@ -375,73 +366,74 @@ global = \notes{ } -$lyric_four = \lyrics{ - _4 _ _ - _ _ _ - _ _ _ - _ _ _ +lyricFour = \lyrics{ + " "4 " " " " + " " " " " " + " " " " " " + " " " " " " } allLyrics = { \time 3/4; % \skip 4 * 12; - \$lyric_four - \$lyric_verse1 + \lyricFour + \lyricVerse1 % \skip 4 * 24; - \$lyric_four - \$lyric_four - \$lyric_verse2 - \$lyric_through + \lyricFour + \lyricFour + \lyricVerse2 + \lyricThrough } -$lyric_staff = \context Lyrics = lyric< +lyricStaff = \context Lyrics = lyric< \allLyrics > vocals = \notes{ + \clef treble; \property Voice.dynamicdir=UP \skip 4 * 12; - \$vocal_verse1 + \vocalVerse \skip 4 * 24; - \$vocal_verse1 - \$vocal_through + \vocalVerse + \vocalThrough } -$vocal_staff = \context Staff = vocal< +vocalStaff = \context Staff = vocal< \property Staff.instrument = "alto sax" \global - \$vocals + \vocals > treble = { - \$treble_intro - \$treble_verse1 - \$treble_eentje - \$treble_verse1 - \$treble_through + \trebleIntro + \trebleVerse1 + \trebleEentje + \trebleVerse1 + \trebleThrough } -$treble_staff = \context Staff = treble< +trebleStaff = \context Staff = treble< \global \treble > bass = { - \$bass_intro - \$bass_verse1 - \$bass_eentje - \$bass_verse1 - \$bass_through + \bassIntro + \bassVerse1 + \bassEentje + \bassVerse1 + \bassThrough } -$bass_staff = \context Staff = bass< +bassStaff = \context Staff = bass< \global \bass > -$grand_staff = \context GrandStaff< - \$treble_staff - \$bass_staff +grandStaff = \context GrandStaff< + \trebleStaff + \bassStaff > \score{ @@ -451,12 +443,12 @@ $grand_staff = \context GrandStaff< % \transpose a gives a' to d'' (for basses, who sing an octave down) < % kjoet, but i like the original better -- jcn -% { \notes \transpose a { \$vocal_staff } } -% \$lyric_staff -% { \notes \transpose a { \$grand_staff } } - { \notes { \$vocal_staff } } - \$lyric_staff - { \notes { \$grand_staff } } +% { \notes \transpose a { \vocalStaff } } +% \lyricStaff +% { \notes \transpose a { \grandStaff } } + { \notes { \vocalStaff } } + \lyricStaff + { \notes { \grandStaff } } > \paper { % \translator { \OrchestralScoreContext } diff --git a/scm/lily.scm b/scm/lily.scm index 718515e4ff..682a0ae46c 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -111,6 +111,11 @@ (("Key_item" "begin-of-note") . (extra_space 2.5)) (("Staff_bar" "begin-of-note") . (extra_space 1.0)) (("Clef_item" "begin-of-note") . (minimum_space 5.0)) + (("" "Breathing_sign") . (minimum_space 0.0)) + (("Breathing_sign" "Key_item") . (minimum_space 1.5)) + (("Breathing_sign" "begin-of-note") . (minimum_space 1.0)) + (("Breathing_sign" "Staff_bar") . (minimum_space 1.5)) + (("Breathing_sign" "Clef_item") . (minimum_space 2.0)) ) ) diff --git a/scripts/abc-2-ly.py b/scripts/abc-2-ly.py index b6827083f3..c3b28363ae 100644 --- a/scripts/abc-2-ly.py +++ b/scripts/abc-2-ly.py @@ -5,6 +5,7 @@ # ... # # (not finished.) +# ABC standard v1.6: http://www.gre.ac.uk/~c.walshaw/abc2mtex/abc.txt # program_name = 'abc-to-ly' @@ -14,7 +15,11 @@ import getopt import sys import re import string -import mpz +try: + import mpz +except: + sys.stderr.write ("This script needs Python 1.5.1\n") + sys.exit (1) header = {} @@ -51,7 +56,7 @@ def dump_header (hdr): print '\\header {' for k in hdr.keys (): print '%s = "%s";\n'% (k,hdr[k]) - print '};' + print '}' def set_default_length (s): m = re.search ('1/([0-9]+)', s) @@ -175,6 +180,7 @@ def compute_key (k): tup_lookup = { '3' : '2/3', '4' : '4/3', + '5' : '4/5', '6' : '4/6', } @@ -196,12 +202,19 @@ def try_parse_group_end (str, state): print '}' return str +def header_append (key, a): + s = '' + if header.has_key (key): + s = header[key] + "\n" + header [key ] = s + a + def try_parse_header_line (ln): m = re.match ('^(.): *(.*)$', ln) if m: g =m.group (1) a = m.group (2) + a = re.sub ('"', '\\"', a) if g == 'T': header['title'] = a if g == 'M': @@ -216,11 +229,10 @@ def try_parse_header_line (ln): header ['origin'] = a if g == 'X': header ['crossRefNumber'] = a - if g == 'A': header ['area'] = a if g == 'H': - header ['history'] = a + header_append ('history', a) if g == 'B': header ['book'] = a if g == 'S': @@ -244,6 +256,7 @@ def pitch_to_mudela_name (name, acc): return chr (name + ord('c')) + s * acc def octave_to_mudela_quotes (o): + o = o + 2 s ='' if o < 0: o = -o @@ -385,7 +398,7 @@ def try_parse_guitar_chord (str): if str: str = str[1:] - print "guitar chord: %s\n" % gc + sys.stderr.write ("warning: ignoring guitar chord: %s\n" % gc) return str @@ -399,6 +412,14 @@ def try_parse_escape (str): return str +# +# |] thin-thick double bar line +# || thin-thin double bar line +# [| thick-thin double bar line +# :| left repeat +# |: right repeat +# :: left-right repeat +# def try_parse_bar (str): if str and str[0] == '|': @@ -409,9 +430,28 @@ def try_parse_bar (str): bs = '|.' if str[0] == '|': bs = '||' - + if str[0] == '|:': + sys.stderr.write ("warning: repeat kludge\n") + bs = '|:' if bs: print '\\bar "%s";' % bs + str = str[1:] + + if str and str[:2] == '[|': + sys.stderr.write ("warning: thick-thin bar kludge\n") + print '\\bar "||";' + str = str[2:] + + if str and str[:2] == ':|': + sys.stderr.write ("warning: repeat kludge\n") + print '\\bar ":|:";' + str = str[2:] + + if str and str[:2] == '::': + sys.stderr.write ("warning: repeat kludge\n") + print '\\bar ":|:";' + str = str[2:] + return str @@ -426,6 +466,19 @@ def try_parse_chord_delims (str): return str +# urg, hairy to compute grace note hack using \times{} +def try_parse_grace_delims (str): + if str and str[0] == '{': + str = str[1:] + sys.stderr.write ("warning: expanding grace notes\n") + print '\\tiny ' + + if str and str[0] == '}': + str = str[1:] + print '\\normalsize ' + + return str + # Try nibbling characters off until the line doesn't change. def try_parse_body_line (ln, state): prev_ln = '' @@ -438,13 +491,11 @@ def try_parse_body_line (ln, state): ln = try_parse_guitar_chord (ln) ln = try_parse_tuplet_begin (ln, state) ln = try_parse_group_end (ln, state) + ln = try_parse_grace_delims (ln) ln = junk_space (ln) if ln: - print 'Huh? Don\'t understand `%s\'' % ln - - - + sys.stderr.write ("Huh? Don't understand `%s'\n" % ln) @@ -468,7 +519,7 @@ def parse_file (fn): def identify(): - print '%s from LilyPond %s' % (program_name, version) + sys.stderr.write ("%s from LilyPond %s\n" % (program_name, version)) def help (): print r""" @@ -499,7 +550,13 @@ for f in files: if f == '-': f = '' + print ("\\score{") + print (" <") + print (" \\context Staff=one \\notes {") parse_file (f) + print (" }") + print (" >") dump_header (header) - print global_voice_stuff, 1 + print "%%%s" % global_voice_stuff, 1 + print ("}") diff --git a/scripts/ly2dvi.py b/scripts/ly2dvi.py index e3b42ffa8e..deb297b599 100644 --- a/scripts/ly2dvi.py +++ b/scripts/ly2dvi.py @@ -760,9 +760,9 @@ class Properties: """ if int(value) == 1: - this.__set('pagenumber',1,requester) + this.__set('pagenumber','\\pagestyle{empty}',requester) else: - this.__set('pagenumber',0,requester) + this.__set('pagenumber','%',requester) # # setSeparate @@ -990,7 +990,7 @@ def main(): elif o == '--landscape' or o == '-L': Props.setOrientation('landscape','commandline') elif o == '--nonumber' or o == '-N': - Props.setNonumber('commandline') + Props.setNonumber(1,'commandline') elif o == '--Width' or o == '-W': Props.setLineWidth(a,'commandline') elif o == '--dependencies' or o == '-d': -- 2.39.2