From: fred Date: Tue, 26 Mar 2002 21:49:31 +0000 (+0000) Subject: lilypond-1.1.42 X-Git-Tag: release/1.5.59~2455 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=a02e5e9dd4377e75345fa408a9d63b6a423e3f59;p=lilypond.git lilypond-1.1.42 --- diff --git a/Documentation/MANIFESTO.yo b/Documentation/MANIFESTO.yo index 0bb3533763..e47053222b 100644 --- a/Documentation/MANIFESTO.yo +++ b/Documentation/MANIFESTO.yo @@ -37,8 +37,6 @@ it()GNU LilyPond uses TeX for its output. This is not a key issue: in a it()GNU LilyPond does not display notes directly, nor will it be rehacked to be used interactively. GNU LilyPond writes output to a file. It will not be extended to play music, or to recognize music. - [As an aside, I am contemplating to create a library for rendering - music, which is "X-capable", so that others can create interactive tools] it()GNU LilyPond is intended to run on Unix platforms, but it should be portable to any platform which can run TeX and the GNU tools it()GNU LilyPond is free. Commercial windows packages for setting music are diff --git a/Documentation/tex/computer-notation.bib b/Documentation/tex/computer-notation.bib index 0f6e4defe6..301d3e1a52 100644 --- a/Documentation/tex/computer-notation.bib +++ b/Documentation/tex/computer-notation.bib @@ -222,7 +222,7 @@ note = {A no-science-here review of Encore. HWN} % LIME @Article {haken93, - note = {A description of Lime internals (which resemble older (before 0.0.68pre) LilyPond data structures somewhat) HWN}, + note = {A description of Lime internals (which resemble older (before 0.0.68pre) LilyPond data structures) HWN}, year = {1993}, title = {The Tilia Music Representation: Extensibility, Abstraction, and Notation Contexts for the Lime Music Editor}, author = {Lippold Haken and Dorothea Blostein}, diff --git a/Documentation/tex/engraving.bib b/Documentation/tex/engraving.bib index 066a7b7063..7552b11c18 100644 --- a/Documentation/tex/engraving.bib +++ b/Documentation/tex/engraving.bib @@ -62,7 +62,8 @@ @Book {read-notation, - note = {(Out of print) This is as close to the ``standard'' reference work for music notation issues as one is likely to get. MB}, + note = {(Out of print) This is as close to the ``standard'' reference +work for music notation issues as one is likely to get. MB}, title = {Music Notation: a Manual of Modern Practice}, author = {Gardner Read}, totalentry = {(2nd edition)}, @@ -103,7 +104,7 @@ publishers. This beautiful booklet was intended as an introduction for laymen on the art of engraving. It contains a step by step, in-depth explanation of how to cut and stamp music into zinc plates. - It also contains some compactly formulated rules on musical + It also contains a few compactly formulated rules on musical orthography. Out of print. } } @@ -123,7 +124,7 @@ @Booklet {mpa96, - note = {Pamphlet explaining some fine points in music font design HWN}, + note = {Pamphlet explaining a few fine points in music font design HWN}, year = {1996}, title = {Standard music notation specifications for computer programming.}, month = {December}, diff --git a/Documentation/tex/lilypond-overview.doc b/Documentation/tex/lilypond-overview.doc index ccb5a7377b..4aea712838 100644 --- a/Documentation/tex/lilypond-overview.doc +++ b/Documentation/tex/lilypond-overview.doc @@ -47,12 +47,13 @@ music until now: impossible to modify the score in a meaningful way. \item Formats for various notation programs. Notation programs either - work with binary formats (e.g., NIFF\cite{niff-web}), need specific - platforms (e.g., Sibelius\cite{sibelius}, Score\cite{score}), are - proprietary or non-portable tools themselves (idem), produce - inadequate output (e.g., MUP\cite{mup}), are based on graphical - content (e.g., MusixTeX\cite{musixtex1}), or limit themselves to - specific subdomains (e.g., ABC\cite{abc2mtex}). + work with binary formats (e.g., NIFF\cite{niff-web}), need specific + platforms (e.g., Sibelius\cite{sibelius}), are proprietary or + non-portable tools themselves (idem), produce inadequate output + (e.g., MUP\cite{mup}), are based on graphical content (e.g., + MusixTeX\cite{musixtex1}), limit themselves to specific subdomains + (e.g., ABC\cite{abc2mtex}), or require considerable skill and + knowledge to use (e.g., SCORE\cite{score}) \item SMDL\cite{smdl-web}. This is a very rich ASCII format, that is designed for storing many types of music. Unfortunately, there is @@ -487,7 +488,7 @@ guidelines: An example of the first guideline in action is the horizontal spacing. The amount of space following a note should reflect the duration of that note: short notes get a small amount of space, long notes larger -amounts. Such spacing constraints can be quite subtle, for the +amounts. Such spacing constraints can be subtle, for the ``amount of space'' is only the impression that should be conveyed; there has to be some correction for optical illusions. See Figure~\ref{fig:spacing}. @@ -587,8 +588,126 @@ The nonterminal productions can \section{Context in notation} +Music notation relies heavily on context. Notational symbols do not +have meaning if they are not surrounded by other context elements. In +this section we give some examples how the reader uses this context do +derive meaning of a piece of notation. We will focus on the prime +example of context: the staff. + +A staff is the grid of five horizontal lines, but it contains more components : +\begin{itemize} +\item A staff can have a key signature (printed at the left) +\item A staff can have a time signature (printed at the left) +\item A staff has bar lines +\item A staff has a clef (printed at the left) +\end{itemize} + +It is still possible to print notes without these components, but one +cannot determine the meaning of the notes. +\begin{mudela} +\score{ +\notes \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } +\paper { + linewidth = -1.; + \translator { + \StaffContext + \remove "Time_signature_engraver"; + \remove "Bar_engraver"; + \remove "Staff_symbol_engraver"; + \remove "Clef_engraver"; + \remove "Key_engraver"; + } + } +} +\end{mudela} + +As you can see, you can still make out the general form of the melody +and the rhythm that is to be played, but the notation is difficult to +read and the musical information is not complete. The stress +pattern in the notes can't be deduced from this output. For this, we +need a time signature. Adding barlines helps with finding the strong +and weak beats. +\begin{mudela} +\score { + \notes \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } + \paper{ + linewidth = -1.; +\translator{ + \StaffContext + \remove "Staff_symbol_engraver"; + \remove "Clef_engraver"; + \remove "Key_engraver";} + } + } +\end{mudela} + +It is impossible to deduce the exact pitch of the notes. One needs a +clef to do so. Staff lines help the eye in determining the vertical +position of a note wrt. to the clef. +\begin{mudela} +\score { + \notes \relative c' {\clef alto; \time 2/4; g'4 c,4 a'4 f4 e c d2 } + \paper { + linewidth = -1.; + } +} +\end{mudela} + +Now you know the pitch of the notes: you look at the start of the line +and see a clef, and with this clef, you can determine the notated pitches. +You have found the em(context) in which the notation is to be +interpreted! + + \section{Interpretation context} +Context (clef, time signature etc.) determines the relationship +between musical and its notation in notes. Because LilyPond writes +notation, context works the other way around for LilyPond: with +context a piece of music can be converted to notation. + +A reader remembers this context while reading the notation from left +to right. By analogy, LilyPond constructs this context while +constructing notes from left to right. This is what happens in the +``Interpretation'' phase from~\ref{fig:intro-fig}. In LilyPond, the +state of this context is a set of variables with their values; A staff +context contains variables like + +\begin{itemize} +\item current clef +\item current time signature +\item current key +\end{itemize} + +These variables determine when and how clefs, time signatures, bar +lines and accidentals are printed. + + +Staff is not the only form of context in notation. In polyphonic +music, the stem direction shows which notes form a voice: all notes of +the same voice have stems pointing in the same direction. The value +of this variable determines the appearance of the printed stems. + +In LilyPond ``Notation context'' is abstracted to a data structure +that is used, constructed and modified during the interpretation +phase. It contains context properties, and is responsible for +creating notational elements: the staff context creates symbols for +clefs, time signatures and key signatures. The Voice context creates +stems, note heads. + +For the fragment of polyphonic music below, +\begin{mudela} + \context Staff { c'4 < { \stemup c'4 } \context Voice = VB { \stemdown a4 } > } +\end{mudela} +A staff context is created. Within this staff context (which printed +the clef), a Voice context is created, which prints the first note. +Then, a second Voice context is created, with stem direction set to +``up'', and the direction for the other is set to down. Both Voice +contexts are still part of the same Staff context. + +In the same way, multiple staff scores are created: within the score +context, multiple staff contexts are created. Every staff context +creates the notation associated with a staff. \section{Discussion} diff --git a/Documentation/tex/lilypond-regtest.doc b/Documentation/tex/lilypond-regtest.doc index aae1c80ea8..20a8336e71 100644 --- a/Documentation/tex/lilypond-regtest.doc +++ b/Documentation/tex/lilypond-regtest.doc @@ -24,6 +24,11 @@ you must create a special context called Thread. \mudelafile{noteheadstyle.ly} +Multiple measure rests do not collide with barlines and clefs. They +are not expanded when you set Score.SkipBars + +\mudelafile{multi-measure-rest.ly} + \section{Beams, slurs and other spanners} @@ -73,9 +78,9 @@ numberOfStaffLines. Ledger lines both on note heads and rests are adjusted. \section{Global stuff} -Markings that are attached to (invisible) barlines are quite +Markings that are attached to (invisible) barlines are delicate: the are attached to the rest of the score without the score -knowing it. Consequently, they fall over quite often. +knowing it. Consequently, they fall over often. \mudelafile{bar-scripts.ly} diff --git a/Documentation/tex/mudela-book-doc.doc b/Documentation/tex/mudela-book-doc.doc index c4874f6b9d..22f9d8f3b6 100644 --- a/Documentation/tex/mudela-book-doc.doc +++ b/Documentation/tex/mudela-book-doc.doc @@ -88,12 +88,12 @@ will set the \verb|linewidth| variable to -1, so Lilypond will make the music as short as possible but without breaking the line. Here is a well know harmonic progression: \begin{mudela}[veryverbatim, intertext="produce a well known harmonic progression:"] - +\context Voice { } \end{mudela} If you want to place music examples in the text, \begin{mudela}[eps] - +\context Voice { } \end{mudela} , you can use the \verb|eps| option. This will create the music as eps graphics and include it into the document with the @@ -102,7 +102,7 @@ eps graphics and include it into the document with the The code used look like this: \begin{verbatim} \begin{mudela}[eps] - +\context Voice { } \end{mudela} \end{verbatim} @@ -301,22 +301,22 @@ names of some triads: dur & \begin{mudela}[eps] - +\context Voice {} \end{mudela} \\ \hline moll & \begin{mudela}[eps] - +\context Voice {} \end{mudela} \\ \hline forminsket & \begin{mudela}[eps] - +\context Voice {} \end{mudela} \\ \hline forstørret & \begin{mudela}[eps] - +\context Voice {} \end{mudela} \\ \hline @@ -330,7 +330,7 @@ into the preamble of your document. Then the line spacing will not be increased between the lines where you have music printed with the smallest font size. -Sinse the version number is quite low, you should be careful not to +Since the version number is low, you should be careful not to mix braces that belongs to mudela-book and \LaTeX~on the same line. The following code will probably break: diff --git a/Documentation/tex/tutorial.yo b/Documentation/tex/tutorial.yo index 30966e4ba6..d8f9f5e28d 100644 --- a/Documentation/tex/tutorial.yo +++ b/Documentation/tex/tutorial.yo @@ -85,7 +85,7 @@ sect(The first tune) label(sec:firsttune) To demonstrate what LilyPond input looks like, we start off with a -full fledged, yet simple, example. It is somewhat convoluted version +full fledged, yet simple, example. It is a convoluted version of one of the menuets in bind(J.)bind(S.)Bach's em(Clavierbuchlein). mudela(verbatim)( @@ -279,7 +279,7 @@ second one without. COMMENT( )verb( a8-. b-. cis-. d-. e-. fis-. % try some super and subscripts.)COMMENT( -)There is more to music than just pitches and rhythms. An important +)There is more to music than pitches and rhythms. An important aspect is articulation. You can enter articulation signs either in an abbreviated form, by a dash and the the character for the articulation to use, e.g. code(-.) for staccato as shown above. @@ -350,7 +350,7 @@ verb(\score { \paper { } })COMMENT( -) we will leave out the the repetitive details for now and just print +) we will leave out the the repetitive details for now and only print code(XXXX). @@ -489,7 +489,7 @@ Chords can be entered in the music in the same places that notes can. As an example we give a snippet of ``Twinkle Twinkle Little Star'' in chords. The chords may seem slightly unconventional, but they only serve to show how chords work. We've aligned the chords in -the input on their starting beat just to help you reading it. This +the input on their starting beat to help you reading it. This layout does not influence the typesetting result in any way. mudela(verbatim, fragment)( @@ -515,7 +515,7 @@ e.g., COMMENT( )COMMENT( ) -As you can see, LilyPond has some difficulty typesetting this +As you can see, LilyPond has difficulty typesetting this elegantly. To adequately solve this, you have to persuade LilyPond to make separate stems for both sequential music lists. This is a topic that is covered in bind(Section)ref(sec:polyphonic). @@ -540,7 +540,7 @@ subsect(Names with chords) A more common problem is the typesetting of chord names. LilyPond has a special kind of staff for this, the code(ChordNames) staff. -The code(ChordNames) staff accepts music just as a normal staff, +The code(ChordNames) staff accepts music like a normal staff, but typesets only the name of each chord: COMMENT( @@ -574,7 +574,7 @@ note. COMMENT( c''4-\tenuto )COMMENT( ) Typing a lot of staccato notes in this syntax will get tedious very -quickly. Therefore, Mudela has some handy abbreviations for +quickly. Therefore, Mudela has handy abbreviations for articulation marks such as staccato and tenuto. They are shown in the following example: COMMENT( @@ -601,7 +601,7 @@ COMMENT( )mudela(fragment,verbatim)(c''4-1 g''4-5 c''-"Sul tasto" ) COMMENT(Currently, the meaning of the -syntax `note-dash-digit/articulation/text' is just ``add a superscript to this +syntax `note-dash-digit/articulation/text' is ``add a superscript to this note.'' This is not in line with our goal to em (define) music with Mudela. We hope that this will be fixed in a future version of the language. In the meantime you can abuse this: the super- and @@ -640,7 +640,7 @@ start marker is. The stopping marker is the closing parenthesis. For example: mudela(fragment,center,verbatim)( c'4( )c'4 ) - The slur is quite flexible: you can nest nop(slurs,)footnote(This is +The slur is flexible: you can nest nop(slurs,)footnote(This is inconsistent when compared to the syntax for articulation hints. This will be fixed some time, we hope.) and you can connect a note with a slur on both the left and the right side: @@ -808,7 +808,7 @@ dit(code(\grouping) var(durationslist)) sets the metric structure of the measure [c'8 c'16 c'8] ) -In practice, you won't be needing this command very often: the +In practice, you won't be needing this command often: the grouping is switched automatically when you issue a code(\time) command. It is set to a combination of groups of 2 and 3 beats, with as many groups of @@ -824,7 +824,7 @@ notes. sect(Notation context) COMMENT(This section is about translation contexts, a topic of LilyPond that -is somewhat advanced. You don't have to understand this to use +is advanced. You don't have to understand this to use LilyPond to print simple music. If you don't want to typeset fancy polyphonic music or tweak the LilyPond notation engine, you can skip the next two sections.) @@ -841,9 +841,11 @@ lines on which one can print note heads. We will call this view on the concept of staff `staff symbol' from now on. But -there is more to a staff than just the symbol. A staff -contains---besides a staff symbol--- some more components: -itemize( +there is more to a staff than the symbol. A staff +contains---besides a staff symbol--- more components: +COMMENT( + +)itemize( it()A staff can have a key signature (printed at the left) it()A staff can have a time signature (printed at the left) it()A staff has bar lines @@ -947,7 +949,7 @@ converted to notation. We see that a staff forms context, and that context is needed to convert between notation and music. In LilyPond we turn around this reasoning: LilyPond has a notion of notation context, and the staff is -just one example of a notation context. In fact, the arguments of the +an example of a notation context. In fact, the arguments of the code(\context) command (Staff, GrandStaff) were all names of different contexts. A notation context is a conversion between music and notation. @@ -966,8 +968,8 @@ description( dit(GrandStaff) A code(GrandStaff) context contains code(Staff) contexts, and it adds a brace to the output at the - nop(left.)footnote(The GrandStaff is quite limited, LilyPond can not - do cross staff beaming and slurring.) + nop(left.)footnote(The GrandStaff is limited, LilyPond can not do + cross staff beaming and slurring.) A code(GrandStaff) context can contain code(Staff)s. Typically, it will contain two code(Staff)s, one treble staff, and one bass @@ -1031,7 +1033,7 @@ sect(Nested music: multiple staffs) label(tutorial:more-staffs) Now we explain how to typeset music that runs in multiple staffs. -Consider the following---somewhat unrealistic---example: +Consider the following---unrealistic---example: mudela(fragment)( \context GrandStaff @@ -1094,10 +1096,10 @@ mudela(verbatim,fragment)( > )COMMENT( -) The names that you choose do not matter just as long as they are +) The names that you choose do not matter as long as they are different. This is almost right, except for the brace at the left and the clef of the second staff. If you want a brace, then you have to -tell LilyPond that the chord you just formed is to be interpreted as a +tell LilyPond that the chord you formed is to be interpreted as a so-called grand staff. This is also done with the code(\context) command. The bass clef is made with a clef command: COMMENT( @@ -1142,7 +1144,7 @@ other words, notes enclosed in braces. Let us try the following counterpoint:CO \context "Voice" = "two" { g'2 f'4 e'4 } >) -As you can see the result is not quite perfect. The notes on the last +As you can see the result is not perfect. The notes on the last two beats look like plain chords and not like separate voices. What really happened was that the stems of the upper and lower voices were printed on top of each other. @@ -1202,7 +1204,7 @@ of all properties. sect(Lyrics) label(tutorial:lyrics) -Since a lyrics can have durations just like notes, we consider them to +Since a lyrics can have durations like notes, we consider them to be music too. Entering lyrics in mudela has two aspects. First, you have to enter the text, i.e., the syllables along with their durations. After this, you have to specify how to convert these to @@ -1245,7 +1247,7 @@ perfor0mable: COMMENT( ) The strings that makes up each syllable in the lyrics block are passed along to TeX() verbatim, so if you are proficient with TeX() -you can do various nifty things. Just keep in mind that a syllable +you can do various nifty things. Keep in mind that a syllable either starts with a letter (a character in the range `code(a)' to `code(z)' or `code(A)' to `code(Z)'), or it is a string enclosed double quotes. It ends with either a number for the duration, or a space. @@ -1272,7 +1274,7 @@ urg sect(Toplevel Mudela) Back in bind(Section)ref(sec:firsttune) we said we would ignore -toplevel constructions (e.g., code(\score)) until some later moment. +toplevel constructions (e.g., code(\score)) until a later moment. Now we will look at these constructions. @@ -1316,7 +1318,7 @@ mudela(verbatim)( You can also see identifiers in action within the code(\paper) block: the value code(-1.0) is assigned to code(linewidth). Within the code(\paper) block, identifiers are not used as abbreviation only: -assigning to some identifiers can influence the output: in this case, +assigning to some identifiers can influence the output: in this case, the music line is printed at natural width. Recall the properties of a context, that could be set with @@ -1514,7 +1516,7 @@ nop(Urtext)footnote(em(Urtext) is the German word for `original text'. The Urtext edition of a piece of music, is an edition that reflects the original writing of the composer. Such editions are useful for musicologists, and performers that want to perform authentic -interpretations. However, for mere mortals, the Urtext can be quite +interpretations. However, for mere mortals, the Urtext can be hard to read. It might not contain fingering and beaming, and typically it is full of footnotes. Moreover, common interpretations may have emerged---after the composer died. For this reason, the @@ -1699,7 +1701,7 @@ COMMENT( played. You may leave out the code(\alternative) part. There must not be more alternative endings than the code(repeat-count). -A somewhat less intuitive form may be needed for lyrics, when there are +A less intuitive form may be needed for lyrics, when there are a couple alternatives, but nothing is repeated. The code(\repeat) command must be present, but it may specify an empty music list: COMMENT( diff --git a/Documentation/topdocs/INSTALL.yo b/Documentation/topdocs/INSTALL.yo index f8298855ce..2faf016ea8 100644 --- a/Documentation/topdocs/INSTALL.yo +++ b/Documentation/topdocs/INSTALL.yo @@ -25,7 +25,7 @@ disk-space run configure with code(--disable-debugging). Although we recommend to use Unix, LilyPond is known to run on Windows NT/95/98 as well. See Section ref(w32). -it() GNU C++ version 2.8 or newer (egcs-1.1 or newer is also fine). +it() EGCS 1.1 or newer. it() Python 1.5 (Strictly speaking, you shouldn't need Python for compiling and installing, but you'll need it to regenerate the font tables, e.g.). @@ -247,8 +247,8 @@ provided to do the work for you, see file(bin/clean-fonts.sh). nsect(CAVEATS) itemize( -it()The -O2 option to gcc triggers a gcc bug on DEC Alpha in dstream.cc. You - should turn off this flag for this file. +it()The -O2 option triggers bugs on various platforms (PowerPC, Alpha). + If you experience problems, you should first try turning off this. ) nsect(EXAMPLE) diff --git a/Documentation/topdocs/README.yo b/Documentation/topdocs/README.yo index 56c3a089bf..1b321d7bdd 100644 --- a/Documentation/topdocs/README.yo +++ b/Documentation/topdocs/README.yo @@ -1,42 +1,28 @@ COMMENT(-*-Text-*-) -DEFINEMACRO(Package)(0)(LilyPond) DEFINEMACRO(package)(0)(lilypond) + redef(XXsetchapternum)(0)() notableofcontents() -article(This is the toplevel README to Package())()() +article(This is the toplevel README to LilyPond)()() includefile(../BLURB.in) sect(VERSIONING) -Package() uses a versioning scheme similar to the Linux kernel. In a +LilyPond uses a versioning scheme similar to the Linux kernel. In a version "x.y.z", an even second number 'y' denotes a stable version. For development versions 'y' is odd. For using straightforward score production, please use the latest stable version. Development versions may not produce good or nice scores. -If you have downloaded a - - *.pre* - -version, then this is version is *not* meant for producing nice output -(but to keep your patchsets up to date). It might not even compile. -The same goes for a version with a 4th version number, eg - - 1.2.3.mypatch2 - -It will be safer if you download 1.2.3 or wait for 1.2.4. - - - sect(REQUIREMENTS) -For the compilation and running of Package() you need some additional +For the compilation and running of LilyPond you need some additional packages. Please refer to the installation instructions. NOTE: If you downloaded a binary (.rpm or a W95/NT .zip file), then -you don't have to compile Package(). +you don't have to compile LilyPond. sect(INSTALLATION) @@ -58,36 +44,35 @@ and then do this: make doc -You can also simply read the .yo sources. They are ASCII text. +You can also simply read the file(.yo) sources. They are ASCII text. The complete documentation is accessible in formatted form at the website lurl(http://www.cs.uu.nl/people/hanwen/lilypond/index.html) sect(COMMENTS) -Package() is a long way from finished and polished. We do appreciate +LilyPond is a long way from finished and polished. We do appreciate criticism, comments, bugreports, patches, etc. - +verb( Please send your e-mail to one of the MAILING LISTS - +) and not to us personally. See file(Documentation/links.yo) for more info. sect(WINDOWS 32) If you have received this file as part of a DOS/Window32 distribution -(package()-*.zip), then it is advisable to also download the source +(LilyPond-*.zip), then it is advisable to also download the source package, since it might contain more documentation lurl(ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/) -If you decide to build Package() from source, please read the INSTALL.txt +If you decide to build LilyPond from source, please read the INSTALL.txt document first, especially the Windows NT/95 section. sect(CAVEATS) -* Please read the file BUGS for some ugly bugs. This especially applies -Linux-Intel unix users. +* Please read the file BUGS for some ugly bugs. * If you have installed a previous version, be sure to remove old font files, eg @@ -98,7 +83,7 @@ a script to do this for you is in file(buildscripts/clean-fonts.sh) sect(CDROM DISTRIBUTIONS) -If you have received Package() on a cdrom, chances are that development -has moved a some patchlevels up. If possible, please check the latest -version of Package() before reporting bugs. +If you have received LilyPond on a cdrom, chances are that development +has moved a some patchlevels up. Please check the latest version of +LilyPond before reporting bugs. diff --git a/Documentation/topdocs/index.yo b/Documentation/topdocs/index.yo index 8dd9e0c4a9..2d645208a7 100644 --- a/Documentation/topdocs/index.yo +++ b/Documentation/topdocs/index.yo @@ -37,6 +37,10 @@ Note: These pages are created from the latest bf(development snapshots) of LilyPond, specifically, this page was made from LilyPond @TOPLEVEL_VERSION@.tar.gz +Note: the pages may have been created from an unreleased development +version. Please have patience, all changes will appear in the +official version. + nsect(Free Software) @@ -67,6 +71,7 @@ it()url(Reference Manual)(DOEXPAND(docdir)/tex/DOEXPAND(outdir)/refman.html) it()url(Mailing Lists)(DOEXPAND(docdir)/DOEXPAND(outdir)/mail.html) it()url(All of the LilyPond documentation)(DOEXPAND(docdir)/DOEXPAND(outdir)/index.html) it()url(The DOC++ documentation of the C++ sources.)(DOEXPAND(depth)/docxx/index.html) +it()url(The installation instructions)(DOEXPAND(tops)/INSTALL.html) ) nsect(Sites) diff --git a/NEWS b/NEWS index 02a1840575..25c174bfc7 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,31 @@ +pl 41.hwn2 + - bf: Score bar line thickness. + - more paper writing + - website tweaks. + - Graphical_element::dim_cache_ now alloced separately. + - junked Graphical_element::absgolute_offset + - Musique-de-Table + - mmrest_x_minimum now works at begin-of-line. + - junked Span_bar::extra_x_off + - \property foo.bar = \stringid + \otherstringid + - bf: stop on lexer errors as well. + - only do vertical alignment at Score level. + - tweaked ledger endings a bit. + + +pl 41.hwn1 + - small fixes. + - mudela-book.py patch (thanks MB) + +pl 41.mb1 + - Added the installation instructions to the top web page. + - N.W.Gade: Added triangolo part, minor changes. + +pl 41.tca1 + - Lookup::accordion and removed some accordionfonts + +*************** + pl 40.uu2 - rest ledger lines are dimensionless. - Score_elements are added to the Paper_score directly when diff --git a/TODO b/TODO index e0301f8859..33dd5f04f1 100644 --- a/TODO +++ b/TODO @@ -17,33 +17,6 @@ Grep for TODO and ugh/ugr/urg. . * staff size for post/prebreaks . * .ly files . * input/star-spangled-banner -. * m=\notes\relative c'''{ - \time 2/4; - - R2*4 | c2 | c2 | c2 | c2 | c2 | c2 | c2 | c2 | c2 | \break - <{R2*10}{s2 \mark "A"; }> | % Too narrow space for the first rest in -1.1.29 - r4 r8 [g16 \p ( a ] | -[ ) g8-. fis16 ( g ][ ) fis8-. f16 ( g ] | -[ ) f8-. e16 ( f ][ ) e8-. es16 ( f ] | -[ ) es8 \f c16 ( d][es8 d16 c ] | -) d4 r8 [g16 \p ( a ] | -[ ) g8-. fis16 ( g ][ ) fis8-. f16 ( g ] | \break -) c2 | c2 | c2 | c2 | c2 | c2 | c2 | c2 | c2 | -} - -\score{ - \m - \paper{ - \translator{ - \ScoreContext - SkipBars = 1; - } - \translator { - \OrchestralPartStaffContext - } - } -} . * midi key. . * P.P.S. It can be cool in mudela-book to distinguish in pre,postMudelaExample, whether MudelaExample is epsed or not: ( if @@ -76,11 +49,6 @@ Lyrics and scripts collide. \key b; \time 4/4; looks bad. The clef and time signature are too close. -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? - restStyle=mensural doesn't seem to work (lots of characters not found for rests.fly) . * Phrasing: Indicating the textual underlay of a piece, or @@ -89,7 +57,6 @@ 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? -. * spacing of mmrests. . * rest collision minimum dist. . * Matanya's tips: . * spacing for prefatory matter @@ -103,6 +70,23 @@ specify the third. Should there be? So that makes for a staff space of 4 2/3 point. I'll add the dimensions to the TODO file. . * accidentals closer to note head +. * to space the staffs/staffgroups contained in the score. + +In the orchestscore.ly file, I tried: +\paper{ + \translator { + \OrchestralScoreContext + minVerticalAlign = 3.0*\staffheight; + } + \translator { + \StaffGroupContext + minVerticalAlign = 3.0*\staffheight; + } + \translator { + \StaffContext + minVerticalAlign = 3.0*\staffheight; + } +} . * heavier beams? .* Cleanups needed @@ -115,6 +99,7 @@ dimensions to the TODO file. . * Spring generation . * Collision . * Rest_collision +. * clef grav prop's .* TODO before 1.2 . * \selectmusic to cut pieces from music. @@ -122,19 +107,10 @@ dimensions to the TODO file. . * Remove mutopia ramblings. . * Remove non-free software links. . * Remove meta article LilyPond. -. * generic rest ledgers . * TODO: merge atom & molecule; make tree from molecule. . * break priority setting from SCM. . * Gade score . * remove [] in favour of auto-beamer -. * The minimum distance between different staffs works only within - StaffGroups, not between StaffGroups. The Gade Score looks quite - strange on the pages where the Timpani and/or Brass sections don't - play. I've set the minimum distance with: - \translator { - \OrchestralScoreContext - minVerticalAlign = 2.5*\staffheight; - } . * hangOnClef with non-breakable clefs. . * Aha, the problem is the new TeX code generation for changing fonts. > (The explanation below is mostly intended for Han-Wen and Jan) @@ -152,7 +128,6 @@ dimensions to the TODO file. > fontencoding OT1 is for the hyphenation mechanism to work, an > argument that's clearly irrelevant in our application. Yet we > see the problem for August. -. * Check gcc 2.8.1 compatibility . * Abstraction for engravers: . * make "in-between" engraver (Tie, Extender) . * make wide_spanner_engraver (line_group_spanne,r staff_symbol) @@ -297,6 +272,7 @@ touching it. . * put errorlevel in Input class . * junk nesting slurs . * integrate midi-elts from mi2mu and lily? +. * distinguish between unset and empty properties. .* FONT . * the bracket is ugly (wings are too parabolic, should be more circular) @@ -320,6 +296,9 @@ touching it. . * glissando, arpeggio . * lengthened trill . * include important spacing dims in fetalog +. * scalability: use blot_diameter everywhere, make font chubbier for + small sizes. + .* 3RD PARTY BUGS . * GNU diff 2.7: diff -rN does not see a new directory with empty file . * check out GCC signatures? diff --git a/buildscripts/mutopia-index.py b/buildscripts/mutopia-index.py index fbc74976f1..11a1221059 100644 --- a/buildscripts/mutopia-index.py +++ b/buildscripts/mutopia-index.py @@ -14,6 +14,24 @@ sys.path.append ('@abs-step-bindir@') header_regex = regex.compile('\\header[ \t\n]*{\([^}]*\)}') header_entry_regex = regex.compile('[\n\t ]*\([^\n\t ]+\)[\n\t ]*=[\n \t]*\([^;]+\)[\n \t]*;') +headertext= r""" +These example files are taken from the LilyPond distribution. +LilyPond currently only outputs TeX and MIDI. The pictures and +PostScript files were generated using TeX, Ghostscript and some +graphics tools. The papersize used for these examples is A4. +The images are in PNG format, and should be viewable with any current browser. +We don't use GIFS due to patent problems. +

+If you want an accurate impression of the output quality please print +out the samples first. +""" + +headertext_nopics = r"""This is a subdirectory of the LilyPond example +set. We decided not to show any examples from this directory. If you +want to view them, then you have to download LilyPond and compile them +yourself.""" + + # # FIXME breaks on multiple strings. # @@ -68,7 +86,7 @@ def gen_list(inputs, subdir, filename): list = open(filename, 'w') list.write ('Rendered Examples\n') list.write ('') - if len(subdirs): + if subdirs: list.write ('

subdirectories

') list.write ('
    ') for ex in subdirs: @@ -77,18 +95,14 @@ def gen_list(inputs, subdir, filename): list.write ('
') - list.write('

Contents of this directory

\n'); - list.write (""" -These example files are taken from the LilyPond distribution. -LilyPond currently only outputs TeX and MIDI. The pictures and -PostScript files were generated using TeX, Ghostscript and some -graphics tools. The papersize used for these examples is A4. -As you know, no gifs due to patent problems, -but the PNG images should be viewable with any current browser -

-If you want an accurate impression of the output quality please print -out the samples first. - """); + + + if inputs: + list.write('

Contents of this directory

\n'); + + list.write (headertext) + else: + list.write (headertext_nopics) for ex in inputs: diff --git a/input/Musique-de-Table.ly b/input/Musique-de-Table.ly new file mode 100644 index 0000000000..74f23a89c7 --- /dev/null +++ b/input/Musique-de-Table.ly @@ -0,0 +1,150 @@ + +\header { +composer = "Georg Philipp Telemann"; +title = "Musique de Table"; +date = "1733"; +tempo = "Maestoso"; +} + +%{ + +This appeared in Uijlenspieghel, the magazine of the Dutch Horn +Society, spring issue. + +It is part of 3rd production of the Table Music by Telemann. It is a +concerto for two "Tromba Selvatica" (Wood trumpets, ie. horns.) in +E-flat. + +There probably are violin parts as well. (they weren't printed in +Uijlenspieghel) + + +%} + + + + +trombaUno = \notes \relative c'' { +c2. ~ +c4 +g c | +e2. ~ e4 c e | +g2. ~ g4 +f2 ~ +f4 +e2~ e4 +f2 ~ f4 +d4 e ~ | +e8 f d4.-\trill c8 +c e e-\trill d d16 e d c | +c4 r r | +r8 e f f16 g e8 e16 f | +d4 r r +r8 d g g16 e f8 f16 d | +e16 g g e g e d e f32 g f16 d32 e d16 +e16 g g e g e d e f32 g f16 d32 e d16 | +e16 d c d e d e d e8 fis g4 r r | +R2. +R2. +r4 d2~ d4 r r R2. +d2. ~ d 4 g, d' +d2. ~ d4 g, d' d2. e fis g +a4. a8 g4 ~ g8 e fis4.-\trill g8 +g g16 a b c d4 c8 b4 +r r +g c b -\trill c r r | +r8 [c16 b] c8 c16 d b8 b16 c | +a4 r r | r e2~ e4 r r | r e2~ e4 d r | r c2 ~ c4 d r R2. | +r4 e8 e e e e4 r r +r8 [e e-\trill d] d16 e d c| c4 r r| +r8 e8 f f16 g e8 e16 f | +d8 d4 f8 e16 d c e d8 d4 f8 e16 d c e +d4 r r | +r8 d g g16 e f8 f16 d | +e16 g g e g e d e f32 g f16 d32 e d16 | +e16 g g e g e d e f32 g f16 d32 e d16 | +e16 d c d e f e d e8 d-\trill c4 r r r8 e f f16 g e8 e16 f +d8 d4 f8 e16 d c e d8 d4 f8 e16 d c e +d4 r r| +c2. ~ c4 g c e2.~ e4 c e | +g2. ~ g4 f2 ~ f4 e2~e4 f2~f2. +r4 d e~ e8 f d4.-\trill c8 +c2 r4 +e16 g g e c e e c g c c g e4 r r c4-| e4-| g-| c,2. + + +} + + +trombaDue = \notes \relative c' { +e2. ~e4 c e g2.~g4 e g8 c | +e2. ~ e4 d2~d4 d2 c2. d4 g, g | +r4 g8 g g g e c' c g g16 e g8 | +e4 r r +r8 c' d8 d16 e c8 c, | g'4 r r | +r4 r8 g d' d16 g, | +c16 e e c e c g c d d g, g | +c e e c e c g c d d g, g | +c g e g c g c g c8 d | +d4 r r R2. R2. R2. | +r4 d2 ~ d4 r r | +g,2. ~ g4 d' g, | g2. ~ g4 d' g, | g2. ~ g4 c e | r d2 ~ d4 c4 e8. d16 | +d4. d8 d4 | +r8 e d4 d | d g fis-\trill | g r r | +r8 [c,16 d] e f g4 f8 e4 r r | +r8 [e16 d] e8 e16 f d8 d16 e +c4 r r | R2. | r4 e2~e4 r r | r d2 ~ d4 c4 r4 | +r4 d2~ d4 r r | +r [e8 e e e] e4 r r | +r8 [c8 c g] g16 e g8 e4 r r +r8 c'8 d8 d16 e c8 c, g'8 g4 d'8 c16 g e c g'8 g4 d'8 c16 g e c +g'4 r r | +r4 r8 g d' d16 g, | +c16 e e c e c g c d d g, g +c e e c e c g c d d g, g | +[c16 g e g] [c8 c16 c] [c g g32 e32 g16] | +e4 r r | r8 c' d d16 e c8 c, g'8 g4 d'8 c16 g e c | +g'8 g4 d'8 c16 g e c | g'4 r r | +e2.~e4 c e | g2.~g4 e g8 c | e2.~e4 d2 ~ d4 d2 c2. d2. r4 g,4 g r g8 g g g | +e2 r4 +c'16 e e c g c c g e g g e c4 r r c-| e-| g-| c2. +} + +global = \notes { + \time 3/4; + s2.* 80 + \bar "|."; +} +trbname = "Horn (E\\textflat)" +trbnameI = \trbname + " 1 " +trbnameII = \trbname + " 2 " + +\score { + \context GrandStaff < + \context Staff = one < + \trombaUno + \property Staff.instrument = \trbnameI + \property Staff.instr = " " + \global + > + \context Staff = two < + \property Staff.instrument = \trbnameII + \property Staff.instr = " " + \global + \trombaDue + > + > + \paper { + \translator { + \OrchestralScoreContext + minVerticalAlign = 2.5*\staffheight; + } + \translator { + \StaffContext + \consists Staff_margin_engraver; + } + +% castingalgorithm = \Wordwrap; + indent = 2. \cm; + } +} diff --git a/input/test/GNUmakefile b/input/test/GNUmakefile index 476ff36010..4502850705 100644 --- a/input/test/GNUmakefile +++ b/input/test/GNUmakefile @@ -1,7 +1,7 @@ # input/test/Makefile depth = ../.. -examples=font20 mark knee beam-interstaff slur-interstaff denneboom sleur repeat hara-kiri grace +examples=font20 slur-interstaff sleur hara-kiri grace LOCALSTEPMAKE_TEMPLATES=mutopia include $(depth)/make/stepmake.make diff --git a/input/test/beam-interstaff.ly b/input/test/beam-interstaff.ly index e30a5f7633..570b34a4d8 100644 --- a/input/test/beam-interstaff.ly +++ b/input/test/beam-interstaff.ly @@ -1,5 +1,5 @@ \score{ - \context GrandStaff < + \context PianoStaff < \context Staff=one \notes\relative c'{ \stemup [c8 c \translator Staff=two \stemup c c] [c c c c] @@ -22,7 +22,7 @@ > \paper{ \translator{ - \GrandStaffContext + \PianoStaffContext minVerticalAlign = 3.0*\staffheight; maxVerticalAlign = 3.0*\staffheight; } diff --git a/input/test/clefs.ly b/input/test/clefs.ly index a0b101780d..08c8143910 100644 --- a/input/test/clefs.ly +++ b/input/test/clefs.ly @@ -2,6 +2,7 @@ \score { \notes{ + \clef "treble"; c'1^"{treble}" \bar "||"; \clef "french";c'1^"{french}" \bar "||"; \clef "soprano";c'1^"{soprano}" \bar "||"; diff --git a/input/test/multi-measure-rest.ly b/input/test/multi-measure-rest.ly new file mode 100644 index 0000000000..4d42739c8d --- /dev/null +++ b/input/test/multi-measure-rest.ly @@ -0,0 +1,7 @@ + +\score { \notes { \time 3/4; \key cis; R2. R2.*5 } + \paper { + \translator { \ScoreContext SkipBars = 1; } + linewidth = -1.; + } +} diff --git a/input/test/slur-interstaff.ly b/input/test/slur-interstaff.ly index 30c46c2ec9..045f16626f 100644 --- a/input/test/slur-interstaff.ly +++ b/input/test/slur-interstaff.ly @@ -1,5 +1,5 @@ \score{ - \context GrandStaff < + \context PianoStaff < \context Staff=one \notes\relative c'{ \stemup c4( c \translator Staff=two c )c | \translator Staff=one @@ -30,7 +30,7 @@ % no slur damping slur_slope_damping = 10.0; \translator{ - \GrandStaffContext + \PianoStaffContext minVerticalAlign = 3.0*\staffheight; maxVerticalAlign = 3.0*\staffheight; } diff --git a/input/test/staff-margin.ly b/input/test/staff-margin.ly index 176e387f64..d6e8fb863e 100644 --- a/input/test/staff-margin.ly +++ b/input/test/staff-margin.ly @@ -4,8 +4,7 @@ \score { - \notes \context PianoStaff < - + \notes \context PianoStaff < \context Staff = treble { \property PianoStaff.instrument = "Piano " \property Staff.instrument = "Right " { c''4 }} diff --git a/input/test/time.fly b/input/test/time.fly index 1fdfbf0559..1ee912c0ae 100644 --- a/input/test/time.fly +++ b/input/test/time.fly @@ -1,4 +1,5 @@ \property Staff.textEmptyDimension = 1 +\property Voice.textEmptyDimension = 1 \property Staff.timeSignatureStyle = "C" \time 1/1; c''1^"timeSignatureStyle = \"C\"" diff --git a/lily/align-element.cc b/lily/align-element.cc index dc41b5de7f..82111b9e2e 100644 --- a/lily/align-element.cc +++ b/lily/align-element.cc @@ -134,7 +134,7 @@ Align_element::do_side_processing () if (center_f) translate_axis ( - center_f, axis ()); - dim_cache_[axis ()].invalidate (); + dim_cache_[axis ()]->invalidate (); } Align_element::Align_element() diff --git a/lily/axis-group-element.cc b/lily/axis-group-element.cc index cd6000b464..d843dfbbbb 100644 --- a/lily/axis-group-element.cc +++ b/lily/axis-group-element.cc @@ -62,8 +62,8 @@ void Axis_group_element::set_axes (Axis a1, Axis a2) { Graphical_axis_group::set_axes (a1,a2); - dim_cache_[X_AXIS].set_empty ((a1 != X_AXIS && a2 != X_AXIS)); - dim_cache_[Y_AXIS].set_empty ((a1 != Y_AXIS && a2 != Y_AXIS)); + dim_cache_[X_AXIS]->set_empty ((a1 != X_AXIS && a2 != X_AXIS)); + dim_cache_[Y_AXIS]->set_empty ((a1 != Y_AXIS && a2 != Y_AXIS)); } diff --git a/lily/bar-script-engraver.cc b/lily/bar-script-engraver.cc index f466e1bc86..a0e33d0d8e 100644 --- a/lily/bar-script-engraver.cc +++ b/lily/bar-script-engraver.cc @@ -40,12 +40,12 @@ void Bar_script_engraver::do_acknowledge_element (Item *i) { Axis other_axis = Axis((axis_ + 1)%2); - if (staff_side_p_ && !staff_side_p_->dim_cache_[other_axis].parent_l_) + if (staff_side_p_ && !staff_side_p_->dim_cache_[other_axis]->parent_l_) { - staff_side_p_->dim_cache_[other_axis].parent_l_ - = &i->dim_cache_[other_axis]; - staff_side_p_->dim_cache_[axis_].parent_l_ - = &i->dim_cache_[axis_]; + staff_side_p_->dim_cache_[other_axis]->parent_l_ + = i->dim_cache_[other_axis]; + staff_side_p_->dim_cache_[axis_]->parent_l_ + = i->dim_cache_[axis_]; staff_side_p_->add_support (i); diff --git a/lily/bar.cc b/lily/bar.cc index 1d81947156..3c8f78452a 100644 --- a/lily/bar.cc +++ b/lily/bar.cc @@ -85,6 +85,6 @@ Bar::do_pre_processing () } if (type_str_ =="") - dim_cache_[X_AXIS].set_empty (true); + dim_cache_[X_AXIS]->set_empty (true); } diff --git a/lily/base-span-bar-engraver.cc b/lily/base-span-bar-engraver.cc index 53aa547cd5..1616106156 100644 --- a/lily/base-span-bar-engraver.cc +++ b/lily/base-span-bar-engraver.cc @@ -14,7 +14,6 @@ Base_span_bar_engraver::Base_span_bar_engraver() { spanbar_p_ =0; - valign_l_ =0; use_priority_b_ = true; break_priority_i_ = 0; } @@ -34,7 +33,7 @@ Base_span_bar_engraver::acknowledge_element (Score_element_info i) && dynamic_cast (i.elem_l_)) { bar_l_arr_.push (dynamic_cast (i.elem_l_)); - + if (bar_l_arr_.size() >= 2 && !spanbar_p_) /* hmm, i do want a bracket with one staff some times, but not always @@ -51,6 +50,7 @@ Base_span_bar_engraver::acknowledge_element (Score_element_info i) */ { spanbar_p_ = get_span_bar_p(); + spanbar_p_->dim_cache_[Y_AXIS]->parent_l_ = bar_l_arr_[0]->dim_cache_[Y_AXIS]; String visnam = String(name()) + "_visibility"; spanbar_p_->set_elt_property (visibility_lambda_scm_sym, @@ -63,7 +63,7 @@ Base_span_bar_engraver::acknowledge_element (Score_element_info i) } else { - spanbar_p_->dim_cache_[X_AXIS].parent_l_ = &bar_l_arr_[0]->dim_cache_[X_AXIS]; + spanbar_p_->dim_cache_[X_AXIS]->parent_l_ = bar_l_arr_[0]->dim_cache_[X_AXIS]; } announce_element (Score_element_info (spanbar_p_,0)); @@ -71,11 +71,6 @@ Base_span_bar_engraver::acknowledge_element (Score_element_info i) spanbar_p_-> type_str_ = bar_l_arr_[0]->type_str_; } } - else if (dynamic_cast (i.elem_l_) - && i.origin_grav_l_arr_.size() <= 2) - { - valign_l_ = dynamic_cast (i.elem_l_); - } } void @@ -85,7 +80,6 @@ Base_span_bar_engraver::do_pre_move_processing() { for (int i=0; i < bar_l_arr_.size() ; i++) spanbar_p_->add_bar (bar_l_arr_[i]); - spanbar_p_->set_align (valign_l_); typeset_element (spanbar_p_); spanbar_p_ =0; } diff --git a/lily/beam.cc b/lily/beam.cc index fdf2ef5d08..4626c1c5ee 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -50,7 +50,7 @@ Beam::add_stem (Stem*s) #if 0 if (!stems_.size ()) { - dim_cache_[Y_AXIS].parent_l_ = &s->dim_cache_[Y_AXIS]; + dim_cache_[Y_AXIS]->parent_l_ = s->dim_cache_[Y_AXIS]; } #endif stems_.push (s); diff --git a/lily/clef-item.cc b/lily/clef-item.cc index 75191ca344..9eb8d1b261 100644 --- a/lily/clef-item.cc +++ b/lily/clef-item.cc @@ -18,7 +18,7 @@ void Clef_item::do_pre_processing() { - dim_cache_[Y_AXIS].translate (y_position_i_ * staff_line_leading_f () / 2.0); + dim_cache_[Y_AXIS]->translate (y_position_i_ * staff_line_leading_f () / 2.0); SCM style_sym =get_elt_property (style_scm_sym); String style; if (style_sym != SCM_BOOL_F) @@ -29,7 +29,7 @@ Clef_item::do_pre_processing() if (style == "transparent") { set_elt_property (transparent_scm_sym, SCM_BOOL_T); - dim_cache_[X_AXIS].set_empty (true); + dim_cache_[X_AXIS]->set_empty (true); } } @@ -60,12 +60,12 @@ Clef_item::do_add_processing () g->text_str_ = "8"; g->style_str_ = "italic"; - g->dim_cache_[Y_AXIS].parent_l_ = &dim_cache_[Y_AXIS]; - g->dim_cache_[X_AXIS].parent_l_ = &dim_cache_[X_AXIS]; + g->dim_cache_[Y_AXIS]->parent_l_ = dim_cache_[Y_AXIS]; + g->dim_cache_[X_AXIS]->parent_l_ = dim_cache_[X_AXIS]; add_dependency (g); // just to be sure. Real r = do_height ()[d] - g->extent (Y_AXIS)[-d]; - g->dim_cache_[Y_AXIS].set_offset (r); + g->dim_cache_[Y_AXIS]->set_offset (r); SCM my_vis = get_elt_property (visibility_lambda_scm_sym); if (my_vis != SCM_BOOL_F) diff --git a/lily/encompass-info.cc b/lily/encompass-info.cc index 06b738e16a..0271eba297 100644 --- a/lily/encompass-info.cc +++ b/lily/encompass-info.cc @@ -81,8 +81,8 @@ Encompass_info::Encompass_info (Note_column const* note, Direction dir, Slur con interstaff_f_ = align->threshold_interval_[MIN]; - Dimension_cache * slur_refpoint = &slur_l->dim_cache_[Y_AXIS]; - Dimension_cache * note_refpoint = ¬e->dim_cache_[Y_AXIS]; + Dimension_cache * slur_refpoint = slur_l->dim_cache_[Y_AXIS]; + Dimension_cache * note_refpoint = note->dim_cache_[Y_AXIS]; while (slur_refpoint->parent_l_ != common) slur_refpoint = slur_refpoint->parent_l_; diff --git a/lily/g-script-column-engraver.cc b/lily/g-script-column-engraver.cc index 831f28bc64..d7116dcf76 100644 --- a/lily/g-script-column-engraver.cc +++ b/lily/g-script-column-engraver.cc @@ -59,7 +59,7 @@ G_script_column_engraver::acknowledge_element( Score_element_info inf) if (!thing) return; - Dimension_cache * parcache = thing->dim_cache_[Y_AXIS].parent_l_; + Dimension_cache * parcache = thing->dim_cache_[Y_AXIS]->parent_l_; if (!parcache || !thing) return ; diff --git a/lily/g-script-column.cc b/lily/g-script-column.cc index d6f3d8b9f8..d16a9cb795 100644 --- a/lily/g-script-column.cc +++ b/lily/g-script-column.cc @@ -12,7 +12,7 @@ static G_staff_side_item * get_g_staff_side (Item *i) { - Graphical_element *e1 = i->dim_cache_[Y_AXIS].parent_l_->element_l (); + Graphical_element *e1 = i->dim_cache_[Y_AXIS]->parent_l_->element_l (); return dynamic_cast(e1); } diff --git a/lily/g-script-engraver.cc b/lily/g-script-engraver.cc index aa167cb3bc..b7afb866f5 100644 --- a/lily/g-script-engraver.cc +++ b/lily/g-script-engraver.cc @@ -103,9 +103,9 @@ G_script_engraver::acknowledge_element (Score_element_info inf) { G_staff_side_item * ss = dynamic_cast(staff_side_p_arr_[i]); - if (!ss->dim_cache_[X_AXIS].parent_l_) + if (!ss->dim_cache_[X_AXIS]->parent_l_) { - ss->dim_cache_[X_AXIS].parent_l_ = &inf.elem_l_->dim_cache_[X_AXIS]; + ss->dim_cache_[X_AXIS]->parent_l_ = inf.elem_l_->dim_cache_[X_AXIS]; } ss->add_support (rh); } diff --git a/lily/g-script.cc b/lily/g-script.cc index cf3c595b77..d08a76800b 100644 --- a/lily/g-script.cc +++ b/lily/g-script.cc @@ -59,7 +59,7 @@ void G_script::do_pre_processing () { Graphical_element * e - = staff_side_l_->dim_cache_[X_AXIS].parent_l_->element_l(); + = staff_side_l_->dim_cache_[X_AXIS]->parent_l_->element_l(); translate_axis (e->extent (X_AXIS).center (), X_AXIS); } @@ -76,7 +76,7 @@ G_script::set_staff_side (G_staff_side_item*g) { staff_side_l_ = g; add_dependency (g); - dim_cache_[Y_AXIS].parent_l_ = & g->dim_cache_[Y_AXIS]; + dim_cache_[Y_AXIS]->parent_l_ = g->dim_cache_[Y_AXIS]; } Molecule* diff --git a/lily/g-staff-side.cc b/lily/g-staff-side.cc index 865eb478ad..91a6a18195 100644 --- a/lily/g-staff-side.cc +++ b/lily/g-staff-side.cc @@ -46,7 +46,7 @@ G_staff_side_item::set_victim (Score_element *e) { add_dependency (e); to_position_l_ = e; - to_position_l_->dim_cache_[axis_].parent_l_ = &dim_cache_[axis_]; + to_position_l_->dim_cache_[axis_]->parent_l_ = dim_cache_[axis_]; } void @@ -89,7 +89,7 @@ G_staff_side_item::position_self () } } else - common = dim_cache_[axis_].parent_l_; + common = dim_cache_[axis_]->parent_l_; if (dim.empty_b ()) { @@ -102,7 +102,7 @@ G_staff_side_item::position_self () ? to_position_l_->extent (axis_) : Interval(0,0); - Real off = dim_cache_[axis_].relative_coordinate (common); + Real off = dim_cache_[axis_]->relative_coordinate (common); SCM pad = remove_elt_property (padding_scm_sym); if (pad != SCM_BOOL_F) @@ -110,7 +110,7 @@ G_staff_side_item::position_self () off += gh_scm2double (SCM_CDR(pad)) * dir_; } Real total_off = dim[dir_] - sym_dim[-dir_] + off; - dim_cache_[axis_].set_offset (total_off); + dim_cache_[axis_]->set_offset (total_off); if (fabs (total_off) > 100 CM) programming_error ("Huh ? Improbable staff side dim."); } diff --git a/lily/graphical-axis-group.cc b/lily/graphical-axis-group.cc index b26e805518..05b70e5cf1 100644 --- a/lily/graphical-axis-group.cc +++ b/lily/graphical-axis-group.cc @@ -44,10 +44,10 @@ Graphical_axis_group::add_element (Graphical_element*e) { Axis a = axes_[i]; assert (a>=0); - Dimension_cache * &d = e->dim_cache_[a].parent_l_; - assert (!d || d == &dim_cache_[a]); - d = &dim_cache_[a]; - d->dependencies_l_arr_.push (&dim_cache_[a]); + Dimension_cache * &d = e->dim_cache_[a]->parent_l_; + assert (!d || d == dim_cache_[a]); + d = dim_cache_[a]; + d->dependencies_l_arr_.push (dim_cache_[a]); } elem_l_arr_.push (e); @@ -67,9 +67,9 @@ Graphical_axis_group::remove_element (Graphical_element*e) for (int i=0; i< 2; i++) { Axis a=axes_[i]; - Dimension_cache * d = &e->dim_cache_[a]; + Dimension_cache * d = e->dim_cache_[a]; d->parent_l_ = 0; - d->dependencies_l_arr_.unordered_substitute (&dim_cache_[a], 0); + d->dependencies_l_arr_.unordered_substitute (dim_cache_[a], 0); } } @@ -82,7 +82,7 @@ Graphical_axis_group::remove_all () for (int i=0; i< 2; i++) { Axis a=axes_[i]; - Dimension_cache * d = &e->dim_cache_[a]; + Dimension_cache * d = e->dim_cache_[a]; d->parent_l_ = 0; d->dependencies_l_arr_.clear (); } diff --git a/lily/graphical-element.cc b/lily/graphical-element.cc index 975b1ffe7a..10daaef6c1 100644 --- a/lily/graphical-element.cc +++ b/lily/graphical-element.cc @@ -12,13 +12,17 @@ Graphical_element::Graphical_element () { + dim_cache_[X_AXIS] = new Dimension_cache; + dim_cache_[Y_AXIS] = new Dimension_cache; used_b_ = false; init (); } Graphical_element::Graphical_element (Graphical_element const &s) - : dim_cache_ (s.dim_cache_) { + dim_cache_[X_AXIS] = new Dimension_cache (*s.dim_cache_[X_AXIS]); + dim_cache_[Y_AXIS] = new Dimension_cache (*s.dim_cache_[Y_AXIS]); + used_b_ = true; init (); } @@ -26,40 +30,31 @@ Graphical_element::Graphical_element (Graphical_element const &s) void Graphical_element::init () { - dim_cache_[X_AXIS].elt_l_ = dim_cache_[Y_AXIS].elt_l_ = this; + dim_cache_[X_AXIS]->elt_l_ = dim_cache_[Y_AXIS]->elt_l_ = this; } Real Graphical_element::absolute_coordinate (Axis a) const { - return dim_cache_[a].absolute_coordinate (); -} - - -Offset -Graphical_element::absolute_offset() const -{ - return Offset (absolute_coordinate (X_AXIS), absolute_coordinate (Y_AXIS)); + return dim_cache_[a]->absolute_coordinate (); } - - void Graphical_element::translate_axis (Real y, Axis a) { - dim_cache_[a].translate (y); + dim_cache_[a]->translate (y); } Real Graphical_element::relative_coordinate (Dimension_cache*e, Axis a) const { - return dim_cache_[a].relative_coordinate (e); + return dim_cache_[a]->relative_coordinate (e); } Dimension_cache * Graphical_element::common_group (Graphical_element const* s, Axis a) const { - return dim_cache_[a].common_group (&s->dim_cache_[a]); + return dim_cache_[a]->common_group (s->dim_cache_[a]); } void @@ -73,14 +68,14 @@ Graphical_element::translate (Offset offset) void Graphical_element::set_empty (bool b) { - dim_cache_[X_AXIS].set_empty (b); - dim_cache_[Y_AXIS].set_empty (b); + dim_cache_[X_AXIS]->set_empty (b); + dim_cache_[Y_AXIS]->set_empty (b); } Interval Graphical_element::extent (Axis a) const { - Dimension_cache const * d = &dim_cache_[a]; + Dimension_cache const * d = dim_cache_[a]; if (d->empty_b ()) return Interval (); @@ -102,27 +97,29 @@ Graphical_element::do_print () const void Graphical_element::invalidate_cache (Axis a) { - dim_cache_[a].invalidate (); + dim_cache_[a]->invalidate (); } Graphical_element* Graphical_element::parent_l (Axis a) const { - Dimension_cache*d= dim_cache_[a].parent_l_; + Dimension_cache*d= dim_cache_[a]->parent_l_; return d ? d->elt_l_ : 0; } Graphical_element::~Graphical_element () { + delete dim_cache_[X_AXIS]; + delete dim_cache_[Y_AXIS]; } Dimension_cache * Graphical_element::common_group (Link_array gs, Axis a) const { - Dimension_cache * common = &dim_cache_[a]; + Dimension_cache * common = dim_cache_[a]; for (int i=0; i < gs.size (); i++) { - common = common->common_group (&gs[i]->dim_cache_[a]); + common = common->common_group (gs[i]->dim_cache_[a]); } return common; diff --git a/lily/include/base-span-bar-engraver.hh b/lily/include/base-span-bar-engraver.hh index 47c274d758..87a24103c3 100644 --- a/lily/include/base-span-bar-engraver.hh +++ b/lily/include/base-span-bar-engraver.hh @@ -15,14 +15,17 @@ class Axis_align_spanner; /** Make bars that span multiple "staffs". Catch bars, and span a - Span_bar over them if we find more than 2 bars + Span_bar over them if we find more than 2 bars. Vertical alignment + of staffs changes the appearance of spanbars. It is up to the + aligner (Vertical_align_engraver, in this case, to add extra + dependencies to the spanbars. */ class Base_span_bar_engraver : public Engraver { Span_bar * spanbar_p_; Array bar_l_arr_; - Axis_align_spanner * valign_l_; + public: VIRTUAL_COPY_CONS(Translator); diff --git a/lily/include/graphical-element.hh b/lily/include/graphical-element.hh index bc60c0b41a..c84a21f717 100644 --- a/lily/include/graphical-element.hh +++ b/lily/include/graphical-element.hh @@ -25,7 +25,7 @@ class Graphical_element { void init (); public: - Dimension_cache dim_cache_[NO_AXES]; + Dimension_cache *dim_cache_[NO_AXES]; /** Set this if anyone points to me, or if I point to anyone. @@ -42,7 +42,7 @@ public: Interval extent (Axis) const; /** - translate the symbol. The symbol does not have to be created yet. + translate the symbol. */ void translate (Offset); /** @@ -52,7 +52,6 @@ public: void translate_axis (Real, Axis); Real relative_coordinate (Dimension_cache*group, Axis) const; - Offset absolute_offset() const; Real absolute_coordinate (Axis) const; /** Find the group-element which has both #this# and #s# diff --git a/lily/include/span-bar.hh b/lily/include/span-bar.hh index f55c5f8626..9290b5ae35 100644 --- a/lily/include/span-bar.hh +++ b/lily/include/span-bar.hh @@ -26,7 +26,6 @@ class Span_bar : public Bar Link_array spanning_l_arr_; Interval get_spanned_interval () const; public: - Real extra_x_off_; Span_bar(); VIRTUAL_COPY_CONS(Score_element); @@ -34,6 +33,7 @@ public: void set_align (Align_element *); protected: void evaluate_empty (); + virtual Interval do_width() const; virtual void do_pre_processing(); virtual void do_post_processing(); diff --git a/lily/ineq-constrained-qp.cc b/lily/ineq-constrained-qp.cc index 2863799a59..7de0df5951 100644 --- a/lily/ineq-constrained-qp.cc +++ b/lily/ineq-constrained-qp.cc @@ -271,6 +271,7 @@ void Ineq_constrained_qp::print() const { #ifndef NPRINT + DOUT << "Ineq_constrained_qp { " << '\n'; DOUT << "Quad " << quad_; DOUT << "lin " << lin_ << '\n' << "const " << const_term_<< '\n'; @@ -279,5 +280,6 @@ Ineq_constrained_qp::print() const DOUT << "constraint["<= " << consrhs_[i]; DOUT << '\n'; } + DOUT << "}\n"; #endif } diff --git a/lily/item.cc b/lily/item.cc index 525e1e1e2a..f74418df8d 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -187,8 +187,8 @@ Item::handle_prebroken_dependents () Item * broken_self = find_prebroken_piece (d); Item * broken_parent = parent->find_prebroken_piece (d); - broken_self->dim_cache_[X_AXIS].parent_l_ = - &broken_parent->dim_cache_[X_AXIS]; + broken_self->dim_cache_[X_AXIS]->parent_l_ = + broken_parent->dim_cache_[X_AXIS]; /* ugh. Should do this is after breaking? @@ -204,8 +204,8 @@ Item::handle_prebroken_dependents () programming_error ("Vertical refpoint lost!"); else if (yparenti) { - broken_self->dim_cache_[Y_AXIS].parent_l_ = - &broken_yparent->dim_cache_[Y_AXIS]; + broken_self->dim_cache_[Y_AXIS]->parent_l_ = + broken_yparent->dim_cache_[Y_AXIS]; } } } diff --git a/lily/lookup.cc b/lily/lookup.cc index efe249977a..846e2614eb 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -140,12 +140,17 @@ Molecule Lookup::simple_bar (String type, Real h) const { SCM thick = ly_symbol ("barthick_" + type); - Real w = 0.1 PT; + Real w = 0.0; + if (paper_l_->scope_p_->elem_b (thick)) { w = paper_l_->get_realvar (thick); } - + else + { + programming_error ("No bar thickness set ! "); + w = 1 PT; + } return filledbox (Box (Interval(0,w), Interval(-h/2, h/2))); } @@ -600,10 +605,196 @@ Molecule Lookup::accordion (SCM s) const { Molecule m; - - /* - Tom: go ahead. - */ - return m; - + String sym = ly_scm2string(SCM_CAR(s)); + String reg = ly_scm2string(SCM_CAR(SCM_CDR(s))); + Real interline_f = paper_l_->get_realvar(interline_scm_sym); + if (sym == "Discant") + { + Molecule r = afm_find("scripts-accDiscant"); + m.add_molecule(r); + if (reg.left_str(1) == "F") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 2.5 PT, Y_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + int eflag = 0x00; + if (reg.left_str(3) == "EEE") + { + eflag = 0x07; + reg = reg.right_str(reg.length_i()-3); + } + else if (reg.left_str(2) == "EE") + { + eflag = 0x05; + reg = reg.right_str(reg.length_i()-2); + } + else if (reg.left_str(2) == "Eh") + { + eflag = 0x04; + reg = reg.right_str(reg.length_i()-2); + } + else if (reg.left_str(1) == "E") + { + eflag = 0x02; + reg = reg.right_str(reg.length_i()-1); + } + if (eflag & 0x02) + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 1.5 PT, Y_AXIS); + m.add_molecule(d); + } + if (eflag & 0x04) + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 1.5 PT, Y_AXIS); + d.translate_axis(0.8 * interline_f PT, X_AXIS); + m.add_molecule(d); + } + if (eflag & 0x01) + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 1.5 PT, Y_AXIS); + d.translate_axis(-0.8 * interline_f PT, X_AXIS); + m.add_molecule(d); + } + if (reg.left_str(2) == "SS") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(0.5 * interline_f PT, Y_AXIS); + d.translate_axis(0.4 * interline_f PT, X_AXIS); + m.add_molecule(d); + d.translate_axis(-0.8 * interline_f PT, X_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-2); + } + if (reg.left_str(1) == "S") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(0.5 * interline_f PT, Y_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + } + else if (sym == "Freebase") + { + Molecule r = afm_find("scripts-accFreebase"); + m.add_molecule(r); + if (reg.left_str(1) == "F") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 1.5 PT, Y_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + if (reg == "E") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 0.5 PT, Y_AXIS); + m.add_molecule(d); + } + } + else if (sym == "Bayanbase") + { + Molecule r = afm_find("scripts-accBayanbase"); + m.add_molecule(r); + if (reg.left_str(1) == "T") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 2.5 PT, Y_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + /* include 4' reed just for completeness. You don't want to use this. */ + if (reg.left_str(1) == "F") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 1.5 PT, Y_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + if (reg.left_str(2) == "EE") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 0.5 PT, Y_AXIS); + d.translate_axis(0.4 * interline_f PT, X_AXIS); + m.add_molecule(d); + d.translate_axis(-0.8 * interline_f PT, X_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-2); + } + if (reg.left_str(1) == "E") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 0.5 PT, Y_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + } + else if (sym == "Stdbase") + { + Molecule r = afm_find("scripts-accStdbase"); + m.add_molecule(r); + if (reg.left_str(1) == "T") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 3.5 PT, Y_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + if (reg.left_str(1) == "F") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 2.5 PT, Y_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + if (reg.left_str(1) == "M") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 2 PT, Y_AXIS); + d.translate_axis(interline_f PT, X_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + if (reg.left_str(1) == "E") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 1.5 PT, Y_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + if (reg.left_str(1) == "S") + { + Molecule d = afm_find("scripts-accDot"); + d.translate_axis(interline_f * 0.5 PT, Y_AXIS); + m.add_molecule(d); + reg = reg.right_str(reg.length_i()-1); + } + } + /* ugh maybe try to use regular font for S.B. and B.B and only use one font + for the rectangle */ + else if (sym == "SB") + { + Molecule r = afm_find("scripts-accSB"); + m.add_molecule(r); + } + else if (sym == "BB") + { + Molecule r = afm_find("scripts-accBB"); + m.add_molecule(r); + } + else if (sym == "OldEE") + { + Molecule r = afm_find("scripts-accOldEE"); + m.add_molecule(r); + } + else if (sym == "OldEES") + { + Molecule r = afm_find("scripts-accOldEES"); + m.add_molecule(r); + } + return m; } diff --git a/lily/my-lily-parser.cc b/lily/my-lily-parser.cc index 996cc8c569..b787e2a8d5 100644 --- a/lily/my-lily-parser.cc +++ b/lily/my-lily-parser.cc @@ -69,6 +69,8 @@ My_lily_parser::parse_file (String init, String s) } inclusion_global_array = lexer_p_->filename_str_arr_; + + error_level_i_ = error_level_i_ | lexer_p_->errorlevel_i_; // ugh naming. } void diff --git a/lily/parser.yy b/lily/parser.yy index 64850abe4f..e6b06a3120 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -863,7 +863,7 @@ property_def: ; scalar: - STRING { $$ = new Scalar (*$1); delete $1; } + string { $$ = new Scalar (*$1); delete $1; } | int { $$ = new Scalar ($1); } ; @@ -1560,3 +1560,4 @@ My_lily_parser::do_yyparse () } + diff --git a/lily/score-element.cc b/lily/score-element.cc index 3b11a3e51b..7be075b6ec 100644 --- a/lily/score-element.cc +++ b/lily/score-element.cc @@ -27,7 +27,7 @@ Interval Score_element::dim_cache_callback (Dimension_cache*c) { Score_element * e =dynamic_cast( c->element_l()); - if(&e->dim_cache_[X_AXIS] == c) + if(e->dim_cache_[X_AXIS] == c) return e->do_width (); else return e->do_height (); @@ -36,8 +36,8 @@ Score_element::dim_cache_callback (Dimension_cache*c) Score_element::Score_element() { output_p_ =0; - dim_cache_[X_AXIS].set_callback (dim_cache_callback); - dim_cache_[Y_AXIS].set_callback (dim_cache_callback); + dim_cache_[X_AXIS]->set_callback (dim_cache_callback); + dim_cache_[Y_AXIS]->set_callback (dim_cache_callback); used_b_ = false; pscore_l_=0; lookup_l_ =0; @@ -214,8 +214,10 @@ Score_element::output_processing () delete output_p_; output_p_ = do_brew_molecule_p (); + Offset o (absolute_coordinate (X_AXIS), absolute_coordinate (Y_AXIS)); + pscore_l_->outputter_l_->output_molecule (output_p_, - absolute_offset (), + o, classname(this)); pscore_l_->schedule_for_delete (this); diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc index 90fb553a55..8938ebd8fe 100644 --- a/lily/score-engraver.cc +++ b/lily/score-engraver.cc @@ -145,7 +145,7 @@ Score_engraver::typeset_all() musical_column_l_->add_element(item_p); } } - if (!elem_p->dim_cache_[Y_AXIS].parent_l_) + if (!elem_p->dim_cache_[Y_AXIS]->parent_l_) scoreline_l_->add_element (elem_p); } elem_p_arr_.clear(); diff --git a/lily/score-priority-engraver.cc b/lily/score-priority-engraver.cc index 1082aa8308..463cff1ca1 100644 --- a/lily/score-priority-engraver.cc +++ b/lily/score-priority-engraver.cc @@ -57,7 +57,7 @@ Score_priority_engraver::acknowledge_element (Score_element_info inf) { if (Item * item_l = dynamic_cast (inf.elem_l_)) { - Dimension_cache * c = &item_l->dim_cache_[X_AXIS]; + Dimension_cache * c = item_l->dim_cache_[X_AXIS]; if (c->empty_b () || c->parent_l_) return; diff --git a/lily/single-malt-grouping-item.cc b/lily/single-malt-grouping-item.cc index 025d7f99f0..6d5e2e1767 100644 --- a/lily/single-malt-grouping-item.cc +++ b/lily/single-malt-grouping-item.cc @@ -46,7 +46,7 @@ Single_malt_grouping_item::my_width () const Interval iv (il->extent (X_AXIS)); if (!iv.empty_b ()) { - Real off = il->relative_coordinate (&pc->dim_cache_[X_AXIS], X_AXIS); + Real off = il->relative_coordinate (pc->dim_cache_[X_AXIS], X_AXIS); w.unite (iv + off); } } diff --git a/lily/span-bar.cc b/lily/span-bar.cc index 487f2b11d4..b9a435b4cc 100644 --- a/lily/span-bar.cc +++ b/lily/span-bar.cc @@ -27,15 +27,6 @@ Span_bar::do_substitute_element_pointer (Score_element*o, Score_element*n) spanning_l_arr_.unordered_substitute (o, n); } -void -Span_bar::set_align (Align_element *a) -{ - add_dependency (a); - Score_element * e = dynamic_cast(a); - Item * i = dynamic_cast (e); - e = dynamic_cast (a); - i = dynamic_cast(e); -} Interval Span_bar::do_width () const @@ -51,9 +42,8 @@ Span_bar::do_pre_processing () Bar::do_pre_processing (); evaluate_empty (); - translate_axis (extra_x_off_, X_AXIS); - dim_cache_[Y_AXIS].set_empty (false); // a hack to make mark scripts work. + dim_cache_[Y_AXIS]->set_empty (false); // a hack to make mark scripts work. } void @@ -98,8 +88,8 @@ Span_bar::get_spanned_interval () const Dimension_cache*common = common_group (spanning_l_arr_[i], Y_AXIS); - Real y = spanning_l_arr_[i]->dim_cache_[Y_AXIS].relative_coordinate (common) - -dim_cache_[Y_AXIS].relative_coordinate (common); + Real y = spanning_l_arr_[i]->dim_cache_[Y_AXIS]->relative_coordinate (common) + -dim_cache_[Y_AXIS]->relative_coordinate (common); y_int.unite (y + spanning_l_arr_[i]->extent(Y_AXIS)); } @@ -124,7 +114,7 @@ Span_bar::do_brew_molecule_p () const } else { - warning("Huh? My children deflated (FIXME)"); + programming_error("Huh? My children deflated (FIXME)"); } return output; } @@ -134,5 +124,4 @@ Span_bar::do_brew_molecule_p () const Span_bar::Span_bar () { type_str_ = ""; - extra_x_off_ = 0.0; } diff --git a/lily/span-score-bar-engraver.cc b/lily/span-score-bar-engraver.cc index 863d33d789..d494cdd204 100644 --- a/lily/span-score-bar-engraver.cc +++ b/lily/span-score-bar-engraver.cc @@ -33,7 +33,7 @@ Span_bar* Piano_bar_engraver::get_span_bar_p () const { Span_bar *s= new Span_bar; - s->dim_cache_[X_AXIS].set_empty (true); + s->dim_cache_[X_AXIS]->set_empty (true); s->type_str_ = "{"; return s; } @@ -42,7 +42,7 @@ Span_bar* Staff_group_bar_engraver::get_span_bar_p () const { Span_bar *s= new Span_bar; - s->dim_cache_[X_AXIS].set_empty (true); + s->dim_cache_[X_AXIS]->set_empty (true); s->type_str_ = "["; return s; } @@ -54,7 +54,8 @@ Staff_group_bar_engraver::acknowledge_element (Score_element_info i) if (Span_bar * b = dynamic_cast (i.elem_l_)) { if (b->type_str_ == "{") - b->extra_x_off_ -= paper_l ()->get_realvar (interline_scm_sym); // ugh + b->translate_axis ( -paper_l ()->get_realvar (interline_scm_sym), + X_AXIS); // ugh } } diff --git a/lily/spanner.cc b/lily/spanner.cc index d5ac3fff5f..32a047cf8f 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -130,7 +130,8 @@ Spanner::output_processing () output_p_ = do_brew_molecule_p (); Offset left_off (spanned_drul_[LEFT]->absolute_coordinate(X_AXIS), 0); - Offset o = absolute_offset() + left_off; + Offset o (absolute_coordinate (X_AXIS), absolute_coordinate (Y_AXIS)); + o += left_off; pscore_l_->outputter_l_->output_molecule (output_p_, o, classname (this)); } diff --git a/lily/stem-info.cc b/lily/stem-info.cc index 94877eb9fa..6935bf3909 100644 --- a/lily/stem-info.cc +++ b/lily/stem-info.cc @@ -122,8 +122,8 @@ Stem_info::Stem_info (Stem*s, int mult) interstaff_f_ = align->threshold_interval_[MIN] / internote_f; - Dimension_cache * beam_refpoint = &beam_l->dim_cache_[Y_AXIS]; - Dimension_cache * stem_refpoint = &stem_l_->dim_cache_[Y_AXIS]; + Dimension_cache * beam_refpoint = beam_l->dim_cache_[Y_AXIS]; + Dimension_cache * stem_refpoint = stem_l_->dim_cache_[Y_AXIS]; while (beam_refpoint->parent_l_ != common) beam_refpoint = beam_refpoint->parent_l_; diff --git a/lily/text-engraver.cc b/lily/text-engraver.cc index e673126b2b..0f0a5d27d9 100644 --- a/lily/text-engraver.cc +++ b/lily/text-engraver.cc @@ -103,7 +103,7 @@ Text_engraver::do_process_requests () Scalar empty = get_property ("textEmptyDimension", 0); if (empty.to_bool ()) { - text->dim_cache_[X_AXIS].set_empty (true); + text->dim_cache_[X_AXIS]->set_empty (true); } announce_element (Score_element_info (text, r)); diff --git a/lily/vertical-align-engraver.cc b/lily/vertical-align-engraver.cc index 69f2978520..891c1b98d1 100644 --- a/lily/vertical-align-engraver.cc +++ b/lily/vertical-align-engraver.cc @@ -11,6 +11,7 @@ #include "vertical-align-engraver.hh" #include "axis-align-spanner.hh" #include "axis-group-spanner.hh" +#include "span-bar.hh" Vertical_align_engraver::Vertical_align_engraver() { @@ -60,8 +61,14 @@ Vertical_align_engraver::qualifies_b (Score_element_info i) const Translator * t = i.origin_grav_l_arr_[0]; int sz = i.origin_grav_l_arr_.size() ; +#if 0 return (sz == 1 && dynamic_cast (t)) || (sz == 2 && dynamic_cast (t)); +#endif + + Axis_group_element * elt = dynamic_cast (i.elem_l_); + + return sz > 1 && elt && elt->axes_[0] == Y_AXIS && !elt->parent_l (Y_AXIS); } void @@ -71,6 +78,10 @@ Vertical_align_engraver::acknowledge_element (Score_element_info i) { valign_p_->add_element (i.elem_l_); } + else if (dynamic_cast(i.elem_l_) && i.origin_grav_l_arr_.size ()) + { + i.elem_l_->add_dependency (valign_p_); + } } diff --git a/ly/engraver.ly b/ly/engraver.ly index 123d8fb627..45bbe4ac3e 100644 --- a/ly/engraver.ly +++ b/ly/engraver.ly @@ -59,7 +59,6 @@ StaffContext=\translator { \translator { \type "Engraver_group_engraver"; \name ChoirStaff; - \consists "Vertical_align_engraver"; alignmentReference = \center; \consists "Staff_group_bar_engraver"; \consistsend "Axis_group_engraver"; @@ -122,21 +121,22 @@ GrandStaffContext=\translator{ \type "Engraver_group_engraver"; \name GrandStaff; \consists "Span_bar_engraver"; - \consists "Vertical_align_engraver"; \consists "Piano_bar_engraver"; - alignmentReference = \center; - minVerticalAlign = 1.5*\staffheight; - \consistsend "Axis_group_engraver"; + \accepts "Staff"; }; \translator{\GrandStaffContext} PianoStaffContext = \translator{\GrandStaffContext + alignmentReference = \center; + + \consists "Vertical_align_engraver"; minVerticalAlign = 3.0*\staffheight; maxVerticalAlign = 3.0*\staffheight; +% \consistsend "Axis_group_engraver"; \name "PianoStaff"; }; @@ -144,8 +144,7 @@ PianoStaffContext = \translator{\GrandStaffContext StaffGroupContext= \translator { \type "Engraver_group_engraver"; \consists "Span_bar_engraver"; - \consists "Vertical_align_engraver"; - alignmentReference = \center; + \consists "Staff_group_bar_engraver"; \name StaffGroup; @@ -175,7 +174,6 @@ StaffGroupContext= \translator { \translator { \type "Engraver_group_engraver"; \name Lyrics; - \consists "Vertical_align_engraver"; \consistsend "Axis_group_engraver"; \accepts "LyricVoice"; @@ -194,7 +192,6 @@ StaffGroupContext= \translator { ChordNameContext = \translator { \type "Engraver_group_engraver"; \name ChordNames; - \consists "Vertical_align_engraver"; \accepts "ChordNameVoice"; \consistsend "Axis_group_engraver"; }; diff --git a/ly/init.sly b/ly/init.sly index 3b7c183d70..0395103e5f 100644 --- a/ly/init.sly +++ b/ly/init.sly @@ -1,6 +1,6 @@ % Toplevel initialisation file. -\version "1.0.15"; +\version "1.0.16"; \include "declarations.ly" @@ -11,6 +11,7 @@ } \paper { linewidth=-1.0; + indent = 0.0; } \midi{ } } diff --git a/ly/params.ly b/ly/params.ly index c9c66b941d..c18c9a85f4 100644 --- a/ly/params.ly +++ b/ly/params.ly @@ -120,6 +120,7 @@ bar_kern = 3.0 * \staffline; bar_thinkern = 3.0 * \staffline; barthick_thick = 6.0* \staffline; barthick_thin = 1.6*\staffline; +barthick_score = 1.6*\staffline; tuplet_thick = 1.0*\staffline; volta_thick = 1.6*\staffline; diff --git a/mf/feta-bolletjes.mf b/mf/feta-bolletjes.mf index 9e15f6fed1..0fdc2bdc6a 100644 --- a/mf/feta-bolletjes.mf +++ b/mf/feta-bolletjes.mf @@ -62,26 +62,23 @@ def draw_brevis(expr brevwid) = enddef; -save uitsteek; - uitsteek = .25; -def draw_ledger(expr wid)= - set_char_box(uitsteek * wid, (1+ uitsteek)*wid, - ledgerlinethickness#/2,ledgerlinethickness#/2); - pickup pencircle scaled ledgerlinethickness; - rt x2 = w; - lft x1 = -b; - y1 = y2 = 0; - draw z1 .. z2; -enddef; fet_beginchar("Ledger ending", "ledgerending", "ledgerending") set_char_box (5/2 ledgerlinethickness#, 5/2 ledgerlinethickness#, ledgerlinethickness#/2,ledgerlinethickness#/2); - pickup pencircle scaled ledgerlinethickness; - lft x1 = -b ; + pickup pencircle scaled 1.3 blot_diameter; + rt x2 = w; - y1 =0; y2 =0; - draw z1 .. z2; + lft x1 = -b; + x3 = x2; + bot y1 = -d; + y2 = y1; + + top y3 = h; + y4 = y3; + x4 = x1; + + filldraw z1 --- z2 --- z3 --- z4 --- cycle ; fet_endchar; fet_beginchar("Brevis notehead", "-1", "brevishead") diff --git a/mf/feta-generic.mf b/mf/feta-generic.mf index 58be0e4576..4d38b9e1dd 100644 --- a/mf/feta-generic.mf +++ b/mf/feta-generic.mf @@ -14,7 +14,7 @@ if test = -1: fi mode_setup; - +% input feta-macros; @@ -35,9 +35,9 @@ if test = 0: input feta-klef; input feta-timesig; else: -% input feta-bolletjes; + input feta-bolletjes; % input feta-banier; - input feta-eindelijk; +% input feta-eindelijk; % input feta-klef; % input feta-toevallig; % input feta-schrift; diff --git a/mf/feta-test11.mf b/mf/feta-test11.mf new file mode 100644 index 0000000000..4bec669221 --- /dev/null +++ b/mf/feta-test11.mf @@ -0,0 +1,21 @@ +% feta-test16 +% part of LilyPond's pretty-but-neat music font + +input feta-autometric; +fet_beginfont("feta-test", 16); +staffsize#:=11pt#; +test:=1; + +% smoked cheese +% test := -1; + + +% dem piksels. +%test := 1; + +input feta-generic; + +fet_endfont("feta"); + +end. + diff --git a/mf/feta-test26.mf b/mf/feta-test26.mf new file mode 100644 index 0000000000..e51a6ce12a --- /dev/null +++ b/mf/feta-test26.mf @@ -0,0 +1,21 @@ +% feta-test16 +% part of LilyPond's pretty-but-neat music font + +input feta-autometric; +fet_beginfont("feta-test", 16); +staffsize#:=26pt#; +test:=1; + +% smoked cheese +% test := -1; + + +% dem piksels. +%test := 1; + +input feta-generic; + +fet_endfont("feta"); + +end. + diff --git a/stepmake/stepmake/tex-vars.make b/stepmake/stepmake/tex-vars.make index 841db19676..6d7b52cba4 100644 --- a/stepmake/stepmake/tex-vars.make +++ b/stepmake/stepmake/tex-vars.make @@ -1,2 +1,3 @@ - #empty + +export TEXPICTS:=$(outdir)$(PATHSEP)$(TEXPICTS)