From: Han-Wen Nienhuys Date: Wed, 9 Dec 1998 13:23:24 +0000 (+0100) Subject: release: 1.1.14 X-Git-Tag: release/1.1.14 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=ee0dca4cea06f2d354cb33d935033116e88a3dba;p=lilypond.git release: 1.1.14 --- diff --git a/Documentation/man/lilypond.yo b/Documentation/man/lilypond.yo index 45e87bde23..0268efdc9f 100644 --- a/Documentation/man/lilypond.yo +++ b/Documentation/man/lilypond.yo @@ -53,9 +53,6 @@ dit(--include, -I=DIRECTORY) Add file(DIRECTORY) to the search path for input files. dit(--ignore-version, -V) Make incompatible mudela version non-fatal. -dit(--find-fourths, -Q) - Warn about melodic intervals larger than a fourth. Useful for - converting absolute octave mode stuff to relative octaves. ) manpagesection(FEATURES) diff --git a/Documentation/man/out/lilypond.1 b/Documentation/man/out/lilypond.1 index 4cea9bf664..9c844fb6b0 100644 --- a/Documentation/man/out/lilypond.1 +++ b/Documentation/man/out/lilypond.1 @@ -13,8 +13,8 @@ LilyPond is the GNU Project music typesetter\&. This program can print beautiful sheet music from a music definition file\&. It can also play mechanical performances to a MIDI file\&. Features include multiple staffs, meters, clefs, keys, lyrics, versatile input language, cadenzas, -beams, slurs, triplets, formatting scores, part extraction\&. It includes -a nice font of musical symbols\&. +beams, slurs, triplets, named chords, transposing, formatting scores, +part extraction\&. It includes a nice font of musical symbols\&. .PP .SH "OPTIONS" .IP "-I,--include=FILE" @@ -46,9 +46,6 @@ Set init file to \fBFILE\fP (default: \fBinit\&.ly\fP)\&. Add \fBDIRECTORY\fP to the search path for input files\&. .IP "--ignore-version, -V" Make incompatible mudela version non-fatal\&. -.IP "--find-fourths, -Q" -Warn about melodic intervals larger than a fourth\&. Useful for -converting absolute octave mode stuff to relative octaves\&. .PP .SH "FEATURES" .PP diff --git a/Documentation/tex/computer-notation.bib b/Documentation/tex/computer-notation.bib index b5d801d431..eaa4ba8043 100644 --- a/Documentation/tex/computer-notation.bib +++ b/Documentation/tex/computer-notation.bib @@ -24,6 +24,7 @@ year = 1986 } +% byrd @PhdThesis {byrd85, year = {1985}, title = {Music Notation by Computer}, @@ -31,6 +32,15 @@ school = {Indiana University}, } +@Article {byrd74, + year = {1974}, + title = {A System for Music Printing by Computer}, + author = {Donald Byrd}, + journal = {Computers and the Humanities}, + volume ={8}, + pages ={161-72}, +} + @Article{byrd94, author = {Donald Byrd}, title = {Music Notation Software and Intelligence}, @@ -43,22 +53,24 @@ pages = {17--20}, note = {Byrd (author of Nightinggale) shows four problematic fragments of notation, and rants about notation programs that try to exhibit intelligent behaviour. HWN} - } -@Article{erickson75, - author = {R. F. Erickson}, +@Article{ericson75, + author = {R. F. Ericson}, title = {The DARMS Project: A status report}, journal = {Computing in the humanities}, year = 1975, volume = 9, number = 6, pages = {291--298} + + note = {Gourlay\cite{gourlay86} writes: A discussion of the design + and potential uses of the DARMS music-description language.} } -c + @Article{field-richards93, author = {H.S. Field-Richards}, title = {Cadenza: A Music Description Language}, @@ -70,7 +82,6 @@ c note = {A description through examples of a music entry language. Apparently it has no formal semantics. There is also no implementation of notation convertor. HWN} - } @@ -156,30 +167,17 @@ note = {A no-science-here review of Encore. HWN} } -@Article {byrd74, - year = {1974}, - title = {A System for Music Printing by Computer}, - author = {Donald Byrd}, - journal = {Computers and the Humanities}, - volume ={8}, - pages ={161-72}, -} - - @Book {smith73, - note = {If I remember correctly, this was concerned more with an input language than with the typography. SP}, year = {1973}, title = {Editing and Printing Music by Computer}, author = {Leland Smith}, totalentry = {Journal of Music Theory}, volume={17}, pages ={292-309}, + note = {Gourlay\cite{gourlay86} writes: A discussion of Smith's music-printing system} } - - - @InProceedings{montel97, author = {Dominique Montel}, title = {La gravure de la musique, lisibilit\'e esth\'etique, respect de l'oevre}, @@ -189,6 +187,8 @@ note = {A no-science-here review of Encore. HWN} editors ={Genevois \& Orlarey} } + +% Gomberg @PhdThesis {gomber75, year = {1975}, title = {A Computer-Oriented System for Music Printing}, @@ -196,6 +196,21 @@ note = {A no-science-here review of Encore. HWN} school = {Washington University}, } +@Book {gomberg, + title = {A Computer-oriented System for Music Printing}, + author = {David A. Gomberg}, + journal = CitH, + volume={11}, + month = {march}, + year = {1977}, + pages = {63-80}, + note = {Gourlay \cite{gourlay86} writes: "A discussion of the + problems of representing the conventions of musical notation in + computer algorithms."} + +} + + @Book {CASR, note = {Annual editions since 1985, many containing surveys of music typesetting technology. SP}, @@ -205,14 +220,41 @@ note = {A no-science-here review of Encore. HWN} } -@Book {gomberg, - title = {A Computer-oriented System for Music Printing}, - author = {David A. Gomberg}, - journal = CitH, - volume={11}, - pages = {63-80}, + +% LIME +@Article {haken93, + note = {A description of Lime internals (which resemble older (before 0.0.68pre) LilyPond data structures somewhat) HWN}, + year = {1993}, + title = {The Tilia Music Representation: Extensibility, Abstraction, and Notation Contexts for the Lime Music Editor}, + author = {Lippold Haken and Dorothea Blostein}, + journal = {Computer Music Journal}, + volume= {17}, + number={3}, + pages = {43--58}, +} + +@InProceedings{haken95, + year = {1995}, + title = {A New Algorithm for Horizontal Spacing of Printed Music}, + author = {Lippold Haken and Dorothea Blostein}, + booktitle = {International Computer Music Conference}, + address={Banff}, + month={Sept}, + pages = {118-119}, + note = {This describes an algorithm which uses springs between adjacent columns. This algorithm is a "subclass" of the LilyPond algorithm. HWN}, } +@Article {blostein91, + note = {This paper provides a shallow overview of the algorithm used in LIME for spacing individual lines. HWN}, + year = {1991}, + title = {Justification of Printed Music}, + author = {Dorothea Blostein and Lippold Haken}, + journal = {Communications of the ACM}, + volume= {J34}, + number= {3}, + month= {March}, + pages = {88-99}, +} @Article{blostein94, @@ -225,7 +267,8 @@ note = {A no-science-here review of Encore. HWN} number = {3}, month = {march}, pages = {289--306}, - note = {A description of various conversions, decisions and issues relating to this interactive editor HWN}, + note = {A description of various conversions, +decisions and issues relating to this interactive editor HWN}, } @InProceedings{bouzaiene98:_une, @@ -257,6 +300,9 @@ year = 1997, organization = {International Computer Music Association} } +% +% MusiCopy +% @TechReport {gourlay87-spacing, note = {Algorithm for generating spacing in one line of (polyphonic) music, tailored for use with MusiCopy. LilyPond uses a variant of it (as of pl 76) HWN}, year = {1987}, @@ -278,11 +324,9 @@ year = 1997, @TechReport {gourlay87-formatting, - note = {This paper discusses the development of algorithms for the formatting of musical scores (from abstract). It also appeared at PROTEXT III, Ireland 1986}, - year = {1987}, title = {Computer Formatting of Music}, author = {John S. Gourlay and A. Parrish @@ -390,39 +434,6 @@ surprising that LilyPond is more mature. pages = {388--401}, } -@Article {haken93, - note = {A description of Lime internals (which resemble older (before 0.0.68pre) LilyPond data structures somewhat) HWN}, - year = {1993}, - title = {The Tilia Music Representation: Extensibility, Abstraction, and Notation Contexts for the Lime Music Editor}, - author = {Lippold Haken and Dorothea Blostein}, - journal = {Computer Music Journal}, - volume= {17}, - number={3}, - pages = {43--58}, -} - -@InProceedings{haken95, - year = {1995}, - title = {A New Algorithm for Horizontal Spacing of Printed Music}, - author = {Lippold Haken and Dorothea Blostein}, - booktitle = {International Computer Music Conference}, - address={Banff}, - month={Sept}, - pages = {118-119}, - note = {This describes an algorithm which uses springs between adjacent columns. This algorithm is a "subclass" of the LilyPond algorithm. HWN}, -} - -@Article {blostein91, - note = {This paper provides a shallow overview of the algorithm used in LIME for spacing individual lines. HWN}, - year = {1991}, - title = {Justification of Printed Music}, - author = {Dorothea Blostein and Lippold Haken}, - journal = {Communications of the ACM}, - volume= {J34}, - number= {3}, - month= {March}, - pages = {88-99}, -} @Article {rader96, @@ -570,6 +581,20 @@ basically say: "You can embed a NIFF or MIDI file") HWN} year={1983} } + + +@Article{Ornstein84, + author={Ornstein, Severo M. and John Turner Maxwell III}, + title={Mockingbird: A Composer's Amanuensis}, + journal= {Byte}, + volume= 9, + month = {January}, + year= { 1984}, + note={A discussion of an interactive and graphical computer system for +music composition} + +} + @PhdThesis{mueller90:_inter_bearb_musik, author = {Giovanni M\"uller}, title = {Interaktive Bearbeitung konventioneller Musiknotation}, @@ -586,6 +611,9 @@ chapters on engraving and notation are well structured and clear, though.} } + +% +% three part study by John Gr/over @TechReport{grover89-symbols, author = {John Gr\/over}, title = {A computer-oriented description of Music Notation. Part I. The Symbol Inventory}, diff --git a/Documentation/tex/tutorial.yo b/Documentation/tex/tutorial.yo index 4e751abc1a..03b1249e62 100644 --- a/Documentation/tex/tutorial.yo +++ b/Documentation/tex/tutorial.yo @@ -66,11 +66,10 @@ sect(Introduction) label(tutorial:introduction) latexcommand(\parindent2pc) -If you are reading this, you probably are interested in printing -music. LilyPond is a program that can print music from a -specification that you, the user, supply. Using LilyPond may be a bit -quaint in the beginning, because you have to give that specification -using a em(language). This document is a gentle introduction to that +LilyPond is a program that can print music from a specification that +you, the user, supply. Using LilyPond may be a bit quaint in the +beginning, because you have to give that specification using a +em(language). This document is a gentle introduction to that language, which is called Mudela, an abbreviation for Music Definition Language. @@ -135,20 +134,23 @@ the input itself, line by line. verb(% lines preceded by a percent are comments.)COMMENT( -)The percent sign (code(%)) introduces a line comment. If you want +)The percent sign, `code(%)', introduces a line comment. If you want make larger comments, you can use block comments. These are delimited -by code(%{) and code(%}) - +by `code(%{)' and `code(%})' verb(\input "paper16.ly") -By default, LilyPond will use definitions for a staff of 20 point -high. If you want smaller output (e.g., 16 point), you have to import -the setting for that size. You can do this by including a file. -code(\include "file") is replaced by the contents of code(file). +By default, LilyPond will use definitions for a staff of 20 +nop(point)footnote(A point is the standard measure of length for +printing. One point is 1/72.27 inch.) +high. If you want smaller output (e.g., 16 point), you have to import +the settings for that size. You can do this by including a file. +code(\include "file") is replaced by the contents of code(file). +LilyPond will inspect the standard search to look for the requested +file.COMMENT( -verb(\score { +)verb(\score { ) COMMENT( ) A mudela file combines music with directions for outputting that @@ -165,19 +167,19 @@ verb( ) As we will see, pitches are combinations of octave, note name and chromatic alteration. In this scheme, the octave is indicated by -using raised quotes (`code (')') and ``lowered'' quotes (commas: +using raised quotes (`code(')') and ``lowered'' quotes (commas: `code(,)'). The central C is denoted by code(c'). The C one octave higher is code(c''). One and two octaves below central C is denoted by code(c) and code(c,) respectively. If you have to indicate the pitches in a long piece that is written in either a high or very low octave, you would have to type very many -quotes. To remedy this, LilyPond has a so-called "relative" octave +quotes. To remedy this, LilyPond has a so-called ``relative'' octave entry mode. In this mode, notes without quotes are chosen in such an octave that they are the closest to the preceding note. If you add a high-quote an extra octave is added. The lowered quote will substract -an octave. Because the first note obviously has no predecessor, you -have to give the (absolute) pitch of the note to start with. +an extra octave. Because the first note obviously has no predecessor, +you have to give the (absolute) pitch of the note to start with. COMMENT( )verb( @@ -229,9 +231,8 @@ COMMENT( )These are notes with pitch code(a') and code(b'). Because their duration is the same as the code(g), there is no need to enter the -duration (It is not illegal to enter it anyway. Then you would have -to enter code(a8 b8)) -COMMENT( +duration (It is not illegal to enter it anyway. You would then enter +code(a8 b8)) COMMENT( )verb( c] @@ -247,9 +248,9 @@ the current time signature. COMMENT( d4 g, g | ) COMMENT( -) Three more notes: The code(|) is a "barcheck". When processing the +) Three more notes: The code(|) is a ``barcheck''. When processing the music, LilyPond will check that barchecks are found at the start of -a bar precisely. This makes it easy to spot where notes are forgotten. +a bar. This can help you track down notes you forgot to enter. verb( e'4 [c8 d e fis] ) COMMENT( @@ -263,13 +264,12 @@ verb( c4 [d8( )c b a( ] )b4 [c8 b a g] | ) COMMENT( -) The next line shows something new: a slur is a symbol that is -printed over several notes. In mudela, one enters a slur by marking -the beginning and ending note of the slur with an opening and closing -parenthesis respectively. In the line shown above this is done for -two slurs. Note that parentheses (slur markers) are between the -notes, and the brackets (beam markers) around the notes. As you can -see, the brackets and parentheses do not have to nest. +) The next line shows something new: In mudela, one enters a slur by +marking the beginning and ending note of the slur with an opening and +closing parenthesis respectively. In the line shown above this is +done for two slurs. Note that parentheses (slur markers) are between +the notes, and the brackets (beam markers) around the notes. As you +can see, the brackets and parentheses do not have to nest. verb( a4 [b8 a g fis] g2. | @@ -288,20 +288,18 @@ Lily can not detect where you want your music to be repeated, so you have to instruct her: a special bar symbol can be entered by the code(\bar) command followed by a string that signifies the bar symbol that you want. Then comes a semicolon to separate the string from the -rest of the notes, analogously with code(\key) and code(\time). +rest of the notes, just like with code(\key) and code(\time). verb( cis'4 [b8 cis] a4 | ) COMMENT( -) -This line shows that Lily will print an accidental if that is needed: -the first C sharp will be printed with an accidental, the second without. -verb( - [a8-. b-. cis-. d-. e-. fis-. ] % try some super and subscripts. -) COMMENT( +) This line shows that Lily will print an accidental if that is +needed: the first C sharp will be printed with an accidental, the +second one without. COMMENT( -) -There is more to music than just pitches and rhythms. An important +)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 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. @@ -318,12 +316,12 @@ verb( d2.-\fermata ) COMMENT( -) Finally, all articulations have a verbose form, like code(\fermata). -The ``command'' COMMENT(Hi Adrian :-) code(\fermata) is not part of -the core of the language (most of the other discussed elements are), -but it is an abbreviation of a more complicated description of a -fermata. code(\fermata) refers to that abbreviation and is therefore -called an em(identifier). +) All articulations have a verbose form, like code(\fermata). The +``command'' COMMENT(Hi Adrian :-) code(\fermata) is not part of the +core of the language (most of the other discussed elements are), but +it is an abbreviation of a more complicated description of a fermata. +code(\fermata) names that description and is therefore called an +em(identifier). verb( } @@ -343,8 +341,9 @@ to be smaller. We do this by setting the line width to 10 centimeter verb( } -) -Finally, the last brace ends the code(\score) block. +)COMMENT( + +)The last brace ends the code(\score) block. @@ -363,16 +362,6 @@ the symbols and the decisions from a high-level musical description. In other words, the function of LilyPond would be best described by `music compiler' or `music to notation compiler'. -We find that ---once you master the language--- there are big -advantages of using LilyPond over GUI oriented programs: first, -entering music is quite efficient. Second, it is possible to explain -exactly what the meaning piece of mudela is, and you can transform -these pieces automatically (eg, by transposing them). Third, the -program that is not interactive, so much less tradeoffs have to be -made between processing speed and the beauty of the output: you get -prettier output by using LilyPond. - - As you can see, the most interesting part of the input is music itself, in this case the sequence of notes. We will therefore focus on entering music for now. Consequently, when we mean @@ -402,7 +391,7 @@ The duration of a note is specified as a number: a whole note is denoted by 1, a half note by 2, a quarter by 4, and so on. If you want to augment a duration with a dot, simply affix a period to the number. You can also print notes longer than a whole. You do this by -using identifiers (code(\breve) and code(\longa): +using identifiers (code(\breve) and code(\longa)): Here are some random notes to show how it works. verb( @@ -429,19 +418,18 @@ mudela()( subsect(Basic pitches) -The pitch code(c') consists of two parts: one part for the -note name, and one for the octave. The letter specifies which note -name to use: note names simply are the letters code(a) to code(g). -The number of apostrophes specifies the octave to use: the central C -is denoted by code(c').footnote(By convention, the A above central C -at concert pitch is the tone that is used to tune instruments. Its -frequency is about 440 Hz.) The C which is an eighth higher (the C in -the ``two-line octave'') is denoted by code(c''): every octave adds a +The pitch code(c') consists of two parts: one part for the note name, +and one for the octave. The letter specifies which note name to use: +note names simply are the letters code(a) to code(g). The number of +apostrophes specifies the octave to use: the central C is denoted by +code(c').footnote(By convention, the A above central C at concert +pitch is the tone that is used to tune instruments. Its frequency is +about 440 Hz.) The C which is an eighth higher (the C in the +``two-line octave'') is denoted by code(c''): every octave adds a quote. A note name without quotes designates the pitch below code(c') (the C in the ``small octave''). If you want to go down even further, -commas should be added, e.g., the C in the ``contra octave'' is -expressed as code(c,,).footnote(The comma is meant to represent a -sunken apostrophe.) +commas (sunken apostrophes) should be added, e.g., the C in the +``contra octave'' is expressed as code(c,,). This example demonstrates pitches mudela(fragment,verbatim,center)( @@ -469,7 +457,7 @@ are given in bind(Table)ref(notename-tab). latexcommand(\begin{table}[h]) center( table(2)(ll)( - row(cell(english)cell(LilyPond)) + row(cell(English)cell(LilyPond)) rowline() row(cell(c double flat)cell(ceses)) row(cell(c flat)cell(ces)) @@ -556,14 +544,13 @@ that is covered in bind(Section)ref(sec:polyphonic). sect(Adding nuances: articulation and dynamics) -Having just chords and notes does not give you real music. Real music -has more liveliness to it: music can have articulation, dynamics -(louder and softer), etc. This liveliness has notation, so LilyPond -can print it. We'll start out by explaining how to obtain the -smallest grains of nuance: the articulation of a single note. Articulation -is entered by writing a dash and the name of the desired articulation -mark. You have to add a backslash in front of the name to distinguish -it from the name of a note. COMMENT( +Music can have articulation, dynamics (louder and softer), etc. These +aspecs have notation, so LilyPond can print those. We'll start out by +explaining how to obtain the smallest grains of nuance: the +articulation of a single note. Articulation is entered by writing a +dash and the name of the desired articulation mark. You have to add a +backslash in front of the name to distinguish it from the name of a +note. COMMENT( )mudela(fragment,verbatim)( c''4-\staccato @@ -588,7 +575,7 @@ following example: COMMENT( \type Lyrics\lyrics { "."4 "-" "+" "|" ">" "\^{ }" } > - \paper { linewidth = 12.\cm; } + \paper { linewidth = -1.\cm; } })COMMENT( )Text and digits for fingering can be entered in the same manner: add a @@ -630,7 +617,7 @@ the one that ends it. These are the spanners that are entered like this: description( -dit(The slur) +dit(Slur) The slur has the opening parenthesis as start marker is. The stopping marker is the closing parenthesis. For example: @@ -647,12 +634,12 @@ mudela(fragment,verbatim,center)( dit(Beam) -Another spanner is the beam. The starting marker is the opening -bracket, then ending marker is the closing bracket. The brackets have -to be em(around) the beamed notes. footnote(Strictly speaking, a -beam is not a musical concept: beaming doesn't change the meaning of -music, it only clarifies the rhythmic structure. One might argue that -beams should not be present in a ``music'' language. Unfortunately, +The starting marker for the beam is the opening bracket, the ending +marker is the closing bracket. The brackets have to be em(around) the +beamed notes. footnote(Strictly speaking, a beam is not a musical +concept: beaming doesn't change the meaning of music, it only +clarifies the rhythmic structure. One might argue that beams should +not be present in a music representation language. Unfortunately, LilyPond is not smart enough to insert beams into music on its own. LilyPond does have code that guesses what the pattern should look @@ -664,17 +651,16 @@ mudela(fragment,verbatim)( [c'8 c'] [c'16 c' c' c'] [c'16. c'32 c' c'16.] ) -dit(The tie) The tie is similar to the slur: it looks like a -slur, but a slur connects whole chords, whereas the tie connects note -heads. Tied notes should be played as one long note. In analogy with -TeX()'s tie (which ties together words with a space), LilyPond's tie -is entered as a tilde, `code(~)'. +dit(Tie) LilyPond's tie is entered as a tilde, `code(~)', in analogy + with TeX()'s tie (which ties together words with a space), The tie is + similar to the slur: it looks like a slur, but a slur connects whole + chords, whereas the tie connects note heads. The input convention for the tilde is somewhat peculiar when used in conjunction with chords. Internally, the extra information that is represented by the tilde has to be attached to a note (or to a rest, for that matter). For this reason, you can't put the tilde between -two chords (as in code( ~ )). The tilde sign must be +two chords (as in code( ~nop( ))). The tilde sign must be directly after a note of the chords. It does not matter which one. The following example demonstrates the use of ties: mudela(fragment,verbatim,center)( @@ -705,36 +691,33 @@ ending markers. sect(Commands) label(sec:commands) -We have focused on printing notes. Notation contains many other -constructs, constructs that help you with reading those notes. -Examples of such constructs are clefs, time signatures, keys etc. -LilyPond will try to generate these constructs as much as possible, -but not all such hints can be inserted automatically, and you can also -override some of the settings. This can be done by inserting various +Music notation constructs with no duration, like clefs and key +signatures, can be entered by inserting various commands between the music. The general form of these commands is COMMENT( -)center(code(\keyword argument argument ... ;)) +)center(code(\keyword argument argument ... ;))COMMENT( -These are the commands that are currently supported: +)These are the commands that are currently supported in alfabetic order: description( dit(code(\bar) var(bartype)) This command makes LilyPond print special bar lines and repeat symbols. You can also use it to allow line breaks when entering cadenzas. The argument var(bartype) is a string that describes what kind of bar line to print. +COMMENT( -mudela(fragment,verbatim)( +)mudela(fragment,verbatim)( \bar "|:"; c'4 \bar ":|:"; c'4 \bar ":|"; c'4 \bar "||"; c'4 \bar "empty"; c'4 \bar "|."; -) +)COMMENT( - The command `code(\bar "empty")' does not create any visible bar - line, but it tells LilyPond to allow a linebreak at that - position. The `code(\bar)' command prints the specified symbol - immediately. If you give a `code(\bar)' command at the end of a - measure then the specified symbol replaces the automatic bar line; - otherwise the specified symbol appears in the middle of the measure. +)The command `code(\bar "empty")' does not create any visible bar + line, but it tells LilyPond to allow a linebreak at that position. + The `code(\bar)' command prints the specified symbol where you enter + it. If you give a `code(\bar)' command at the end of a measure then + the specified symbol replaces the automatic bar line. + The code(\bar) command does not affect metric structure. dit(code(\cadenza) var(togglevalue)) This command toggles the @@ -759,10 +742,11 @@ dit(code(\clef) var(clefname)) This command sets the current clef for notation, dit(code(\key) var(pitch) var(type)) This command changes the current key signature. The key signature is printed at the start of every - line. The var(type) argument is set to code(\major) or code(\minor) - to get major or minor keys, respectively. Omitting the second - argument gives major keys. The key of C-minor can thus be specified - as `code(\key es)' or `code(\key \c minor)'. + line. The var(type) argument is an integer. Useful values are + available as the predefined identifiers code(\major) and + code(\minor). Omitting the second argument gives major keys. The + key of C-minor can thus be specified as `code(\key es)' or + `code(\key c \minor)'. dit(code(\keysignature) var(pitchlist)) @@ -797,7 +781,7 @@ Example: dit(code(\grouping) var(durationslist)) sets the metric structure of the measure. Its effect can best be shown by an example: - mudela(fragment,verbatim)( + mudela(fragment,verbatim,center)( \time 5/16; \grouping 16*3 16*2; [c'8 c'16 c'8] @@ -818,7 +802,7 @@ of 2 and 3 beats, with as many groups of The commands described above aren't really music, but they can best be thought as as notes with no duration. Since they are grammatically equivalent to notes, these commands can be used in the same places as -notes: +notes. sect(Notation context) @@ -835,10 +819,9 @@ it as multiple voices on a staff). Obviously the concept of staff is not really something musical. But what is it then? The most simplistic explanation is: a staff is a graphic peculiarity -of the notation system. In other words, a staff is a graphic device, -a special picture of five lines on which one can print note heads. We -will call this view on the concept of staff `staff symbol' from now -on. +of the notation system. In other words, a staff is a picture of five +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 @@ -889,7 +872,7 @@ mudela()( }} }) COMMENT( -)Technically speaking you know where the strong and weak beats are, but +)Technically speaking you can find out where the strong and weak beats are, but it is difficult to find them quickly. Bar lines help you in finding the location of the notes within the measure: mudela()( @@ -934,72 +917,78 @@ mudela()(\score { })COMMENT( ) Now you know the pitch of the notes: you look at the start of the line -and see a clef, with this clef, you can determine the notated pitches. +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! So the context determines the relationship between a piece of music and its notation: you, the reader, use context to deduce music from -notation. Because LilyPond is a notation writer instead of a reader, -context works the other way around for Lily: with context a piece of -music can be converted to notation. +notation. Because LilyPond writes notation, context works the +other way around for LilyPond: with context a piece of music can be +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 code(\type) command (Staff, GrandStaff) were all names of different -contexts. +contexts. A notation context is a conversion between music and +notation. We make one final observation before listing the standard notation -contexts. A score can contain many staffs; A staff can contain many -voices. This suggests that notation contexts are objects that can be -nested. +contexts: a score can contain many staffs and a staff can contain many +voices. This suggests that notation contexts are objects that can +contain other notation contexts. -The following is a list of the contexts that are supported by +The following + is a list in alfabetic order of the contexts that are supported by LilyPond. Each notation context is characterised by its name, the notation elements it creates, and the contexts that it can contain. description( -dit(Voice) The code(Voice) context is a context that corresponds to a - voice on a staff. This context handles the conversion of noteheads, - dynamic signs, stems, beams, super- and subscripts, slurs, ties and rests -dit(Staff) The code(Staff) context handles clefs, bar lines, keys, - accidentals. A code(Staff) context can contain code(Voice) - contexts. - -dit(RhythmicStaff) The code(RhythmicStaff) context is like the staff, - but much simpler: the notes are printed on one line, and pitches are - ignored. code(RhythmicStaff) can contain code(Voice) contexts. dit(GrandStaff) A code(GrandStaff) context contains code(Staff) contexts, and it adds a brace to the output at the - nop(left.)footnote(This is a major deficiency in the current - implementation. Currently stems, slurs and beams cannot be printed - across two staffs. In reality, a grand staff is a hybrid of one big - staff and two stacked staffs.) - - A code(GrandStaff) context can contain - code(Staff)s. Typically, it will contain two code(Staff)s, one - treble staff, and one bass staff. The bar lines of the contained - staffs are connected vertically. - -dit(StaffGroup) A code(StaffGroup) context contains code(Staff) or - code(Lyrics) contexts, and prints a bracket at the left. The bar - lines in the participating staffs are connected. + nop(left.)footnote(The GrandStaff is quite 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 + staff. The bar lines of the contained staffs are connected + vertically. dit(Lyrics) As its name suggests, The code(Lyrics) context deals with typesetting lyrics. This topic will be covered in bind(Section)ref(tutorial:lyrics). -dit(Score) The code(Score) context is the toplevel context: no context can - contain a code(Score) context. The code(Score) context handles the - administration of time signatures. It also makes sure that items - such as clefs, time signatures, and key-signatures are aligned across staffs. +dit(Score) The code(Score) context is the toplevel context: no context + can contain a code(Score) context. The code(Score) context handles + the administration of time signatures. It also makes sure that + items such as clefs, time signatures, and key-signatures are aligned + in columns across staffs. The code(Score) can contain code(Staff), code(StaffGroup), code(Lyrics), code(GrandStaff) and code(RhythmicStaff) contexts. +dit(RhythmicStaff) The code(RhythmicStaff) context is like the staff, + but much simpler: the notes are printed on one line, and pitches are + ignored. code(RhythmicStaff) can contain code(Voice) + contexts. + + +dit(Staff) The code(Staff) context handles clefs, bar lines, keys, + accidentals. A code(Staff) context can contain code(Voice) + contexts. + +dit(StaffGroup) A code(StaffGroup) context contains + code(Staff) or code(Lyrics) contexts, and prints a bracket at the + left. The bar lines in the participating staffs are connected. + + +dit(Voice) The code(Voice) context is a context that corresponds to a + voice on a staff. This context handles the conversion of noteheads, + dynamic signs, stems, beams, super- and subscripts, slurs, ties and rests + COMMENT(do ChoireStaff) ) @@ -1017,10 +1006,9 @@ code(\clef) and code(\cadenza) change these properties, and this explains why they are fundamentally different from musical expressions like notes and rests. -A notation context is not a primitive element of LilyPond, but rather - Later on, in bind(Section)ref(tutorial:engravers) we will explain - how you can create your own contexts. - +A notation context is not a primitive element of LilyPond: in +bind(Section)ref(tutorial:engravers) it will be explained how you can +form your own notation contexts. sect(Nested music: multiple staffs) label(tutorial:more-staffs) @@ -1112,14 +1100,16 @@ context can have properties that influence the conversion from music to notation. A simple example of such a property is the clef: the type of a clef helps determines the vertical position of note heads in a staff. Some of these properties can be modified by commands such as -code(\clef) and code(\time). But there is more: notation contexts -also have properties are settable in a generic fashion. We will -demonstrate this feature by printing multiple voices on a staff. +code(\clef) and code(\time). But notation contexts can have other +properties, that are settable in +a generic fashion. We will demonstrate this feature by printing +multiple voices on a staff. -Printing more than one voice on a staff, is not unlike printing -multiple staffs stacked together. This suggests that the template -to follow is this: -verb( +Printing more than one voice on a staff is like printing multiple +staffs stacked together. This suggests that the template to follow is +this:COMMENT( + +)verb( \type Staff < \type Voice = one ... \type Voice = two ... @@ -1127,10 +1117,9 @@ verb( ) COMMENT( ) On the ellipsis there should be music going from left to right, in -other words, notes enclosed in braces. Let us try the following -simple melodies: +other words, notes enclosed in braces. Let us try the following counterpoint:COMMENT( -mudela(fragment,verbatim)( +)mudela(fragment,verbatim)( \type "Staff" < \type "Voice" = "one" { r4 as'4 () as'4 g'4 } \type "Voice" = "two" { g'2 f'4 e'4 } @@ -1174,13 +1163,11 @@ mudela(fragment,verbatim,center)( g'2 f'4 e'4 } > ) - latexcommand(\caption{multiple voices}) + latexcommand(\caption{Multiple voices}) label(tutorial:multi-voice-fig) latexcommand(\end{figure}) -As you can see, this property also controls the directions of slurs, -which explains the name code(ydirection).COMMENT(hmm) - +As you can see, this property also controls the directions of slurs. Other properties can also be set, and they can be within different contexts. In general, you can set a property by specifying @@ -1190,9 +1177,10 @@ should be strings. The effect of a property is pretty much hardwired into the implementation (and thus subject to change), so we will not deal with -all the possible properties in detail. Among other characteristics that -can be set are the layout of slurs and beams. The initialisation file -file(property.ly) explains most properties. +all the possible properties in detail. Among other characteristics +that can be set are the layout of slurs and beams. The initialisation +file file(property.ly) and the reference manual contain explanations +of all properties. sect(Lyrics) label(tutorial:lyrics) @@ -1204,11 +1192,10 @@ durations. After this, you have to specify how to convert these to graphics. Lyrics consist of syllables, which are strings together with -durations. Previously we only entered note names, so for entering -lyrics we have to instruct LilyPond that what we enter are not note -names but strings. This instruction is the keyword -code(\lyrics). After entering this keyword you can enter a musical -construct---sequential music, simultaneous music, code(\type) +durations. For entering lyrics we have to instruct LilyPond that what +we enter are not note names but strings. This instruction is the +keyword code(\lyrics). After entering this keyword you can enter a +musical construct---sequential music, simultaneous music, code(\type) entries, etc.--- but with syllables instead of pitches. For example: COMMENT( @@ -1220,7 +1207,7 @@ default conversion will try to put the text you entered as note heads onto a staff, and this will fail. This default must be overridden with a code(\type) keyword. Printing syllables of text in a line is done by a context called code(Lyrics). You can select this context -with the code(\type) keyword. Here is a simple example: +with the code(\type) keyword. Here is a simple example with output: COMMENT( )mudela(fragment,verbatim)( @@ -1241,9 +1228,11 @@ 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 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 -quotes. It ends with either a number for the duration, or a space. +double quotes. It ends with either a number for the duration, or a space. These tricks are demonstrated in the following example: -COMMENT( urg +COMMENT( + +urg \type Lyrics \lyrics { 'got8 m\textbf{e}8 on8. m$\cal_Y$16 knees,4 Le-8 lie!4.} \type Lyrics \lyrics { 'got8 m{\bf e}4 on8. m$\cal_Y$16 knees,4 Le-8 lie!4.} )COMMENT( @@ -1255,19 +1244,17 @@ COMMENT( urg )COMMENT( -) -COMMENT(Groen is de kleur van geluk.) -COMMENT(Dat geldt zeker voor Bj"ork) +) COMMENT(Groen is de kleur van geluk. Dat geldt zeker voor Bj"ork) sect(Toplevel Mudela) -Back in bind(Section)ref(sec:firsttune) we said we would defer -discussion of toplevel constructions (e.g., code(\score)) to a later -moment in time: and now we will look at these constructions. In -general, Mudela looks like set of nested `blocks'. The general syntax -for a block is code(\keyword { ... }). +Back in bind(Section)ref(sec:firsttune) we said we would ignore +toplevel constructions (e.g., code(\score)) until some later moment. +Now we will look at these constructions. -We will now discuss identifiers. Generally you can define an + +Mudela allows you to name constructs of the language. This is done by +using an em(identifier). Generally you can define an identifier by entering code(identifierName = ... ) where there can be a variety of things on the ellipsis. COMMENT( @@ -1299,23 +1286,15 @@ mudela(verbatim)( > \paper { linewidth = -1.0; - stem_length = 6.0*\interline; } } ) - -Another interesting feature of this example are the assignments within -the paper block. Some blocks, such as code(\paper), have a scope of -their own. In the case of the code(\paper) block, these variables -influence the characteristics of the output. As is shown, you can -tune quantities like the stemlength, and enter simple -nop(expressions.)footnote(The purpose of the negative linewidth is to -prevent the music from being justified.) The identifiers that are -meaningful are for the paper block is strongly implementation -dependent, so they will not be listed here. Moreover, since most of -the values are predefined to sensible defaults, there usually is no -need to tune these values. +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, +the music line is printed at natural width. Recall the properties of a context, that could be set with code(\property). It is a very general mechanism to tune the output of @@ -1346,15 +1325,6 @@ a real command like code(\clef) or code(\bar). Real commands are hardcoded into the language and they have to be terminated by semicolons. -You can also use identifiers to break up the heavy nesting that can -occur in the code(\score) block. Another useful application is -parametrisation of the music: if you use identifiers in the -code(\score) block, you can make variations of the music by simply -redefining those identifiers. One particular application of this is -part extraction: by using identifiers and redefining them, one can -print extracted parts and a full orchestral score from the same music -definition. - sect(Sound output) label(tutorial:sound) @@ -1368,8 +1338,8 @@ for prooflistening your files: typing errors stand out when you listen, especially if they involve accidentals. The only information that you need to enter is the -tempo. (Unfortunately, at this time, this the only thing that can be -tuned. The syntax for the tempo is code(\tempo )var(duration) = +tempo (Unfortunately, at this time, this the only thing that can be +tuned.). The syntax for the tempo is code(\tempo )var(duration) = var(beatsperminute);), for example: COMMENT( @@ -1397,7 +1367,7 @@ it()handles specific notation constructs This characterization almost automatically explains what the definition of a context should look like: itemize( -it() It should have a name +it() It should define a name it()It should be part of the ``notation output definition,'' i.e., the code(\paper) block it() @@ -1412,17 +1382,19 @@ LilyPond can create notation for a large number of symbols. This code is split up into basic building blocks. Each building block is called an em(engraver), and an engraver generally handles only one notation construct: the code(Clef_engraver) takes care of the clefs, the -code(Time_signature_engraver) takes care of printing time signatures. +code(Time_signature_engraver) takes care of printing time signatures, +etc. A notation context is formed by a group of engravers. A special class in LilyPond---the code(Engraver_group_engraver)---allows engravers to -cooperate in a group. A variant of this grouping object is the -code(Line_group_engraver_group), which puts the output of all the -engravers (clefs, bars, etc) into a compound object, so that these -symbols can be treated as a whole. +cooperate in a group, thus forming a notation context. A variant of +this grouping object is the code(Line_group_engraver_group), which +puts the output of all the engravers (clefs, bars, etc) into a +compound object, so that these symbols can be treated as a whole. -This explains the following definition, which is a simplified Staff context: -verb( +The following definition shows a simplified Staff context: COMMENT( + +)verb( \translator { \type "Line_group_engraver_group"; @@ -1447,12 +1419,7 @@ A staff can contain a Voice context. You can also preset properties of contexts: for instance, the clef that is printed upon starting a Staff, is the treble clef. -You can also declare contexts, and reference them. This is useful in -combination with code(\remove "..."): code(\remove) does the opposite -of code(\consists). -The real context definitions are in the standard initialisation -file file(engraver.ly). As a practical example, we will show how to typeset polymetric music, i.e., music where the meter can differ for each staff. The solution @@ -1467,6 +1434,11 @@ generating bar lines and time signatures. So, we can have different timing for every staff, by moving the code(Timing_engraver) into the Staff context. +You can also declare contexts, and reference them. This is useful in +combination with code(\remove "..."): code(\remove) does the opposite +of code(\consists). + + mudela(verbatim)( \score { \notes < @@ -1487,6 +1459,9 @@ mudela(verbatim)( } ) +The context definitions provided as a default are in the standard +initialisation file file(engraver.ly). + sect(Urtexts and context selection) label(tutorial:urtext) @@ -1561,10 +1536,10 @@ sect(Transposing) label(tutorial:more-grammar) -One of the things that you can do with music is -em(transposing) it. If you want to transpose a piece of music, then -you should prefix the keyword code(\transpose) along with the pitch -(relative to the central C) for the transposition.footnote(the +One of the things that you can do with music is em(transposing) it. +If you want to transpose a piece of music, then you should prefix it +with the keyword code(\transpose) along with the pitch (relative to +the central C, i.e., code(c')) for the transposition.footnote(the code(\type Staff) is to make sure that no separate staffs are created for the code(\scale) and code(\transpose cis' \scale) part.) @@ -1615,127 +1590,36 @@ switch = \type Voice = voiceA \notes { s4 \translator Staff = staffB s4 Don't try to switch staffs when you are in the middle of a slur or beam, though: the spanners won't switch along. -sect(Hairy durations: triplets) - -OUTDATED +sect(Tuplets) -In the previous section we explained an operation that changes the -pitches of music, transposition. In this section we will explain an -operation that modifies the duration of the notes that you enter. -When notes are part of a triplet, then the real of duration of the -notes are 2/3 part of what their shape indicates: -mudela(fragment)( -\times 2/3 { c'4 c'4 c'4 } -) +The notes in a triplet take 2/3 of their notated duration. The syntax +for triplet in LilyPond reflects this. To make a triplet, you enter +COMMENT( -To support this notion, Mudela allows you to modify the duration of a -note by multiplication or division. A code(c'4) note that would be in a -triplet is written as code(c'4*2/3). If you sequence a few of these -notes, you get a triplet.footnote(We added a normal staff in the example to -show the difference.) -mudela(fragment,verbatim)( -< \type Staff = staffA { \times 2/3 { c'8 c'8 c'8 } c'4} - \type Staff = staffB { c''8 c''8 c''4 } >) - -LilyPond knows that these notes are no normal eighth notes, but the -reader doesn't yet. To help the reader a beam or a bracket with a `3' -should be printed. The special beam command `code([2/3)' and the -matching close beam `code(]1/1)' will take care of that, and -they also abbreviate the code(*2/3) part. If you want brackets in -stead of beams, you can use `code(\[2/3])' and `code(\]1/1)'. -mudela(fragment,verbatim)( -< \type Staff = staffA { - \times 2/3 { [ c'8 c'8 c'8 } - \times 2/3 { c'8 c'8 c'8 } - } - \type Staff = staffB { [c''8 c''8 c''8 c''8] } ->) +)mudela(fragment,center)( + \type Voice \times 2/3 { c''4 c''4 c''4 } +)COMMENT( -Other tuplets can be entered in the same way. -mudela(fragment,verbatim)( -< \type Staff = staffA { - \time 7/8; - \times 7/6 { [c'8 c'8 c'8 c'8 c'8 c'8] } - } - \type Staff = staffB { - \time 7/8; - [c''8 c''8 c''8 c''8 c''8 c''8 c''8] } > -) +)Since tuplet brackets are printed by the Voice context, a Voice +context must exist before code(\times) is interpreted. To ensure this, +a context is instantiated explicitly with code(\type Voice). You +don't need this, if a Voice context is already instantiated, like in +the following example: +COMMENT( -For your convenience, code([2/3) can be further abbreviated to code([/3), and -you can abbreviate code(]1/1) on the closing beam marker to code(]/1). +)mudela(fragment,center)( + c''4 \times 2/3 { c''4 c''4 c''4 } c''4 +)COMMENT( -mudela(fragment,verbatim)( -< \type Staff = staffA { - \times 2/3 { c'8 c'8 c'8 } c'4 - } - \type Staff = staffB { [c''8 c''8] c''4 } > ) - -bf(Important) the construct with code([/3) and -code([/1) is a hack that sets a mode in the parser. This means that -verb(id = \notes { c8 c8 c8 } -notATriplet =\notes { [2/3 \id ]1/1 }) -does not produce a triplet. It will hopefully -soon be replaced by a construction that mixes more elegantly with the -grammar for Music. - - - - - -sect(Titling) -label(tutorial:titling) - -A piece of sheet music isn't complete without proper opening and -closing titles. LilyPond does not have any real support for setting -text: that is a job best left to TeX(). But you can pass messages to -TeX() from the input file. You can write TeX() macros to handle -these messages. -To do this, you add a code(\header) block -to your input file. The format is quite simple, - -verb( -\header{ - "key" = "value"; - "key" = "value"; - "key" = "value"; - % etc. -}) - -When the results of the music typesetting are output, the contents of -code(\header) are also up into the TeX() file. Tools like -code(ly2dvi) can use this information to generate pretty titling for -your input file. Consult the manual page of code(ly2dvi) for more -details. - - -The code(\header) block should be at toplevel in mudela, and -preferably at the top of the file. If you have an input file with -multiple code(\score) blocks, you should add a header to every score, -describing the different sub parts of the music piece, eg. - - -verb(\header { - "composer" = "Ludwig Van Bavaria"; - "title" = "Symphonie Megalomane"; - } - \score{ - ... % some music - \header { movement = "Mit roher Kraft wild herausfahrend!"; } - \paper { } - } - \score{ - ... % some more music - \header { movement = "Saut\'e comme un oeuf."; } - \paper { } - } +Of course, you can also use different ratios, and use beamed notes or +rests: +mudela(fragment)( + \type Voice \times 4/5 { [c''8 c''16 c''16] r8 [g'8 g'8] } ) +If you make a tuplet of beamed notes, where the beam is as wide as +the bracket, the bracket is omitted. -If you want you can also put the code(\header) block at the top of the -input file; it will then be put into every output file automatically. -This will make it clear what the file contains as soon as you open it. - - +sect(Repeats) diff --git a/INSTALL.txt b/INSTALL.txt index dfc89fc498..2747f7e0e1 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -36,7 +36,7 @@ and what you should do. If you are going to compile and install LilyPond very often you might want to check out the buildscripts/set-lily.sh script. It sets some environment variables and symlinks, which comes in handly when you have -to compile LilyPond very often. +to compile LilyPond more often. 2: PREREQUISITES @@ -59,15 +59,15 @@ o Lots of disk space: LilyPond takes between 50 and 100 run on Windows NT/95/98 as well. See Section 11. -o GNU C++ version 2.7 or newer (2.8 and egcs are also +o GNU C++ version 2.8 or newer (egcs-1.1 or newer is also fine). o 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.). -o GUILE 1.3 (no, GUILE 1.2 won't work), check out - http://www.gnu.org/programs/guile.html +o GUILE 1.3 (no, GUILE 1.2 won't work), check out + http://www.gnu.org/programs/guile.html. 3: RUNNING @@ -86,7 +86,7 @@ o A PostScript printer and/or viewer (such as installed. -o GUILE 1.3 (no, GUILE 1.2 won't work), check out +o GUILE 1.3 (no, GUILE 1.2 won't work), check out http://www.gnu.org/programs/guile.html For running LilyPond successfully you have to help TeX and diff --git a/NEWS b/NEWS index 5cccae0f18..ff5f32efab 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,24 @@ +pl 14 + +pl 13.hwn1 + - tutorial fixes. + - junked find-quarts + - junked various plet goryness. + - preps for ~ syntax + - bib fixes + +pl 12.jcn3 + - bf's: standchen + - added repeat, chord stuff to website + - bf: dashed slur + - hacks for barlines, dynamics + pl 12.jcn2 - bf: package-diff - new chord syntax, again: TONIC [DURATION] ['-' MODIFIERS/ADDITIONS] - shorthand prefix for note-mode: '@', no shorthand for notes in chord mode... -pl 12.jcn1 pl 11.jcn6 - bf: ly2dvi: better guess LILYPONDPREFIX: ../share/lilypond - chord-table; urg bugs: @@ -18,6 +32,7 @@ pl 11.jcn5 pl 11.jcn4 +********** pl 13 - mutopia stuff (thanks, Peter) - bugfix : \maininput diff --git a/TODO b/TODO index 03915a7737..47164946a3 100644 --- a/TODO +++ b/TODO @@ -7,6 +7,10 @@ Most of the items are marked in the code as well, with full explanation. grep for TODO and ugh/ugr/urg BUGS: + * c4 \! \> c4 + + * resurrect tremolo beams. + * gallina barlines. * fix height of / collisions with lyrics (chords), @@ -635,7 +639,7 @@ IDEAS * versioning stuff (cvt mudela, mudela, etc.) * Klavarskribo? - +5 * lyrics in chords still fuck up. * Use hooks/dependency graphs for properties diff --git a/VERSION b/VERSION index bb97303512..d2263c50d7 100644 --- a/VERSION +++ b/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=1 -PATCH_LEVEL=13 -MY_PATCH_LEVEL=uu1 +PATCH_LEVEL=14 +MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/debian/out/control b/debian/out/control index 14be2746a9..8e150650c8 100644 --- a/debian/out/control +++ b/debian/out/control @@ -14,8 +14,8 @@ Description: The GNU Project music typesetter. beautiful sheet music from a music definition file. It can also play mechanical performances to a MIDI file. Features include multiple staffs, meters, clefs, keys, lyrics, versatile input language, cadenzas, - beams, slurs, triplets, formatting scores, part extraction. It includes - a nice font of musical symbols. + beams, slurs, triplets, named chords, transposing, formatting scores, + part extraction. It includes a nice font of musical symbols. . URLs: http://www.cs.uu.nl/~hanwen/lilypond/ http://www.xs4all.nl/~jantien/lilypond/ diff --git a/init/init.fly b/init/init.fly index d3d0c5294c..0358846984 100644 --- a/init/init.fly +++ b/init/init.fly @@ -1,6 +1,6 @@ % Toplevel initialisation file. -\version "1.0.7"; +\version "1.0.12"; \include "declarations.ly" diff --git a/init/property.ly b/init/property.ly index 7348a4f6c9..7140c7ce03 100644 --- a/init/property.ly +++ b/init/property.ly @@ -12,6 +12,7 @@ name value effect shorthand ydirection -1 force stem down \stemdown ydirection 0 stem direction free \stemboth ydirection 1 force stem up \stemup + pletvisibility 0 show nothing pletvisibility 1 show number pletvisibility 2 show (number and bracket)-if-no-beam @@ -78,28 +79,22 @@ instrument ascii midi instrument table lookup % i guess they're meant as some form of doco % that's what i use them for... stemup = { - \skip 1*0; % Stupid hack to make < { \stemup } > work \property Voice.ydirection = \up } stemboth= { - \skip 1*0; \property Voice.ydirection = \center } stemdown = { - \skip 1*0; \property Voice.ydirection = \down } slurup = { - \skip 1*0; \property Voice.slurydirection = \up } slurboth= { - \skip 1*0; \property Voice.slurydirection = \center } slurdown = { - \skip 1*0; \property Voice.slurydirection = \down } @@ -112,59 +107,50 @@ onevoice = { voiceone = { \type Voice = one - \skip 1*0; \stemup } voicetwo = { \type Voice = two - \skip 1*0; \stemdown } voicethree = { \type Voice = three - \skip 1*0; \stemup } voicefour = { \type Voice = four - \skip 1*0; \stemdown \shifton } onestaff = { \translator Staff=one - \skip 1*0; } staffone = { \translator Staff=one - \skip 1*0; \property Staff.ydirection = \center \property Staff.hshift = 0 } stafftwo = { \translator Staff=two - \skip 1*0; \property Staff.ydirection = \center \property Staff.hshift = 0 } staffthree = { \translator Staff=three - \skip 1*0; \property Staff.ydirection = \center \property Staff.hshift = 0 } stafffour = { \translator Staff=four - \skip 1*0; \property Staff.ydirection = \center \property Staff.hshift = 0 } diff --git a/input/GNUmakefile b/input/GNUmakefile index 27d3b1bd33..cb057c2c79 100644 --- a/input/GNUmakefile +++ b/input/GNUmakefile @@ -4,8 +4,8 @@ depth = .. SUBDIRS=test bugs -examples=example-3 praeludium-fuga-E twinkle star-spangled-banner -flexamples=example-1 example-2 +examples=praeludium-fuga-E star-spangled-banner twinkle-pop +flexamples= LOCALSTEPMAKE_TEMPLATES=mutopia diff --git a/input/test/GNUmakefile b/input/test/GNUmakefile index 39f71e418c..117e9e6786 100644 --- a/input/test/GNUmakefile +++ b/input/test/GNUmakefile @@ -1,7 +1,7 @@ # input/test/Makefile depth = ../.. -examples=font20 hara-kiri grace mark denneboom sleur +examples=font20 hara-kiri grace mark denneboom sleur chords chord-table repeat LOCALSTEPMAKE_TEMPLATES=mutopia include $(depth)/make/stepmake.make diff --git a/input/twinkle-pop.ly b/input/twinkle-pop.ly index b18d69be77..2676202973 100644 --- a/input/twinkle-pop.ly +++ b/input/twinkle-pop.ly @@ -1,6 +1,6 @@ \header{ filename = "twinkle-pop.ly"; -title = "Ah, vous dirais-je, maman "; +%title = "Ah, vous dirais-je, maman "; description = "twinkle twinkle in pop-song-settings"; composer = "traditional"; enteredby = "HWN, chords by Johan Vromans"; @@ -12,31 +12,30 @@ Tested Features lyrics and chords %} \version "1.0.12"; - + melodie = \notes\relative c'' { \clef "violin"; - \time 2/4 ; - + \time 2/4 ; + c4 c | g' g | a a | g2 | f4 f | e e | d d | c2 | g'4 g | f f | e e | d d | g g | f f | e e | d d | - % copy 1-8 + % copy 1-8 c4 c | g' g | a a | g2 | f4 f | e e | d d | c2 \bar "|."; } acc = \chords { - % why don't \skip, s4 work? + % why don't \skip, s4 work? c2 c f c f c g-7 c - g f c g-7 % urg, bug! + g f c g-7 % urg, bug! g f c g-7 - % copy 1-8 + % copy 1-8 c2 c f c f c g-7 c - } - +} text = \lyrics{ \property Lyrics . textstyle = "italic" @@ -52,24 +51,25 @@ text = \lyrics{ \score { < - \type ChordNames \acc - \type Staff=melody \melodie + \type ChordNames \acc + \type Staff=melody \melodie \type Lyrics \text - > - \header{ - title = "Ah, vous dirais-je, maman "; - } - \paper { } - } + > + \header{ + title = "Ah, vous dirais-je, maman "; + } + \paper { } +} \score { < - \chords \type ChordNames \transpose bes\acc - \notes \type Staff=melody \transpose bes\melodie + \chords \type ChordNames \transpose bes\acc + \notes \type Staff=melody \transpose bes\melodie \lyrics \type Lyrics \text > - \header{ - piece = "clarinet in B\\textflat"; - } + \header{ + piece = "clarinet in B\\textflat"; + } \paper { } } + diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc index 273d9afde3..133f91ae64 100644 --- a/lily/chord-name-engraver.cc +++ b/lily/chord-name-engraver.cc @@ -61,20 +61,6 @@ Chord_name_engraver::do_process_requests () */ - /* - Banter style chord names (almost). - TODO: - - don't print inclusive scale (i.e. no "9" in c 9/11) - - handle c7 / cmaj7 - - use #,b iso -es -is on tonica - - switch on property, add american (?) chordNameStyle - - Scalar chordNameStyle = get_property ("chordNameStyle"); - if (chordNameStyle == "Banner") - chord = pitches_to_banner (pitch_arr_.size ()); - - */ - Scalar style = get_property ("textstyle"); Scalar alignment = get_property ("textalignment"); Text_def* text_p = new Text_def; @@ -100,7 +86,7 @@ Chord_name_engraver::do_process_requests () scale[i].transpose (tonic); //urg, should do translation in scheme. - char const *acc[] = {"\\textflat\\textflat", "\\textflat", "", "\\textsharp" , "\\textsharp\\textsharp"}; + char const *acc[] = {"\\textflat\\textflat ", "\\textflat ", "", "\\textsharp " , "\\textsharp\\textsharp "}; String tonic_str = tonic.str (); tonic_str = tonic_str.left_str (1).upper_str () + acc[tonic.accidental_i_ + 2]; diff --git a/lily/command-request.cc b/lily/command-request.cc index 1ab0353bc5..0ce2b67d6c 100644 --- a/lily/command-request.cc +++ b/lily/command-request.cc @@ -50,6 +50,9 @@ Bar_req::do_equal_b (Request*r) const return b && type_str_ == b->type_str_; } +void +Command_tie_req::do_print () const +{} diff --git a/lily/compressed-music.cc b/lily/compressed-music.cc index 5133cb5752..68953bc69b 100644 --- a/lily/compressed-music.cc +++ b/lily/compressed-music.cc @@ -15,7 +15,7 @@ Compressed_music::Compressed_music (int n, int d,Music *mp) { num_i_ = n; den_i_ = d; - element_p_->compress (Moment (num_i_,den_i_)); + element_l ()->compress (Moment (num_i_,den_i_)); } diff --git a/lily/ctie-engraver.cc b/lily/ctie-engraver.cc new file mode 100644 index 0000000000..25082cd973 --- /dev/null +++ b/lily/ctie-engraver.cc @@ -0,0 +1,101 @@ +/* + ctie-engraver.cc -- implement Command_tie_engraver + + source file of the GNU LilyPond music typesetter + + (c) 1998 Han-Wen Nienhuys + + */ + +#include "ctie-engraver.hh" +#include "command-request.hh" +#include "note-head.hh" +#include "musical-request.hh" + +Command_tie_engraver::Command_tie_engraver() +{ + req_l_ = 0; +} + + +bool +Command_tie_engraver::do_try_music (Music *m) +{ + if (Command_tie_req * c = dynamic_cast (m)) + { + req_l_ = c; + return true; + } + return false; +} + +void +Command_tie_engraver::acknowledge_element (Score_element_info i) +{ + if (Note_head *nh = dynamic_cast (i.elem_l_)) + { + Note_req * m = dynamic_cast (i.req_l_); + now_heads_.push (CHead_melodic_tuple (nh, m, now_moment()+ m->duration ())); + } +} + +void +Command_tie_engraver::do_process_requests () +{ + +} + +void +Command_tie_engraver::processed_acknowledged () +{ +} + +void +Command_tie_engraver::do_pre_move_processing () +{ + for (int i=0; i < now_heads_.size (); i++) + { + past_notes_pq_.insert (now_heads_[i]); + } +} + +void +Command_tie_engraver::do_post_move_processing () +{ + Moment now = now_moment (); + while (past_notes_pq_.front ().end_ < now) + past_notes_pq_.delmin (); +} + + + +ADD_THIS_TRANSLATOR(Command_tie_engraver); + + +CHead_melodic_tuple::CHead_melodic_tuple () +{ + head_l_ =0; + mel_l_ =0; + end_ = 0; +} + +CHead_melodic_tuple::CHead_melodic_tuple (Note_head *h, Melodic_req*m, Moment mom) +{ + head_l_ = h; + mel_l_ = m; + end_ = mom; +} + +int +CHead_melodic_tuple::pitch_compare (CHead_melodic_tuple const&h1, + CHead_melodic_tuple const &h2) +{ + return Melodic_req::compare (*h1.mel_l_, *h2.mel_l_); +} + +int +CHead_melodic_tuple::time_compare (CHead_melodic_tuple const&h1, + CHead_melodic_tuple const &h2) +{ + return (h1.end_ - h2.end_ ).sign (); +} diff --git a/lily/include/command-request.hh b/lily/include/command-request.hh index c03ff6eb54..527ffbce01 100644 --- a/lily/include/command-request.hh +++ b/lily/include/command-request.hh @@ -47,6 +47,11 @@ public: REQUESTMETHODS(Command_script_req); }; +class Command_tie_req : public Command_req { +public: + REQUESTMETHODS(Command_tie_req); +}; + /** Baseclass for time_signature/partial req. It has to be handled by Staff_{walker,column} baseclass. */ class Timing_req : public Command_req { diff --git a/lily/include/ctie-engraver.hh b/lily/include/ctie-engraver.hh new file mode 100644 index 0000000000..238db2ff19 --- /dev/null +++ b/lily/include/ctie-engraver.hh @@ -0,0 +1,51 @@ +/* + ctie-engraver.hh -- declare Command_tie_engraver + + source file of the GNU LilyPond music typesetter + + (c) 1998 Han-Wen Nienhuys + + */ + +#ifndef CTIE_ENGRAVER_HH +#define CTIE_ENGRAVER_HH + +#include "pqueue.hh" +#include "engraver.hh" + +struct CHead_melodic_tuple { + Melodic_req *mel_l_ ; + Note_head *head_l_; + Moment end_; + CHead_melodic_tuple (); + CHead_melodic_tuple (Note_head*, Melodic_req*, Moment); + static int pitch_compare (CHead_melodic_tuple const &, CHead_melodic_tuple const &); + static int time_compare (CHead_melodic_tuple const &, CHead_melodic_tuple const &); +}; + +inline int compare (CHead_melodic_tuple const &a, CHead_melodic_tuple const &b) +{ + return CHead_melodic_tuple::time_compare (a,b); +} + + +class Command_tie_engraver : public Engraver +{ + PQueue past_notes_pq_; + Command_tie_req *req_l_; + Array now_heads_; +protected: + virtual void do_post_move_processing (); + virtual void do_pre_move_processing (); + virtual void acknowledge_element (Score_element_info); + virtual bool do_try_music (Music*); + virtual void do_process_requests (); + virtual void processed_acknowledged (); +public: + VIRTUAL_COPY_CONS(Translator); + Command_tie_engraver(); + +}; + +#endif /* CTIE_ENGRAVER_HH */ + diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh index 3bd510b231..7ae5f935f7 100644 --- a/lily/include/lily-proto.hh +++ b/lily/include/lily-proto.hh @@ -57,6 +57,8 @@ struct Collision; struct Collision_engraver; struct Command_req; struct Command_script_req; +struct Command_tie_engraver; +struct Command_tie_req; struct Compressed_music; struct Compressed_music_iterator; struct Cresc_req; diff --git a/lily/include/main.hh b/lily/include/main.hh index 17bd2480b4..0b7340bb75 100644 --- a/lily/include/main.hh +++ b/lily/include/main.hh @@ -23,7 +23,8 @@ extern Sources* source_global_l; extern bool no_paper_global_b; extern bool safe_global_b; extern bool no_timestamps_global_b; -extern bool find_quarts_global_b; +extern bool find_old_relative_b; + extern int exit_status_i_; extern bool experimental_features_global_b; extern char const* output_global_ch; diff --git a/lily/include/music-list.hh b/lily/include/music-list.hh index 7e5e310adc..7cbbffee49 100644 --- a/lily/include/music-list.hh +++ b/lily/include/music-list.hh @@ -58,6 +58,7 @@ public: virtual Moment duration () const; }; + /** The request is a collection of Requests. A note that you enter in mudela is one Request_chord, one syllable of lyrics is one Request_chord @@ -70,6 +71,8 @@ public: virtual Musical_pitch to_relative_octave (Musical_pitch); Request_chord(); }; + + /** Sequential_music is a list of music-elements which are placed behind each other. */ diff --git a/lily/include/music-wrapper.hh b/lily/include/music-wrapper.hh index 14c99c6726..26fea0ec7b 100644 --- a/lily/include/music-wrapper.hh +++ b/lily/include/music-wrapper.hh @@ -21,9 +21,10 @@ */ class Music_wrapper : public Music { -public: Music * element_p_; +public: Music_wrapper (Music*); + Music * element_l () const; virtual void transpose (Musical_pitch); virtual void do_print () const; diff --git a/lily/include/my-lily-parser.hh b/lily/include/my-lily-parser.hh index 1c40332452..5dcb4ef38f 100644 --- a/lily/include/my-lily-parser.hh +++ b/lily/include/my-lily-parser.hh @@ -34,7 +34,6 @@ public: int default_abbrev_i_; Duration default_duration_; Extender_req* extender_req; - Plet plet_; Scope *default_header_p_; bool first_b_; @@ -46,7 +45,6 @@ public: bool init_parse_b_; My_lily_lexer * lexer_p_; - Moment plet_mom(); Input here_input() const; void remember_spot(); Input pop_spot(); diff --git a/lily/include/request-chord.hh b/lily/include/request-chord.hh new file mode 100644 index 0000000000..8a736ca41d --- /dev/null +++ b/lily/include/request-chord.hh @@ -0,0 +1,15 @@ +/* + request-chord.hh -- declare Request_chord + + source file of the GNU LilyPond music typesetter + + (c) 1998 Han-Wen Nienhuys + + */ + +#ifndef REQUEST_CHORD_HH +#define REQUEST_CHORD_HH + + +#endif /* REQUEST_CHORD_HH */ + diff --git a/lily/lexer.ll b/lily/lexer.ll index a56f86aae9..dc409d288a 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -92,8 +92,6 @@ RESTNAME [rs] NOTECOMMAND \\{A}+ LYRICS ({AA}|{TEX})[^0-9 \t\n\f]* ESCAPED [nt\\'"] -PLET \\\[ -TELP \\\] EXTENDER [_][_] %% @@ -292,9 +290,6 @@ EXTENDER [_][_] {NOTECOMMAND} { return scan_escaped_word (YYText () + 1); } - {NOTECOMMAND} { - return scan_escaped_word (YYText () + 1); - } {UNSIGNED} { yylval.i = String_convert::dec2_i (String (YYText ())); return UNSIGNED; @@ -344,14 +339,6 @@ EXTENDER [_][_] return c; } -{PLET} { - return yylval.i = PLET; -} - -{TELP} { - return yylval.i = TELP; -} - . { return yylval.c = YYText ()[0]; } diff --git a/lily/main.cc b/lily/main.cc index 2477c9870f..dfa0389314 100644 --- a/lily/main.cc +++ b/lily/main.cc @@ -35,11 +35,9 @@ bool version_ignore_global_b = false; bool no_paper_global_b = false; bool no_timestamps_global_b = false; -bool find_quarts_global_b = false; +bool find_old_relative_b = false; char const* output_global_ch = "tex"; -// temporarily default to ps, because tex is even more broken -//char const* output_global_ch = "ps"; String default_outname_base_global = "lelie"; int default_count_global; @@ -65,7 +63,7 @@ Long_option_init theopts[] = { {0, "no-paper", 'M'}, {0, "dependencies", 'd'}, {0, "no-timestamps", 'T'}, - {0, "find-fourths", 'Q'}, + {0, "find-old-relative", 'Q'}, {0, "ignore-version", 'V'}, {1, "output-format", 'f'}, {0, "safe", 's'}, @@ -109,7 +107,7 @@ usage () " -o, --output=FILE set FILE as default output base\n" ); cout << _ ( - " -Q, --find-fourths show all intervals greater than a fourth\n" + " -Q, --find-old-relative show all changes in relative syntax\n" ); cout << _ ( " -s, --safe inhibit file output naming and exporting TeX macros\n"); @@ -270,7 +268,7 @@ main_prog (int argc, char **argv) output_global_ch = oparser.optional_argument_ch_C_; break; case 'Q': - find_quarts_global_b = true; + find_old_relative_b= true; break; case 'I': global_path.push (oparser.optional_argument_ch_C_); diff --git a/lily/music-list.cc b/lily/music-list.cc index d6fe224a9c..3d155a90c6 100644 --- a/lily/music-list.cc +++ b/lily/music-list.cc @@ -6,16 +6,11 @@ (c) 1997--1998 Han-Wen Nienhuys */ - - #include "music-list.hh" #include "musical-pitch.hh" #include "request.hh" #include "musical-request.hh" - - - - +#include "main.hh" Moment Simultaneous_music::duration () const @@ -85,8 +80,27 @@ Music_list::do_relative_octave (Musical_pitch last, bool ret_first) if (!count ++ ) retval = last; } + + // hmmm +#if 0 + if (!ret_first && find_old_relative_b) + { + PCursor b (bottom ()); + + if (b.ok ()) + { + String w = _("\\relative mode changed here, old value: "); + w += last.str (); + + b->warning (w); + retval = last; + } + } + +#endif if (!ret_first) retval = last; + return retval; } diff --git a/lily/music-wrapper-iterator.cc b/lily/music-wrapper-iterator.cc index e282bded8c..33fd876c38 100644 --- a/lily/music-wrapper-iterator.cc +++ b/lily/music-wrapper-iterator.cc @@ -27,7 +27,7 @@ Music_wrapper_iterator::do_print () const void Music_wrapper_iterator::construct_children () { - child_iter_p_ = get_iterator_p (music_wrapper_l ()->element_p_); + child_iter_p_ = get_iterator_p (music_wrapper_l ()->element_l ()); } Music_wrapper_iterator::~Music_wrapper_iterator () diff --git a/lily/music-wrapper.cc b/lily/music-wrapper.cc index 81ee249605..57ab04b741 100644 --- a/lily/music-wrapper.cc +++ b/lily/music-wrapper.cc @@ -56,3 +56,9 @@ Music_wrapper::to_relative_octave (Musical_pitch p) { return element_p_->to_relative_octave (p); } + +Music* +Music_wrapper::element_l () const +{ + return element_p_; +} diff --git a/lily/musical-pitch.cc b/lily/musical-pitch.cc index f3dde21fce..13a4e5de08 100644 --- a/lily/musical-pitch.cc +++ b/lily/musical-pitch.cc @@ -96,9 +96,23 @@ Musical_pitch::str () const if (accidental_i_) s += String (accname[accidental_i_ + 2]); + if (octave_i_ > 0) + { + int o = octave_i_ + 1; + while (o--) + s += to_str ('\''); + } + else if (octave_i_ <0) + { + int o = (-octave_i_) - 1; + while (o--) + s += to_str (','); + } +#if 0 if (octave_i_) s += String ((octave_i_> 0)? "^": "_") + to_str (octave_i_); - +#endif + return s; } @@ -126,25 +140,7 @@ Musical_pitch::to_relative_octave (Musical_pitch p) else n = down_pitch; - if (find_quarts_global_b) - { - int d = this->semitone_pitch () - n.semitone_pitch (); - if (d) - { - int i = 1 + (abs (d) - 1) / 12; - String quote_str = d < 0 ? to_str (',', i) : to_str ('\'', i); - Musical_pitch w = *this; - w.octave_i_ = 0; - String name_str = w.str (); - name_str + quote_str; - w.warning (_f ("Interval greater than quart, relative: %s", - name_str + quote_str)); - // don't actually do any relative stuff - n = *this; - } - } - else - n.octave_i_ += oct_mod; + n.octave_i_ += oct_mod; *this = n; return *this; diff --git a/lily/my-lily-parser.cc b/lily/my-lily-parser.cc index 75ff14f5c7..7d43cdd8d8 100644 --- a/lily/my-lily-parser.cc +++ b/lily/my-lily-parser.cc @@ -105,12 +105,6 @@ void My_lily_parser::set_last_duration (Duration const *d) { default_duration_ = *d; - - /* - forget plet part, - but keep sticky plet factor within plet brackets - */ - default_duration_.plet_ = plet_; } @@ -293,13 +287,6 @@ My_lily_parser::get_note_element (Note_req *rq, Duration * duration_p) v->add_music (rq); - // too bad parser reads (default) duration via member access, - // this hack will do for now.. - if (abbrev_beam_type_i_) - { - assert (!duration_p->plet_b ()); - duration_p->set_plet (1, 2); - } rq->duration_ = *duration_p; rq->set_spot (here_input ()); delete duration_p ; @@ -319,13 +306,7 @@ My_lily_parser::get_parens_request (int t) case '~': reqs.push (new Tie_req); break; - case BEAMPLET: - case MAEBTELP: - { - Plet_req* p = new Plet_req; - p->plet_i_ = plet_.type_i_; - reqs.push (p); - } + /* fall through */ case '[': case ']': @@ -351,14 +332,6 @@ My_lily_parser::get_parens_request (int t) reqs.push (new Span_dynamic_req); break; - case PLET: - case TELP: - { - Plet_req* p = new Plet_req; - p->plet_i_ = plet_.type_i_; - reqs.push (p); - } - break; case ')': case '(': { @@ -372,19 +345,13 @@ My_lily_parser::get_parens_request (int t) switch (t) { - case BEAMPLET: - dynamic_cast (reqs.top ())->spantype = Span_req::START; - /* fall through */ case '<': case '>': case '(': case '[': - case PLET: - dynamic_cast (reqs.top ())->spantype = Span_req::START; + dynamic_cast (reqs[0])->spantype = Span_req::START; break; - case MAEBTELP: - dynamic_cast (reqs.top ())->spantype = Span_req::STOP; - /* fall through */ + case '!': case ')': case ']': diff --git a/lily/parser.yy b/lily/parser.yy index 6ebde09668..a0c4fbdba7 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -46,23 +46,13 @@ #include "repeated-music.hh" // mmm -Mudela_version oldest_version ("1.0.7"); +Mudela_version oldest_version ("1.0.10"); Mudela_version version ("1.0.12"); // needed for bison.simple's malloc() and free() #include -int const GUESS_PLET = 5; -int guess_plet_a[GUESS_PLET] = -{ - 1, - 3, - 2, - 3, - 4 -}; - struct Assignment { String *name_p_; Identifier *id_p_; @@ -136,7 +126,6 @@ Paper_def* current_paper = 0; char c; const char *consstr; int i; - int pair[2]; int ii[10]; } %{ @@ -162,7 +151,6 @@ yylex (YYSTYPE *s, void * v_l) %token ACCEPTS %token ALTERNATIVE %token BAR -%token BEAMPLET %token CADENZA %token CHORDMODIFIERS %token CHORDS @@ -170,7 +158,6 @@ yylex (YYSTYPE *s, void * v_l) %token CM_T %token CONSISTS %token DURATION -%token END %token EXTENDER %token FONT %token GROUPING @@ -179,21 +166,17 @@ yylex (YYSTYPE *s, void * v_l) %token KEY %token KEYSIGNATURE %token LYRICS -%token MAEBTELP %token MARK %token MEASURES %token MIDI %token MM_T -%token MUSIC %token MUSICAL_PITCH %token NAME %token NOTENAMES %token NOTES -%token OCTAVE %token PAPER %token PARTIAL %token PENALTY -%token PLET %token PROPERTY %token PT_T %token RELATIVE @@ -208,7 +191,6 @@ yylex (YYSTYPE *s, void * v_l) %token SPANDYNAMIC %token SYMBOLTABLES %token TABLE -%token TELP %token TEMPO %token TIME_T %token TIMES @@ -239,7 +221,6 @@ yylex (YYSTYPE *s, void * v_l) %token SCORE_IDENTIFIER %token MIDI_IDENTIFIER %token PAPER_IDENTIFIER -%token REQUEST_IDENTIFIER %token REAL %token DURATION RESTNAME %token STRING @@ -251,9 +232,8 @@ yylex (YYSTYPE *s, void * v_l) %type box %type open_request_parens close_request_parens %type open_abbrev_parens -%type open_plet_parens close_plet_parens %type sub_quotes sup_quotes -%type simple_element request_chord command_element Simple_music Composite_music +%type simple_element request_chord command_element Simple_music Composite_music %type Alternative_music Repeated_music %type abbrev_type %type int unsigned @@ -284,7 +264,6 @@ yylex (YYSTYPE *s, void * v_l) %type real_expression real dimension %type abbrev_command_req %type post_request structured_post_request -%type plet_fraction %type command_req verbose_command_req %type script_req dynamic_req extender_req %type string @@ -795,6 +774,9 @@ Simple_music: | MUSIC_IDENTIFIER { $$ = $1->access_content_Music (true); } | property_def | translator_change + | Simple_music '*' unsigned '/' unsigned { } + | Simple_music '*' unsigned { } + ; @@ -815,7 +797,7 @@ Composite_music: THIS->remember_spot (); } /* CONTINUED */ - int '/' int Music + unsigned '/' unsigned Music { $$ = new Compressed_music ($3, $5, $6); @@ -924,7 +906,10 @@ abbrev_command_req: | COMMAND_IDENTIFIER { $$ = $1->access_content_Request (true); } -/* +/* TODO */ +/* | '~' { + $$ = new Command_tie_req; + } | '[' { $$ = new Beam_req; $$->spantype = Span_req::START; @@ -1170,39 +1155,7 @@ dynamic_req: } ; -plet_fraction: - unsigned '/' unsigned { - $$[0] = $1; - $$[1] = $3; - } - | - '/' unsigned { - int num = $2 >? 1; - $$[0] = guess_plet_a[(num plet_.type_i_ = $2[1]; - THIS->plet_.iso_i_ = $2[0]; - THIS->default_duration_.plet_ = THIS->plet_; - } - | TELP { - $$ = TELP; - THIS->plet_.type_i_ = 1; - THIS->plet_.iso_i_ = 1; - THIS->default_duration_.plet_ = THIS->plet_; - } - | TELP plet_fraction { - $$ = TELP; - THIS->plet_.type_i_ = $2[1]; - THIS->plet_.iso_i_ = $2[0]; - THIS->default_duration_.plet_ = THIS->plet_; - } - ; close_request_parens: '~' { @@ -1220,7 +1173,6 @@ close_request_parens: | E_BIGGER { $$ = '>'; } - | close_plet_parens ; open_abbrev_parens: @@ -1235,20 +1187,6 @@ open_abbrev_parens: } ; -open_plet_parens: - '[' plet_fraction { - $$ = BEAMPLET; - THIS->plet_.type_i_ = $2[1]; - THIS->plet_.iso_i_ = $2[0]; - THIS->default_duration_.plet_ = THIS->plet_; - } - | PLET plet_fraction { - $$ = PLET; - THIS->plet_.type_i_ = $2[1]; - THIS->plet_.iso_i_ = $2[0]; - THIS->default_duration_.plet_ = THIS->plet_; - } - ; open_request_parens: E_EXCLAMATION { @@ -1261,7 +1199,6 @@ open_request_parens: $$='['; } | open_abbrev_parens - | open_plet_parens ; @@ -1383,6 +1320,12 @@ duration_length: steno_duration { $$ = $1; } + | duration_length '*' unsigned { + $$->plet_.iso_i_ *= $3; + } + | duration_length '/' unsigned { + $$->plet_.type_i_ *= $3; + } ; dots: @@ -1416,7 +1359,6 @@ steno_duration: THIS->parser_error (_f ("not a duration: %d", $1)); else { $$->durlog_i_ = Duration_convert::i2_type ($1); - $$->set_plet (THIS->plet_.iso_i_, THIS->plet_.type_i_); } } | DURATION_IDENTIFIER { @@ -1425,12 +1367,6 @@ steno_duration: | steno_duration '.' { $$->dots_i_ ++; } - | steno_duration '*' unsigned { - $$->plet_.iso_i_ *= $3; - } - | steno_duration '/' unsigned { - $$->plet_.type_i_ *= $3; - } ; @@ -1476,40 +1412,48 @@ simple_element: $$ = THIS->get_word_element (*$1, $2); delete $1; } - | '@' chord { + | chord { if (!THIS->lexer_p_->chord_state_b ()) THIS->parser_error (_ ("have to be in Chord mode for chords")); + $$ = $1; + } + | '@' notemode_chord { + if (!THIS->lexer_p_->note_state_b ()) + THIS->parser_error (_ ("have to be in Note mode for @chords")); $$ = $2; } ; - chord: - notemode_duration steno_musical_pitch chord_additions chord_subtractions { - $$ = THIS->get_chord (*$2, $3, $4, *$1); + steno_tonic_pitch notemode_duration chord_additions chord_subtractions { + $$ = THIS->get_chord (*$1, $3, $4, *$2); }; -chord_additions: +notemode_chord: + steno_musical_pitch notemode_duration chord_additions chord_subtractions { + $$ = THIS->get_chord (*$1, $3, $4, *$2); + }; + +chord_additions: { $$ = new Array; } - | chord_additions chord_note { - $1->push (*$2); - $$ = $1; - } - | chord_additions CHORDMODIFIER_PITCH { - /* - urg, this is kind of ugly. - all but "sus" chord modifiers can be - handled as chord_additions... - */ - $1->push (*$2); + | '-' { + $$ = new Array; + } + | chord_additions chord_addsub { $$ = $1; + $$->push (*$2); } ; +chord_addsub: + chord_note optional_dot + | CHORDMODIFIER_PITCH optional_dot + ; + chord_note: - UNSIGNED { + UNSIGNED { $$ = new Musical_pitch; $$->notename_i_ = ($1 - 1) % 7; $$->octave_i_ = $1 > 7 ? 1 : 0; diff --git a/lily/relative-octave-music.cc b/lily/relative-octave-music.cc index dafd7bf7b4..cbf4c71c1a 100644 --- a/lily/relative-octave-music.cc +++ b/lily/relative-octave-music.cc @@ -20,7 +20,7 @@ Relative_octave_music::to_relative_octave (Musical_pitch) Relative_octave_music::Relative_octave_music(Music*p,Musical_pitch def) : Music_wrapper (p) { - last_pitch_ = element_p_->to_relative_octave (def); + last_pitch_ = element_l()->to_relative_octave (def); } void diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index fc7ab50eed..ea76b89d45 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -14,14 +14,19 @@ #include "compressed-music.hh" #include "text-def.hh" #include "beam.hh" +#include "music-list.hh" bool Tuplet_engraver::do_try_music (Music *r) { if (Compressed_music * c = dynamic_cast (r)) { - compressed_music_arr_.push (c); - stop_moments_.push (now_moment () + c->duration ()); + Music *el = c->element_l (); + if (!dynamic_cast (el)) + { + compressed_music_arr_.push (c); + stop_moments_.push (now_moment () + c->duration ()); + } return true; } return false; diff --git a/make/lilypond-vars.make b/make/lilypond-vars.make index f912908583..7fb3e57e33 100644 --- a/make/lilypond-vars.make +++ b/make/lilypond-vars.make @@ -2,5 +2,5 @@ export PATH:=$(topdir)/lily/out:$(topdir)/buildscripts/out:$(PATH) export MFINPUTS:=$(topdir)/mf/$(PATHSEP)$(MFINPUTS)$(PATHSEP)$(PATHSEP) export TEXINPUTS:=$(topdir)/tex/$(PATHSEP)$(TEXINPUTS)$(PATHSEP)$(PATHSEP) -export LILYINCLUDE:=$(topdir)/init$(PATHSEP)$(topdir)/mf/out$(PATHSEP)$(LILYINCLUDE) +export LILYINCLUDE:=$(topdir)/scm$(PATHSEP)$(topdir)/init$(PATHSEP)$(topdir)/mf/out$(PATHSEP)$(LILYINCLUDE) diff --git a/make/out/lelievijver.lsm b/make/out/lelievijver.lsm index 9b15bddb16..7f7a88a3ca 100644 --- a/make/out/lelievijver.lsm +++ b/make/out/lelievijver.lsm @@ -1,15 +1,15 @@ Begin3 Titel: LilyPond -Versie: 1.1.13 -Inschrijf datum: 08DEC98 +Versie: 1.1.14 +Inschrijf datum: 09DEC98 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.13.tar.gz + 770k lilypond-1.1.14.tar.gz Oorspronkelijke plek: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 770k lilypond-1.1.13.tar.gz + 770k lilypond-1.1.14.tar.gz Copi-eer voorwaarden: GPL End diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 40370913f7..628679c923 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,21 +1,21 @@ Begin3 Title: LilyPond -Version: 1.1.13 -Entered-date: 08DEC98 +Version: 1.1.14 +Entered-date: 09DEC98 Description: LilyPond is the GNU Project music typesetter. This program can print beautiful sheet music from a music definition file. It can also play mechanical performances to a MIDI file. Features include multiple staffs, meters, clefs, keys, lyrics, versatile input language, cadenzas, -beams, slurs, triplets, formatting scores, part extraction. It includes -a nice font of musical symbols. +beams, slurs, triplets, named chords, transposing, formatting scores, +part extraction. It includes a nice font of musical symbols. Keywords: music notation typesetting midi fonts engraving 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.13.tar.gz + 770k lilypond-1.1.14.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 770k lilypond-1.1.13.tar.gz + 770k lilypond-1.1.14.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index fa465fd0f9..a5cf6f1317 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -1,9 +1,9 @@ Name: lilypond -Version: 1.1.13 +Version: 1.1.14 Release: 1 Copyright: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.13.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.14.tar.gz Summary: A program for printing sheet music. URL: http://www.cs.uu.nl/~hanwen/lilypond Packager: Han-Wen Nienhuys @@ -17,8 +17,8 @@ LilyPond is the GNU Project music typesetter. This program can print beautiful sheet music from a music definition file. It can also play mechanical performances to a MIDI file. Features include multiple staffs, meters, clefs, keys, lyrics, versatile input language, cadenzas, -beams, slurs, triplets, formatting scores, part extraction. It includes -a nice font of musical symbols. +beams, slurs, triplets, named chords, transposing, formatting scores, +part extraction. It includes a nice font of musical symbols. %prep %setup diff --git a/make/toplevel.make.in b/make/toplevel.make.in index 90b98e9ecb..c5234f0e70 100644 --- a/make/toplevel.make.in +++ b/make/toplevel.make.in @@ -27,7 +27,7 @@ STEPMAKE_TEMPLATES=toplevel yolily-toplevel include $(depth)/make/stepmake.make # -website: examples htmldoc doc++ +website: htmldoc examples doc++ examples: $(MAKE) CONFIGSUFFIX='www' -C input WWW diff --git a/mutopia/F.Schubert/standchen.ly b/mutopia/F.Schubert/standchen.ly index abf8201317..4bc8f842f3 100644 --- a/mutopia/F.Schubert/standchen.ly +++ b/mutopia/F.Schubert/standchen.ly @@ -18,12 +18,12 @@ Note: Original key F. \version "1.0.10"; -$vocal_verse1 = \notes\relative c{ +$vocal_verse1 = \notes\relative c''{ % ugh: treble/bass -% \clef treble; -% \clef violin; + % ? + \clef treble; \property Voice.dynamicdir=1 - \times 2/3 { [ g''8( )as] g } c4. g8 | + \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 | diff --git a/ps/lily.ps b/ps/lily.ps index 26b1fbc219..88477154c7 100644 --- a/ps/lily.ps +++ b/ps/lily.ps @@ -115,6 +115,7 @@ 1 setlinejoin setdash setlinewidth + 8 -2 roll moveto curveto stroke diff --git a/scm/lily.scm b/scm/lily.scm index 750b053bc8..4aa093e818 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -70,24 +70,15 @@ (define (empty2 a b ) "") - (define emptybar empty1) -(define setdynamic empty1) -(define startrepeat empty1) -(define repeatbar empty1) -(define finishbar empty1) -(define extender empty1) -(define startbar empty1) -(define repeatbarstartrepeat empty1) -(define fatdoublebar empty1) -(define setfinger empty1) -(define doublebar empty1) ;;; and these suck as well. +(define (setdynamic s) (text "dynamic" (string-append "\\" s))) (define (settext s) (text "text" s)) (define (settypewriter s) (text "typewriter" s)) (define (setnumber s) (text "number" s)) (define (setbold s) (text "bold" s)) +(define (setfinger s) (text "finger" s)) (define (setitalic s) (text "italic" s)) (define (setnumber-1 s) (text "numberj" s)) @@ -115,17 +106,28 @@ (define (decrescendo w h cont) (embedded-ps ((ps-scm 'decrescendo) w h cont))) + (define + (doublebar h) + (invoke-dim1 "doublebar" h)) + (define (embedded-ps s) (string-append "\\embeddedps{" s "}")) - (define (end-output) "\n\\EndLilyPondOutput") (define (experimental-on) "\\turnOnExperimentalFeatures") - (define (extender o h) - ((invoke-output o "invoke-dim1") "extender" h)) + (define (extender h) + (invoke-dim1 "extender" h)) + + (define + (fatdoublebar h) + (invoke-dim1 "fatdoublebar" h)) + + (define + (finishbar h) + (invoke-dim1 "finishbar" h)) (define (font-switch i) (string-append @@ -155,7 +157,6 @@ (string-append "\n\\" s "{" (number->dim d) "}")) - ;; ;; need to do something to make this really safe. ;; @@ -184,6 +185,14 @@ (string-append "{\\bracefont " (char (/ (- (min y (- maxht step)) minht) step)) "}")) + (define + (repeatbar h) + (invoke-dim1 "repeatbar" h)) + + (define + (repeatbarstartrepeat h) + (invoke-dim1 "repeatbarstartrepeat" h)) + (define (rulesym h w) (string-append "\\vrule height " (number->dim (/ h 2)) @@ -195,6 +204,14 @@ (define (slur l) (embedded-ps ((ps-scm 'slur) l))) + (define + (startbar h) + (invoke-dim1 "startbar" h)) + + (define + (startrepeat h) + (invoke-dim1 "startrepeat" h)) + (define (start-line) (string-append "\\hbox{%\n") @@ -210,6 +227,10 @@ (define (stop-line) "}\\interscoreline") + (define + (stoprepeat h) + (invoke-dim1 "stoprepeat" h)) + (define (text f s) (string-append "\\set" f "{" (output-tex-string s) "}")) @@ -222,18 +243,22 @@ (define (maatstreep h) (string-append "\\maatstreep{" (number->dim h) "}")) + ; urg: generate me (cond ((eq? action-name 'all-definitions) `(begin (define beam ,beam) (define tuplet ,tuplet) (define bracket ,bracket) (define crescendo ,crescendo) - (define volta ,volta) - (define slur ,slur) (define dashed-slur ,dashed-slur) + (define doublebar ,doublebar) + (define emptybar ,emptybar) (define decrescendo ,decrescendo) (define empty ,empty) (define end-output ,end-output) + (define extender ,extender) + (define fatdoublebar ,fatdoublebar) + (define finishbar ,finishbar) (define font-def ,font-def) (define font-switch ,font-switch) (define generalmeter ,generalmeter) @@ -243,7 +268,13 @@ (define invoke-char ,invoke-char) (define invoke-dim1 ,invoke-dim1) (define placebox ,placebox) + (define repeatbar ,repeatbar) + (define repeatbarstartrepeat ,repeatbarstartrepeat) (define rulesym ,rulesym) + (define slur ,slur) + (define startbar ,startbar) + (define startrepeat ,startrepeat) + (define stoprepeat ,stoprepeat) (define start-line ,start-line) (define stem ,stem) (define stop-line ,stop-line) @@ -252,6 +283,7 @@ (define char ,char) (define maatstreep ,maatstreep) (define pianobrace ,pianobrace) + (define volta ,volta) )) ((eq? action-name 'experimental-on) experimental-on) @@ -259,12 +291,14 @@ ((eq? action-name 'tuplet) tuplet) ((eq? action-name 'bracket) bracket) ((eq? action-name 'crescendo) crescendo) - ((eq? action-name 'volta) volta) - ((eq? action-name 'slur) slur) ((eq? action-name 'dashed-slur) dashed-slur) + ((eq? action-name 'doublebar) doublebar) ((eq? action-name 'decrescendo) decrescendo) ((eq? action-name 'empty) empty) ((eq? action-name 'end-output) end-output) + ((eq? action-name 'extender) extender) + ((eq? action-name 'fatdoublebar) fatdoublebar) + ((eq? action-name 'finishbar) finishbar) ((eq? action-name 'font-def) font-def) ((eq? action-name 'font-switch) font-switch) ((eq? action-name 'generalmeter) generalmeter) @@ -274,13 +308,19 @@ ((eq? action-name 'invoke-char) invoke-char) ((eq? action-name 'invoke-dim1) invoke-dim1) ((eq? action-name 'placebox) placebox) + ((eq? action-name 'repeatbar) repeatbar) + ((eq? action-name 'repeatbarstartrepeat) repeatbarstartrepeat) ((eq? action-name 'rulesym) rulesym) + ((eq? action-name 'slur) slur) + ((eq? action-name 'startbar) startbar) + ((eq? action-name 'startrepeat) startrepeat) + ((eq? action-name 'stoprepeat) stoprepeat) ((eq? action-name 'start-line) start-line) ((eq? action-name 'stem) stem) ((eq? action-name 'stop-line) stop-line) + ((eq? action-name 'volta) volta) (else (error "unknown tag -- PS-TEX " action-name)) ) - ) ;;;;;;;;;;;; PS @@ -431,6 +471,7 @@ (else (error "unknown tag -- PS-SCM " action-name)) ) ) + diff --git a/stepmake/make/out/stepmake.lsm b/stepmake/make/out/stepmake.lsm index 004a96b08c..0af85431cc 100644 --- a/stepmake/make/out/stepmake.lsm +++ b/stepmake/make/out/stepmake.lsm @@ -1,15 +1,15 @@ Begin3 Title: StepMake -Version: 0.1.59 -Entered-date: 23OCT98 +Version: 0.1.61 +Entered-date: 08DEC98 Description: Keywords: music notation typesetting midi fonts engraving Author: janneke@gnu.org (Jan Nieuwenhuizen) hanwen@cs.ruu.nl (Han-Wen Nienhuys) Maintained-by: janneke@gnu.org (Jan Nieuwenhuizen) Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert - 40k stepmake-0.1.59.tar.gz + 40k stepmake-0.1.61.tar.gz Original-site: pcnov095.win.tue.nl /pub/lilypond/development/ - 40k stepmake-0.1.59.tar.gz + 40k stepmake-0.1.61.tar.gz Copying-policy: GPL End diff --git a/stepmake/make/out/stepmake.spec b/stepmake/make/out/stepmake.spec index 5131d881e9..97d36df82b 100644 --- a/stepmake/make/out/stepmake.spec +++ b/stepmake/make/out/stepmake.spec @@ -1,9 +1,9 @@ Name: stepmake -Version: 0.1.59 +Version: 0.1.61 Release: 1 Copyright: GPL Group: Development -Source0: pcnov095.win.tue.nl:/pub/lilypond/development/stepmake-0.1.59.tar.gz +Source0: pcnov095.win.tue.nl:/pub/lilypond/development/stepmake-0.1.61.tar.gz Summary: generic make package Packager: janneke@gnu.org (Jan Nieuwenhuizen) Buildroot: /tmp/stepmake-install