GNU C++ version 2.7 or newer (yes, 2.8 is fine).
+=item *
+
+Python
=back
GNU LilyPond does use a lot of resources. For operation you need the following:
-
=over 5
=item *
=item *
Bison (version 1.25 or newer).
+
=item *
Perl-5. Most documentation was created with the perl's Plain Old
to install GNU LilyPond, simply type:
configure
+ make
make install
This will install the following files:
Set the directory mf input is in (idem)
+=item B<--enable-config>
+
+Output to different configuration files. Needed for multi-platform
+builds
+
+
=back
All options are documented in the F<configure> help
resulting binaries can be found in the subdirectories F<out/> (which
contain all files generated during compilation).
+=head1 CONFIGURING FOR MULTIPLE PLATFORMS
+
+If you want to compile LilyPond with different configuration settings,
+then, you can use the B<--enable-config> option. Example: suppose I
+want to build with and without profiling. Then I'd use the
+following for the normal build,
+
+ configure --prefix=~ --disable-optimise --enable-checking
+ make
+ make install
+
+and for the profiling version, I specify a different configuration.
+
+ configure --prefix=~ --enable-profiling --enable-config=optprof --enable-optimise --disable-checking
+ make configuration=optprof
+ make configuration=optprof install
+
+
=head1 INSTALLING
If you have done a successful C<make>, then a simple
is unpacked correctly, in particular the empty out directories
(F<flower/out>, F<lib/out> et. al.)
-=head1 MUSIXTEX
-
-Previous versions (before 0.1.39) used fonts from the TeX macro
-package "MusixTeX". You can still use these, but they are not
-supported. Since LilyPond's Feta font is much prettier, you'd be
-seriously misguided if you used them, but anyway, here are the
-installation instructions for those deprecated fonts.
-
-
-[obsolete] I use the MusixTeX fonts those found in MusixTeX
-T.73. Beware, the clef symbol seems to have changed its position in
-some versions, (notably Egler's, a.k.a. OpusTeX). The MusixTeX fonts
-are included in MusixTeX (T73 or newer), which can be had from any
-CTAN site, e.g. at
-
-=over 4
-
-=item ftp://ftp.shsu.edu/tex-archive/macros/musixtex/taupin
-
-=item ftp://ftp.tex.ac.uk/tex-archive/macros/musixtex/taupin
-
-=item ftp://ftp.dante.de/tex-archive/macros/musixtex/taupin
-
-=back
-
-You only need the contents of the F<mf/> subdirectory of the
-package. The primary site of the Taupin version is
-ftp://hprib.lps.u-psud.fr/pub/music_zips/musixtex.zip
-
-Install the musixtex fonts in a directory which TeX and MF knows (if
-you are root, look for a directory which contains the directories with
-AMS and CM source (*.mf) files. Create a subdir lilypond or musixtex
-and copy the fonts into that). Do not forget to rehash TeX (if
-applicable)
-
-Example: my fonts are in F</usr/local/lib/texfonts/musixtex/>, and I
-have a symlink pointing to that in
-F</usr/lib/texmf/texmf/fonts/source/public/>. After I copied the
-files, I ran "texhash"
-
-Andreas Egler's version of MusixTeX, now called OpusTeX, will also
-work. Andreas moved some characters around in the fonts, so you have
-to edit the definitions in F<tex/eglerdefs.tex>.
-
-
-
=head1 AUTHORS
Han-Wen Nienhuys <hanwen@cs.ruu.nl>
# identify module:
#
NAME = Documentation
+SUBDIRS=man
#
include ./$(depth)/make/Variables.make
include ./$(depth)/make/Version.make
include ./$(depth)/make/Files.make
-include ./Rules.make
+include ./$(depth)/make/Docrules.make
#
#
DOCFILES = $(wildcard *.doc)
OUTPODFILES = $(addprefix $(outdir)/,$(PODFILES))
+BIBFILES= $(wildcard *.bib)
TEXTFILES = $(OUTPODFILES:.pod=.txt)
GROFFFILES = $(OUTPODFILES:.pod=.1)
HTMLFILES = $(OUTPODFILES:.pod=.html)
gifs: $(addprefix $(outdir)/, $(giffiles))
-EXTRA_DISTFILES = $(XPMS) $(DOCFILES) vocabulary-data vocabulary-forms.el fonts.tex automake.urgh engraving.bib
+EXTRA_DISTFILES = $(XPMS) $(DOCFILES) vocabulary-data vocabulary-forms.el fonts.tex automake.urgh $(BIBFILES)
# don't do DVI files. They can only be made if lily is installed
do-doc: $(TEXTFILES)
html: $(HTMLFILES)
-htmldist: html
- $(lily_bindir)/make_website
-
dvi: $(DVIFILES)
# generic targets and rules:
#
include $(depth)/make/Targets.make
include $(depth)/make/Rules.make
-
-MAN1FILES = lilypond convert-mudela mi2mu mudela-book
-MAN1GROFF = $(addprefix $(outdir)/, $(addsuffix .1,$(MAN1FILES)))
-
-localinstall: $(outdir)/lilypond.1
- $(INSTALL) -d $(mandir)/man1
- $(INSTALL) -m 644 $(MAN1GROFF) $(mandir)/man1
-
-
-localuninstall:
- (cd $(mandir)/man1/; rm -f $(MAN1GROFF))
-
-
-
--- /dev/null
+%
+% from the University of Colorado Engraving page (by Alyssa Lamb)
+%
+
+@Book {
+author ={Jacob, Archibald},
+year={ 1947},
+title = {Musical handwriting : or, How to put music on paper : A handbook for all musicians, professional and amateur},
+address ={ London}
+publisher ={Oxford University Press},
+subject = { Musical notation},
+}
+
+@Book {
+author ={Brandt, Carl, and Roemer, Clinton},
+title = {Standardized Chord Symbol Notation},
+address={Sherman Oaks, CA}
+publisher={Roerick Music Co.}
+}
+
+@Book {
+author = {Johnson, Harold M},
+year = {1946},
+title = {How to write music manuscript an exercise-method handbook for the music student, copyist, arranger, composer, teacher},
+publisher={ Carl Fischer, Inc. }
+address= {New York}
+subject = {Musical notation --Handbooks, manuals},
+}
+
+@Book {
+title = {Music Printing & Publishing},
+editedby={ Donald W. Krummel \& Stanley Sadie},
+author = {?}
+year = {1990},
+series={ The Norton/Grove Handbooks in Music.}
+publisher={W.W. Norton}
+}
+
+@Book {
+author={Foss, Hubert},
+title = {Music Printing},
+series = {Practical Printing and Binding},
+address={ London},
+publisher={ Oldhams Press Ltd., Long Acre.}
+}
+
+@Book {
+author = {Steele, Robert},
+year = {1903},
+title = {The Earliest English Music Printing},
+address={ London},
+}
+@Book {
+author={Austin, Ernest},
+title = {The Story of Music Printing},
+address={ London},
+publisher={Lowe and Brydone Printers, Ltd.}
+}
+
+}
+
+@Book {
+title = {Pictoral History of Music Printing},
+address={E;lhardt, Indiana}
+publisher={H. and A. Selmer, Inc.}
+}
+
+@Book {
+author = {Scholderer, Victor},
+year = {1963},
+title = {Johann Gutenberg},
+address={ London},
+publisher={ British Museum},
+}
+
+@Book{
+author = {Wintermitz, Emmanuel},
+year = {1955},
+title = {Musical Autographs from Monteverdi to Hindemith},
+address={Princeton}
+publisher={Princeton University Press},
+}
+
+@Book{
+author = {Wolf, Johannes},
+year = {1919},
+title = {Handbuch der Notationskunde},
+address={Leipzig},
+publisher={ Breitkopf & Hartel.}
+}
+@Book{
+
+author = {Novello, A},
+year = {1847},
+title = {Some Account of the Methods of Musick Printing, with Specimens of the Various Sizes of Moveable Types and of Other Matters},
+address={ London}.
+}
+
+@Book{
+author={Chrsander, F.}
+year={18??}
+title={A Sketch of the HIstory of Music printing, from the 15th to the 16th century},
+}
+@Book{
+author = {Squire, W},
+year = {1897},
+title = {Notes on Early Music Printing},
+, title = {Bibliographica},
+, iii, 99.
+}
+
+@Book{
+author = {Meyer, K. and O'Meara, J},
+year = {1935},
+title = {The Printing of Music, 1473-1934},
+, title = {The Dolphin},
+, ii, p.171-207.
+
+@Book{
+author = {Pattison, B},
+year = {1939},
+title = {Notes on Early Music Printing},
+,title = {The Library},
+, 4th ver., xix, p.389-421.
+}
+
+@Book{
+author = {Barksdale, A},
+year = {1957},
+title = {The Printed Note: 500 Years of Music Printing and Engraving},
+address={Toledo, Ohio}
+note={(exhibition catalogue, the Toledo Museum of Art).}
+}
+
+@Book{
+author = {King, H},
+year = {1964},
+title = {Four Hundred Years of Music Printing},
+London.
+}
+
+@Book{
+Gamble, W. 1923 (Rev. 1971). title = {Music Engraving and Pinting, Historical And Technical Treatise},
+Londond.
+
+Deutsch, O.F. 1946 (Rev.1961). title = {Music Publishers' Numbers},
+London.
+}
+
+@Book{
+author = {Marco, G.A},
+year = {1962},
+title = {The Earliest Music Printers of Continental Europe: a Checklist of Facsimiles Illustrating Their Work},
+Charlottesville, Virginia.
+}
+
+@Book{
+author = {Kinkeldey, O},
+year = {1932},
+title = {Music And Music Printing in Incunabula},
+, title = {Papers of the Bibliographical Society of America},
+, xxvi, p.89-118.
+}
+
+@Book{
+author = {Oldman, C.B},
+year = {1934},
+title = {Collecting Musical First Editions},
+London.
+Also in: Carter, J. 1934. title = {New Paths in Book Collecting},
+London.
+
+Krummel, D.W. 1958-9. title = {Graphic Analysis in Application to Early American Engraved Music},
+, title = {Notes},
+, xvi, p.213.
+}
+
+@Book{
+author = {Krummel, D.W},
+year = {1971},
+title = {Oblong Format in Early Music Books},
+, title = {The Library},
+, 5th ser., xxvi, p.312.
+}
+
+@Book{
+author = {King, A.H},
+year = {1973},
+title = {The 50th Anniversary of Music Printing},
+, title = {M_________},
+, cxiv.
+}
+
+@Book{
+Rastall, Richard. 1982. title = {The notation of Western music : an introduction},
+New York, N.Y.: St. Martin's Press.
+subject = { Musical notation},
+
+
+}
+
+@Book{
+author = {Tappelot, Willy},
+year = {1947},
+title = {La Notation Musicale},
+Paris: Neuchatel.
+}
+
+@Book{
+author = {Williams, C.F. Abdy},
+year = {1903},
+title = {The Story of Notation},
+New York: Charles Scribner's Sons.
+}
+
+@Book{
+author = {Rosenthal, Carl A},
+year = {1967},
+title = {A Practical Guide to Music Notation},
+New York: MCA Music.
+
+<UL>}
+
+@Book{
+Apel, Willi. 1953. title = {The notation of polyphonic music, 900-1600.},
+Cambridge, Mass.: Mediaeval Academy of America.
+subject = {Musical notation},
+}
+
+@Book{
+
+
+Berger, Anna Maria Busse. 1993. title = {Mensuration and proportion signs : origins and evolution},
+Oxford, England: Clarendon Press; New York: Oxford University Press .
+}
+
+@Book{
+Parrish, Carl. 1957. title = {The notation of medieval music},
+New York : Norton.
+subject = {Musical notation},
+
+
+}
+
+@Book{
+author = {Parrish, Carl},
+year = {1946},
+title = { The Notation of Medieval Music},
+New York: Carl Fischer, Inc.
+}
+
+@Book{
+author = {Patch, Harry},
+year = {1949},
+title = { Genesis of a Music},
+Madison: University of Wisconsin Press.
+}
+
+@Book{
+Cage, John. 1969. title = {Notations},
+New York: Something Else Press.
+subject = { Music, Manuscripts, Facsimiles},
+
+(Facsimiles of holographs from the Foundation for Contemporary Performance Arts, with text by 269 composers, but rearranged using title = {chance operations.},
+)
+}
+
+@Book{
+author = {Gaburo, Virginia},
+year = {1977},
+title = {Notation},
+publisher= {Lingua Press: La Jolla, California}.
+subject = { A Lecture about notation, new ideas about},
+
+
+}
+
+@Book{
+author = {Risatti, Howard},
+year = {1975},
+title = {New Music Vocabulary},
+Urbana, Illinois: University of Illinois Press.
+subject = { A Guide to Notational Signs for Contemporary Music},
+
+
+}
+
+@Book{
+author = {Boehm, Laszlo},
+year = {1961},
+Modern Music Notation. New York: G. Schirmer, Inc.
+}
+
+@Book{
+author = {Cowell, Henry},
+year = {1930},
+title = {New Musical Resources},
+New York: Alfred A. Knopf, Inc.
+
+author = {Cowell, Henry},
+year = {1927},
+title = {Our Inadequate Notation},
+,title = {Modern Music},
+, Vol. 4, No. 3.
+}
+
+@Book{
+author = {Bowers, Roger},
+year = {1992},
+title = {Music & Letters},
+v73, n3, August, p347(52)
+
+Some reflection upon notation and proportion in Monteverdi's mass and vespers.
+}
+
+@Book{
+author = {Brainard, Paul},
+year = {1992},
+title = {Current Musicology},
+n50, July-Dec, p21(26)
+
+Proportional notation in the music of Schutz and his contemporaries in the 17th Century.}
+
+@Book{
+
+author = {Monelle, Raymond},
+year = {1989},
+title = {Comparative Literature},
+v41, n3, Summer, p252(18)
+
+Music notation and the poetic foot.
+}
+
+@Book{
+author = {Pinegar, Sandra},
+year = {1993},
+title = {Current Musicology},
+n53, July, p99(10)
+The seeds of notation and music paleography.
+
+author = {Smith, Norman E},
+year = {1990},
+title = {Current Musicology},
+n45-47, Jan-Dec, p283(22)
+
+The notation of fractio modi.
+}
+
+@Book{
+author = {Treitler, Leo},
+year = {1992},
+title = {The Journal of Musicology},
+v10, n2, Spring, p131(61)
+
+The title = {unwritten},
+and title = {written transmission},
+of medieval chant and the start-up of musical notation.
+
+Notational practice developed in medieval music to address the written tradition for chant which interacted with the unwritten vocal tradition...
+}
+
+@Book{
+author = {West, M.L},
+year = {1994},
+title = {Music & Letters},
+v75, n2, May, p161(19)
+The Babylonian musical notation and the Hurrian melodic texts.
+
+A new way of deciphering the ancient Babylonian musical notation...
+
+}
+
+@Book{
+author = {Brown, Earle},
+year = {1986},
+title = {Musical Quarterly},
+v72, Spr, p180(22)
+
+The notation and performance of new music.
+}
+
+@Book{
+author = {Eggleston, Suzanne},
+year = {1994},
+
+title = {Notes},
+v51, n2, Dec, p657(7)
+
+New periodicals
+
+A list of new music periodicals covering the period Jun.-Dec. 1994. Includes aims, formats and a description of the contents of each listed periodical. Includes title = {Music Notation News},
+
+}
+
+@Book{
+
+author = {Fuller, David},
+year = {1989},
+title = {The Journal of Musicology},
+v7, n1, Wntr, p21(8)
+
+Notes and inegales unjoined: defending a definition. (written-out inequalities in music notation).
+}
+
+@Book{
+
+author = {Jones, David Evan},
+year = {1990},
+title = {Perspectives of New Music},
+
+
+Speech extrapolated. (includes notation)
+
+}
+
+@Book{
+
+author = {Lependorf, Jeffrey},
+year = {1989},
+I>Perspectives of New Music</I> v27, n2, Summer, p232(20)
+
+Contemporary notation for the shakuhachi: a primer for composers. (Tradition and Renewal in the Music of Japan)
+
+}
+
+@Book{
+author = {Rastall, Richard},
+year = {1993},
+title = {Music & Letters},
+v74, n4, Nov, p639(2)
+Equal Temperament Music Notation: The Ailler-Brennink Chromatic Notation. Results and Conclusions of the Music Notation Refor by the Chroma Foundation (book reviews).
+}
+
+@Book{
+<UL>
+Francois, Jean-Charles.title = {Perspectives of New Music},
+v30, n1, Wntr, p6(15)
+
+1992.
+Writing without representation, and unreadable notation. by Jean-Charles Francois.
+Modern music has outgrown notation. While the computer is used to write down music with accuracy never before achieved, the range of modern sounds has surpassed the relevance of the computer...
+}
+
+@Book{
+author = {Hamel, Keith A},
+year = {1989},
+
+title = {Perspectives of New Music},
+v27, n1, Wntr, p70(14)
+
+A design for music editing and printing software based on notational syntax. (computer music)
+
-@Book{wanske,
- author = {Helene Wanske},
- ALTeditor = {},
- title = {Musiknotation --- Von der Syntax des Notenstichs zum
-EDV-gesteuerten Notensatz},
- publisher = {Schott-Verlag, Mainz},
- year = {1988},
- OPTkey = {},
- OPTvolume = {},
- OPTnumber = {},
- OPTseries = {},
- OPTaddress = {},
- OPTedition = {},
- OPTmonth = {},
- OPTnote = {ISBN 3-7957-2886-x},
- OPTannote = {}
-}
-
-
@Book{rastall,
author = {Richard Rastall},
ALTeditor = {},
title = {The Notation of Western Music: an
-Introduction},
+ Introduction},
publisher = {J. M. Dent \6& Sons London},
year = {1983},
- OPTkey = {},
- OPTvolume = {},
- OPTnumber = {},
- OPTseries = {},
- OPTaddress = {},
- OPTedition = {},
- OPTmonth = {},
- OPTnote = {},
- OPTannote = {}
+ key = {},
+ volume = {},
+ number = {},
+ series = {},
+ address = {},
+ edition = {},
+ month = {},
+ note = {},
+ comment = {Interesting account of the evolution and origin of common notation starting from neumes, and ending with modern innovations HWN},
+ annote = {},
}
@Book{ross,
-author = {Ted Ross},
+ author = {Ted Ross},
title = {Teach yourself the art of music engraving and processing},
publisher = {Hansen House},
year = {1987},
+ key = {},
+ volume = {},
+ number = {},
+ series = {},
+ address = {},
+ edition = {},
+ month = {},
+ comment = {This is about engraving, i.e. professional typesetting. It contains
+ directions on good typesetting, but the sections on reproduction
+ technicalities, how to use pens and history are interesting.
+ Especially the section on Music Typewriters is amusing HWN},
+ annote = {},
+}
+
+@Article{blostein94,
+ author = {Dorothea Blostein and Lippold Haken},
+ title = {The Lime Music Editor: A Diagram Editor Involving Complex
+ Translations},
+ journal = {Software Practice and Experience},
+ year = {1994},
+ key = {},
+ volume = {24},
+ number = {3},
+ month = {march},
+ pages = {289--306},
+ note = {},
+ annote = {},
+ comment = {A description of various conversions, decisions and issues relating to this interactive editor HWN},
+}
+
+
+
+@Book {wanske,
+ comment = {I. A very thorough overview of engraving practices of various craftsmen. It includes detailed specs of characters, dimensions etc. II. a thorough overview of a anonymous (by now antiquated) automated system. EDV Means e(lektronischen) D(aten)v(erarbeitung), electronic data processing HWN},
+ year = {1988},
+ title = {Musiknotation --- Von der Syntax des Notenstichs zum EDV-gesteuerten Notensatz},
+ author = {Helene Wanske},
+ publisher = {Schott-Verlag},
+ address = {Mainz},
+ isbn = {ISBN 3-7957-2886-x},
+}
+
+
+
+
+@Book{,
+ ALTauthor = {},
+ ALTeditor = {},
+ title = {},
+ publisher = {},
+ year = {},
+ key = {},
+ volume = {},
+ number = {},
+ series = {},
+ address = {},
+ edition = {},
+ month = {},
+ note = {},
+ annote = {},
+}
+
+
+
+@Book {,
+ year = {1993},
+ title = {Standard Music Notation Practice},
+ author = {Maxwell Weaner and Walter Boelke},
+ totalentry = {revised edition by Arnold Broido and Daniel Dorff.},
+ publisher = { Music Publisher's Association of the United States Inc},
+ address = {New York}
+}
+
+
+
+@Book {,
+ comment = {Sound (boring) review of the various hairy rhythmic notations used by avant-garde composers HWN},
+ year = {1978},
+ title = {Modern Rhythmic Notation},
+ author = {Gardner Read},
+ publisher = {Indiana University Press},
+}
+
+
+@Book {,
+ comment = {This is as close to the ``standard'' reference work for music notation issues as one is likely to get. MB},
+ title = {Music Notation: a Manual of Modern Practice},
+ author = {Gardner Read},
+ totalentry = {(2nd edition)},
+ publisher ={Taplinger Publishing},
+ address ={New York},
+ note = { (Out of print)},
+}
+
+
+@Book{,
+ ALTauthor = {},
+ ALTeditor = {},
+ title = {},
+ publisher = {},
+ year = {},
OPTkey = {},
OPTvolume = {},
OPTnumber = {},
OPTaddress = {},
OPTedition = {},
OPTmonth = {},
- OPTnote = {This is about engraving, i.e. professional typesetting. It contains
-directions on good typesetting, but the sections on reproduction
-technicalities, how to use pens and history are interesting.
-Especially the section on Music Typewriters is amusing HWN},
+ OPTnote = {},
OPTannote = {}
}
+@Book {,
+ year = {1948},
+ title = {Aus der Werkstatt eines Notenstechers},
+ author = {Karl Hader},
+ publisher = {Waldheim--Eberle Verlag},
+ address ={Vienna},
+
+ comment = {Hader was the chief-engraver of the Waldheim-Eberle music
+ publishers. This book contains the most important rules on engraving
+(according to [Chlapik])},
+
+}
+
+
+
+@Booklet {,
+ comment = {Pamphlet explaining some fine points in music font design HWN},
+ year = {1996},
+ title = {Standard music notation specifications for computer programming. },
+ month = {December},
+ publisher = {MPA},
+}
+
+@TechReport{,
+ comment = {Rules on formatting music formulated for use in computers. Mainly distilled from [Ross] HWN},
+ year = {1988},
+ title = {Music Formatting Guidelines,},
+ author = {D. Roush},
+ note={Technical Report OSU-CISRC-3/88-TR10},
+ institution ={Department of Computer and Information Science, The Ohio State University},
+}
+
+
+
+@PhdThesis {,
+ year = {1985},
+ title = {Music Notation by Computer},
+ author = {Donald Byrd},
+ institution = {Dissertation Indiana University},
+}
+
+
+@Article {,
+ year = {1974},
+ title = {A System for Music Printing by Computer},
+ author = {Donald Byrd},
+ journal = {Computers and the Humanities},
+ volume ={ 8},
+ pages ={161-72},
+}
+
+
+@Book {,
+ comment = {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},
+}
+
+
+@PhdThesis {,
+ year = {1975},
+ title = {A Computer-Oriented System for Music Printing},
+ author = {David A Gomberg},
+ school = {Washington University},
+}
+
+
+@Book {,
+ comment = {Annual editions since 1985, many containing surveys of music typesetting technology. SP},
+ title = {Directory of Computer Assisted Research in Musicology},
+ author = {Walter B Hewlett. and Eleanor Selfridge-Field},
+ totalentry = {Menlo Park, CA: Center for Computer Assisted Research in the Humanities},
+}
+
+
+@Book {,
+ title = {A Computer-oriented System for Music Printing},
+ author = {David A. Gomberg; },
+
+ journal = {Computers and the Humanities},
+ volume={11},
+ pages = {63-80},
+}
+
+
+@TechReport {,
+ comment = {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},
+ title = {Spacing a Line of Music,},
+ author = {John S. Gourlay},
+ totalentry = {OSU-CISRC-10/87-TR35},
+ institution ={ Department of Computer and Information Science, The Ohio State University},
+}
+
+
+@TechReport {,
+ comment = {A brief overview of MusiCopy HWN},
+ year = {1987},
+ title = {MusiCopy: An automated Music Formatting System},
+ author = {Allen Parish, Wael A. Hegazy, John S. Gourlay, Dean K. Roush and F. Javier Sola},
+ totalentry = {OSU-CISRC-10/87-TR29},
+ institution ={ Department of Computer and Information Science, The Ohio State University},
+}
+
+
+@TechReport {,
+ comment = {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, A. Parrish, D. Roush, F. Sola, Y. Tien},
+ totalentry = {OSU-CISRC-2/87-TR3},
+ institution ={Department of Computer and Information Science, The Ohio State University},
+}
+
+
+@TechReport {,
+ comment = {Describes the "parser" which converts MusiCopy MDL to MusiCopy Simultaneities & columns HWN},
+ year = {1987},
+ title = {On the Implementation of the MusiCopy Language Processor,},
+ author = {Wael A. Hegazy},
+ number = { OSU-CISRC-10/87-TR34},
+ institution={ Department of Computer and Information Science, The Ohio State University},
+}
+
+
+@TechReport {,
+ comment = {This generalizes TeX's breaking algorithm to music. It also appeared in Document Manipulation and Typography, J.C. van Vliet (ed) 1988. HWN},
+ year = {1987},
+ title = {Optimal line breaking in music},
+ author = {Wael A. Hegazy and John S. Gourlay},
+ totalentry = { OSU-CISRC-8/87-TR33},
+ institution={Department of Computer and Information Science, The Ohio State University, },
+}
+
+
+@TechReport {,
+ comment = {User manual of MusiCopy. Includes an impressive example piece. HWN},
+ year = {1987},
+ title = {Using MusiCopy},
+ author = {Dean K. Roush},
+ totalentry = { OSU-CISRC-18/87-TR31},
+ institution={ Department of Computer and Information Science, The Ohio State University},
+}
+
+
+@TechReport {,
+ comment = {Placement of balls, stems, dots which occur at the same moment ("Simultaneity") HWN},
+ year = {1987},
+ title = {Computer Formatting of Musical Simultaneities,},
+ author = {A. Parrish and John S. Gourlay},
+ institution={ Department of Computer and Information Science, The Ohio State University},
+}
+ totalentry = { OSU-CISRC-10/87-TR28},
+}
+
+
+@TechReport {,
+ comment = {Overview of a procedure for generating slurs HWN},
+ year = {1987},
+ title = {Computer Design of Musical Slurs, Ties and Phrase Marks,},
+ author = {F. Sola},
+ institution={ Department of Computer and Information Science, The Ohio State University},
+ totalentry = { OSU-CISRC-10/87-TR32},
+}
+
+
+@TechReport {,
+ institution={ Department of Computer and Information Science, The Ohio State University},
+ comment = {Calculating beam slopes HWN},
+ year = {1987},
+ title = {Design of Musical Beams,},
+ author = {F. Sola and D. Roush},
+ totalentry = { OSU-CISRC-10/87-TR30},
+}
+
+
+@Article {,
+ comment = {This paper describes the MusiCopy musicsetting system and an input language to go with it. HWN},
+ year = {1986},
+ title = {A language for music printing},
+ author = {John. S. Gourlay},
+ journal = { Communications of the ACM},
+ volume= { 29 },
+ number ={5},
+ pages = {388--401},
+}
+
+
+
+
+@Article {,
+ comment = {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},
+}
+
+
+@Article {,
+ comment = {This describes an algorithm which uses springs between adjacent columns. This algorithm is a "subclass" of the LilyPond algorithm. HWN},
+ year = {1995},
+ title = {A New Algorithm for Horizontal Spacing of Printed Music},
+ author = {Lippold Haken and Dorothea Blostein},
+ totalentry = {Lippold Haken and Dorothea Blostein. ``A New Algorithm for Horizontal Spacing of Printed Music'', International Computer Music Conference, Banff, Sept. 1995},
+ pages = {118-119},
+}
+
+@Article {,
+ comment = {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},
+ totalentry = {Communications of the ACM},
+ volume={J34},
+ number={ 3},month={ March}, pages = {88-99},
+}
+
+
+@Article {,
+ comment = {Describes a system called MusicEase, and explains that it uses "constraints" (which go unexplained) to automatically position various elements. HWN},
+ year = {1996},
+ title = {Creating Printed Music Automatically},
+ author = {Gary M. Rader},
+ journal = {Computer},
+ volume={ 29},
+ number={6},
+ month={June}, pages = {61--69}},
+
+
+@PhdThesis {,
+ comment = {Don't ask Stephen for a copy. Write to the Bodleian Library, Oxford, or to the British Library, instead. SP},
+ year = {1988},
+ title = {Computer Tools for Music Information Retrieval},
+ author = {Stephen Dowland Page},
+ school ={ Dissertation University of Oxford},
+}
+
+@MastersThesis{,
+ comment = {This dutch thesis describes a simplistic (monophonic) typesetting system, and focuses on the breaking algorithm, which is taken from Hegazy & Gourlay HWN},
+ year = {1991},
+ title = {Een Geautomatiseerd Systeem voor het Afdrukken van Muziek},
+ author = {Ren\'e Roelofs},
+ totalentry = {Ren\'e Roelofs. ``Een Geautomatiseerd Systeem voor het Afdrukken van Muziek'' afstudeerscriptie Bestuurlijke informatica, no 45327, Erasmus universiteit Rotterdam, 1991. (``An automated system for printing music'' Master's Thesis Managerial Computer Science.)},
+}
+
+
+@Article {,
+ year = {1993},
+ title = {Representation and manipulation of music documents in SceX},
+ author = {Miguel Filgueiras and Jos\'e Paulo Leal},
+ journal= { Electronic Publishing},
+ volume={ 6},
+ number={4}, pages = {507--518},
+
+}
+
+
+@Article {,
+ comment = {A paper on a TROFF preprocessor to typeset music. The output shown is not very sophisticated, and contains some typographical atrocities HWN},
+ year = {1987},
+ title = {Music --- A language for typesetting music scores},
+ author = {Eric Foxley, },
+ journal={ Software --- Practice and Experience, },
+ volume={ 17},
+ number={8}, pages = {485-502},
+
+}
+
+
+@Book {,
+ year = {1996},
+ title = {Implementing a Symbolic Music Processing System},
+ author = {Miguel Filgueiras},
+ totalentry = {LIACC, Universidade do Porto, 1996; submitted},
+}
+
+@Book {,
+ title = {Some Music Typesetting Algorithms},
+ author = {Miguel Filgueiras},
+ totalentry = {Miguel Filgueiras. ``Some Music Typesetting Algorithms''. LIACC, Universidade do Porto, forthcoming},
+}
+
+
+@Book {,
+ comment = {A concise, alphabetically ordered list of typesetting and music (notation) issues with a rather simplistic attitude but in most cases "good-enough" answers JCN},
+ year = {1996},
+ title = {Essential Dictionary of Music Notation},
+ author = {Tom Gerou and Linda Lusk},
+ publisher = {Alfred Publishing},
+ address ={Van Nuys CA},
+ isbn ={ ISBN 0-88284-768-6},
+}
+
+
+@Book {,
+ comment = {An clearly written book for the casually interested reader. It shows some of the conventions and difficulties in printing music HWN},
+ year = {1987},
+ title = {Die Praxis des Notengraphikers},
+ author = {Herbert Chlapik},
+ publisher = {Doblinger},
+ isbn ={ ISBN 3-9000 035-96-2},
+}
+
+
+@Book {,
+ comment = {Webpages about engraving (designed with finale users in mind) (sic) HWN},
+ institution = {The University of Colorado},
+ title ={The University of Colorado Music Engraving page.},
+ url={http://obenamots.cc.colorado.edu/Musicpress/engraving.html},
+}
+
+
+
+
+@Book {,
+ year = {1963},
+ author = {Anthony Donato},
+ title ={ Preparing Music Manuscript},
+ address ={ Englewood Cliffs, NJ},
+ publisher={Prentice-Hall},
+}
+
+
+@Book {,
+ year = {1900},
+ title = {Uitgeven van muziek},
+ author = {Donemus},
+ publisher= {Donemus Amsterdam},
+}
+
+
+@Book {,
+ year = {1987},
+ title = {The Norton Manual of Music Notation},
+ author = {George Heussenstamm},
+ address= { New York},
+ publisher={ Norton},
+}
+
+
+@Book {,
+ year = {1972},
+ title = {Notation in New Music; a critical guide to interpretation and realisation},
+ author = {Erdhard Karkoshka},
+ translator={Ruth Koenig},
+ publisher={Praeger Publishers},
+ address={ New York},
+ note ={(Out of print)},
+}
+
+
+@Book {,
+ year = {1973},
+ title = {The Art of Music Copying},
+ author = {Clinton Roemer},
+ publisher={ Roerick music co.},
+ address= { Sherman Oaks (CA)},
+}
+
+
+@Book {,
+ year = {1979},
+ title = {Music Notation Primer},
+ author = {Glen Rosecrans},
+ publisher={Passantino},
+ address={New York},
+}
+
+
+@Book {,
+ year = {1980},
+ title = {Music Notation in the Twentieth Century},
+ author = {Kurt Stone},
+ publisher= {Norton},
+ address={New York},
+ note ={(Out of print)},
+
+}
+
+
+@Book {,
+ comment = {This paper deals with some command-line tools for music editing and playback. It doesn't mention notation issues, but does come with the grand idea (not) of using music to monitor complex systems. Imagine your nuclear plant supervisor to use AC/DC for checking the reactor HWN},
+ year = {1990},
+ title = {Unix music tools at Bellcore},
+ author = {Peter S. Langston},
+ journal={ Software --- Practice and Experience},
+ volume={20},
+ number={S1},
+ pages={47--61},
+}
+
+
+
+@URL {,
+ comment = {FAQ (with answers) about TAB, the ASCII variant of Tablature. HWN},
+ title = {how to read and write tab: a guide to tab notation},
+ author = {Howard Wright},
+ email={Howard.Wright@ed.ac.uk},
+ url={ http://wabakimi.carleton.ca/~phacket2/guitar/tabfaq.html},
+}
+
+
+@URL {,
+ comment = {Specs for NIFF, a comprehensive but binary (yuk) format for notation HWN},
+ year = {1995},
+ title = {NIFF6a Notation Interchange File Format},
+ author = {Cindy Grande, },
+ publisher={Grande Software Inc.},
+ url={http://www.jtauber.com/music/encoding/niff/},
+}
+
+
+@URL {,
+ title = {SMDL, Standard Musical Description Language},
+ url={ftp://ftp.ornl.gov/pub/sgml/wg8/smdl/10743.pdf},
+ note={ISO/IEC DIS 10743},
+}
This document are some design notes of the Feta font. Feta (not an
abbreviation of Font-En-Tja) is a font of music symbols. All MetaFont
-%ugh sources are original. The symbols are modelled after various
-editions of music, notably
+sources are original. The symbols are modelled after various editions
+of music, notably
\begin{itemize}
\item B\"arenreiter
\item Hofmeister
(running from 0 to 8).
We have tried to measure these (helped by a magnifying glass), and
-found the staffsizes in the following table. One should note that
+found the staffsizes in table~\ref{fonts:staff-size}. One should note that
these are estimates, so I think there could be a measuring error of ~
.5 pt. Moreover [Ross] states that not all engravers use exactly
those sizes.
-\begin{table}
-\begin{tabular}{lll}
-Staffsize &Numbers &Name\\
+\begin{table}[h]
+ \begin{center}
+ \begin{tabular}{lll}
+Staffsize &Numbers &Name\\
\hline\\
-26.2pt &No. 0\\
-22.6pt &No. 1 &Giant/English\\
-21.3pt &No. 2 &Giant/English\\
-19.9pt &No. 3 &Regular, Ordinary, Common\\
-19.1pt &No. 4 &Peter\\
-17.1pt &No. 5 &Large middle\\
-15.9pt &No. 6 &Small middle\\
-13.7pt &No. 7 &Cadenza\\
-11.1pt &No. 8 &Pearl\\
-\end{tabular}
-\caption{Font and staff sizes}
+26.2pt &No. 0\\
+22.6pt &No. 1 &Giant/English\\
+21.3pt &No. 2 &Giant/English\\
+19.9pt &No. 3 &Regular, Ordinary, Common\\
+19.1pt &No. 4 &Peter\\
+17.1pt &No. 5 &Large middle\\
+15.9pt &No. 6 &Small middle\\
+13.7pt &No. 7 &Cadenza\\
+11.1pt &No. 8 &Pearl\\
+
+ \end{tabular}
+ \caption{Foo}
+ \label{fonts:staff-size}
+ \end{center}
\end{table}
-
-This table is partially taken from [Ross]. Most music is set in No.3,
-but the papersizes usually are bigger than standard printer paper
-(such as A4). If you plot these, you'll notice that the sizes (With
-exception of 26) almost (but not quite) form a arithmetic progression.
-
Ross states that the dies (the stamps to make the symbols) come in
12 different sizes.
=head2 Music engraving: references
-Helene Wanske. ``Musiknotation --- Von der Syntax des Notenstichs zum
-EDV-gesteuerten Notensatz'', Schott-Verlag, Mainz 1988.ISBN 3-7957-2886-x.
+Helene Wanske. ``Musiknotation --- Von der Syntax des Notenstichs zum
+EDV-gesteuerten Notensatz'', Schott-Verlag, Mainz 1988. ISBN
+3-7957-2886-x.
[I. A very thorough overview of engraving practices of various
craftsmen. It includes detailed specs of characters, dimensions etc.
system. EDV Means e(lektronischen) D(aten)v(erarbeitung), electronic
data processing HWN]
-Maxwell Weaner and Walter Boelke, Standard Music Notation Practice,
+Maxwell Weaner and Walter Boelke. ``Standard Music Notation Practice'',
revised edition by Arnold Broido and Daniel Dorff. Music Publisher's
Association of the United States Inc., 1993.
=head2 Notation with computers
-Donald Byrd. ``Music Notation by Computer''. Dissertation Indiana
+Donald Byrd. ``Music Notation by Computer''. Dissertation Indiana
University, 1985.
-Donald Byrd. ``A System for Music Printing by Computer.'' Computers
+Donald Byrd. ``A System for Music Printing by Computer.'' Computers
and the Humanities, 8 (1974), 161-72.
-Leland Smith. ``Editing and Printing Music by Computer.'' Journal of
+Leland Smith. ``Editing and Printing Music by Computer.'' Journal of
Music Theory, 17 (1973), 292-309.
[If I remember correctly, this was concerned more with an input
language than with the typography. SP.]
-David A Gomberg. ``A Computer-Oriented System for Music Printing.''
+David A Gomberg. ``A Computer-Oriented System for Music Printing.''
Dissertation Washington University. 1975.
-Walter B Hewlett. and Eleanor Selfridge-Field. ``Directory of Computer
+Walter B Hewlett. and Eleanor Selfridge-Field. ``Directory of Computer
Assisted Research in Musicology''. Menlo Park, CA: Center for Computer
Assisted Research in the Humanities.
[This paper describes the MusiCopy musicsetting system and an input
language to go with it. HWN]
-Dorothea Blostein and Lippold Haken, ``The Lime Music Editor: A Diagram
+Dorothea Blostein and Lippold Haken. ``The Lime Music Editor: A Diagram
Editor Involving Complex Translations'', Software Practice and
Experience, Vol. 24, No. 3, March 1994, pp. 289-306.
[A description of various conversions, decisions and issues relating
to this interactive editor HWN]
-Lippold Haken and Dorothea Blostein, ``The Tilia Music Representation:
+Lippold Haken and Dorothea Blostein. ``The Tilia Music Representation:
Extensibility, Abstraction, and Notation Contexts for the Lime Music
Editor'', Computer Music Journal, Vol. 17, No. 3, 1993, pp. 43-58
[A description of Lime internals (which resemble older (before
0.0.68pre) LilyPond data structures somewhat) HWN]
-Lippold Haken and Dorothea Blostein, ``A New Algorithm for Horizontal
+Lippold Haken and Dorothea Blostein. ``A New Algorithm for Horizontal
Spacing of Printed Music'', International Computer Music Conference,
Banff, Sept. 1995, pp. 118-119.
[This describes an algorithm which uses springs between adjacent
columns. This algorithm is a "subclass" of the LilyPond algorithm. HWN]
-Dorothea Blostein and Lippold Haken, ``Justification of Printed Music'',
+Dorothea Blostein and Lippold Haken. ``Justification of Printed Music'',
Communications of the ACM, VolJ34, No. 3, March 1991, pp. 88-99.
[This paper provides a shallow overview of the algorithm used in LIME
"constraints" (which go unexplained) to automatically position various
elements. HWN]
-Stephen Dowland Page. ``Computer Tools for Music Information
+Stephen Dowland Page. ``Computer Tools for Music Information
Retrieval''. Dissertation University of Oxford, 1988.
[Don't ask Stephen for a copy. Write to the Bodleian Library, Oxford,
manipulation of music documents in SceX''. Electronic Publishing,
vol. 6 (4), 507--518, 1993.
-Eric Foxley, Music --- A language for typesetting music scores.
+Eric Foxley, ``Music --- A language for typesetting music scores''.
Software --- Practice and Experience, Vol. 17(8), 485--502, 1987.
[A paper on a TROFF preprocessor to typeset music. The output shown is
not very sophisticated, and contains some typographical atrocities HWN]
-Miguel Filgueiras, ``Implementing a Symbolic Music Processing
+Miguel Filgueiras. ``Implementing a Symbolic Music Processing
System''. LIACC, Universidade do Porto, 1996; submitted.
-Miguel Filgueiras, ``Some Music Typesetting Algorithms''. LIACC,
+Miguel Filgueiras. ``Some Music Typesetting Algorithms''. LIACC,
Universidade do Porto, forthcoming.
=head2 Engraving: further reading
-Tom Gerou and Linda Lusk. ``Essential Dictionary of Music Notation''
+Tom Gerou and Linda Lusk. ``Essential Dictionary of Music Notation''
Alfred Publishing, Van Nuys CA, 1996. ISBN 0-88284-768-6.
[A concise, alphabetically ordered list of typesetting and music
Donemus. ``Uitgeven van muziek''. Donemus Amsterdam, 1900
-George Heussenstamm. The Norton Manual of Music Notation. New York:
+George Heussenstamm. ``The Norton Manual of Music Notation''. New York:
Norton, 1987.
Erdhard Karkoshka. ``Notation in New Music. Trans. Ruth
Koenig''. Praeger Publishers, New York, 1972. (Out of print)
-C. Roemer, The Art of Music Copying. Roerick music co., Sherman Oaks
+C. Roemer, ``The Art of Music Copying''. Roerick music co., Sherman Oaks
(CA), 1973.
-Glen Rosecrans. Music Notation Primer. New York: Passantino, 1979.
+Glen Rosecrans. ``Music Notation Primer''. New York: Passantino, 1979.
-Kurt Stone. Music Notation in the Twentieth Century. New York: Norton,
+Kurt Stone. ``Music Notation in the Twentieth Century''. New York: Norton,
1980. (Out of print)
=head2 Other stuff
-Peter S. Langston, ``Unix music tools at Bellcore''. Software ---
+Peter S. Langston. ``Unix music tools at Bellcore''. Software ---
Practice and Experience, Vol. 20(S1), S1/47--S1/61, 1990.
[This paper deals with some command-line tools for music editing and
=head2 File formats
-Howard Wright <Howard.Wright@ed.ac.uk>, how to read and write tab: a
-guide to tab notation,
+Howard Wright <Howard.Wright@ed.ac.uk>, ``how to read and write tab: a
+guide to tab notation''.
http://wabakimi.carleton.ca/~phacket2/guitar/tabfaq.html
[FAQ (with answers) about TAB, the ASCII variant of Tablature. HWN]
-Cindy Grande, NIFF6a Notation Interchange File Format. Grande
-Software Inc., 1995. ftp://blackbox.cartah.washington.edu/pub/,
-http://www.jtauber.com/music/encoding/niff/
+Cindy Grande, ``NIFF6a Notation Interchange File Format''. Grande
+Software Inc., 1995. http://www.jtauber.com/music/encoding/niff/
[Specs for NIFF, a comprehensive but binary (yuk) format for notation HWN]
--- /dev/null
+
+depth = ../..
+
+include $(depth)/make/Include.make
+include $(depth)/make/Docrules.make
+SECTION=1
+MANGROFF = $(addprefix $(outdir)/, $(addsuffix .$(SECTION),$(basename $(PODFILES) .pod)))
+
+default: $(MANGROFF)
+
+
+INSTALLATION_OUT_FILES=$(MANGROFF)
+INSTALLATION_DIR=$(mandir)/man$(SECTION)
+
+include $(depth)/make/Install_outfiles.make
--- /dev/null
+=head1 NAME
+
+convert-mudela - convert mudela to newer versions
+
+=head1 SYNOPSIS
+
+ convert-mudela [options] [files]
+
+=head1 DESCRIPTION
+
+convert-mudela sequentially applies different mudela-conversions to
+upgrade a Mudela input file from FROM_PATCHLEVEL to TO_PATCHLEVEL.
+If no files are given, the standard input and output are used
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--output>
+
+The output file to write
+
+=item B<--edit>
+
+Do an inline edit of the input file. override B<--output>
+
+=item B<--show-rules>
+
+shows all known conversions.
+
+=item B<--from>=FROM_PATCHLEVEL
+
+Set the level to convert from. If this is not set, convert-mudela will
+guess this, on the basis of C<\version> strings in the file
+
+=item B<--to>=TO_PATCHLEVEL
+
+Set the goal version of the conversion. It defaults to the latest
+available version.
+
+=back
+
+=head1 BUGS
+
+Not all language changes are handled. Multiple output options won't work
+
+=head1 AUTHOR
+
+Han-Wen Nienhuys <hanwen@gnu.org>
--- /dev/null
+=head1 NAME
+
+lilypond - the GNU music typesetter
+
+=head1 SYNOPSIS
+
+ lilypond [options] [inputfiles]
+
+=head1 DESCRIPTION
+
+LilyPond is the GNU Project music typesetter. The program generates
+visual or auditive output from a music definition file: it can typeset
+formatted sheet music to a TeX file and play (mechanical) performances
+to a MIDI file.
+
+=head1 OPTIONS
+
+=over 5
+
+=item B<-I,--include>=F<FILE>,
+
+add F<FILE> to the search path for input files.
+
+=item B<-M,--midi>
+
+This disables TeX output. If you have a \midi definition, it will do
+the midi output only.
+
+=item B<-d,--debug>,
+
+Turn debugging info on. GNU LilyPond reads the file F<.dstreamrc>,
+which lists what functions and classes may produce copious debugging
+output.
+
+=item B<-t,--test>,
+
+Switch on any experimental features. Not for general public use.
+
+=item B<-w,--warranty>,
+
+Show the warranty with which GNU LilyPond comes. (It comes with B<NO
+WARRANTY>!)
+
+=item B<-o,--output=>F<FILE>,
+
+Set the default output file to F<FILE>.
+
+=item B<-h,--help>,
+
+Show a summary of usage.
+
+=item B<-i,--init=>F<FILE>,
+
+Set init file to F<FILE> (default: F<lily-init.ly>).
+
+=item B<--include, -I>=F<DIRECTORY>,
+
+Add F<DIRECTORY> to the search path for input files.
+
+=item B<--ignore-version, -V>,
+
+Make incompatible mudela version non-fatal.
+
+=item B<--no-postscript, -P>,
+
+Don't generate embedded PostScript (or MetaFont) symbols, but resort to
+less beautiful fixed-size versions.
+
+LilyPond uses PostScript for variable symbols where possible. (For some
+of these symbols runtime MetaFont source will be genarated too. These are
+not used unless you also include the appropriate TeX file too. See
+F<tex/fetdefs.tex>.)
+
+=back
+
+=head1 FEATURES
+
+This is an overview of the features that GNU LilyPond supports. For
+details on how to use them, you should consult mudela(5).
+
+=over 5
+
+=item *
+
+ASCII script input, with identifiers (for music reuse),
+customizable notenames, customisable fontset.
+
+=item *
+
+MIDI output lets you check if you have entered the correct notes.
+
+=item *
+
+MIDI to Mudela conversion through the mi2mu program.
+
+=item *
+
+Multiple staffs in one score. Each staff can have different meters.
+
+=item *
+
+Beams, slurs, ties, chords, super/subscripts (accents and text)
+triplets, general n-plet (triplet, quadruplets, etc.), lyrics,
+transposition dynamics (both absolute and hairpin style).
+
+=item *
+
+Multiple voices within one staff; beams optionally shared
+between voices. Up to four voices is handled cleanly.
+
+=item *
+
+Multiple scores within one input file. Each score is output to
+a different file.
+
+=item *
+
+Clef changes, meter changes, cadenza-mode, key changes, repeat bars.
+
+=back
+
+=head1 DISCLAIMER AND COPYING POLICY
+
+GNU LilyPond is copyright 1996-1998 by its authors. GNU LilyPond is
+distributed under the terms of the GNU General Public License. GNU LilyPond
+is provided without any warranty what so ever.
+GNU LilyPond may be freely distributed. For further information consult
+the GNU General Public License, from the file F<COPYING>.
+
+=head1 AUTHORS
+
+Please consult the documentation file AUTHORS for more detailed
+information, and small contributions.
+
+=over 4
+
+=item *
+
+Han-Wen Nienhuys <hanwen@cs.ruu.nl>, http://www.cs.ruu.nl/people/hanwen
+
+=item *
+
+Jan Nieuwenhuizen <jan@digicash.com>, http://www.digicash.com/~jan.
+
+=back
+
+
+=head1 PROBLEMS
+
+
+There is an extensive list of todoes and bugs. See F<TODO>. If you
+have a problem you should try to find out
+
+=over 4
+
+=item *
+
+If the bug has been fixed in a newer release.
+
+=item *
+
+If the bug has been found earlier, consult F<TODO> and F<BUGS>.
+
+=back
+
+If you have found a bug, then you should send a bugreport.
+
+=over 4
+
+=item *
+Send a copy of the input which causes the error.
+
+=item *
+Send a description of the platform you use.
+
+=item *
+Send a description of the LilyPond version you use (with
+compile/configure options please).
+
+=item *
+Send a description of the bug itself.
+
+=item *
+Send it to bug-gnu-music@gnu.org (you don't have to subscribe
+to this mailinglist).
+
+=back
+
+It does help if you can find out where the bug comes from: if GNU
+LilyPond bombs out, then please recompile using with debugging info
+turned on, and send gdb stacktrace of the crash. It also helps if you
+can print the values of the objects. So if your trace is
+
+ received SIGSEGV
+ (gdb) backtrace 12
+ #0 Interval::operator+= (this=0x11fffec60..)
+ at ../flower/interval.hh:50
+ #1 0x12005195c in Item::width (this=0x14008a680) at src/item.cc:39
+ #2 0x12008fdbc in itemlist_width (its=0x11fffed58 ..
+ :
+ :
+
+Than it would help if you send a dump of the Interval and the Item
+(use: C<print *this> or use LilyPond C<print()> methods).
+
+
+=head1 FILES
+
+=over 5
+
+=item F<lily-init.ly>
+
+The initialisation file with symbol tables etc. It
+includes files from the directory F<init/>.
+
+=back
+
+=head1 ENVIRONMENT
+
+B<LILYINCLUDE> an (one) additional directory for finding lilypond data.
+
+=head1 BUGS
+
+Lots of them. See F<TODO> and F<BUGS>
+
+=head1 SEE ALSO
+
+=over 4
+
+=item internals
+
+On technical details of LilyPond
+
+=item mudela-man
+
+On the input format. This is a LilyPond-enhanced LaTeX document.
+
+=item MANIFESTO
+
+Goals of the GNU LilyPond project.
+
+=item FAQ
+
+The GNU LilyPond FAQ list
+
+=item http://www.cs.ruu.nl/people/hanwen/lilypond/index.html
+
+GNU LilyPond has her own webpage. This webpage contains the MIDI, GIF
+and PS files for some standard music files. It also has the complete
+LilyPond documentation
+
+=back
+
+GNU LilyPond is
+updated very frequently, the latest version is always available at:
+ftp://pcnov095.win.tue.nl/pub/lilypond and
+ftp://alpha.gnu.org/gnu/lilypond/
+
+
+For programs which are part of the GNU music project, the following
+mailing list have been setup:
+
+
+=over 4
+
+=item info-gnu-music@gnu.org
+
+For information on the GNU Music project, to subscribe: send mail with
+subject "subscribe" to info-gnu-music-request@gnu.org
+
+=item help-gnu-music@gnu.org
+
+For help with programs from the GNU music project. To subscribe: send
+mail with subject "subscribe" to
+help-gnu-music-request@gnu.org
+
+=item bug-gnu-music@gnu.org
+
+If you have bugreports, you should send them to this list. If you want
+to read all bugreports, you should subscribe to this list. To
+subscribe: send mail with subject "subscribe" to
+bug-gnu-music-request@gnu.org
+
+=item gnu-music-discuss@gnu.org,
+
+For discussions concerning the GNU Music project, to subscribe: send
+mail with subject "subscribe" to
+gnu-music-discuss-request@gnu.org,
+
+
+=back
+
+Announces of new versions will be sent to info-gnu-music and
+gnu-music-discuss.
+
+=head1 REMARKS
+
+GNU LilyPond has no connection with the music package Rosegarden, other
+than the names being similar :-)
+
+=head1 HISTORY
+
+(for a detailed changelog, see F<NEWS>)
+
+GNU LilyPond's roots lie in MPP, a preprocessor to the rather arcane
+MusiXTeX macro package for TeX. A friend of mine, Jan Nieuwenhuizen
+wrote the first 44 versions (0.01 to 0.44), then his program caught my
+attention, and I was slowly sucked in to the interesting problem of
+easily producing beautifully printed music. I contributed some
+code. We soon realised that MPP's design was too fundamentally broken
+to be repaired, so it was decided to rewrite MPP. We debated a lot about
+the requirements to an inputformat (fall 1995). I sat down and started
+with a parser-first, bottom-up rewrite called mpp95 (which totally
+failed, obviously).
+
+After long and hard thinking, I came up with an algorithm for the
+horizontal spacing of multiple staffs (april 1996) I coded it (and did
+not test it). After starting with this fundamental piece, I slowly
+added the stages which come before spacing, and after. A half year
+later, I had a first working version, (october 1996). I announced
+Patchlevel 0.0.7 (or 8) to the mutex list after asking some technical
+details on spacing; it was downloaded approximately 4 times. Then I
+got the hang of it, and in the subsequent two months, I coded until it
+had doubled in size (pl 23).
+
+Most the other history is described in the NEWS file. The first large
+scale release (0.1) was done after approximately 78 patchlevels on
+August 1, 1997.
+
--- /dev/null
+=head1 NAME
+
+ly2dvi - convert mudela to DVI
+
+=head1 SYNOPSIS
+
+ ly2dvi [options] inputfile[.ly] [....]
+
+=head1 DESCRIPTION
+
+ly2dvi is a shell script which creates input file for LaTeX,
+based on information from the output files from lilypond.
+The script handles multiple files. If a mudela file name is
+specified lilypond is run to make an output (TeX) file.
+
+One or more LaTeX files are created, based on information found
+in the output (TeX) files, and latex is finally run to create
+one or more DVI files.
+
+=head1 OPTIONS
+
+=over 5
+
+=item B<-D,--debug>
+
+Set debug mode. There are two levels - in level one some debug
+info is written, in level two the command C<set -x> is run, which
+echoes every command in the ly2dvi script.
+
+=item B<-O,--orientation=>
+
+Set orientation - portrait is the default.
+(C<-O> landscape produces C<\usepackage[landscape]{article}>)
+
+=item B<-o,--output=>
+
+Set output directory.
+
+=item B<-h,--help>
+
+Print help.
+
+=item B<-k,--keep>
+
+Keep the LaTeX file after the run.
+
+=item B<-K>
+
+Keep LilyPond output after the run.
+
+=item B<-l,--language>
+
+Specify LaTeX language.
+(C<-l norsk> produces C<\usepackage[norsk]{babel}>).
+
+=item B<-p,--papersize=>
+
+Specify papersize.
+(C<-p a4paper> produces C<\usepackage[a4paper]{article}>)
+
+=item B<-s,--separate>
+
+Normally all output files are included into one LaTeX file.
+With this switch all files are run separately, to produce one
+DVI file for each.
+
+=back
+
+=head1 FEATURES
+
+ly2dvi responds to several parameters specified in the mudela
+file. They are overridden by corresponding command line options.
+
+=over 5
+
+=item B<papersize>
+
+Specify papersize.
+
+=item B<orientation>
+
+Set orientation.
+
+=item B<language>
+
+Specify LaTeX language
+
+=item B<paperlinewidth>
+
+Specify the width (pt, mm or cm) of the printed lines.
+
+=back
+
+=head1 ENVIRONMENT
+
+=over 5
+
+=item B<LILYINCLUDE>
+
+Additional directories for input files.
+
+=item B<TMP>
+
+Temporary directory name. Default is /tmp
+
+=back
+
+=head1 FILES
+
+F<titledefs.tex> is inspected for definitions used to extract
+additional text definitions from the mudela file. In the current
+version the following are defined:
+
+=over 5
+
+=item B<title>
+
+The title of the music. Centered on top of the first page.
+
+=item B<subtitle>
+
+Subtitle, centered below the title.
+
+=item B<composer>
+
+Name of the composer, rightflushed below the subtitle.
+
+=item B<arranger>
+
+Name of the arranger, rightflushed below the composer.
+
+=item B<instrument>
+
+Name of the instrument, leftflushed at same level as the composer.
+
+=back
+
+F</usr/local/share/lilyrc /etc/lilyrc $HOME/.lilyrc ./.lilyrc>
+are files to set up default running conditions/variables, Bourne shell
+syntax. All files are parsed, in the shown sequence. The variables are
+overridden by variables in the mudela file, and by command line options.
+In the current version the following are allowed:
+
+=over 5
+
+=item B<ORIENTATION>
+
+Set orientation - portrait is the default.
+
+=item B<LANGUAGE>
+
+Specify LaTeX language.
+
+=item B<OUTPUTDIR>
+
+Set output directory.
+
+=item B<PAPERSIZE>
+
+Specify papersize.
+
+=item B<LILYINCLUDE>
+
+Additional directories for input files.
+
+=item B<TMP>
+
+Temporary directory name.
+
+=back
+
+=head1 SEE ALSO
+
+lilypond(1), tex(1), latex(1)
+
+=head1 AUTHOR
+
+Jan Arne Fagertun <Jan.A.Fagertun@energy.sintef.no>,
+http://www.termo.unit.no/mtf/people/janaf/
+
+=head1 BUGS
+
+If you have found a bug, you should send a bugreport.
+
+=over 4
+
+=item *
+Send a copy of the input which causes the error.
+
+=item *
+Send a description of the platform you use.
+
+=item *
+Send a description of the LilyPond and ly2dvi version you use.
+
+=item *
+Send a description of the bug itself.
+
+=item *
+Send it to bug-gnu-music@gnu.org (you don't have to subscribe
+to this mailinglist).
+
+=back
+
+=head1 REMARKS
+
+Only one papersize is supported, A4. Information on other sizes
+(LaTeX names, horizontal and vertical sizes) should be mailed to
+the author or to the mailing list.
+
--- /dev/null
+=head1 NAME
+
+mi2mu - convert MIDI to mudela(5)
+
+=head1 SYNOPSIS
+
+ mi2mu [options] midi-file
+
+=head1 DESCRIPTION
+
+Mi2mu translates a MIDI input file to Mudela (GNU LilyPond source
+format). Mi2mu is part of the GNU LilyPond music typesetting package.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-b, --no-quantify>,
+
+Write exact durations, e.g.: `a4*385/384'.
+
+=item B<-d, --debug>,
+
+Print lots of debugging stuff.
+
+=item B<-h, --help>,
+
+Show a summary of usage.
+
+=item B<-I, --include>=F<DIR>,
+
+Add DIR to search path.
+
+=item B<-k, --key>=ACC[:MINOR],
+
+Set default key. ACC > 0 sets number of sharps; ACC < 0 sets number
+of flats. A minor key is indicated by ":1".
+
+=item B<-n, --no-silly>,
+
+Assume no plets or double dots, assume smallest (reciprocal) duration 16.
+
+=item B<-o, --output>=F<FILE>,
+
+Set FILE as default output.
+
+=item B<-p, --no-plets>,
+
+Assume no plets.
+
+=item B<-q, --quiet>,
+
+Be quiet.
+
+=item B<-s, --smallest=N>,
+
+Assume no shorter (reciprocal) durations than N.
+
+=item B<-v, --verbose>,
+
+Be verbose.
+
+=item B<-w, --warranty>,
+
+Show the warranty with which mi2mu comes. (It comes with B<NO WARRANTY>!)
+
+=item B<-x, --no-double-dots>,
+
+Assume no double dotted notes.
+
+=back
+
+=head1 FEATURES
+
+This is an overview of the features that Mi2mu supports.
+
+=over 4
+
+=item *
+
+[todo]
+
+=back
+
+=head1
+DISCLAIMER & COPYING POLICY
+
+Mi2mu is copyright 1996, 1997 by its authors. Mi2mu is distributed
+as part of GNU LilyPond, under the terms of the GNU General Public
+License. Mi2mu is provided without any warranty what so ever.
+Mi2mu may be freely distributed. For further information consult
+the GNU General Public License, from the file F<COPYING>.
+
+=head1 AUTHORS
+
+Please consult the documentation file AUTHORS for more detailed
+information, and small contributions.
+
+=over 4
+
+=item *
+
+Jan Nieuwenhuizen <jan@digicash.com>, http://www.digicash.com/~jan.
+
+=back
+
+=head1 SEE ALSO
+
+=over 4
+
+=item lilypond(1)
+
+The GNU LilyPond music typesetter.
+
+=item mudela-man
+
+On the input format. This is a LilyPond-enhanced LaTeX document.
+
+=back
+
--- /dev/null
+=head1 NAME
+
+mudela-book - integrate LaTeX and mudela
+
+=head1 SYNOPSIS
+
+ mudela-book [options] [file]
+
+=head1 DESCRIPTION
+
+If no file is given, input is taken from the standard input
+
+mudela-book runs LilyPond on fragments of mudela in your source file,
+and produces a LaTeXable document, with formatted music.
+
+ \begin{mudela}
+ CONTENTS
+ \end{mudela}
+
+runs LilyPond on CONTENTS, and puts the result back, surrounded by
+\preexample and \postexample commands. The \begin takes the
+following options:
+
+=over 4
+
+=item fragment
+
+mudela-book adds some redtape. You
+can substitute voice-contents for CONTENTS in this case.
+
+=item verbatim
+
+CONTENTS is copied into the TeX source enclosed in a verbatim block.
+
+=back
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--outname>
+
+The name of TeX file to output. If none is given, the output is
+printed on stdout.
+
+=item B<--outdir>
+
+The directory to output lilypond output and input to
+
+=back
+
+=head1 BUGS
+
+Doesn't handle incorrect input sanely.
+
+=head1 AUTHOR
+
+Han-Wen Nienhuys <hanwen@gnu.org>
-% -*-latex-*-
+% -*-tex-*-
% this document should be run through the mudela-book script after lilypond
% has been installed. The rules have been precooked into the
simple music.
LilyPond is a so called ``batch'' program. This means, that you use a
-texteditor (such as emacs or vi) to create an input file. When you
-are done editing your input file, you run LilyPond. If Lily
-finds any errors in your input file she\footnote{ If computer programs
-could have gender, we're sure that LilyPond is a female computer
-program, so we will refer to the program as a she. This gender-bending
-is not to tease you, dear reader. We do it in real life as well. In
-the past two years LilyPond has become sort of a baby daughter to us,
-keeping us awake at night, but also providing lots of joy. We hope
-you do not mind our little aberration from computer-manual tradition.
+text editor (such as \texttt{emacs} or \texttt{vi}) to create an input
+file. When you are done editing your input file, you save it, and you
+run LilyPond on the file. If Lily finds any errors in your input file
+then she\footnote{ We're sure that if computer programs could have
+gender, LilyPond would be a female computer program. So we will refer
+to the program as a she. This gender-bending is not to tease you, dear
+reader. We do it in real life as well. In the past two years LilyPond
+has become sort of a baby daughter to us, keeping us awake at night,
+but also providing us lots of joy. We hope you do not mind our little
+aberration from computer-manual tradition.
%
% The name LilyPond is actually sort of a girl's name. Can you guess which
% one ?
%
-} complain. If everything is well, than she'll generate a file that
-you can process further to view or print it.
+} will complain. If everything is well, than she'll generate a file, that
+you can process further to view or print.
Using LilyPond to print or view some music is a procedure with four
steps. To get you started we'll run down the full procedure for you
and key in the following text:
\begin{verbatim}
\score {
- <
+ <
\type Staff = aStaff \melodic { g'2 e'4 }
\type Lyrics = yell \lyric { Air2 ball!4 }
>
+ \paper {}
}
\end{verbatim}
-Save your file as \file{silly.ly}. The input files for LilyPond have
-the default extension \file{.ly}.
+Save your file as \file{silly.ly}.
+
+%The input files for LilyPond have the default extension \file{.ly}.
\item
Run LilyPond on your newly created file: enter \verb+lilypond silly+.
-LilyPond will then print all kinds of mumbo jumbo that can safely
+LilyPond will then print all kinds of mumbo jumbo that can safely be
ignored. You might see something like this:
\begin{verbatim}
GNU LilyPond 0.1.55/FlowerLib 1.1.39
... stuff left out here ...
- Documentation/silly.ly]
+ Documentation/silly.ly]
Interpreting music ...[1] (time: 0.04 seconds)
Preprocessing elements...
Calculating column positions ... [2]
Postprocessing elements...
TeX output to silly.tex ...
\end{verbatim}
- All has gone well; there were some warning but no errors. The
- output is a \file{TeX}\footnote{%
- \file{TeX} is usually spelled as
- \TeX. It is batch program for typesetting text, developed by the
- famous programmer and scientist Donald Knuth to typeset his famous The
- Art of Computer Programming bookseries. As you can see \TeX\ can be
- adapted to do a lot more. In fact, the document that you are
- reading was also done with \TeX.} file, and it is called
- \file{silly.tex}.
+All has gone well; there were some warning but no errors. The output
+is a TeX file, and it is called \file{silly.tex}. \file{TeX} is
+usually spelled as \TeX. It is batch program for typesetting text,
+developed by the great programmer and scientist Donald Knuth to
+typeset his famous The Art of Computer Programming bookseries. As you
+can see \TeX\ can be adapted to do a lot more. In fact, the document
+that you are reading now was also done with \TeX.
\item
To do something useful with the output you have to run \TeX\ on it
- first. type \verb+tex silly+. The output should resemble this:
+ first. Run the command \verb+tex silly+. The output should resemble this:
\begin{verbatim}
This is TeX, Version 3.14159 (C version 6.1)
(silly.tex
Transcript written on silly.log.
\end{verbatim}
The human translation is ``everything went OK, the result is one
- page long, and I put it in \file{silly.dvi}''.
+ page long, and I put it in \file{silly.dvi}.''
\item The \file{silly.dvi} file is a description of how a piece of
text looks when it is printed. You can view it, or print it. If you
-are using a Unix system equipped with X-Windows, issue the command
-\file{xdvi silly} to view the result. If this is not the case,
-consult your local \TeX\ guru on printing and viewing DVI files. What
-is in your window should look like this:
+are using a Unix system equipped with X-Windows, then you can issue
+the command \file{xdvi silly} to view the result. If this is not the
+case, consult your local \TeX\ guru on printing and viewing DVI files.
+What is in your window should look like this:
\begin{mudela}
\score {
- <
+ <
\type Staff = aStaff \melodic { g'2 e'4 }
\type Lyrics = yell \lyric { Air2 ball!4 }
>
fed to LilyPond is a special kind of file composed of notenames,
special words and punctation. The remainder of this document explains
how to combine these elements to express a piece of music in the
-language that LilyPond understands. So we try to explain how to use
-LilyPond, and not how LilyPond works; the input language of LilyPond
-is the subject of the document. For want of a better name we call
-this language Mudela (short for Music Description Language).
+language that LilyPond understands. In other words, we try to explain
+how to use LilyPond, and not how LilyPond works. For want of a better
+name we call this language Mudela (short for Music Description
+Language).
This document does not cover all of Mudela. Due to technical details,
the precise working of Mudela is coupled to the innards of LilyPond.
If you really want to know all the details, your best bet would be to
-get the sources to LilyPond and read the parser and scanner
-source\footnote{ They are in \file{lilypond-x.y.z/lily/parser.y},
-\file{lilypond-x.y.z/lily/lexer.l}. Of course, it would be even
+get the sources to LilyPond and read the parser and scanner source.
+They are in \file{lilypond-x.y.z/lily/parser.y},
+\file{lilypond-x.y.z/lily/lexer.l\footnote{Of course, it would be even
better if you would improve LilyPond and send the resulting diffs to
-us. But that would a really different ballpark (And we
-haven't started with the programming guide yet.)}
+us. But that would a really different ballpark (And we haven't
+started with the programming guide yet.)}
In the following sections the basic elements of Mudela are presented.
We don't want to bore you too much with details, so we will leave-out
For the remainder we will assume that you can carry out steps 1 to 4
from the above instruction. We will also assume that you know how
-music notation works, and that you are familiar with terms such as
-``note'', ``clef'', ``slur'' etc.
+music notation works. If you are not familiar with the English terms
+for music notation, then you should consult XXXX [FIXME], it contains
+a glossary of musical terms.
\section{Music copying versus music definition}
If you have done music copying before, then using LilyPond may seem
-awkward to you in the beginning. The purpose of LilyPond is usually
+awkward to you in the beginning. The purpose of LilyPond is informally
explained by the term ``music typesetter.''
-This may give the impression that the program lets you control
-precisely how the music is formatted. This is not the case: not only
-does the program print musical symbols, LilyPond also tries to make
-esthetic decisions---to be precise, we programmed her to do what we
-find pretty. You do not have complete control over what is happening.
-On the other hand, good engraving is a very complex trade, so it is a
-Good Thing that you do not have to worry about what is happening.
+This may give the impression that the program is like a drawing tool
+that lets you control precisely how the music is formatted. This is
+not the case: not only does the program print musical symbols,
+LilyPond also tries to make esthetic decisions---to be precise, we
+programmed her to do what we find pretty. You do not have complete
+control over what is happening. On the other hand, good engraving is
+a very complex trade, so it is a Good Thing that you do not have to
+worry about what is happening.
Secondly, LilyPond operates on musical definitions. This really is
something different from graphical definitions. If you copy music by
possible: we expect you to enter the meaning of the score, not the
score itself. If put more concretely: you do not enter ``black
notehead without flag, fourth staff line'', but ``a quarter note,
-pitch $d^2$''. LilyPond will figure out from the musical info what
+pitch d$^2$''. LilyPond will figure out from the musical info what
kind of graphic presentation is needed.
This has some drawbacks: most notably, it is difficult to enter sheet
music that you cannot read. On the other hand, any piece of music
-that you enter can be played and transposed automatically.
+once entered can be played and transposed automatically.
\section{When you know the notes to print\ldots}
The basic building block of music is the note. You can have LilyPond
print a note by specifying its pitch and the duration. The pitch of
-the central C, also know as c$^1$ is written as \verb+c'+. A quarter
+the central C, also known as c$^1$, is written as \verb+c'+. A quarter
note duration is written as \verb+4+. So, to print quarter note with
central C pitch, you enter the following
\begin[fragment,verbatim,center]{mudela}
specifies the octave to use, and the letter which note name to use.
The note names simply are the letters \verb+a+ to \verb+g+.
+For example,
+\begin[fragment,verbatim]{mudela}
+ c'4 d'4 e'4 c'4 c''4 d''4 e''4 f''4 g''4 a''4 b''4 c'''4
+\end{mudela}
+
The duration of a note is specified as a number: a whole note is
denoted by 1, the half note by 2, the quarter by 4, and so on. Here
are some random notes to show how it works
\begin[fragment,verbatim]{mudela}
-'c8 c8 c'16 c''16 d''64 b'64 c1 c'4 d'4 e'4 f'4 g'4 a'4
+'c8 c8 c'16 c''32 d''64 b'64 c'''2 c1 c'4 d'4 e'4 f'4 g'4 a'4
\end{mudela}
This gives us already enough material to make simple songs:
There is only one part about pitches that we haven't told you:
chromatically altered pitches. The names ``a'' to ``g'' for typing
pitches are convenient: they are short, pronounceable and they
-resemble the normal vocabulary for pitches. Enter flats and sharps.
-In english there is no standard terse word for C sharp or C flat. For
-this reason, we implemented a different, non-english convention for
-entering altered pitches, see table~\ref{notename-tab}: one makes a note sharp by adding the suffix
---is to the name, one makes the a note flat by adding the suffix
---es. For a double sharp you simply add another --is suffix.
-
-\begin{table}\caption{Note names}\label{notename-tab}
-\begin{tabular}{ll}
-english &LilyPond\\
-\hline\\
-c double flat &ceses\\
-c flat &ces\\
-c natural &c\\
-c sharp &cis\\
-c double sharp &cisis\\
-\end{tabular}
+resemble the normal vocabulary for pitches.
+
+Enter flats and sharps. In English there is no standard terse word
+for C sharp or C flat. For this reason, we implemented a different,
+non-english convention for entering altered pitches, see
+table~\ref{notename-tab}: one makes a note sharp by adding the suffix
+``--is'' to the name, one makes the a note flat by adding the suffix
+``--es.'' For a double sharp you simply add another ``--is'' suffix,
+flats ditto.
+
+
+\begin{table}[h]
+ \begin{center}
+ \caption{Defaults note names}\label{notename-tab}
+ \begin{tabular}{ll}
+ english &LilyPond\\
+ \hline\\
+ c double flat &ceses\\
+ c flat &ces\\
+ c natural &c\\
+ c sharp &cis\\
+ c double sharp &cisis\\
+ \end{tabular}
+
+ \end{center}
\end{table}
-Variations on this convention\footnote{LilyPond actually defaults to
-dutch notenames, with aes, aeses, ees and eeses added} are used in a
-number of germanic languages, notably dutch, german, swedish,
-norwegian. If you are not comfortable with these names, you can make
-your own names. Check out the example initialisation files. A number
-of languages are included.
+Variations on this convention are used in a number of germanic
+languages, notably Dutch, German, Swedish, and Norwegian. To be
+precise, LilyPond actually defaults to dutch notenames, with aes,
+aeses, ees and eeses added for consistency.
+
+If you are not comfortable with these names, you can make your own
+names. Included with the example initialisation files are note names
+for different languages, among others English (C sharp is abbreviated
+to cs), Italian, Swedish, Norwegian
\section{Hairy rhythms}
\begin[verbatim,center]{mudela}
\score{
\melodic {
- \octave c';
- c d e c |
- c d e c |
- e f g2 |
+ \octave c';
+ c d e c |
+ c d e c |
+ e f g2 |
}
}
\end{mudela}
\begin[verbatim,center]{mudela}
\score{
<
- \melodic{
- \octave c';
- c d e c | c d e c |
- e f g2 | e4 f g2
- \bar "|.";
- }
- \type Lyrics \lyric{
- Fr\`e-4 re Ja- que
- Fr\`e- re Ja- que
- Dor- mez vous?2
- Dor-4 mez vous?2
- }
+ \melodic{
+ \octave c';
+ c d e c | c d e c |
+ e f g2 | e4 f g2
+ \bar "|.";
+ }
+ \type Lyrics \lyric{
+ Fr\`e-4 re Ja- que
+ Fr\`e- re Ja- que
+ Dor- mez vous?2
+ Dor-4 mez vous?2
+ }
>
}
\end{mudela}
-Francais:US English:Deutsch:UK English:Nederlands:Italiaans
-:system:::systeem:
-accentuation:accentuation:::accent:
-accolade:brace::::
-accord:chord:::akkoord:
-accord de neuvième dominante:chord of the dominant ninth:::dominant akkoord:
-accord de septième dominante:chord of the dominant seventh:::septiem akkoord:
-accord parfait majeur:perfect major chord::::
-accord parfait mineur:perfect minor chord::::
-alto:alto:::alt:
-altération accidentelle:accident; accidental alteration:::toevallig teken:
-altération essentielle:essential alteration::::
-appogiature:appoggiatura::::
-appogiature brève:short appoggiatura::::
-appogiature double:double appoggiatura::::
-appogiature longue:long appoggiatura::::
-appogiature simple:simple appoggiatura::::
-armature [de la clé]:key signature:::toonsoort (voortekens):
-armure [de la clé]:key signature:::toonsoort:
-arpège:arpeggio:::gebroken akoord:
-augmenté (intervalle):augmented (interval):::overmatig interval:
-bariton:baritone:::bariton:
-barre de mesure:bar line:::maatstreep:
-:beam:Balk::waardestreep/balk:
-barre de reprise:repeat:::herhaling:
-basse:bass:::bas:
-blanche:half note:::halve noot:
-bâton de pause:(arbitrary number of bars' rest)::::
-bâton de pause:four-bar rest::::
-bâton de pause:two-bar rest::::
-bécarre:natural sign:::herstellingsteken:
-bémol:flat:::mol:
-cadence:cadence:::cadens:
-cadence harmonique:harmonic cadence:::cadens:
-cadence mélodique:melodic cadence:::cadens:
-:cue-notes:Stichnoten::stichnoten:
-caractère:character::::
-chaîne de trilles:chain of trills:::triller:
-chevron:chevron::::
-chiffrage (chiffres indicateurs):time signature:::maatsoort:
-chiffre inférieur:lower number::::
-chiffre supérieur:upper number::::
-clé:clef:::sleutel:
-clé d'octave:octave line::::
-clé d'ut:middle C clef:::C sleutel, alt sleutel:
-clé de fa:bass clef:::F sleutel:
-clé de sol:treble clef:::G sleutel, viool sleutel:
-comma:comma::::
-comma enharmonique::::
-comma pythagoricien::::
-comma syntonique: : : : :
-consonance:consonant interval; consonance:::consonant:
-contralto:contralto::::
-contre-temps:contro-time::::
-contre-temps irrégulier:irregular contro-time::::
-contre-temps régulier:regular contro-time::::
-coulé:slur:::binding, bindingsboog:
-courbe rythmique:rythmic curve::::
-:opening angular bracket::::crescendo
-croche:eighth note:::achtste noot:
-:closing angular bracket::::decrescendo
-degré [de la gamme]:degree [of the scale]:::trap [van de toonladder]:
-demi-pause:half rest:::halve rust:
-demi-soupir:eighth rest:::achtste rust:
-demi-ton:semitone:::halve toon:
-demi-ton chromatique:chromatic semitone:::chromatische halve toon:
-demi-ton diatonique:diatonic semitone:::diatonische halve toon:
-diapason:pitch pipe; tuning fork:::stemfluitje; stemvork:
-diminué (intervalle):diminished (interval):::verminderd (interval):
-dissonance:dissonant interval; dissonance:::dissonant interval; dissonant:
-dièse:sharp:::kruis:
-do:C:::C:
-do central:middle C:::centrale C::
-doigté:::::
-doigté de pédale:::::
-dominante:dominant:::dominant:
-double barre:double bar line:::dubbele streep:
-double bémol:double flat:::dubbelmol:
-double croche:sixteenth note:::zestiende noot:
-double dièse:double sharp:::dubbelkruis:
-double triolet:double triplet:::dubbele triool:
-duolet:duplet:::duool:
-durée:duration:::duur, lengte:
-échelle d'octave:octave line::::
-échelle musicale:Musical Ladder::::
-enharmonie:enharmony::::
-espace:space::::
-extension d'intervalle:extension of interval::::
-fa:F::::
-figure de note:kind of note::::
-figure de silence:kind of rest::::
-fioriture::::cadens:cadenza
-forme du mode mineur ancien:ancient form (diatonic minor scale)::::
-forme harmonique:harmonic form (diatonic minor scale)::::
-forme mélodique:melodic form (diatonic minor scale)::::
-gamme:scale:::toonladder:
-gamme chromatique:chromatic scale:::chromatische toonladder:
-gamme diatonique majeure:diatonic major scale:::diatonische majeur toonladder:
-gamme diatonique mineure:diatonic minor scale::::
-gammes enharmoniques:enharmonic scales::::
-gammes relatives:relative scales::::
-genre chromatique:chromatic type::::
-genre diatonique:diatonic type::::
-genre enharmonique:enharmonic type::::
-groupe irrégulier:irregular group::::
-grupetto:turn; gruppetto:::dubbelslag:
-hauteur:pitch:::toonhoogte:
-huitième de soupir:thirty-second rest:::32e rust:
-incise:motive:::motief:
-indication de pédale::::
-indication métronomique:metronomic indication::::
-intervalle:interval:::interval:
-intervalle ascendant:ascending interval::::
-intervalle composé:compound interval::::
-intervalle descendant:descending interval:::dalend interval:
-intervalle harmonique:harmonic interval::::
-intervalle simple:simple interval::::
-intervalles enharmoniques:enharmonic intervals::::
-juste (intervalle):perfect (interval):::rein (interval):
-la:A::::
-liaison:tie:::overbinding:
-liaison rythmique:legato curve::::
-ligne:line::::
-ligne supplémentaire:ledger line:::hulplijntje:
-majeur (intervalle):major (interval):::groot (interval):
-membre de phrase:phrase member::::
-mesure:bar; measure:::maat, maatstreep:
-mesure artificielle:artificial measure::::
-mesure composée:compound measure::::
-mesure incomplète:incomplete measure::::
-mesure irrégulière:irregular measure::::
-mesure simple:simple measure::::
-mezzo-soprano:mezzo-soprano::::
-mi:E::::
-mineur (intervalle):minor (interval)::::
-mode:mode::::
-mode ecclésiastique::::
-mode majeur:major mode::::
-mode mineur:minor mode::::
-modulation:modulation:::modulatie:
-mordant:mordent:::mordent:
-:::::
-mouvement:tempo; movement:::deel:
-mouvement conjoint:conjunct movement::::
-mouvement disjoint:disjunct movement::::
-mouvement lent:slow tempo::::
-mouvement modéré:moderate tempo::::
-mouvement rapide:fast tempo::::
-médiante:mediant::::
-métronome:metronome:::metronoom:
-noire:quarter note:::kwartnoot:
-note:note:::noot:
-note doublement pointée:double dotted note::::
-note modale:modal note::::
-note pointée:dotted note::::
-note tonale:tonal note::::
-notes enharmoniques:enharmonic notes:::enharmonische noot:
-nuance:shading::::
-octave:octave:::octaaf:
-ornement:embellishment; accessory::::
-:part:::partij:
-partition:score:::partituur:
-pause:whole rest::::
-phrase:phrase::::
-phrasé:phrasing::::
-pizzicato:dash over/below::::
-point:dot:::punt:
-point d'orgue:pause::::
-point et liaison combinés:dot and curved line combined::::
-pointillés::::
-portamento:underline over/below::::
-portée:staff:::(noten)balk; partij:
-portées:staves::::
-quadruple croche:sixty-fourth note::::
-quart de soupir:sixteenth rest::::
-quarte:fourth:::kwart:
-quartolet:quadruplet:::kwartool:
-quinte:fifth:::kwint:
-registre:register:::register:
-renversement d'intervalle:inversion of interval:::inversie:
-renvoi:return sign:::herstellingsteken:
-respiration:artificial rest::::
-:double whole note::breve:brevis:breve
-ronde:whole note:::hele noot:
-rythme:rythm:::ritme:
-ré:D::::
-seconde:second::::secunde
-seizième de soupir:sixty-fourth rest::::
-sensible:leading note::::
-septième:seventh:::septiem:septime
-sextolet:sextuplet::::
-si:B::::
-signes indicateurs de nuance:shading signs::::
-silence:rest::::
-sixain:sextuplet:::sextool:
-sixte:sixth::::
-sol:G::::
-soprano:soprano:::sopraan:
-soupir:quarter rest::::
-sous-dominante:subdominant::::
-sous-tonique:subtonic::::
-:dot over/below:::staccato:staccato
-sus-dominante:superdominant::::
-sus-tonique:supertonic::::
-syncope:syncopation; upbeat:::syncope:
-syncope irrégulière:irregular syncopation:::onregelmatige syncope:
-syncope régulière:regular syncopation::::
-temps:beat:::tel:
-temps binaire:binary beat::::
-temps faible:weak beat::::
-temps fort:strong beat::::
-temps ternaire:ternary beat::::
-tempérament mésotonique:meantone tuning::::
-tempérament égal:tempered tuning:::getempereerde stemming:
-tierce:third:::terts:
-ton:tone:::toon:
-tonalité:tonality:::tonaliteit:
-tonique:tonic::::
-tons relatifs:relative scales::::
-tons voisins:adjacent keys::::
-transposition:transposition::::
-transposition chromatique:chromatic transposition::::
-transposition enharmonique:enharmonic transposition::::
-trille:trill; shake::::
-trille double:double trill::::
-triolet:triplet::::
-triple croche:thirty-second note::::
-triton:tritone::::
-ténor:tenor::::
-tétracorde:tetrachord::::
-unisson:unison::::
-unité de mesure:unit of measure::::
-unité de temps:unit of beat::::
-ut:C::::
-voix:voice:::stem:
-:quarter note::crotchet::
-:quarter rest::crotchet rest::
-:thirty-second note::demisemiquaver::
-:thirty-second rest::demisemiquaver rest::
-:sixty-fourth note::hemidemisemiquaver::
-:sixty-fourth rest::hemidemisemiquaver rest::
-:half note::minim::
-:half rest::minim rest::
-:eighth note::quaver::
-:eighth rest::quaver rest::
-:whole note::semibreve::
-:whole rest::semibreve rest::
-:sixteenth note::semiquaver::
-:sixteenth rest::semiquaver rest::
+:engraving:notenstechen::steken::
+Francais:US English:Deutsch:UK English:Nederlands:Italiaans:
+:system:::systeem::
+accentuation:accentuation:::accent::
+accolade:brace:::::
+accord:chord:::akkoord::
+accord de neuvième dominante:chord of the dominant ninth:::dominant akkoord::
+accord de septième dominante:chord of the dominant seventh:::septiem akkoord::
+accord parfait majeur:perfect major chord:::::
+accord parfait mineur:perfect minor chord:::::
+alto:alto:::alt::
+altération accidentelle:accident; accidental alteration:::toevallig teken::
+altération essentielle:essential alteration:::::
+appogiature:appoggiatura:::::
+appogiature brève:short appoggiatura:::::
+appogiature double:double appoggiatura:::::
+appogiature longue:long appoggiatura:::::
+appogiature simple:simple appoggiatura:::::
+armature [de la clé]:key signature:::toonsoort (voortekens)::
+armure [de la clé]:key signature:::toonsoort::
+arpège:arpeggio:::gebroken akoord::
+augmenté (intervalle):augmented (interval):::overmatig interval::
+bariton:baritone:::bariton::
+barre de mesure:bar line:::maatstreep::
+:beam:Balk::waardestreep/balk::
+barre de reprise:repeat:::herhaling::
+basse:bass:::bas::
+blanche:half note:::halve noot::
+bâton de pause:(arbitrary number of bars' rest):::::
+bâton de pause:four-bar rest:::::
+bâton de pause:two-bar rest:::::
+bécarre:natural sign:::herstellingsteken::
+bémol:flat:::mol::
+cadence:cadence:::cadens::
+cadence harmonique:harmonic cadence:::cadens::
+cadence mélodique:melodic cadence:::cadens::
+:cue-notes:Stichnoten::stichnoten::
+caractère:character:::::
+chaîne de trilles:chain of trills:::triller::
+chevron:chevron:::::
+chiffrage (chiffres indicateurs):time signature:::maatsoort::
+chiffre inférieur:lower number:::::
+chiffre supérieur:upper number:::::
+clé:clef:::sleutel::
+clé d'octave:octave line:::::
+clé d'ut:middle C clef:::C sleutel, alt sleutel::
+clé de fa:bass clef:::F sleutel::
+clé de sol:treble clef:::G sleutel, viool sleutel::
+comma:comma:::::
+comma enharmonique:::::
+comma pythagoricien:::::
+comma syntonique: : : : : :
+consonance:consonant interval; consonance:::consonant::
+contralto:contralto:::::
+contre-temps:contro-time:::::
+contre-temps irrégulier:irregular contro-time:::::
+contre-temps régulier:regular contro-time:::::
+coulé:slur:::binding, bindingsboog::
+courbe rythmique:rythmic curve:::::
+:opening angular bracket::::crescendo:
+croche:eighth note:::achtste noot::
+:closing angular bracket::::decrescendo:
+degré [de la gamme]:degree [of the scale]:::trap [van de toonladder]::
+demi-pause:half rest:::halve rust::
+demi-soupir:eighth rest:::achtste rust::
+demi-ton:semitone:::halve toon::
+demi-ton chromatique:chromatic semitone:::chromatische halve toon::
+demi-ton diatonique:diatonic semitone:::diatonische halve toon::
+diapason:pitch pipe; tuning fork:::stemfluitje; stemvork::
+diminué (intervalle):diminished (interval):::verminderd (interval)::
+dissonance:dissonant interval; dissonance:::dissonant interval; dissonant::
+dièse:sharp:::kruis::
+do:C:::C::
+do central:middle C:::centrale C:::
+doigté::::::
+doigté de pédale::::::
+dominante:dominant:::dominant::
+double barre:double bar line:::dubbele streep::
+double bémol:double flat:::dubbelmol::
+double croche:sixteenth note:::zestiende noot::
+double dièse:double sharp:::dubbelkruis::
+double triolet:double triplet:::dubbele triool::
+duolet:duplet:::duool::
+durée:duration:::duur, lengte::
+échelle d'octave:octave line:::::
+échelle musicale:Musical Ladder:::::
+enharmonie:enharmony:::::
+espace:space:::::
+extension d'intervalle:extension of interval:::::
+fa:F:::::
+figure de note:kind of note:::::
+figure de silence:kind of rest:::::
+fioriture::::cadens:cadenza:
+forme du mode mineur ancien:ancient form (diatonic minor scale):::::
+forme harmonique:harmonic form (diatonic minor scale):::::
+forme mélodique:melodic form (diatonic minor scale):::::
+gamme:scale:::toonladder::
+gamme chromatique:chromatic scale:::chromatische toonladder::
+gamme diatonique majeure:diatonic major scale:::diatonische majeur toonladder::
+gamme diatonique mineure:diatonic minor scale:::::
+gammes enharmoniques:enharmonic scales:::::
+gammes relatives:relative scales:::::
+genre chromatique:chromatic type:::::
+genre diatonique:diatonic type:::::
+genre enharmonique:enharmonic type:::::
+groupe irrégulier:irregular group:::::
+grupetto:turn; gruppetto:::dubbelslag::
+hauteur:pitch:::toonhoogte::
+huitième de soupir:thirty-second rest:::32e rust::
+incise:motive:::motief::
+indication de pédale:::::
+indication métronomique:metronomic indication:::::
+intervalle:interval:::interval::
+intervalle ascendant:ascending interval:::::
+intervalle composé:compound interval:::::
+intervalle descendant:descending interval:::dalend interval::
+intervalle harmonique:harmonic interval:::::
+intervalle simple:simple interval:::::
+intervalles enharmoniques:enharmonic intervals:::::
+juste (intervalle):perfect (interval):::rein (interval)::
+la:A:::::
+liaison:tie:::overbinding::
+liaison rythmique:legato curve:::::
+ligne:line:::::
+ligne supplémentaire:ledger line:::hulplijntje::
+majeur (intervalle):major (interval):::groot (interval)::
+membre de phrase:phrase member:::::
+mesure:bar; measure:::maat, maatstreep::
+mesure artificielle:artificial measure:::::
+mesure composée:compound measure:::::
+mesure incomplète:incomplete measure:::::
+mesure irrégulière:irregular measure:::::
+mesure simple:simple measure:::::
+mezzo-soprano:mezzo-soprano:::::
+mi:E:::::
+mineur (intervalle):minor (interval):::::
+mode:mode:::::
+mode ecclésiastique:::::
+mode majeur:major mode:::::
+mode mineur:minor mode:::::
+modulation:modulation:::modulatie::
+mordant:mordent:::mordent::
+::::::
+mouvement:tempo; movement:::deel::
+mouvement conjoint:conjunct movement:::::
+mouvement disjoint:disjunct movement:::::
+mouvement lent:slow tempo:::::
+mouvement modéré:moderate tempo:::::
+mouvement rapide:fast tempo:::::
+médiante:mediant:::::
+métronome:metronome:::metronoom::
+noire:quarter note:::kwartnoot::
+note:note:::noot::
+note doublement pointée:double dotted note:::::
+note modale:modal note:::::
+note pointée:dotted note:::::
+note tonale:tonal note:::::
+notes enharmoniques:enharmonic notes:::enharmonische noot::
+nuance:shading:::::
+octave:octave:::octaaf::
+ornement:embellishment; accessory:::::
+:part:::partij::
+partition:score:::partituur::
+pause:whole rest:::::
+phrase:phrase:::::
+phrasé:phrasing:::::
+pizzicato:dash over/below:::::
+point:dot:::punt::
+point d'orgue:pause:::::
+point et liaison combinés:dot and curved line combined:::::
+pointillés:::::
+portamento:underline over/below:::::
+portée:staff:::(noten)balk; partij::
+portées:staves:::::
+quadruple croche:sixty-fourth note:::::
+quart de soupir:sixteenth rest:::::
+quarte:fourth:::kwart::
+quartolet:quadruplet:::kwartool::
+quinte:fifth:::kwint::
+registre:register:::register::
+renversement d'intervalle:inversion of interval:::inversie::
+renvoi:return sign:::herstellingsteken::
+respiration:artificial rest:::::
+:double whole note::breve:brevis:breve:
+ronde:whole note:::hele noot::
+rythme:rythm:::ritme::
+ré:D:::::
+seconde:second::::secunde:
+seizième de soupir:sixty-fourth rest:::::
+sensible:leading note:::::
+septième:seventh:::septiem:septime:
+sextolet:sextuplet:::::
+si:B:::::
+signes indicateurs de nuance:shading signs:::::
+silence:rest:::::
+sixain:sextuplet:::sextool::
+sixte:sixth:::::
+sol:G:::::
+soprano:soprano:::sopraan::
+soupir:quarter rest:::::
+sous-dominante:subdominant:::::
+sous-tonique:subtonic:::::
+:dot over/below:::staccato:staccato:
+sus-dominante:superdominant:::::
+sus-tonique:supertonic:::::
+syncope:syncopation; upbeat:::syncope::
+syncope irrégulière:irregular syncopation:::onregelmatige syncope::
+syncope régulière:regular syncopation:::::
+temps:beat:::tel::
+temps binaire:binary beat:::::
+temps faible:weak beat:::::
+temps fort:strong beat:::::
+temps ternaire:ternary beat:::::
+tempérament mésotonique:meantone tuning:::::
+tempérament égal:tempered tuning:::getempereerde stemming::
+tierce:third:::terts::
+ton:tone:::toon::
+tonalité:tonality:::tonaliteit::
+tonique:tonic:::::
+tons relatifs:relative scales:::::
+tons voisins:adjacent keys:::::
+transposition:transposition:::::
+transposition chromatique:chromatic transposition:::::
+transposition enharmonique:enharmonic transposition:::::
+trille:trill; shake:::::
+trille double:double trill:::::
+triolet:triplet:::::
+triple croche:thirty-second note:::::
+triton:tritone:::::
+ténor:tenor:::::
+tétracorde:tetrachord:::::
+unisson:unison:::::
+unité de mesure:unit of measure:::::
+unité de temps:unit of beat:::::
+ut:C:::::
+voix:voice:::stem::
+:quarter note::crotchet:::
+:quarter rest::crotchet rest:::
+:thirty-second note::demisemiquaver:::
+:thirty-second rest::demisemiquaver rest:::
+:sixty-fourth note::hemidemisemiquaver:::
+:sixty-fourth rest::hemidemisemiquaver rest:::
+:half note::minim:::
+:half rest::minim rest:::
+:eighth note::quaver:::
+:eighth rest::quaver rest:::
+:whole note::semibreve:::
+:whole rest::semibreve rest:::
+:sixteenth note::semiquaver:::
+:sixteenth rest::semiquaver rest:: :
; Forms by Han-Wen Nienhuys
(setq forms-file "vocabulary-data")
-(setq forms-number-of-fields 6)
+(setq forms-number-of-fields 7)
(setq forms-read-only nil) ; to make sure
(setq forms-field-sep ":")
(setq forms-multi-line nil)
(list
"*** Musical vocabulary ***\n"
"\nItaliano: " 6
- "\nFrancais: " 1
- "\nUS English: " 2
+ "\nFrancais: " 1
+ "\nUS English: " 2
"\nDeutsch: " 3
- "\nBritish English: " 4
- "\nNederlands: " 5
+ "\nBritish English: " 4
+ "\nNederlands: " 5
+ "\n\nExplanation\n\n" 7
+
))
+pl 59
+ - ly2dvi 0.9.hwn1, -K switch,
+ - doc: moved manpages in separate directory.
+ - do WWW stuff via make
+ - mutopia-index.py
+ - ly2dvi 0.9 (JAF)
+ - multi platform build fixes
+ - junked embedded switches, embedded MF, obsolete TeX stuff
+ - junked virtual matrix storage: inlined most matrix computation,
+ speed increase of 30%
+ - junked taupindefs, eglerdefs
+ - rm'd taupin/egler from INSTALL
+ - doc: engraving.bib, colorado.bib
+ - input hierarchy.
+
+
+pl 58.jcn6
+ - multi-measure rests: moved acknowledge from timing-translator
+ to -grav
+ - slur clipping experimental...
+ - bo to b
+ - always announce multi-measure
+
+pl 58.jcn5
+ - bf: reset plet after reading mmrest
+ - try at not generating moments...
+ - Multi_measure_rest 'symbol'
+
+pl 58.jcn4
+ - try at multi-measure rests: part.ly
+ - bf's: slur get_encompass
+ - bf: slur clipping
+
+pl 58.jcn3
+ - experimental (--test) clipping of too high or tilted slurs
+ - nicer slur control output and ps code
+ - bit thicker and round-capped tuplet bracket
+ - bf: slur.cc: RESIZE_ICE
+
+pl 58.jcn1
+ - varray.hh bezier.cc, slur.cc patches to avoid gcc 2.8.1 ice
+ - some inlining fixes
+ - configure: use -O to enable inlining
+ - included and fixed new make-patch.py
+ - bf: Mutopia.make
+ - bf: offset: operator - ()
+ - ugly hack bezier: do blow_fit twice
+ - bf's: bezier: rotate,translate
+
+***************
pl 58
- more *.make hacking
- bracket fix (AG)
- solaris/irix patches (AO)
-pl 56.jcn5
+ pl 56.jcn5
- bezier and slur: cleaning and fixes
- bf: removed silly experimental beam feature
done, or is an idea that I want to think about
Most of the items are marked in the code as well, with full explanation.
-grep for TODO and ugh/ugr
+grep for TODO and ugh/ug
0.2:
- * junk embedded mf
-
-
-
* ly2dvi seams to eat accents as in \'el\'egant
* libtoolize flowerlib
+
* shared lib
* bf: abbrevbeam?
- remove all \multi
- break-up heavily-nested score blocks
- * --metafont
-
* disable spaces in TeX stuff
* handle ^C for tmp/file creation.
* AFM for font input?
+
3RD PARTY BUGS:
+
* tried egcs 1.0.2: failed on lily/stem.cc -> flower/include/interval.hh
should narrow down and send bug report
* a musical dictionary. See Documentation/vocabulary-*, other
languages:
+ - explanation
- italian
- german
- dutch
* accidentals per Voice_group
- * Convert all ref/bib stuff into BibTeX.
-
* Output class, handles : (smallish)
- help text /(c) notice?
- version line
* adaptive accidental spacing.
* handle EOF graciously in error messages.
-
+oo
* caching Item/spanner dimensions.
* centered whole rest
MAJOR_VERSION=0
MINOR_VERSION=1
-PATCH_LEVEL=58
+PATCH_LEVEL=59
MY_PATCH_LEVEL=
# use the above to send patches, always empty for released version:
include $(depth)/make/Scripts.make
-EXECUTABLES=convert-mudela mudela-book
+EXECUTABLES=convert-mudela mudela-book ly2dvi
include $(depth)/make/Executable.make
ln -sf $lelie/current/lily/out/lilypond bin/lilypond
ln -sf $lelie/current/mi2mu/out/mi2mu bin/mi2mu
-configure --prefix=/usr --enable-debugging --enable-printing --enable-checking
+configure --prefix=/usr --enable-debugging --enable-printing --enable-checking
for d in dirnames:
l = l + my_find(pats, d)
return l
-#!@PYTHON@
-
-#
-# flower.py -- python flower lib
-#
-# source file of the GNU LilyPond music typesetter
-#
-# (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-#
-
-class File:
- """silly wrapper for Python file object."""
- def __init__ (self,nm, mode='r'):
- if nm:
- self.file_ = open (nm, mode);
- elif mode == 'w':
- self.file_ = sys.stdout
- else:
- self.file_ = sys.stdin
-
- self.eof_ = 0;
- def readline (self):
- l= self.file_.readline ();
- if not l:
- self.eof_ = 1;
- return l;
- def write (self, str):
- self.file_.write (str)
- def eof (self):
- return self.eof_
- def close (self):
- self.file_.close ()
- def __del__ (self):
- self.close ();
+def file_exist_b(name):
+ try:
+ f = open(name)
+ except IOError:
+ return 0
+ f.close ()
+ return 1
-
-import fnmatch
-import os
-
-_debug = 0
-
-_prune = ['(*)']
-
-
-def my_find(patterns, dir = os.curdir):
- list = []
- try:
- names = os.listdir(dir)
- except os.error:
- names = []
- names.sort()
- for name in names:
- if name in (os.curdir, os.pardir):
- continue
- fullname = os.path.join(dir, name)
- for pat in patterns:
- if fnmatch.fnmatch(name, pat):
- list.append(fullname)
- if os.path.isdir(fullname) and not os.path.islink(fullname):
- for p in _prune:
- if fnmatch.fnmatch(name, p):
- if _debug: print "skip", `fullname`
- break
- else:
- if _debug: print "descend into", `fullname`
- found = my_find(patterns, fullname)
- if found:
- list = list + found
- return list
-
-def multiple_find(pats, dirnames):
- from find import find
- l = []
- for d in dirnames:
- l = l + my_find(pats, d)
- return l
--- /dev/null
+#!@PYTHON@
+
+#
+# genheader.py -- do headers (like these)
+#
+# source file of the GNU LilyPond music typesetter
+#
+# (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+#
+
+
+
+import posix
+import pwd
+import regex
+import regsub
+import string
+import sys
+import os
+import getopt
+import time
+
+class My_options:
+ def __init__(self):
+ self.commentify = None
+ self.add_hdr_def = 0
+ self.classname = ''
+
+my_options = My_options()
+
+def mail():
+ return os.environ['MAILADDRESS']
+
+def name():
+ return pwd.getpwuid(posix.getuid())[4]
+
+def c_commentify(str):
+ return '/* ' + regsub.gsub('^',' ', str) + '\n */';
+
+def sh_commentify(str):
+ return regsub.gsub('^', '# ', str)
+
+def tex_commentify(str):
+ return regsub.gsub('^', '% ', str)
+
+def project_str():
+ cwd = posix.getcwd()
+ if regex.search('flower', cwd) <> -1:
+ PROJECT = "the Flower Library"
+ elif regex.search('mf$', cwd) <> -1:
+ PROJECT = "the Feta (defintively not an abbreviation for Font-En-Tja) music font"
+ else:
+ PROJECT = "the GNU LilyPond music typesetter"
+ return PROJECT
+
+def head_str(filename):
+ if my_options.add_hdr_def:
+ what = "declare "
+ else:
+ what=" implement "
+
+
+ headstr = '\n%s -- %s\n\nsource file of %s\n\n(c) %d %s <%s>\n' \
+ %(filename, what, project_str(), time.localtime (time.time ())[0], name(), mail())
+ return headstr
+
+
+def c_include(filename):
+ startdef= filename;
+ trans = string.maketrans( string.lowercase + '-.', string.uppercase + '__')
+ startdef = string.translate(filename, trans)
+
+
+ headstr = "\n\n#ifndef %s\n#define %s\n" % (startdef, startdef)
+ terminatestr = "#endif /* %s */\n" % (startdef);
+
+ return headstr+ '\n\n'+ terminatestr;
+
+
+
+
+
+(options, files) = getopt.getopt(sys.argv[1:], 'tcsh', ['class'])
+
+for opt in options:
+ o = opt[0]
+ a = opt[1]
+ if o == '-c':
+ my_options.commentify = c_commentify
+ elif o == '-t':
+ my_options.commentify = tex_commentify
+ elif o == '-s':
+ my_options.commentify = sh_commentify
+ elif o == '-h':
+ my_options.add_hdr_def = 1
+ elif o == '--class':
+ my_options.classname = a
+
+
+
+#
+# FIXME: should create xxx.cc and include/xxx.hh, with implement/declare Xxx
+# in one run
+if my_options.classname:
+ pass
+
+def do_file(nm):
+ s = my_options.commentify(head_str(nm))
+ if my_options.add_hdr_def:
+ s = s + c_include(nm)
+ return s
+
+
+def extension(ext,nm):
+ ext = '\\.' + ext
+ return regex.search(ext, nm) <> -1
+
+def c_extension(nm):
+ return extension('hh',nm) or extension('cc',nm) \
+ or extension('icc', nm) or extension('tcc',nm)
+def select_commentification(nm):
+ if c_extension (nm):
+ return c_commentify
+ elif extension('py',nm) or extension('pl',nm) or extension('sh',nm):
+ return sh_commentify
+ elif extension('mf',nm) or extension('tex',nm) or extension('ly',nm):
+ return tex_commentify
+ else:
+ raise 'help'
+
+for nm in files:
+ if extension('hh', nm) or extension('icc', nm) or extension('tcc', nm):
+ my_options.add_hdr_def = 1
+ if my_options.commentify == None:
+ my_options.commentify = select_commentification(nm)
+ print do_file(nm)
# Original LaTeX file made by Mats Bengtsson, 17/8 1997
#
-VERSION="0.8"
+VERSION="0.9"
NAME=ly2dvi.sh
IDENTIFICATION="$NAME $VERSION"
NOW=`date`
echo "$IDENTIFICATION" 1>&2
+KEEP_LILY_OUTPUT=N
+
# NEWS
+#0.9.hwn1
+# - option to remove output of lily
+
+# 0.9 - Trap Lilypond abort
+# - Replaced "\usepackage[T1]{fontenc}" with
+# \usepackage[latin1]{inputenc} (takk, Mats)
+# - Removed "()" around "\LilyIdString" (Janne didn't want it)
+
# 0.8 - Trap Lilypond segmentation fault
# - Function for cleanup
# - Trap line
# - More human-readable variables
# - Some logics concerning rc-files
-
# 0.7
# - Improved Lilypond error checking
# - Output orientation (landscape...). Overrides mudela file
# - Handles margins for A4 paper (equal on both sides)
# - new option -s (--separate) for one LaTeX run per file,
# else all files are run together
-
+#
# 0.5
# - More useful ("two-level") debug.
# - The Q&D hack to find file names and not handling \include
#
cleanup() {
$debug_echo "("$LF")("$FN")("$LOGFILE")"
- if [ "$KEEP" != "Y" ]
+ if [ "$KEEP_LY2DVI_OUTPUT" != "Y" ]
then
[ -n "$LF" -a -f "$LF" ] && rm -f $LF
[ -n "$LOGFILE" -a -f "$LOGFILE" ] && rm -f $LOGFILE
fi
LOGFILE=$TMP/lilylog.$$ # Logfile for lilypond
PWIDTH=600; # Width of A4 paper!
-PHEIGTH=830; # Heigth of A4 paper!
+PHEIGTH=845; # Heigth of A4 paper!
#
# RC-files ?
#
#
# "x:" x takes argument
#
-switches="DO:hkl:o:p:s\?"
+switches="DO:hkl:o:Kp:s\?"
options=""
#
# ugh, "\-" is a hack to support long options
exit 0
;;
k )
- KEEP=Y
+ KEEP_LY2DVI_OUTPUT=Y
+ ;;
+ K )
+ KEEP_LILY_OUTPUT=Y
;;
+
l )
LANGUAGE=$OPTARG
;;
exit 0
;;
k*|-k*)
- KEEP=Y
+ KEEP_LY2DVI_OUTPUT=Y
;;
l*|-l*)
LANGUAGE=`echo $OPTARG | sed -e s/"^.*="//`
#
BN=`basename $File .tex`
FN=$BN.$$
-if [ "$KEEP" != "Y" ]
+if [ "$KEEP_LY2DVI_OUTPUT" != "Y" ]
then
LF=$TMP/$FN.tex
else
\nonstopmode
$LLNG
\usepackage{geometry}
-\usepackage[T1]{fontenc}
+%\usepackage[T1]{fontenc}
+\usepackage[latin1]{inputenc}
%\addtolength{\oddsidemargin}{-1cm}
%\addtolength{\topmargin}{-1cm}
\setlength{\textwidth}{$TW}
LLL=`echo $LL | sed -e 's/}.*$//' -e 's/.*{//'`
if [ "$LLL" != "" ]
then
- echo '\'$L'{'$LLL'}%' >> $LF
+ echo "\\"$L'{'$LLL'}%' >> $LF
fi
fi
done
#
endFile(){
cat << EOF >> $LF
-\vfill\hfill{(\LilyIdString)}
+\vfill\hfill{\LilyIdString}
\end{document}
EOF
#
#
# Loop through all files
#
+
+LILY_OUTPUT_FILES=
+
for GF in $*
do
findInput $GF
OF=`egrep '^TeX output to ' $LOGFILE | \\
sed -e 's/TeX output to//' -e 's/\.\.\.//'`
$debug_echo "==> "$OF
- STATUS=`egrep -i "error|segmentation" $LOGFILE`
+ STATUS=`egrep -i "error|segmentation|abort" $LOGFILE`
echo $STATUS
if [ ! -z "$STATUS" ]
then
FFile=""
endFile
fi
+ LILY_OUTPUT_FILES="$LILY_OUTPUT_FILES $OF"
done
done
if [ $SEPFILE = N ]
then
endFile
fi
+
+
+
+if [ $KEEP_LILY_OUTPUT = N ]
+then
+ rm $LILY_OUTPUT_FILES
+fi
#
# OK - finished
#
import pipes
-mp_version = '0.3'
+mp_version = '0.51'
class Options:
def __init__(self):
'Generate a patch to go to this version.\n'
' --from=FROM, -f FROM old is FROM\n'
' --to=TO, -t TO to version TO\n'
-
+ ' --dir=DIR, -d TO directory\n'
)
def untar(fn):
# os.system('pwd');
- sys.stderr.write('untarring ' + fn)
-# can't seem to fix errors:
-# gzip: stdout: Broken pipe
-# tar: Child returned status 1
-# os.system ('tar xzf ' + fn)
-# sys.stderr.write('\n')
-# ugh, even this does not work, but one error message less :-)
+ sys.stderr.write('untarring ' + fn + '\n')
os.system ('gzip --quiet -dc ' + fn + '| tar xf - ')
-# so print soothing message:
- sys.stderr.write('make-patch:ugh: Please ignore error: gzip: stdout: Broken pipe\n');
sys.stderr.flush()
\n\
usage \n\
\n\
- cd lilypond-source-dir; patch -E -p0 < %s\n\
+ cd lilypond-source-dir; patch -E -p1 < %s\n\
\n\
Patches do not contain automatically generated files, \n\
i.e. you should rerun configure\n\n'
+# ugh, how to get rid of .tex files generated by lily?
pats = ['*.lsm', 'configure', '*.txt', 'lilypond.spec']
+
def remove_automatic(dirnames):
files = []
files = files + multiple_find(pats, dirnames)
for f in files:
os.remove(f)
-def makepatch(fv, tv, patfile_nm):
- import tempfile
- prev_cwd = os.getcwd();
- os.chdir ('/tmp')
- untar(released_tarball(fv))
- untar(released_tarball(tv))
- remove_automatic([dirname(fv), dirname(tv)])
+def makepatch(fromdir, todir, patfile_nm):
- os.chdir(dirname(tv))
-
- if not patfile_nm:
- patfile_nm = '../patch-%s' % version_tuple_to_str(tv)
+ remove_automatic([fromdir, todir])
+ os.chdir(todir)
+
f = open(patfile_nm, 'w')
f.write(header %\
- (version_tuple_to_str(fv), version_tuple_to_str(tv), \
+ (fromdir, todir, \
os.path.basename(patfile_nm)))
f.close()
sys.stderr.write('diffing to %s... ' % patfile_nm)
- os.system('diff -urN ../%s . >> %s' % (dirname(fv), patfile_nm))
- #os.system('gzip -9f %s' % patfile_nm)
- os.chdir('/tmp')
-
- sys.stderr.write('cleaning ... ')
- os.system('rm -fr %s %s' % (dirname(tv), dirname(fv)))
- sys.stderr.write('\n')
- os.chdir(prev_cwd)
-
+ os.system('pwd')
+ print ('diff -urN ../%s . >> %s' % (fromdir, patfile_nm))
+ os.system('diff -urN ../%s . >> %s' % (fromdir, patfile_nm))
+ os.system('gzip -9f %s' % patfile_nm)
+
def main():
+ os.environ['GZIP'] = '-q'
sys.stderr.write('This is make-patch version %s\n' % mp_version)
(cl_options, files) = getopt.getopt(sys.argv[1:],
- 'hf:o:t:', ['output=', 'help', 'from=', 'to='])
+ 'd:hf:o:t:', ['output=', 'help', 'from=', 'to='])
outfn = ''
+ srcdir = ''
+
+ # on default, we want to diff tar balls, again :-)
+ from_b=1
+ to_b=1
for opt in cl_options:
o = opt[0]
a = opt[1]
if o == '--from' or o == '-f':
options.from_version = version_str_to_tuple(a)
+ from_b=1
elif o == '--to' or o == '-t':
- options.to_version = version_str_to_tuple(a)
+ options.to_version = version_str_to_tuple(a)
+ to_b=1
+ elif o == '--dir' or o == '-d':
+ srcdir = a;
+ to_b=0
elif o== '--help' or o == '-h':
help()
return 0;
pn = 'patch-%s' % version_tuple_to_str(options.to_version)
outfn = os.path.join(os.getcwd(), pn)
- makepatch(options.from_version, options.to_version, outfn)
+ import tempfile
+ prev_cwd = os.getcwd();
+
+ os.system('rm -rf /tmp/make-patch')
+ try:
+ os.mkdir ('/tmp/make-patch')
+ except:
+ pass
+
+ fromdir = dirname(options.from_version)
+ todir = dirname(options.to_version)
+
+ diffdir = ''
+ if srcdir != '':
+ diffdir = '/tmp/make-patch/' + 'lilypond-%s'\
+ % version_tuple_to_str(options.to_version)
+
+ if from_b != 0 or (from_b == 0 and to_b == 0):
+ os.chdir ('/tmp/make-patch')
+ untar(released_tarball(options.from_version))
+ os.chdir(prev_cwd)
+ else:
+ fromdir = diffdir
+ sys.stderr.write('copying ' + srcdir + ' to ' + diffdir + '\n')
+ # os.system('cp -pr %s %s' % (srcdir, diffdir))
+ os.system('mkdir -p %s '% (diffdir))
+ os.system('tar cf - --exclude out %s | tar -xf - -C %s'
+ % (srcdir, '/tmp/make-patch'))
+
+ if to_b != 0:
+ os.chdir ('/tmp/make-patch')
+ untar(released_tarball(options.to_version))
+ os.chdir(prev_cwd)
+ else:
+ todir = diffdir
+ sys.stderr.write('copying ' + srcdir + ' to ' + diffdir + '\n')
+ os.system('mkdir -p %s '% (diffdir))
+ # os.system('cp -pr %s %s' (srcdir, diffdir))%
+ os.system('tar -cf - --exclude out %s | tar -xf - -C %s '
+ % (srcdir, '/tmp/make-patch'))
+
+ os.chdir('/tmp/make-patch')
+ os.chdir(todir)
+ # os.system('rm -f *.aux *.dvi *.midi *.log *.ps *.tex *.ly')
+ os.chdir ('/tmp/make-patch')
+
+ makepatch(fromdir, todir, outfn)
+
+ os.chdir('/tmp/make-patch')
+ sys.stderr.write('cleaning ... ')
+ os.system('rm -fr %s %s' % (fromdir, todir))
+ sys.stderr.write('\n')
+ os.chdir(prev_cwd)
if __name__ == '__main__':
main()
+
--- /dev/null
+
+import sys
+import os
+
+lilypath =''
+try:
+ lilypath = os.environ['LILYPOND_SOURCEDIR'] + '/'
+except KeyError:
+ print 'Please set LILYPOND_SOURCEDIR to the toplevel source, eg LILYPOND_SOURCEDIR=/home/foobar/lilypond-1.2.3/'
+ sys.exit(1)
+
+lilypath = lilypath + '/bin/'
+sys.path.append(lilypath)
+
+from lilypython import *
+
+
+
+def gen_list(inputs, filename):
+ print "generating HTML list %s\n" % filename
+ list = open(filename, 'w')
+ list.write ('<html><TITLE>Rendered Examples</TITLE>\n'
+ '<body>These example files are taken from the LilyPond distribution.\n'
+ 'LilyPond currently only outputs TeX and MIDI. The pictures and\n'
+ 'PostScript files were generated using TeX, Ghostscript and some\n'
+ 'graphics tools. The papersize used for these examples is A4. The GIF\n'
+ 'files have been scaled to eliminate aliasing.\n');
+
+ for ex in inputs:
+ print '%s, ' % ex
+ header = read_mudela_header(ex + '.ly.txt')
+
+ def read_dict(s, default, h =header):
+ try:
+ ret = h[s]
+ except KeyError:
+ ret = default
+ return ret
+ head = read_dict('title', ex)
+ composer = read_dict('composer', '')
+ desc = read_dict('description', '')
+ list.write('<hr>')
+ list.write('<h1>example file: %s</h1>' % head);
+ if composer <> '':
+ list.write('<h2>%s</h2>\n' % composer)
+ if desc <> '':
+ list.write('%s<p>' % desc)
+ list.write ('<ul>')
+ def list_item(filename, desc, l = list):
+ if file_exist_b(filename):
+ l.write ('<li><a href=%s>%s</a>\n' % (filename, desc))
+
+ list_item(ex + '.ly.txt', 'The input')
+ for pageno in range(1,10):
+ f = ex + '-page%d.gif' % pageno
+ if not file_exist_b (f):
+ break
+ list_item(f, 'The output (picture, page %d)' % pageno)
+ list_item(ex + '.ps.gz', 'The output (gzipped PostScript)')
+ list_item(ex + '.midi', 'The output (MIDI)')
+ list.write ("</ul>");
+
+ list.write( "</BODY></HTML>");
+ list.close()
+
+allfiles = multiple_find (['*.ly.txt'], '.')
+
+gen_list (sys.argv[1:], 'index.html')
--- /dev/null
+
+configure --prefix=~ --enable-profiling --enable-config=optprof --enable-optimise --disable-checking
-sOutputFile="|pnmscale 0.5|ppmtogif > $FILE-page%d.gif" \
-r200 -dNOPAUSE - -c quit
-
-
ZIP = @ZIP@
PERL = @PERL@
PYTHON = @PYTHON@
-OUTDIR_NAME = @OUTDIR_NAME@
-
+CONFIGSUFFIX = @CONFIGSUFFIX@
AC_INIT(flower/choleski.cc)
-AC_CONFIG_HEADER(config.hh:config.hh.in) #ugh flower/out/
+AC_CONFIG_HEADER($CONFIGFILE.hh:config.hh.in) #ugh flower/out/
AC_CONFIG_AUX_DIR(bin)
AC_CANONICAL_HOST
-OUTDIR_NAME=out
+
. $srcdir/VERSION
FULL_VERSION=$MAJOR_VERSION.$MINOR_VERSION.$PATCH_LEVEL
if test x$MY_PATCH_LEVEL != x; then
# ugh, ugh
ac_cv_prog_lex_root=lex.yy
+# -O is necessary to get inlining
+OPTIMIZE="-O"
printing_b=no
checking_b=yes
optimise_b=no
profile_b=no
-
+CONFIGSUFFIX=
debug_b=yes
+
+
AC_LANG_CPLUSPLUS
[MFDIR=$enableval],
[MFDIR=auto])
+AC_ARG_ENABLE(config,
+ [ enable-config=FILE put configure settings in config-FILE.make],
+ [CONFIGSUFFIX=$enableval])
+
+
if test "$printing_b" = no; then
AC_DEFINE(NPRINT)
fi
fi
if test "$optimise_b" = yes; then
- DEFINES="$DEFINES -finline-functions -O2 -DSTRING_UTILS_INLINED"
+ DEFINES="$DEFINES -finline-functions -DSTRING_UTILS_INLINED"
+ OPTIMIZE="-O2"
AC_DEFINE(STRINGS_UTILS_INLINED)
fi
ZIP="zip -r -9"
fi
+if test "$CONFIGSUFFIX" != "" ; then
+ CONFIGFILE=config-$CONFIGSUFFIX
+else
+ CONFIGFILE=config
+fi
+
+
+
dnl COMPILEINFO="$HOST $host $TARGET $target"
AUTOGENERATE="This file was automatically generated by configure"
CPPFLAGS=${CPPFLAGS:-""} # we don't want -g -O junk
# CXXFLAGS=${CXXFLAGS:-""} # we don't want -g -O junk
-CXXFLAGS=$DEFINES
+CXXFLAGS="$DEFINES $OPTIMIZE"
LDFLAGS=$EXTRA_LIBES
AC_PROG_CXX
AC_SUBST(DIR_DATADIR)
AC_SUBST(absolute_builddir)
AC_SUBST(EXTRA_LIBES)
-AC_SUBST(OUTDIR_NAME)
+AC_SUBST(CONFIGSUFFIX)
AC_CHECK_PROGS(BISON, bison, error)
AC_CHECK_PROGS(FLEX, flex, error)
AC_CHECK_PROGS(MAKE, make, error)
# first do Foobar/Makefile then Foobar/include/Makefile
-AC_OUTPUT(config.make)
+AC_OUTPUT($CONFIGFILE.make:config.make.in)
rm -f Makefile
cp make/Toplevel.make.in ./Makefile
+pl 41
+ - matrix fixes; more inlining no virtual methods
+
pl 40
- do some Complex number stuff in Offset
- included axies, offset from lily
MAJOR_VERSION=1
MINOR_VERSION=1
-PATCH_LEVEL=40
+PATCH_LEVEL=41
# use to send patches, always empty for released version:
#
void
Choleski_decomposition::solve (Vector &x, Vector const &rhs) const
{
- if (L.band_b())
+ if (band_b_)
{
band_matrix_solve (x,rhs);
}
Real d = P(i,i) - sum;
D(i) = d;
}
- L.try_set_band();
- assert (L.band_i() == P.band_i ());
+ L.set_band();
+ band_b_ = true;
}
#ifdef PARANOID
assert ((P-P.transposed()).norm ()/P.norm () < EPS);
#endif
- if (P.band_b())
+ band_b_ = false;
+
+ int b = P.calc_band_i ();
+
+ if (b <= P.dim ()/2)
band_matrix_decompose (P);
else
full_matrix_decompose (P);
-
#ifdef PARANOID
assert ((original()-P).norm () / P.norm () < EPS);
OK();
fs.OK();
for (int i=0; i<height_i_; i++)
- for (int j=0; j<width_i_; j++)
- els_p_p_[i][j]= fs.els_p_p_[i][j];
+ for (int j=0; j<width_i_; j++)
+ els_p_p_[i][j]= fs.els_p_p_[i][j];
}
Full_storage::OK() const
{
#ifndef NDEBUG
-
assert (max_height_i_ >= height_i_ && max_width_i_ >= width_i_);
assert (height_i_ >= 0 && width_i_ >= 0);
assert (els_p_p_||!max_height_i_);
Full_storage::~Full_storage()
{
for (int i=0; i < max_height_i_; i++)
- delete [] els_p_p_[i];
+ delete [] els_p_p_[i];
delete[] els_p_p_;
}
OK();
resize_cols (rows);
resize_rows (cols);
+ band_i_ = rows >? cols;
}
-bool
-Full_storage::mult_ok (int i, int) const
-{
- return i < height_i_;
-}
-
-
-bool
-Full_storage::trans_ok (int , int j) const
-{
- return j < width_i_;
-}
-
-
-
-void
-Full_storage::trans_next (int &i, int &j) const
-{
- assert (trans_ok (i,j));
- i++;
- if (i >= height_i_)
- {
- i=0;
- j ++;
- }
-}
-
-
-void
-Full_storage::mult_next (int &i, int &j) const
-{
- assert (mult_ok (i,j));
- j++;
- if (j >= width_i_)
- {
- j=0;
- i++;
- }
-}
-
-
void
Full_storage::delete_column (int k)
{
assert (0 <= k &&k<width_i_);
for (int i=0; i< height_i_ ; i++)
- for (int j=k+1; j <width_i_; j++)
- els_p_p_[i][j-1]=els_p_p_[i][j];
+ for (int j=k+1; j <width_i_; j++)
+ els_p_p_[i][j-1]=els_p_p_[i][j];
width_i_--;
}
{
assert (0 <= k &&k<height_i_);
for (int i=k+1; i < height_i_ ; i++)
- for (int j=0; j < width_i_; j++)
- els_p_p_[i-1][j]=els_p_p_[i][j];
+ for (int j=0; j < width_i_; j++)
+ els_p_p_[i-1][j]=els_p_p_[i][j];
height_i_--;
}
assert (0 <= k&& k <=height_i_);
resize_cols (height_i_+1);
for (int i=height_i_-1; i > k ; i--)
- for (int j=0; j <width_i_; j++)
- els_p_p_[i][j]=els_p_p_[i-1][j];
+ for (int j=0; j <width_i_; j++)
+ els_p_p_[i][j]=els_p_p_[i-1][j];
+
+}
+Array<Real>
+Full_storage::row (int n) const
+{
+ Array<Real> r;
+ for (int j = 0; j < cols(); j++)
+ r.push (elem (n,j));
+ return r;
+}
+Array<Real>
+Full_storage::column (int n) const
+{
+ Array<Real> r;
+ for (int i = 0; i < rows(); i++)
+ r.push (elem (i,n));
+ return r;
}
-bool
-Full_storage::try_right_multiply (Matrix_storage * dest, Matrix_storage const * right) const
+void
+Full_storage::set_size (int rows, int cols)
{
- if (dest->name() != Full_storage::static_name () ||
- right->name() != Full_storage::static_name ())
- return false;
-
- Full_storage *d_l = (Full_storage*)dest;
- Full_storage *r_l = (Full_storage*)right;
-
- d_l->set_size (height_i_, r_l->width_i_);
- for (int i=0; i < d_l->height_i_; i++)
- for (int j = 0; j < d_l->width_i_; j++)
- {
- Real &r (d_l->els_p_p_[i][j]);
- r=0.0;
- for (int k = 0; k < width_i_; k++)
- r += els_p_p_[i][k] * r_l->els_p_p_[k][j];
-
- }
- return true;
-
-
+ resize (rows,cols);
}
-IMPLEMENT_IS_TYPE_B1(Full_storage,Matrix_storage);
+
+void
+Full_storage::set_size (int rows)
+{
+
+ resize (rows);
+}
+
+
+
void
Full_storage::resize_cols (int newh)
{
if (newh <= max_height_i_)
{
- height_i_=newh;
- return;
+ height_i_=newh;
+ return;
}
Real ** newa=new Real*[newh];
int j=0;
for (; j < height_i_; j++)
- newa[j] = els_p_p_[j];
+ newa[j] = els_p_p_[j];
for (; j < newh; j++)
- newa[j] = new Real[max_width_i_];
+ newa[j] = new Real[max_width_i_];
delete[] els_p_p_;
els_p_p_=newa;
-Full_storage::Full_storage (Matrix_storage*m)
-{
- set_size (m->rows(), m->cols ());
- if (!m->is_type_b (Full_storage::static_name()))
- for (int i=0; i<height_i_; i++)
- for (int j=0; j<width_i_; j++)
- els_p_p_[i][j]=0.0;
- for (int i,j=0; m->mult_ok (i,j); m->mult_next (i,j))
- els_p_p_[i][j] = m->elem (i,j);
-}
-
-
void
Full_storage::resize_rows (int neww)
{
if (neww <= max_width_i_)
{
- width_i_=neww;
- return;
+ width_i_=neww;
+ return;
}
for (int i=0; i < max_height_i_ ; i++)
{
- Real* newa = new Real[neww];
- for (int k=0; k < width_i_; k++)
- newa[k] = els_p_p_[i][k];
+ Real* newa = new Real[neww];
+ for (int k=0; k < width_i_; k++)
+ newa[k] = els_p_p_[i][k];
- delete[] els_p_p_[i];
- els_p_p_[i] = newa;
+ delete[] els_p_p_[i];
+ els_p_p_[i] = newa;
}
width_i_ = max_width_i_ = neww;
}
#endif
#define INLINE
-INLINE
-IMPLEMENT_VIRTUAL_COPY_CONS(Full_storage,Matrix_storage);
#include "full-storage.icc"
/// lower triangle of Choleski decomposition
Matrix L;
+ bool band_b_;
+
/// diagonal
Vector D;
#define FULL_STORAGE_HH
#include "varray.hh"
-#include "matrix-storage.hh"
#include "real.hh"
/// simplest matrix storage. refer to its baseclass for the doco.
-class Full_storage : public Matrix_storage
+class Full_storage
{
/// height, width
- int height_i_,width_i_;
+ int height_i_;
+ int width_i_;
/// maxima.
- int max_height_i_, max_width_i_;
+ int max_height_i_;
+ int max_width_i_;
- /// the storage
+ /// the storage
Real** els_p_p_;
- void
- init() ;
+ void init() ;
bool valid (int i, int j) const ;
void resize_cols (int);
public:
- virtual int rows() const;
- virtual int cols() const ;
-
+ int band_i_; // ugh
+
+ /// check invariants
+ void OK() const;
- virtual void resize (int i, int j);
- virtual void resize (int i);
- virtual Real& elem (int i,int j);
- virtual Real elem (int i, int j) const ;
+ /// height of matrix
+ int rows() const;
+
+ /// width of matrix
+ int cols() const;
+
+ /// size if square
int dim() const;
- Full_storage (Matrix_storage*);
+
+ /** set the size. contents lost.
+ PRE
+ i >=0, j>=0
+ */
+ void set_size (int rows, int cols) ;
+
+
+ /**set the size to square dimen. contents lost
+ PRE
+ i>=0
+ */
+ void set_size (int i) ;
+ /**set the size to i.
+
+ keep contents. If enlarged contents unspecified
+
+ PRE
+ i>=0, j>=0
+
+ */
+ void resize (int rows, int cols);
+
+ /**
+ set the size to square dimen. contents kept
+ Keep contents. If enlarged contents are unspecified
+
+ PRE
+ i>=0
+ */
+ void resize (int i);
+
+
+ /**
+ access an element.
+
+ Generate an errormessage, if this happens
+ in the 0-part of a sparse matrix.
+ */
+
+ Real& elem (int i,int j);
+
+ /// access a element, no modify
+ Real elem (int i, int j) const;
+
+ Array<Real> row (int i) const ;
+ Array<Real> column (int j) const;
+
+
+ /**
+ add a row to the matrix before row k. Contents
+ of added row are unspecified
+
+ 0 <= k <= rows()
+ */
+ void insert_row (int k);
+
+
+ /**
+ delete a row from this matrix.
+
+ PRE
+ 0 <= k < rows();
+ */
+ void delete_row (int k);
+ void delete_column (int k);
+
+
+
+ /**
+ at end of matrix?. when doing loop
+
+ for (i=0; i<h; i++)
+ for (j=0; j<w; j++)
+ ..
+
+ */
+ bool mult_ok (int i, int j) const;
+
+ /**
+ walk through matrix (regular multiply).
+ get next j for row i, or get next row i and reset j.
+ this will make sparse matrix implementation easy.
+
+ PRE
+ mult_ok (i,j)
+ */
+ void mult_next (int &i, int &j) const;
+
+ /**
+ valid matrix entry. return false if at end of row
+ */
+ bool trans_ok (int i, int j) const;
+
+ /**
+ walk through matrix (transposed multiply).
+ Get next i (for column j)
+
+ PRE
+ ver_ok (i,j)
+ */
+
+ void trans_next (int &i, int &j) const;
+
Full_storage();
Full_storage (int i, int j);
Full_storage (Full_storage const&);
Full_storage (int i);
- void OK() const;
void operator=(Full_storage const &);
- virtual void insert_row (int k);
- virtual void delete_row (int k);
- virtual void delete_column (int k);
~Full_storage();
- virtual bool mult_ok (int i, int j) const;
- virtual void mult_next (int &i, int &j) const ;
- virtual bool trans_ok (int i, int j) const;
- virtual void trans_next (int &i, int &j) const;
- DECLARE_VIRTUAL_COPY_CONS(Full_storage,Matrix_storage);
- DECLARE_MY_RUNTIME_TYPEINFO;
- virtual bool try_right_multiply (Matrix_storage * dest, Matrix_storage const *) const;
};
+#ifndef INLINE
+#define INLINE inline
+#endif
+
+#include "full-storage.icc"
+
+
#endif // FULL_STORAGE_HH
Full_storage::init()
{
els_p_p_=0;
+ band_i_ = 0;
height_i_=width_i_=max_height_i_=max_width_i_=0;
}
+
INLINE bool
Full_storage::valid (int i, int j) const
{
INLINE
Full_storage::Full_storage (Full_storage const&s)
- : Matrix_storage (s)
{
init();
(*this) = s;
{
return height_i_;
}
+
INLINE int
Full_storage::cols() const
{
return width_i_;
}
+
INLINE int
Full_storage::dim() const
{
init();
set_size (i);
}
-
-//INLINE
-//IMPLEMENT_VIRTUAL_COPY_CONS(Full_storage,Matrix_storage);
+
+INLINE
+bool
+Full_storage::mult_ok (int i, int ) const
+{
+ return i < height_i_;
+}
+
+INLINE
+bool
+Full_storage::trans_ok (int , int j) const
+{
+ return j < width_i_;
+}
+
+
+INLINE
+void
+Full_storage::trans_next (int &i, int &j) const
+{
+ assert (trans_ok (i,j));
+ i++;
+ if (i >= height_i_)
+ {
+ i= (0 >? j - band_i_);
+ j ++;
+ }
+}
+
+INLINE
+void
+Full_storage::mult_next (int &i, int &j) const
+{
+ assert (mult_ok (i,j));
+ j++;
+ if (j >= width_i_)
+ {
+ j= 0 >? (i - band_i_);
+ i++;
+ }
+}
#endif // FULL_STORAGE_ICC
#include "varray.hh"
#include "real.hh"
-// oo, noo!
-#include "virtual-methods.hh"
-
/**
base class for interface with matrix storageclasses. There are no
public:
- /// check invariants
- virtual void OK() const=0;
+ /// check invariants
+ void OK() const;
- /// height of matrix
- virtual int rows() const = 0;
+ /// height of matrix
+ int rows() const;
- /// width of matrix
- virtual int cols() const = 0;
+ /// width of matrix
+ int cols() const;
- /// size if square
- virtual int dim() const =0;
+ /// size if square
+ int dim() const;
- /** set the size. contents lost.
- PRE
- i >=0, j>=0
- */
- virtual void set_size (int rows, int cols) ;
+ /** set the size. contents lost.
+ PRE
+ i >=0, j>=0
+ */
+ void set_size (int rows, int cols) ;
- /**set the size to square dimen. contents lost
- PRE
- i>=0
- */
- virtual void set_size (int i) ;
- /**set the size to i.
-
- keep contents. If enlarged contents unspecified
+ /**set the size to square dimen. contents lost
+ PRE
+ i>=0
+ */
+ void set_size (int i) ;
+ /**set the size to i.
+
+ keep contents. If enlarged contents unspecified
- PRE
- i>=0, j>=0
+ PRE
+ i>=0, j>=0
- */
- virtual void resize (int rows, int cols) = 0;
+ */
+ void resize (int rows, int cols);
/**
- set the size to square dimen. contents kept
- Keep contents. If enlarged contents are unspecified
+ set the size to square dimen. contents kept
+ Keep contents. If enlarged contents are unspecified
- PRE
- i>=0
- */
- virtual void resize (int i) = 0;
+ PRE
+ i>=0
+ */
+ void resize (int i);
- /**
- access an element.
+ /**
+ access an element.
- Generate an errormessage, if this happens
- in the 0-part of a sparse matrix.
- */
+ Generate an errormessage, if this happens
+ in the 0-part of a sparse matrix.
+ */
- virtual Real& elem (int i,int j) = 0;
+ Real& elem (int i,int j);
- /// access a element, no modify
- virtual Real elem (int i, int j) const = 0;
+ /// access a element, no modify
+ Real elem (int i, int j) const;
- virtual Array<Real> row (int i) const ;
- virtual Array<Real> column (int j) const;
+ Array<Real> row (int i) const ;
+ Array<Real> column (int j) const;
- /**
- add a row to the matrix before row k. Contents
- of added row are unspecified
+ /**
+ add a row to the matrix before row k. Contents
+ of added row are unspecified
- 0 <= k <= rows()
- */
- virtual void insert_row (int k)=0;
+ 0 <= k <= rows()
+ */
+ void insert_row (int k);
- /**
- delete a row from this matrix.
-
- PRE
- 0 <= k < rows();
- */
- virtual void delete_row (int k)=0;
- virtual void delete_column (int k)=0;
- virtual ~Matrix_storage() { }
- virtual Matrix_storage *clone() const=0;
+ /**
+ delete a row from this matrix.
+ PRE
+ 0 <= k < rows();
+ */
+ void delete_row (int k);
+ void delete_column (int k);
+ ~Matrix_storage() { }
- /**
- at end of matrix?. when doing loop
+ /**
+ at end of matrix?. when doing loop
- for (i=0; i<h; i++)
- for (j=0; j<w; j++)
- ..
+ for (i=0; i<h; i++)
+ for (j=0; j<w; j++)
+ ..
- */
- virtual bool mult_ok (int i, int j) const=0;
+ */
+ bool mult_ok (int i, int j) const;
- /**
- walk through matrix (regular multiply).
- get next j for row i, or get next row i and reset j.
- this will make sparse matrix implementation easy.
-
- PRE
- mult_ok (i,j)
- */
- virtual void mult_next (int &i, int &j) const = 0;
-
- /**
- valid matrix entry. return false if at end of row
- */
- virtual bool trans_ok (int i, int j) const=0;
-
- /**
- walk through matrix (transposed multiply).
- Get next i (for column j)
+ /**
+ walk through matrix (regular multiply).
+ get next j for row i, or get next row i and reset j.
+ this will make sparse matrix implementation easy.
- PRE
- ver_ok (i,j)
- */
-
- virtual void trans_next (int &i, int &j) const = 0;
+ PRE
+ mult_ok (i,j)
+ */
+ void mult_next (int &i, int &j) const;
+
+ /**
+ valid matrix entry. return false if at end of row
+ */
+ bool trans_ok (int i, int j) const;
+
+ /**
+ walk through matrix (transposed multiply).
+ Get next i (for column j)
- /// generate a "Full_storage" matrix
- static Matrix_storage *get_full (int n, int m);
- static void set_band (Matrix_storage*&, int band);
- static void set_full (Matrix_storage*&);
- virtual bool try_right_multiply (Matrix_storage *dest,
- const Matrix_storage *fact) const ;
- /**
- RTTI.
- */
- DECLARE_MY_RUNTIME_TYPEINFO;
+ PRE
+ ver_ok (i,j)
+ */
+ void trans_next (int &i, int &j) const;
- static Matrix_storage* get_product_result (Matrix_storage *left,
- Matrix_storage *right);
-
-
- static void set_addition_result (
- Matrix_storage *&dat, Matrix_storage *right);
- static void set_product_result (
- Matrix_storage*&dest, Matrix_storage*left, Matrix_storage*right);
+ /// generate a "Full_storage" matrix
+ static void set_band (Matrix_storage*&, int band);
};
#endif // MATRIX_STORAGE_HH
#ifndef MATRIX_HH
#define MATRIX_HH
-#include "matrix-storage.hh"
+#include "full-storage.hh"
#include "vector.hh"
#include "offset.hh"
friend Matrix operator *(Matrix const &m1, Matrix const &m2);
protected:
- Matrix_storage *dat;
+ Full_storage *dat_;
void set (Matrix_storage*);
- Matrix (Matrix_storage*);
public:
- void OK() const { dat->OK(); }
- int cols() const { return dat->cols (); }
- int rows() const { return dat->rows (); }
+ void OK() const { dat_->OK(); }
+ void set_band ();
+ int calc_band_i () const;
+ int cols() const { return dat_->cols (); }
+ int rows() const { return dat_->rows (); }
/** return the size of a matrix.
PRE
0 <= band_i() <= dim
*/
int band_i() const;
- bool band_b() const;
- void set_full() const;
- void try_set_band() const;
- ~Matrix() { delete dat; }
/// set entries to r
void fill (Real r);
PRE
0 <= k < rows();
*/
- void delete_row (int k) { dat->delete_row (k); }
- void delete_column (int k) { dat->delete_column (k); }
+ void delete_row (int k) { dat_->delete_row (k); }
+ void delete_column (int k) { dat_->delete_column (k); }
/**
square n matrix, initialised to null
void operator=(Matrix const &m);
/// access an element
- Real operator()(int i,int j) const { return dat->elem (i,j); }
+ Real operator()(int i,int j) const { return dat_->elem (i,j); }
/// access an element
- Real &operator()(int i, int j) { return dat->elem (i,j); }
+ Real &operator()(int i, int j) { return dat_->elem (i,j); }
/// Matrix multiply with vec (from right)
Vector operator *(Vector const &v) const;
operator String() const;
void print() const;
+ ~Matrix ();
};
inline Vector
Offset o = *this;
o.x () = - o.x ();
o.y () = - o.y ();
- return *this;
+ return o;
}
Offset& operator-=(Offset o) {
x()-=o.x ();
bool isnum_b() const;
operator Real();
operator int();
+ bool to_bool () const;
/** perl -like string to bool conversion.
*/
bool eof() {
return feof (f);
}
- bool eol() {
- return (peek() == '\n');
- }
- char peek() {
- char c = get();
- unget (c);
- return c;
- }
- int line(){
- return line_no;
- }
-
char get() {
char c;
line_no--;
pushback.push (c);
}
+ char peek() {
+ char c = get();
+ unget (c);
+ return c;
+ }
+ bool eol() {
+ return (peek() == '\n');
+ }
+ int line(){
+ return line_no;
+ }
+
~Text_stream(){
if (!eof())
cerr <<__FUNCTION__<< ": closing unended file";
Array()
{ array_p_ = 0; max_ =0; size_ =0; }
+ // ugh, get around gcc 2.8.1 ice; see bezier.cc
+ Array (int i)
+ {
+ max_ = size_ = i;
+ array_p_ = new T[i];
+ }
+
/** set the size_ to #s#.
POST: size() == s.
public:
void OK() const { dat.OK();}
int dim() const { return dat.size (); }
+ void fill (Real r) {
+ for (int i=0; i < dim(); i++)
+ dat[i] =r;
+ }
+
Vector() { }
Vector (Array<Real> d);
Vector (Vector const &n);
+
+ Real &operator()(int i) { return dat[i]; }
+ Real operator()(int i) const { return dat[i]; }
+ Real elem (int i) { return dat[i]; }
Vector (int n) {
dat.set_size (n);
fill (0);
}
void del (int i) { dat.del (i); }
operator String() const;
- void fill (Real r) {
- for (int i=0; i < dim(); i++)
- dat[i] =r;
- }
void operator +=(Vector v) {
assert (v.dim() == dim ());
dat[i] += v.dat[i];
}
- void operator /=(Real a) {
- (*this) *= 1/a;
- }
-
- void operator *=(Real a) {
- for (int i=0; i < dim(); i++)
- dat[i] *= a;
- }
-
void operator -=(Vector v) {
assert (v.dim() == dim ());
for (int i=0; i < dim(); i++)
dat[i] -= v (i);
}
- Real &operator()(int i) { return dat[i]; }
- Real operator()(int i) const { return dat[i]; }
- Real elem (int i) { return dat[i]; }
Real operator *(Vector v) const {
Real ip=0;
assert (v.dim() == dim ());
ip += dat[i] *v (i);
return ip;
}
- Vector operator-() const;
- Real norm() {
- return sqrt (norm_sq());
+ void operator *=(Real a) {
+ for (int i=0; i < dim(); i++)
+ dat[i] *= a;
+ }
+ void operator /=(Real a) {
+ (*this) *= 1/a;
}
+ Vector operator-() const;
Real norm_sq() {
return ((*this) * (*this));
}
+ Real norm() {
+ return sqrt (norm_sq());
+ }
operator Array<Real>() { return dat; }
void print() const;
/// set to j-th element of unit-base
#include "flower-debug.hh"
#include "matrix.hh"
-#include "matrix-storage.hh"
-
Matrix::operator String() const
{
String s;
#ifndef NPRINT
- Matrix_storage const * stor_c_l = dat;
- s=String ("matrix { (") + dat->name() + ")\n";
+ Full_storage const * stor_c_l = dat_;
+ s=String ("matrix {");
for (int i=0; i< rows(); i++)
{
for (int j = 0; j < cols(); j++)
{
s += String (dat[i], "%6f") + String (' ');
}
- s+="]";
+ s+="]\n";
#endif
return s;
}
#include "matrix.hh"
#include "full-storage.hh"
-#include "diagonal-storage.hh"
-
-bool
-Matrix::band_b() const
-{
- return dat->is_type_b (Diagonal_storage::static_name());
-}
-
-void
-Matrix::set_full() const
-{
- if (dat->name() != Full_storage::static_name ())
- {
- Matrix_storage::set_full (((Matrix*)this)->dat);
- }
-}
-
-void
-Matrix::try_set_band() const
-{
- if (band_b())
- return;
-
- int b = band_i();
- if (b > dim()/2)
- return;
- // it only looks constant
- Matrix*self = (Matrix*)this;
- Matrix_storage::set_band (self->dat,b);
-}
Real
Matrix::norm() const
{
Real r =0.0;
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
- r += sqr (dat->elem (i,j));
+ for (int i=0, j=0; dat_->mult_ok (i,j); dat_->mult_next (i,j))
+ r += sqr (dat_->elem (i,j));
return sqrt (r);
}
void
Matrix::fill (Real r)
{
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
- dat->elem (i,j)=r;
+ for (int i=0, j=0; dat_->mult_ok (i,j); dat_->mult_next (i,j))
+ dat_->elem (i,j)=r;
}
void
Matrix::set_diag (Real r)
{
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
- dat->elem (i,j)=(i==j) ? r: 0.0;
+ for (int i=0, j=0; dat_->mult_ok (i,j); dat_->mult_next (i,j))
+ dat_->elem (i,j)=(i==j) ? r: 0.0;
}
void
Matrix::set_diag (Vector d)
{
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
- dat->elem (i,j)=(i==j) ? d (i): 0.0;
+ for (int i=0, j=0; dat_->mult_ok (i,j); dat_->mult_next (i,j))
+ dat_->elem (i,j)=(i==j) ? d (i): 0.0;
}
void
Matrix::operator+=(Matrix const &m)
{
- Matrix_storage::set_addition_result (dat, m.dat);
assert (m.cols() == cols ());
assert (m.rows() == rows ());
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
- dat->elem (i,j) += m (i,j);
+ for (int i=0, j=0; dat_->mult_ok (i,j); dat_->mult_next (i,j))
+ dat_->elem (i,j) += m (i,j);
}
void
Matrix::operator-=(Matrix const &m)
{
- Matrix_storage::set_addition_result (dat, m.dat);
assert (m.cols() == cols ());
assert (m.rows() == rows ());
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
- dat->elem (i,j) -= m (i,j);
+ for (int i=0, j=0; dat_->mult_ok (i,j); dat_->mult_next (i,j))
+ dat_->elem (i,j) -= m (i,j);
}
void
Matrix::operator*=(Real a)
{
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
- dat->elem (i,j) *= a;
+ for (int i=0, j=0; dat_->mult_ok (i,j); dat_->mult_next (i,j))
+ dat_->elem (i,j) *= a;
}
void
Matrix::operator=(Matrix const &m)
{
if (&m == this)
- return ;
- delete dat;
- dat = m.dat->clone();
+ return ;
+ delete dat_;
+ dat_ = new Full_storage (*m.dat_);
}
+
int
-Matrix::band_i() const
+Matrix::band_i () const
+{
+ return dat_->band_i_;
+}
+
+void
+Matrix::set_band ()
+{
+ dat_->band_i_ = calc_band_i ();
+}
+
+int
+Matrix::calc_band_i() const
{
- if (band_b())
- {
- Diagonal_storage const * diag = (Diagonal_storage*) dat;
- return diag->band_size_i();
- }
int starty = dim();
while (starty >= 0)
{
- for (int i = starty, j = 0; i < dim(); i++, j++)
- if (dat->elem (i,j))
- goto gotcha;
- for (int i=0, j = starty; j < dim(); i++,j++)
- if (dat->elem (i,j))
- goto gotcha;
- starty --;
+ for (int i = starty, j = 0; i < dim(); i++, j++)
+ if (dat_->elem (i,j))
+ goto gotcha;
+ for (int i=0, j = starty; j < dim(); i++,j++)
+ if (dat_->elem (i,j))
+ goto gotcha;
+ starty --;
}
-gotcha:
+ gotcha:
return starty;
}
Matrix::Matrix (Matrix const &m)
{
- m.OK();
-
- dat = m.dat->clone();
+ dat_ = new Full_storage (*m.dat_);
}
Matrix::Matrix (int n, int m)
{
- dat = Matrix_storage::get_full (n,m);
+ dat_ = new Full_storage(n,m);
fill (0);
}
-Matrix::Matrix (Matrix_storage*stor_p)
-{
- dat = stor_p;
-}
Matrix::Matrix (int n)
{
- dat = Matrix_storage::get_full (n,n);
+ dat_= new Full_storage (n,n);
fill (0);
}
Matrix::Matrix (Vector v, Vector w)
-{
- dat = Matrix_storage::get_full (v.dim(), w.dim ());
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
- dat->elem (i,j)=v (i)*w (j);
+{
+ int n = v.dim();
+ int m = w.dim ();
+ dat_= new Full_storage (n,m);
+ for (int i=0; i < n; i++)
+ for (int j=0; j < m ; j++)
+ dat_->elem (i,j)=v (i)*w (j);
}
Vector v (n);
for (int i=0; i < n; i++)
- v (i)=dat->elem (k,i);
+ v (i)=dat_->elem (k,i);
return v;
}
int n=rows();
Vector v (n);
for (int i=0; i < n; i++)
- v (i)=dat->elem (i,k);
+ v (i)=dat_->elem (i,k);
return v;
}
Vector
Matrix::left_multiply (Vector const & v) const
{
- Vector dest (v.dim());
- assert (dat->cols()==v.dim ());
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
- dest (i)+= dat->elem (j,i)*v (j);
+ Vector dest (v.dim());
+ assert (dat_->cols()==v.dim ());
+ for (int i=0, j=0; dat_->mult_ok (i,j); dat_->mult_next (i,j))
+ dest (i)+= dat_->elem (j,i)*v (j);
return dest;
}
Matrix::operator *(Vector const & v) const
{
Vector dest (rows());
- assert (dat->cols()==v.dim ());
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
- dest (i)+= dat->elem (i,j)*v (j);
+ assert (dat_->cols()==v.dim ());
+ for (int i=0, j=0; dat_->mult_ok (i,j); dat_->mult_next (i,j))
+ dest (i)+= dat_->elem (i,j)*v (j);
return dest;
}
ugh. Only works for square matrices.
*/
void
-Matrix::transpose() // delegate to storage?
+Matrix::transpose()
{
-#if 1
- for (int i=0, j=0; dat->mult_ok (i,j); dat->mult_next (i,j))
+ for (int i=0, j=0; dat_->mult_ok (i,j); dat_->mult_next (i,j))
{
- if (i >= j)
- continue;
- Real r=dat->elem (i,j);
- dat->elem (i,j) = dat->elem (j,i);
- dat->elem (j,i)=r;
+ if (i >= j)
+ continue;
+ Real r=dat_->elem (i,j);
+ dat_->elem (i,j) = dat_->elem (j,i);
+ dat_->elem (j,i)=r;
}
-#endif
}
Matrix
Matrix
operator *(Matrix const &m1, Matrix const &m2)
{
- Matrix result (Matrix_storage::get_product_result (m1.dat, m2.dat));
-
+ Matrix result (m1.rows (), m2.cols ());
result.set_product (m1,m2);
return result;
}
+
+
void
Matrix::set_product (Matrix const &m1, Matrix const &m2)
{
assert (m1.cols()==m2.rows ());
assert (cols()==m2.cols () && rows ()==m1.rows ());
- if (m1.dat->try_right_multiply (dat, m2.dat))
- return;
-
- for (int i=0, j=0; dat->mult_ok (i,j);
- dat->mult_next (i,j))
- {
+ for (int i=0; i < rows (); i++)
+ for (int j=0; j < cols (); j++)
+ {
Real r=0.0;
- for (int k = 0; k < m1.cols(); k++)
+ for (int k = 0 >? i - m1.band_i () >? j - m2.band_i ();
+ k < m1.cols(); k++)
+ {
r += m1(i,k)*m2(k,j);
- dat->elem (i,j)=r;
- }
+ }
+ dat_->elem (i,j)=r;
+ }
}
void
{
int c = cols();
assert (v.dim()==cols ());
- dat->insert_row (k);
+ dat_->insert_row (k);
for (int j=0; j < c; j++)
- dat->elem (k,j)=v (j);
+ dat_->elem (k,j)=v (j);
}
int r = rows();
for (int i=0; i< r; i++)
{
- Real r=dat->elem (i,c1);
- dat->elem (i,c1) = dat->elem (i,c2);
- dat->elem (i,c2)=r;
+ Real r=dat_->elem (i,c1);
+ dat_->elem (i,c1) = dat_->elem (i,c2);
+ dat_->elem (i,c2)=r;
}
}
int c = cols();
for (int i=0; i< c; i++)
{
- Real r=dat->elem (c1,i);
- dat->elem (c1,i) = dat->elem (c2,i);
- dat->elem (c2,i)=r;
+ Real r=dat_->elem (c1,i);
+ dat_->elem (c1,i) = dat_->elem (c2,i);
+ dat_->elem (c2,i)=r;
}
}
return rows();
}
-
-
+Matrix::~Matrix ()
+{
+ delete dat_;
+}
*/
#include <math.h>
+#ifndef STANDALONE
#include "string.hh"
+#endif
#include "offset.hh"
return value_i ();
}
-
Scalar::operator bool () const
+{
+ return to_bool ();
+}
+
+bool
+Scalar::to_bool () const
{
if (!length_i ())
return false;
+/*
+ vector.cc -- implement Vector
+
+ source file of the Flower Library
+
+ (c) 1996-98 Han-Wen Nienhuys <hanwen@cs.ruu.nl>
+
+ */
+
#include "vector.hh"
+
Vector::Vector (Array<Real> d)
: dat (d)
{
Rhythmic_staff = \translator
{
- \type "Engraver_group_engraver";
+ \type "Engraver_group_engraver";
nolines = "1";
- \consists "Pitch_squash_engraver";
+ \consists "Pitch_squash_engraver";
- \consists "Bar_engraver";
- \consists "Meter_engraver";
- \consists "Staff_sym_engraver";
- \consists "Line_group_engraver";
- \accepts "Voice";
+ \consists "Bar_engraver";
+ \consists "Meter_engraver";
+ \consists "Staff_sym_engraver";
+ \consists "Line_group_engraver";
+ \accepts "Voice";
}
+
Voice = \translator {
\type "Engraver_group_engraver";
\consists "Dynamic_engraver";
\consists "Plet_engraver";
\consists "Beam_engraver";
\consists "Abbreviation_beam_engraver";
+ \consists "Multi_measure_rest_engraver";
\consists "Script_engraver";
\consists "Rhythmic_column_engraver";
\consists "Slur_engraver";
"finger" "\setfinger{%}" 0.0\pt 0.0\pt 0.0\pt 5.0\pt
"italic" "\setitalic{%}" 0.0\pt 0.0\pt 0.0\pt 10.0\pt
"large" "\setlarge{%}" 0.0\pt 9.50\pt 0.0\pt 12.0\pt
+ "number" "\setnumber{%}" 0.0\pt 9.50\pt 0.0\pt 12.0\pt
"roman" "\settext{%}" 0.0\pt 7.5\pt 0.0\pt 10.0\pt
}
"finger" "\setfinger{%}" 0.0\pt 0.0\pt 0.0\pt 5.0\pt
"italic" "\setitalic{%}" 0.0\pt 0.0\pt 0.0\pt 10.0\pt
"large" "\setlarge{%}" 0.0\pt 9.50\pt 0.0\pt 12.0\pt
+ "number" "\setnumber{%}" 0.0\pt 9.50\pt 0.0\pt 12.0\pt
"roman" "\settext{%}" 0.0\pt 7.5\pt 0.0\pt 10.0\pt
}
"finger" "\setfinger{%}" 0.0\pt 0.0\pt 0.0\pt 4.0\pt
"italic" "\setitalic{%}" 0.0\pt 4.\pt 0.0\pt 8.0\pt
"large" "\setlarge{%}" 0.0\pt 9.50\pt 0.0\pt 10.0\pt
+ "number" "\setnumber{%}" 0.0\pt 6.0\pt 0.0\pt 8.0\pt
"roman" "\settext{%}" 0.0\pt 4.0\pt 0.0\pt 8.0\pt
}
"dynamics" = \table {
"finger" "\setfinger{%}" 0.0\pt 0.0\pt 0.0\pt 5.0\pt
"italic" "\setitalic{%}" 0.0\pt 7.5\pt 0.0\pt 10.0\pt
"large" "\setlarge{%}" 0.0\pt 9.50\pt 0.0\pt 12.0\pt
+ "number" "\setnumber{%}" 0.0\pt 8.0\pt 0.0\pt 10.0\pt
"roman" "\settext{%}" 0.0\pt 7.5\pt 0.0\pt 10.0\pt
}
"finger" "\setfinger{%}" 0.0\pt 0.0\pt 0.0\pt 5.0\pt
"italic" "\setitalic{%}" 0.0\pt 0.0\pt 0.0\pt 10.0\pt
"large" "\setlarge{%}" 0.0\pt 9.50\pt 0.0\pt 12.0\pt
+ "number" "\setnumber{%}" 0.0\pt 8.0\pt 0.0\pt 10.0\pt
"roman" "\settext{%}" 0.0\pt 7.5\pt 0.0\pt 10.0\pt
}
depth = ..
#
-build = ./$(depth)/lily/$(outdir)/.build
+SUBDIRS=test bugs
-# generic stuff/Makefile
-#
-include ./$(depth)/make/Include.make
-#
-
-# list of distribution files:
-#
-LYFILES = $(wildcard *.ly)
-TEXFILES = $(wildcard *.tex)
-M4FILES = $(wildcard *.m4)
-DISTFILES = Makefile TODO $(LYFILES) $(TEXFILES) $(wildcard *.m4)
-#
+include $(depth)/make/Mutopia.make
-OUTFILES = $(addprefix $(outdir)/,$(M4FILES:%.m4=%))
+WWW_examples=twinkle-pop praeludium-fuga-E cadenza twinkle
-all: $(OUTFILES)
+include $(depth)/make/WWW.make
--- /dev/null
+# input/Makefile
+
+# subdir level:
+#
+depth = ../..
+#
+
+
+include $(depth)/make/Mutopia.make
--- /dev/null
+% silly file to test beam stem lengths
+% compare to *ugly* bug in preludes-1: [e'16 c'' g' f']
+% here it's okee ??
+
+one = \melodic{
+ \octave c';
+ [e'8 c'' g' f']
+ \octave c'';
+ [e16-1\f c'-5( g-3 f-2] % [e-1 c'-5 g-3 e-2]
+ \octave c';
+% [e'16 c'' g' f']
+ [e'32 c'' g' f']
+ [c32 c] ['b 'b]
+ [c8 c]
+ [e8 g b]
+ [e16 g b] c c c
+ [e32 g b] c
+ [c c c c]
+ c4 c4
+ \onevoice;
+ [e'8 c'' g' f']
+ [e'16 c'' g' f']
+ [e'32 c'' g' f']
+ [c32 c] ['b 'b]
+ [c8 c]
+ [e8 g b]
+ [e16 g b] c
+ [e32 g b] c
+ [c c c c]
+ c4
+}
+
+\score{
+ \one
+}
--- /dev/null
+% bug
+% excentric slur can't handle this ...
+\score{
+ \melodic{
+ \octave c;
+ \stemdown;
+ \[4/5c8( c ''f c c\]1/1 c c c )c |
+ }
+}
--- /dev/null
+part = \melodic{
+ \octave c;
+ c c c c
+ r1*3
+ c4 c c c
+ c c c c
+ c c c c
+ c c c c
+}
+
+a4 = \paper{
+ linewidth= 80.\mm;
+ Staff = \translator {
+ \type "Engraver_group_engraver";
+ defaultclef = violin;
+ \consists "Bar_engraver";
+ \consists "Clef_engraver";
+ \consists "Key_engraver";
+ \consists "Meter_engraver";
+ \consists "Local_key_engraver";
+ \consists "Staff_sym_engraver";
+ \consists "Collision_engraver";
+ \consists "Rest_collision_engraver";
+ \consists "Bar_column_engraver";
+ \consists "Bar_number_engraver";
+ \consists "Separating_line_group_engraver";
+ \consists "Line_group_engraver";
+ \accepts "Voice";
+ }
+}
+
+\score{
+ <
+ \melodic{
+ \property Score.part = 1
+ \part
+ }
+ >
+ \paper{\a4}
+}
+
+\score{
+ <
+ \melodic{
+ \property Score.part = 0
+ \part
+ }
+ >
+ \paper{\a4}
+}
--- /dev/null
+# input/Makefile
+
+# subdir level:
+#
+depth = ../..
+#
+
+
+include $(depth)/make/Mutopia.make
--- /dev/null
+
+\score{\melodic {
+ % default abbreviations
+ c4 c4: c4:32 c4: c4 c2.
+ 'a1
+ 'a1:32
+ 'c4:8 c': 'c4:16 c':
+% [ 'c8:16 'c 'c 'c ] [ a a a a ]
+% [ 'c 'f 'b e ]
+% [ 'c16:32 'c 'c 'c ] [ a16:32 a a a ]
+%% % there's still some hairy beam bugfixing todo
+%% [ c'8:16 g d 'a ]
+%% [ c'16:32 g d 'a ]
+%% [ 'c8:32 'f 'b e ]
+ [:32 c16 e]
+ [:32 c16 e]
+ [:16 c8 e]
+ [:16 e4 g]
+ [:16 e2 g]
+ [:16 e1 g]
+
+}}
--- /dev/null
+
+\header{
+filename = "beams.ly";
+composer = "heu";
+enteredby = "jcn";
+copyright = "PD";
+
+TestedFeatures = "beams and beamflags";
+}
+\version "0.1.9";
+
+\score{
+ \melodic { \multi 3 <
+ { \octave c';
+ \meter 8/4;
+ \duration8;
+ \stemup [c c'' a' f']
+ \duration16;
+ \stemup [c c'' a' f']
+ \duration32;
+ \stemup [c c'' a' f']
+ \duration64;
+ \stemup [c c'' a' f']
+ \duration128;
+ \stemup [c c'' a' f']
+ r32
+
+ \duration 8;
+ \stemup ['g 'g 'g 'g]
+ \duration 16;
+ \stemup ['g 'g 'g 'g]
+ \duration 32;
+ \stemup ['g 'g 'g 'g]
+ \duration 64;
+ \stemup ['g 'g 'g 'g]
+ \duration 128;
+ \stemup ['g 'g 'g 'g]
+ r32
+ }
+
+ { \octave c';
+ \meter 8/4;
+ \duration8;
+ \stemdown [a' 'a c e]
+ \duration16;
+ \stemdown [a' 'a c e]
+ \duration32;
+ \stemdown [a' 'a c e]
+ \duration64;
+ \stemdown [a' 'a c e]
+ \duration128;
+ \stemdown [a' 'a c e]
+ r32
+
+ \octave c;
+ \duration 8;
+ \stemdown [d'' d'' d'' d'']
+ \duration 16;
+ \stemdown [d'' d'' d'' d'']
+ \duration 32;
+ \stemdown [d'' d'' d'' d'']
+ \duration 64;
+ \stemdown [d'' d'' d'' d'']
+ \duration 128;
+ \stemdown [d'' d'' d'' d'']
+ r32
+
+ } >
+
+ {\duration "last";
+ % ugh, "duration mode"
+
+ [g8 g] [a a] [b b] [c' c']
+
+ [g16 g ] [a a] [b b] [c' c']
+ [g32 g] [a a] [b b] [c' c']
+
+ [g64 g ] [c' c' ]
+ }
+ {
+ \transpose d {
+ \octave c''';
+ | [g8 g] [a a] [b b] [c' c']
+ [g16 g ] [a a] [b b] [c' c']
+ [g32 g] [a a] [b b] [c' c']
+ [g64 g]
+ [c' c']
+ }
+ }
+ }
+ \paper{
+ gourlay_maxmeasures = 1.;
+ }
+}
+
+
--- /dev/null
+\score {
+ \melodic{ \octave c';
+ \clef "violin"; c1^"{violin}" \bar "||";
+ \clef "french";c1^"{french}" \bar "||";
+ \clef "soprano";c1^"{soprano}" \bar "||";
+ \clef "mezzosoprano";c1^"{mezzosoprano}" \bar "||";
+ \clef "alto";c1^"{alto}" \bar "||";
+ \clef "tenor";c1^"{tenor}" \bar "||";
+ \clef "baritone";c1^"{baritone}" \bar "||";
+ \clef "varbaritone";c1^"{varbaritone}" \bar "||";
+ \clef "bass";c1^"{bass}" \bar "||";
+ \clef "subbass";c1^"{subbass}" \bar "|.";
+ }
+ \paper{
+ }
+}
+
--- /dev/null
+\header{
+filename = "collisions.ly";
+description = "random counterpoint to test collisions";
+enteredby = "HWN,JCN";
+copyright = "public domain";
+Tested = "test the Collision resolution ";
+}
+\version "0.1.9";
+
+
+
+two_voice = \melodic
+ \multi 2 <
+ { \stemdown \octave c';
+ c4 d e f g2~ g4 a [c8 d e f] c2| }
+ { \stemup
+ g4 f e g ~ g2 g2 c4 g4 g2 }
+
+ >
+
+two_voice_steminvert = \melodic
+ \multi 2 <
+ {
+ \octave c'; \stemup
+% the f and g on 4th beat are exceptionally ugh.
+ c4 d e f g2 g4 a | }
+ { \stemdown
+ g4 f e g g2 g2 }
+
+ >
+
+three_voice = \melodic
+ \multi 2 <
+ { \stemup
+ g4 f e f g a g2 }
+ { \stemup \property Voice.hshift = 1
+ e2 e2 e2 e2 }
+ { \stemdown
+ c4 d e d c d es }
+ >
+
+
+rests = \melodic
+ \multi 2 <
+ { \stemup
+ | r8 r r r r r r r
+ [c' b a g] [f e d c]
+ }
+ { \stemdown
+ [c8 d e f] [g a b c']
+ r r r r r r r r
+ }
+ >
+
+restsII = \melodic {
+ \octave c';
+ \multi 2 <
+ { \stemup g' f' e' d' c' b a g f e d c }
+ { \stemdown r r r r r r r r r r r r }
+ >
+ \multi 2 <
+ { \stemup r r r r r r r r r r r r }
+ { \stemdown c d e f g a b c' d' e' f' g' }
+ >
+ r8 r4
+ \multi 2 < r8 r8 >
+ \multi 2 < r8 r8 r8 >
+ \multi 2 < r8 r8 r8 r8 >
+ \multi 2 < r r >
+ \multi 2 < r r r >
+ \stemup
+ [c''8 r8 c''8 c''8]
+ [c8 r8 c8 c8]
+ \stemdown
+ [c8 r8 c8 c8]
+ [c''8 r8 c''8 c''8]
+}
+
+\score{
+ { \two_voice
+ \two_voice_steminvert
+ \three_voice
+ \rests
+ % UGH ! bug!
+ %\restsII
+ }
+
+
+
+% \midi { \tempo 4:80 }
+}
--- /dev/null
+\header{
+filename = "denneboom.ly";
+enteredby = "jcn";
+copyright = "public domain";
+TestedFeatures = "This file tests silly line shapes";
+}
+
+\include "paper20.ly"
+
+\version "0.1.9";
+
+oden = \lyric{
+ O8 |
+ den-8. ne-16 boom,4. o8 |
+ den-8. ne-16 boom.4. Wat8 |
+ zijn uw tak-4 ken |
+ won-8. der-16 schoon4 _8
+}
+
+ikheb = \lyric{
+ Ik8 |
+ heb u laatst4. in_'t8 |
+ bos8. zien16 staan4 _8 toen8 |
+ zat- en er4. geen8 |
+ kaars-8. jes16 aan.4 _8
+}
+
+ugloeit = \lyric{
+ U8 |
+ gloeit in bar-4. re8 |
+ win-8. ter-16 tijd,4 r8 als8 |
+ sneeuw op aar-4. de8 |
+ licht8. ge-16 spreid.4 _8
+}
+
+oboom = \melodic{
+ \octave c';
+ 'g8 |
+ c8. c16 c4. d8 |
+ e8. e16 e4. e8 |
+ d e f4 'b |
+ d8. c16 c4 r8
+}
+
+bos = \melodic{
+ \octave c';
+ g8 |
+ g e a4. g8 |
+ g8. f16 f4 r8 f8 |
+ f d g4. f8 |
+ f8. e16 e4 r8
+}
+
+global = \melodic{
+ \meter 3/4;
+ \partial 8;
+ \skip 4*48;
+ \bar "|.";
+}
+melody = \melodic{
+ \oboom
+ \oboom
+ \bos
+ \oboom
+}
+
+$melody_staff = \type Staff = melody <
+ \global
+ \melody
+>
+
+$verse_one = \melodic{
+ \oden
+ \oden
+ \ikheb
+ \oden
+}
+
+$verse_one_staff = \type Lyrics = one <
+ \global
+ \$verse_one
+>
+
+$verse_two = \melodic{
+ \oden
+ \oden
+ \ugloeit
+ \oden
+}
+
+$verse_two_staff = \type Lyrics = two <
+ \global
+ \$verse_two
+>
+
+$denneboom_shape = \paper{
+ \paper_twenty
+ indent = 20. \mm;
+ \shape = 70. \mm 20. \mm
+ 65. \mm 30. \mm
+ 57.5 \mm 45. \mm
+ 50. \mm 60. \mm
+ 42.5 \mm 75. \mm
+ 35. \mm 90. \mm
+ 27.5 \mm 105. \mm
+ 20. \mm 120. \mm
+ 10. \mm 140. \mm
+ 65. \mm 30. \mm
+ ;
+ gourlay_maxmeasures = 30.;
+% uhuh, loop if you comment these in
+% arithmetic_basicspace = 3.8;
+% arithmetic_multiplier = 8.\pt;
+}
+
+\score{
+ <
+ \$melody_staff
+ \$verse_one_staff
+ >
+ \paper{
+% huh?
+% \$denneboom_shape
+ \paper_twenty
+ indent = 20. \mm;
+ \shape = 70. \mm 20. \mm
+ 65. \mm 30. \mm
+ 57.5 \mm 45. \mm
+ 50. \mm 60. \mm
+ 42.5 \mm 75. \mm
+ 35. \mm 90. \mm
+ 27.5 \mm 105. \mm
+ 20. \mm 120. \mm
+ 10. \mm 140. \mm
+% 65. \mm 30. \mm
+ 65. \mm 40. \mm
+ ;
+ gourlay_maxmeasures = 30.;
+% uhuh, loop if you comment these in
+ arithmetic_basicspace = 3.8;
+% arithmetic_multiplier = 8.\pt;
+ arithmetic_multiplier = 7.5\pt;
+ }
+ \midi{ \tempo 4 = 90; }
+}
+
+%{
+\score{
+ <
+ \$melody_staff
+ \$verse_two_staff
+ >
+ \paper{ \$denneboom_shape }
+ \midi{ \tempo 4 = 90; }
+}
+%}
--- /dev/null
+\version "0.1.9";
+FontBody= \melodic{
+ \octave c';
+ \bar "|:";
+ \meter 4/4;
+ \multi 2 < { \stemup e'\longa a\breve | }
+ { \stemdown
+ c1 \clef "bass"; ''b \clef "violin"; c' a'
+ c2 \clef "alto"; g c' \clef "violin"; a'
+ } >
+ \stemboth
+ c4 g c' a' \bar ":|";
+ a\ppp-\upbow a\pp-\downbow a\p^\turn a\mp^\fermata |
+ a\mf_\fermata a\f-\stopped a\ff-\open a\fff^\trill|
+ a\fp-\reverseturn a4.\sf a4.\sfz | % a\fz a\rf
+ [c8-\prall c-\mordent] [a'-\prallmordent a'-\prallprall]
+ [c-\upprall a'-\downprall] [a' c] |
+ [c \< d e f] [as' ges' f' e']
+ [cis' dis' c' des'] [cisis' disis' \! ceses' deses'] |
+ \clef "bass";
+ r1 r2 r4 r8 r16 r32 r64 r128 r128 |
+ \multi 2 < { \stemup r2 r2} {\stemdown c c }>
+ \multi 2 < { \stemup ''c1 } {\stemdown r1}>
+ \stemboth
+ \clef "violin";
+ e8_. g'8-> e16^^ g'16_^
+ e32 _| g'32^| g''32-\ltoe g''32-\lheel
+ e64-\rtoe g'64-\rheel c4... |
+
+ \octave c'';
+ \meter 4/4;
+ \textstyle "finger";
+ c4^"1" d^"2" e^"3" f^"4" g^"5"
+
+ % Music to the Martians!
+ < bes4^"6" e_"7" c_"8" >
+ a^"0"_"9"
+
+ a'^\flageolet
+ \textstyle "roman";
+ \meter 1/2; a2 |
+ \meter 3/2; < a1.
+ { s4 \ppp \< s4 \! s4 \fff s4 \> s4 \! s4\ppp} >
+ |
+ \meter 2/4; a2 |
+ \meter 5/4; a1.. |
+ \meter 6/8; a2. |
+ \meter 7/8; a2.. |
+ \meter 9/8; a1... |
+ \meter 12/8; a1. |
+ \meter 12/4;
+ r1. r2. r4. r8. r16. r32. r64. r64. |
+ }
--- /dev/null
+\header{
+title= "The Feta Font";
+subtitle = "proofsheet";
+enteredby = "jcn & hwn";
+copyright = "public domain";
+description = "This file tests the Feta music font";
+% "(Feta definitively is not an abbreviation of Font-En-TjA)";
+}
+
+\version "0.1.9";
+
+\include "font-body.ly"
+\score{
+ \paper{
+ % don't change this.
+ % otherwise 16pt and 20pt layouts differ.
+ linewidth = 12.5 \cm;
+ gourlay_maxmeasures =5.;
+ }
+ \paper{
+ \paper_twenty
+ linewidth = 17.5 \cm;
+ gourlay_maxmeasures =5.;
+ \output "font20.tex";
+ }
+}
+
--- /dev/null
+
+\header{
+title= "The Feta Font";
+subtitle = "proofsheet";
+enteredby = "jcn & hwn";
+copyright = "public domain";
+description = "This file tests the Feta music font, 11pt";
+% "(Feta definitively is not an abbreviation of Font-En-TjA)";
+}
+
+
+\include "paper11.ly"
+\include "font-body.ly"
+\score{
+ \FontBody
+ \paper{
+ \paper_eleven
+ linewidth = 17.5 \cm;
+ gourlay_maxmeasures =5.;
+ }
+}
+
--- /dev/null
+
+\header{
+title= "The Feta Font";
+subtitle = "proofsheet";
+enteredby = "jcn & hwn";
+copyright = "public domain";
+description = "This file tests the Feta music font, 11pt";
+% "(Feta definitively is not an abbreviation of Font-En-TjA)";
+}
+
+
+\include "paper13.ly"
+\include "font-body.ly"
+\score{
+ \FontBody
+ \paper{
+ \paper_thirteen
+ linewidth = 17.5 \cm;
+ gourlay_maxmeasures =5.;
+ }
+}
+
--- /dev/null
+\header{
+title= "The Feta Font";
+subtitle = "proofsheet";
+enteredby = "jcn & hwn";
+copyright = "public domain";
+description = "This file tests the Feta music font";
+% "(Feta definitively is not an abbreviation of Font-En-TjA)";
+}
+
+\version "0.1.9";
+\include "font-body.ly"
+
+\score{
+ \FontBody
+ \paper{
+ % don't change this.
+ % otherwise 16pt and 20pt layouts differ.
+ linewidth = 12.5 \cm;
+ gourlay_maxmeasures =5.;
+ }
+}
+
--- /dev/null
+\header{
+title= "The Feta font";
+subtitle = "proofsheet";
+enteredby = "jcn";
+copyright = "public domain";
+description = "This file tests the Feta music-font in the 20pt version";
+TestedFeatures =
+ "(Feta definitively is not an abbreviation of Font-En-TjA)";
+}
+
+\include "paper20.ly"
+\include "font-body.ly"
+\score{
+ \FontBody
+ \paper{
+ \paper_twenty
+ linewidth = 17.5 \cm;
+ gourlay_maxmeasures =5.;
+ }
+ }
--- /dev/null
+\header{
+title= "The Feta Font";
+subtitle = "proofsheet";
+enteredby = "jcn & hwn";
+copyright = "public domain";
+description = "This file tests the Feta music font";
+% "(Feta definitively is not an abbreviation of Font-En-TjA)";
+}
+
+\include "paper26.ly"
+\include "font-body.ly"
+
+\score{
+ \FontBody
+ \paper{
+ \paper_twentysix
+ linewidth = 17.5 \cm;
+ gourlay_maxmeasures =5.;
+ }
+}
+
--- /dev/null
+\header{
+enteredby = "jcn";
+copyright = "PD";
+TestedFeatures = "This file tests some nasty Gourlay spacings";
+}
+
+\version "0.1.9";
+
+%{
+
+This is taken from [Gourlay]'s paper on breaking lines
+
+%}
+
+\score{
+ \melodic \multi 2 < \octave c'';
+ { \stemup; d2 d | d d | d4 d2. | \break; c1 }
+ \octave c';
+ { \stemdown; g4 g g g | \[2/3 g2 g2 g2 \] | g4. g8 g2 | c1 }
+ >
+ \paper{
+ linewidth = 8.\cm;
+ }
+}
+
--- /dev/null
+\header{
+enteredby = "jcn";
+copyright = "PD";
+TestedFeatures = "This file tests Feta embedded slurs"
+ "(Feta definitively is not an abbreviation of Font-En-TjA)";
+}
+
+\version "0.1.9";
+
+shortlong = \melodic{
+ c4()c( c c |
+ c c c c |
+ c c c c |
+ c c c )c |
+}
+
+dirs = \melodic {
+ \octave c';
+ c'1() g' () c () g () c |
+}
+
+complex = \melodic{
+ \octave c';
+ 'c16( 'e( 'g( 'b( d( f( a( c'())))))))c4 c4 |
+ \octave c''';
+ 'c16( a( f( d( 'b( 'g( 'e( 'c())))))))c4 c4 |
+}
+
+over = \melodic{
+ \octave c';
+
+ e( g' g' )e
+ e( a' a' )e
+ e( b' b' )e
+ e( c'' c'' )e
+ \stemup
+ e( c' c' )e
+ e( d' d' )e
+ e( e' e' )e
+ e( c'' c'' )e
+ \stemboth
+ e( f' b' )e
+ e( b' f' )e
+ e( e'' g' )e
+ e( g' e'' )e
+ \stemup
+ e( d' b )e
+ e( b d' )e
+ e( f' c'' )e
+ e( c'' f )e
+}
+
+under = \melodic{
+ \octave c';
+ \stemdown
+ f'( \stemboth d d \stemdown )f'
+ f'( \stemboth c c \stemdown )f'
+ f'( \stemboth 'b 'b \stemdown )f'
+ f'( \stemboth 'a 'a \stemdown )f'
+ \stemdown
+ f'( a a )f'
+ f'( g g )f'
+ f'( f f )f'
+ f'( 'a 'a )f'
+
+ \stemdown
+ f'( \stemboth d 'b \stemdown )f'
+ f'( \stemboth 'b d \stemdown )f'
+ f'( \stemboth 'd 'b \stemdown )f'
+ f'( \stemboth 'b 'd \stemdown )f'
+ \stemdown
+ f'( f a )f'
+ f'( a f )f'
+ f'( f 'e )f'
+ f'( 'e f )f'
+}
+
+eccentric = \melodic{
+ \octave c';
+ \stemup
+ \[4/7 f( a' f f f f )f \] |
+ \[4/7 f( f f f f a' )f \] |
+ \stemdown
+ \[4/7 e'( c e' e' e' e' )e' \] |
+ \[4/7 e'( e' e' e' e' c )e' \] |
+}
+
+tiltup = \melodic{
+ \octave c';
+ e( c'' c'' )e'
+ \stemup
+ e( c'' c'' )e'
+ \stemboth
+ e( g' e'' )e'
+ \stemup
+ e( c'' f )e'
+ \stemdown
+ f'( \stemboth 'a 'a \stemdown )f''
+ \stemdown
+ f'( 'a 'a )f''
+}
+
+tiltdown = \melodic{
+ \octave c';
+ e'( c'' c'' )e
+ \stemup
+ e'( c'' c'' )e
+ \stemboth
+ e'( g' e'' )e
+ \stemup
+ e'( c'' f )e
+ \stemdown
+ f''( \stemboth 'a 'a \stemdown )f'
+ \stemdown
+ f''( 'a 'a )f'
+}
+
+broken = \melodic{
+ \octave c'';
+ c c c c()
+ c c c c(
+ c )c c c(
+ c c )c c(
+ )a' a' a' a'()
+ a' a' a' a'()
+ c( c c )c
+ c( c c )'f
+ 'f( c c )c
+ 'f( c c )'f
+}
+
+blend = \melodic{
+ \octave c';
+ e( c'' c'' )e
+ \stemup
+ e( c'' c'' )e
+ \stemdown
+ f'( \stemboth 'a 'a \stemdown )f'
+ f'( 'a 'a )f'
+
+ \stemboth
+ e( c'' c'' )e'
+ e'( c'' c'' )e
+ d( d d )d
+
+ \stemdown
+ e( c'' c'' )e'
+ e'( c'' c'' )e
+ d( d d )d
+}
+
+
+bug = \melodic{
+ \octave c';
+ a()g( f )e
+ b'()a'( g' )f'
+ g( f' e' )d'
+ f f( g )a
+ c' () b () c' c'
+}
+
+clipping = \melodic{
+ \octave c';
+ \stemboth
+ c( c''' c''')c
+ c( c''' c )c''
+ c''( c c''' )c
+ \stemdown
+ c( \stemup '''c '''c \stemdown )c
+ c( \stemup '''c c \stemdown )''c
+ ''c( \stemup c '''c \stemdown )c
+}
+
+\score{
+ \melodic{
+ % use blend for fast check
+ %\blend
+% {
+ \shortlong
+ \dirs
+ \complex
+ \over
+ \under
+ \eccentric
+ \tiltup
+ \tiltdown
+ \bug
+ \clipping
+% }
+ % use broken with small linewidth
+ %\broken
+ }
+ \paper{
+ indent = 0.0\pt;
+ %for broken!
+ %linewidth= 40.\mm;
+ %castingalgorithm = \Wordwrap;
+ }
+}
+
--- /dev/null
+
+\version "0.1.9";
+
+\score{
+ \melodic{\octave c';
+ \duration "last";
+
+ 'c4 ~ 'c c'' ~ c'' ~ g ~ c ~
+ d ~ e ~ f ~ g ~
+ a ~ b ~ 'c ~ c
+
+ < c e ( > <)d f>
+ \octave c'';
+ < c e ( > <)d f>
+ \octave c';
+ < c e ( > <)d' f'>
+ < { c ~ d }
+ { e ~ f }
+ >
+% \multi 2 <
+% { \stemup c'8 ~g ~e( ~c~ [c'~ g' e' )c'] c'' ~ c'' c~c }
+% { \stemdown c (e g )c'~( [b a g )d] r2 }
+% >
+
+ {
+% \octave c';
+% 'c16( 'e( 'g( 'b( d( f( a( c'~ )))))))c4 c4 |
+% \octave c''';
+% 'c16( a( f( d( 'b( 'g( 'e( 'c~ )))))))c4 c4 |
+% \octave c';
+% c'1() g' () c () g () c |
+
+ c4()c( c c |
+ c c c c |
+ c c c c |
+ c c c )c |
+ }
+ }
+ }
+}
--- /dev/null
+\header{
+title= "Spacing";
+subtitle = "proofsheet";
+enteredby = "jcn";
+copyright = "public domain";
+TestedFeatures = "This file tests various spacings";
+}
+
+\version "0.1.9";
+
+multipart = \melodic{
+ \multi 3 <
+ {
+ c4
+ c
+ c c
+ }
+ {
+ [c8 c]
+ [c c]
+ [c c] [c c]
+ }
+ {
+ [2/3 c8 c c]1/1
+ [2/3 c c c]1/1
+ [2/3c c c]1/1 [2/3c c c]1/1
+ }
+ {
+ [2/4 c8 c c c]1/1
+ [2/4 c c c c]1/1
+ [2/4c c c c]1/1 [2/4c c c c]1/1
+ }
+ {
+ [2/5 c8 c c c c]1/1
+ [2/5 c c c c c]1/1
+ [2/5c c c c c]1/1 [2/5c c c c c]1/1
+ }
+ {
+ [2/6c8 c c c c c]1/1
+ [2/6c c c c c c]1/1
+ [2/6c c c c c c]1/1 [2/6c c c c c c]1/1
+ }
+ {
+ [2/7c8 c c c c c c]1/1
+ [2/7c c c c c c c]1/1
+ [2/7c c c c c c c]1/1 [2/7c c c c c c c]1/1
+ }
+ >
+ }
+
+singlepart = \melodic{
+ c4 d e f
+ c4 d e [f8 f]
+ c4 d e f8 [f16 f]
+ c4 d e f8 f16 [f32 f]
+ c4 d e f8 f16 f32 [f64 f]
+ c4 c4 c4 c4
+
+ }
+
+ \score{
+ \melodic {
+% \singlepart
+ \multipart
+ }
+ \paper {
+% linewidth= 18.\cm;
+% gourlay_maxmeasures = 4.0
+ }
+}
--- /dev/null
+\header{
+title= "Stems and Beams";
+subtitle = "proofsheet";
+enteredby = "jcn";
+copyright = "public domain";
+TestedFeatures = "This file tests the length of stems and placement
+of beams";
+
+}
+
+\version "0.1.9";
+
+beamintervals = \melodic{
+ \meter 7/4;
+ \stemup;
+ \octave c';
+ [ c8 d ] [ c e ] [ c f ] [ c g ] [ c a ] [ c b ] [ c c' ] |
+ [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] |
+ \octave c'';
+ [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] |
+ \stemdown;
+ \octave c''';
+ [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] |
+ \octave c'';
+ [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] |
+ [ c d ] [ c e ] [ c f ] [ c g ] [ c a ] [ c b ] [ c c' ] |
+ }
+
+\score{
+ \melodic{
+ \octave c';
+ \stemup;
+ \meter 17/4;
+ 'g4 'a 'b c d e f g a b c' d' e' f' g' a' b' |
+ \stemdown
+ b' a' g' f' e' d' c' b a g f e d c 'b 'a 'g |
+ \beamintervals;
+ \transpose d \beamintervals;
+ \transpose e \beamintervals;
+ \transpose f \beamintervals;
+ \transpose g \beamintervals;
+ \transpose a \beamintervals;
+ \transpose b \beamintervals;
+ }
+ \paper{
+ gourlay_maxmeasures = 2.;
+ }
+}
--- /dev/null
+$somewhat_long = \lyric{
+ \textstyle "roman" ;
+ AaaaaaA2
+ BbbbbbB2
+ CcccccC2
+ DdddddD2
+ EeeeeeE2
+ FfffffF2
+}
+
+$rather_long = \lyric{
+ \textstyle "roman" ;
+ LLLLoooonggggg2
+ Syyllllaaabbble2
+ LLLLoooonggggg2
+ Syyllllllaaabbble2
+ LLLLoooonggggg2
+ Syyyylllaaabbble2
+}
+
+$quite_long = \lyric{
+ \textstyle "roman" ;
+ LLLLLLLLLooooongggggggg2
+ Syyyyyyyyyyyyylllllllaaaaaabbble2
+ LLLLLLLLLooooongggggggg2
+ Syyyyyyyyyyyyylllllllaaaaaabbble2
+ LLLLLLLLLooooongggggggg2
+ Syyyyyyyyyyyyylllllllaaaaaabbble2
+}
+
+$somewhat_long_lyrics_staff = \type Lyrics = somewhat <
+ \$somewhat_long
+>
+
+$rather_long_lyrics_staff = \type Lyrics = rather <
+ \$rather_long
+>
+
+$quite_long_lyrics_staff = \type Lyrics = quite <
+ \$quite_long
+>
+
+melody = \melodic{
+ \octave c';
+ c4 e4 g4 e4 c4 e4 g4 e4 c4 e4 g4 e4 c4 e4 g4 e4
+ c4 e4 g4 e4 c4 e4 g4 e4 c4 e4 g4 e4 c4 e4 g4 e4
+}
+
+$melodic_staff = \type Staff = mel <
+ \melody
+>
+
+\score
+{
+ <
+ \$melodic_staff
+ \$somewhat_long_lyrics_staff
+% \$rather_long_lyrics_staff
+ \$quite_long_lyrics_staff
+ >
+ \paper{
+% castingalgorithm = \Wordwrap;
+ }
+}
#include "bar-grav.hh"
#include "bar.hh"
+#include "musical-request.hh"
+#include "multi-measure-rest.hh"
#include "command-request.hh"
#include "time-description.hh"
#include "engraver-group.hh"
}
}
+void
+Bar_engraver::acknowledge_element (Score_elem_info i)
+{
+ if (!bar_p_ || !i.elem_l_->is_type_b (Multi_measure_rest::static_name ()))
+ return;
+
+#if 0
+ if (!bar_p_ || !i.req_l_ || !i.req_l_->musical ()
+ || !i.req_l_->musical ()->multi_measure ())
+ return;
+
+ // would this be enough?
+ //urg segfault
+ bar_p_->unlink ();
+ delete bar_p_;
+ bar_p_ = 0;
+#endif
+}
+
void
Bar_engraver::do_creation_processing ()
{
{
Molecule* mol_p = new Molecule;
- Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
-
- Real dx_f = width ().length ();
- dx_f += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
-
- Atom a = paper ()->lookup_l ()->slur (get_controls ());
+ Array<Offset> c = get_controls ();
+ Atom a = paper ()->lookup_l ()->slur (c);
+// a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
+ a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT] - c[0].y ()));
- a.translate (Offset (dx_f + dx_f_drul_[LEFT], dy_f + dy_f_drul_[LEFT]));
mol_p->add (a);
+
return mol_p;
}
(c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/
+#include <ctype.h>
#include "clef-item.hh"
#include "string.hh"
#include "molecule.hh"
else if (t == "G" || t == "G2" || t == "treble")
{
symbol_ = "violin";
- y_position_i_ == -2;
+ y_position_i_ = -2;
}
else if (t == "french" || t == "G1")
{
protected:
+ virtual void acknowledge_element (Score_elem_info);
virtual void do_creation_processing ();
virtual void do_removal_processing ();
virtual bool do_try_request (Request *req_l);
void calc ();
Real calc_f (Real height);
void calc_bezier ();
+ bool calc_clipping ();
void calc_controls ();
void calc_default (Real h);
void calc_return (Real begin_alpha, Real end_alpha);
+ void calc_tangent_controls ();
bool check_fit_bo ();
Real check_fit_f ();
void set (Array<Offset> points, int dir);
struct Midi_walker;
struct Mixed_qp;
struct Molecule;
+struct Multi_measure_rest;
+struct Multi_measure_rest_req;
+struct Multi_measure_rest_engraver;
struct Music_general_chord;
struct Musical_script_req;
struct Music_voice;
/// round slope to closest TeXslope
Atom beam (Real&,Real, Real) const;
Atom ps_beam (Real, Real, Real)const;
- Atom tex_beam (Real&, Real) const;
Atom streepje (int type) const;
extern bool no_timestamps_global_b;
extern int exit_status_i_;
extern bool experimental_features_global_b;
-extern bool postscript_global_b;
-extern bool embedded_mf_global_b;
extern String default_outname_base_global;
extern String default_outname_suffix_global;
--- /dev/null
+/*
+ multi_measure_rest-engraver.hh -- declare Multi_measure_rest_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998 Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+#ifndef MULTI_MEASURE_REST_ENGRAVER_HH
+#define MULTI_MEASURE_REST_ENGRAVER_HH
+
+#include "engraver.hh"
+#include "moment.hh"
+
+/**
+ */
+class Multi_measure_rest_engraver : public Engraver
+{
+public:
+ TRANSLATOR_CLONE(Multi_measure_rest_engraver);
+ DECLARE_MY_RUNTIME_TYPEINFO;
+ Multi_measure_rest_engraver ();
+
+protected:
+ virtual void do_removal_processing ();
+ virtual void do_process_requests ();
+ virtual bool do_try_request (Request*);
+ virtual void do_pre_move_processing ();
+
+private:
+ bool part_b_;
+ Moment last_mom_;
+ Multi_measure_rest_req* multi_measure_req_l_;
+ Multi_measure_rest* mmrest_p_;
+};
+
+#endif // MULTI_MEASURE_REST_ENGRAVER_HH
--- /dev/null
+/*
+ multi-measure-rest.hh -- declare Multi_measure_rest
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998 Jan Nieuwenhuizen <jan@digicash.com>
+
+ */
+
+#ifndef MULTI_MEASURE_REST_HH
+#define MULTI_MEASURE_REST_HH
+
+#include "item.hh"
+
+class Multi_measure_rest : public Item
+{
+public:
+ Multi_measure_rest ();
+ int measures_i_;
+
+ DECLARE_MY_RUNTIME_TYPEINFO;
+
+protected:
+ virtual void do_print () const;
+ virtual Molecule *brew_molecule_p () const;
+};
+
+#endif /* MULTI_MEASURE_REST_HH */
+
virtual Plet_req* plet() { return 0; }
virtual Span_dynamic_req * span_dynamic() { return 0; }
virtual Abbreviation_req* abbrev() { return 0; }
+ virtual Multi_measure_rest_req* multi_measure() { return 0; }
REQUESTMETHODS(Musical_req, musical);
};
class Blank_req : public Spacing_req, Rhythmic_req {
public:
REQUESTMETHODS(Spacing_req, spacing);
-
};
/// Put a text above or below (?) this staff.
REQUESTMETHODS(Rest_req,rest);
};
-
+/**
+ Part: typeset a measure with the number of measures rest
+ Score: typeset all individual measures ass full rests
+ */
+class Multi_measure_rest_req : public Rhythmic_req {
+public:
+ REQUESTMETHODS(Multi_measure_rest_req, multi_measure);
+};
/**
Requests to start or stop something.
class Timing_engraver : public Timing_translator, public Engraver
{
protected:
+ virtual void acknowledge_element (Score_elem_info i);
virtual void fill_staff_info (Staff_info&);
virtual Engraver * engraver_l () { return Engraver::engraver_l (); }
public:
virtual void do_process_requests();
virtual void do_pre_move_processing();
virtual void do_post_move_processing();
+
+ bool mmrest_b_;
};
#endif // TIMING_TRANSLATOR_HH
#include "main.hh"
/*
- MAy be this also should go into a library
+ May be this also should go into a library
*/
const int MAXITER=100; // qlpsolve.hh
if (!dim())
return Vector (0);
- // experimental
- if (quad_.dim() > 10)
- quad_.try_set_band();
-
Active_constraints act (this);
act.OK();
Atom
Lookup::slur (Array<Offset> controls) const
{
- assert (postscript_global_b);
assert (controls.size () == 8);
String ps = "\\embeddedps{\n";
-#if 1
- for (int i = 1; i < 4; i++)
- ps += String_convert::double_str (controls[i].x ()) + " "
- + String_convert::double_str (controls[i].y ()) + " ";
+ Real dx = controls[3].x () - controls[0].x ();
+ Real dy = controls[3].y () - controls[0].y ();
- Real dx = controls[3].x ();
- Real dy = controls[3].y ();
for (int i = 5; i < 8; i++)
- ps += String_convert::double_str (controls[i].x () - dx) + " "
- + String_convert::double_str (controls[i].y () - dy) + " ";
-#else
- // this would be nice
- for (int i = 1; i < 4; i++)
ps += String_convert::double_str (controls[i].x ()) + " "
+ String_convert::double_str (controls[i].y ()) + " ";
- for (int i = 5; i < 8; i++)
+ ps += String_convert::double_str (controls[4].x ()) + " "
+ + String_convert::double_str (controls[4].y ()) + " ";
+
+ for (int i = 1; i < 4; i++)
ps += String_convert::double_str (controls[i].x ()) + " "
+ String_convert::double_str (controls[i].y ()) + " ";
-#endif
+
+ ps += String_convert::double_str (controls[0].x ()) + " "
+ + String_convert::double_str (controls[0].y ()) + " ";
ps += " draw_slur}";
Atom
Lookup::hairpin (Real &wid, bool decresc, bool continued) const
{
- bool embedded_b = postscript_global_b;
String embed;
Atom ret;
Real height = paper_l_->get_var ("barsize") / 6;
- if (embedded_b)
- {
- embed = "\\embeddedps{\n" ;
- embed += String (wid) + " "
+ embed = "\\embeddedps{\n" ;
+ embed += String (wid) + " "
+ String (height) + " "
- + String (continued ? height/2 : 0) +
- + " draw_" + String(decresc ? "de" : "") + "cresc}\n";
- ret.tex_ = embed;
- }
- else
- {
- if (wid > 32 * 6 PT)
- {
- warning (_("Crescendo too long (") + print_dimen (wid)
- +_( ") shrinking (ugh)"));
- wid = 32*6 PT;
- }
- int idx = int (rint (wid / 6 PT));
- if (!idx) idx ++;
- wid = idx*6 PT;
- String idxstr = (decresc)? "decrescendosym" : "crescendosym";
- ret=(*symtables_p_)("param")->lookup (idxstr);
-
- Array<String> a;
- a.push (idx);
- ret.tex_ = substitute_args (ret.tex_, a);
- }
-
+ + String (continued ? height/2 : 0) +
+ + " draw_" + String(decresc ? "de" : "") + "cresc}\n";
+ ret.tex_ = embed;
+
+
ret.dim_.x () = Interval (0,wid);
ret.dim_.y () = Interval (-2*height,2*height);
-// ret.translate_axis (ret.dim_[Y_AXIS][DOWN], Y_AXIS);
+
return ret;
}
Atom
Lookup::vbracket (Real &y) const
{
+ Atom psbracket;
+ psbracket.tex_ = String ("\\embeddedps{ ") + y + " draw_bracket}";
+ psbracket.dim_[Y_AXIS] = Interval (-y/2,y/2);
+ psbracket.dim_[X_AXIS] = Interval (0,4 PT);
+ return psbracket;
Atom bracket = (*symtables_p_)("param")->lookup ("bracket");
Interval ydims = bracket.dim_[Y_AXIS];
+
+
Real min_y = ydims[LEFT];
Real max_y = ydims[RIGHT];
Real step = 1.0 PT;
bool no_paper_global_b = false;
bool no_timestamps_global_b = false;
-bool embedded_mf_global_b = false;
bool experimental_features_global_b = false;
-bool postscript_global_b = true;
+
int exit_status_i_;
void destill_inname (String &name_str_r);
{1, "init", 'i'},
{1, "include", 'I'},
{0, "no-paper", 'M'},
- {0, "no-postscript", 'P'},
+
{0, "no-timestamps", 'T'},
{0, "ignore-version", 'V'},
{0,0,0}
" -t, --test switch on experimental features\n"
" -M, --no-paper produce midi output only\n"
" -V, --ignore-version ignore mudela version\n"
- " -P, --no-postscript don't use PostScript\n"
+
" -T, --no-timestamps don't timestamp the output\n"
"\n"
"GNU LilyPond was compiled with the following settings:\n")
case 'V':
version_ignore_b = true;
break;
- case 'P':
- postscript_global_b = false;
- break;
case 'd':
set_debug (true);
break;
--- /dev/null
+/*
+ multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver
+
+ (c) 1998 Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+#include "proto.hh"
+#include "musical-request.hh"
+#include "multi-measure-rest.hh"
+#include "multi-measure-rest-engraver.hh"
+#include "score-column.hh"
+
+IMPLEMENT_IS_TYPE_B1 (Multi_measure_rest_engraver, Engraver);
+ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver);
+
+Multi_measure_rest_engraver::Multi_measure_rest_engraver ()
+{
+ last_mom_ = 0;
+ multi_measure_req_l_ = 0;
+ mmrest_p_ = 0;
+}
+
+bool
+Multi_measure_rest_engraver::do_try_request (Request* req_l)
+{
+ if (!req_l->musical () || !req_l->musical ()->multi_measure ())
+ return false;
+
+ multi_measure_req_l_ = req_l->musical ()->multi_measure ();
+ last_mom_ = now_moment () + multi_measure_req_l_->duration_.length ();
+
+ return true;
+}
+
+void
+Multi_measure_rest_engraver::do_removal_processing ()
+{
+ if (mmrest_p_)
+ {
+ typeset_element (mmrest_p_);
+ mmrest_p_ = 0;
+ }
+}
+
+void
+Multi_measure_rest_engraver::do_process_requests ()
+{
+ if (mmrest_p_ || !multi_measure_req_l_)
+ return;
+
+ mmrest_p_ = new Multi_measure_rest;
+
+ Scalar prop = get_property ("part");
+ if (prop.isnum_b ())
+ part_b_ = prop.to_bool ();
+
+// if (!part_b_)
+// return;
+
+ int measures_i = (int)multi_measure_req_l_->duration_.plet_.iso_i_;
+ if (part_b_)
+ mmrest_p_->measures_i_ = measures_i;
+
+ announce_element (Score_elem_info (mmrest_p_, multi_measure_req_l_));
+
+ multi_measure_req_l_ = 0;
+}
+
+void
+Multi_measure_rest_engraver::do_pre_move_processing ()
+{
+ if (!mmrest_p_)
+ return;
+
+ typeset_element (mmrest_p_);
+ mmrest_p_ = 0;
+
+ if (part_b_)
+ return;
+
+ if (last_mom_ <= now_moment () + Moment (1))
+ multi_measure_req_l_ = 0;
+}
+
--- /dev/null
+/*
+ multi-measure-rest.cc -- implement Multi_measure_rest
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998 Jan Nieuwenhuizen <jan@digicash.com>
+
+ */
+
+#include "multi-measure-rest.hh"
+#include "debug.hh"
+#include "paper-def.hh"
+#include "lookup.hh"
+#include "dimen.hh"
+#include "rest.hh"
+#include "script.hh"
+#include "text-def.hh"
+#include "molecule.hh"
+
+IMPLEMENT_IS_TYPE_B1 (Multi_measure_rest, Item);
+
+Multi_measure_rest::Multi_measure_rest ()
+{
+ measures_i_ = 0;
+}
+
+void
+Multi_measure_rest::do_print () const
+{
+ DOUT << "measures_i_ " << measures_i_;
+}
+
+Molecule*
+Multi_measure_rest::brew_molecule_p () const
+{
+ /*
+ [TODO] 3
+ * make real multi-measure rest symbol: |---|
+ * make two,four,eight-measure-rest symbols
+ */
+
+ Atom s (paper ()->lookup_l ()->rest (0, 0));
+ Molecule* mol_p = new Molecule ( Atom (s));
+ Real interline_f = paper ()->interline_f ();
+ mol_p->translate_axis (interline_f, Y_AXIS);
+
+ if (measures_i_)
+ {
+ Text_def text;
+ text.text_str_ = measures_i_;
+ text.style_str_ = "number";
+ Atom s = text.get_atom (paper (), UP);
+ s.translate_axis (3.0 * interline_f, Y_AXIS);
+ mol_p->add (s);
+ }
+
+ return mol_p;
+}
+
-IMPLEMENT_IS_TYPE_B1(Musical_req,Request);
+IMPLEMENT_IS_TYPE_B1 (Musical_req,Request);
void
-Musical_req::do_print() const{}
+Musical_req::do_print () const{}
void
-Tie_req::do_print() const{}
+Tie_req::do_print () const{}
/* *************** */
-IMPLEMENT_IS_TYPE_B1(Span_req,Musical_req);
+IMPLEMENT_IS_TYPE_B1 (Span_req,Musical_req);
void
-Span_req::do_print() const
+Span_req::do_print () const
{
#ifndef NPRINT
DOUT << spantype ;
#endif
}
-IMPLEMENT_IS_TYPE_B1(Spacing_req,Request);
+IMPLEMENT_IS_TYPE_B1 (Spacing_req,Request);
-Spacing_req::Spacing_req()
+Spacing_req::Spacing_req ()
{
next = 0;
distance = 0;
}
void
-Spacing_req::do_print() const
+Spacing_req::do_print () const
{
#ifndef NPRINT
DOUT << "next " << next << "dist " << distance << "strength\n";
}
void
-Abbreviation_req::do_print() const
+Abbreviation_req::do_print () const
{
#ifndef NPRINT
DOUT << "type " << type_i_ << "\n";
}
-IMPLEMENT_IS_TYPE_B2(Blank_req,Spacing_req,Rhythmic_req);
+IMPLEMENT_IS_TYPE_B2 (Blank_req,Spacing_req,Rhythmic_req);
void
-Blank_req::do_print() const
+Blank_req::do_print () const
{
- Spacing_req::do_print();
+ Spacing_req::do_print ();
}
/* *************** */
-Melodic_req::Melodic_req()
+Melodic_req::Melodic_req ()
{
notename_i_ = 0;
octave_i_ = 0;
void
Melodic_req::transpose (Melodic_req const * delta)
{
- int old_pitch = pitch();
- int delta_pitch = delta->pitch();
+ int old_pitch = pitch ();
+ int delta_pitch = delta->pitch ();
octave_i_ += delta->octave_i_;
notename_i_ += delta->notename_i_;
while (notename_i_ >= 7)
octave_i_ ++;
}
- int new_pitch = pitch();
+ int new_pitch = pitch ();
int delta_acc = new_pitch - old_pitch - delta_pitch;
accidental_i_ -= delta_acc;
if (abs (accidental_i_) > 2)
{
- delta->warning (_("transposition makes accidental larger than 2"));
+ delta->warning (_ ("transposition makes accidental larger than 2"));
}
}
-IMPLEMENT_IS_TYPE_B1(Melodic_req,Musical_req);
+IMPLEMENT_IS_TYPE_B1 (Melodic_req,Musical_req);
bool
Melodic_req::do_equal_b (Request*r) const
{
- Melodic_req* m= r->musical()->melodic ();
+ Melodic_req* m= r->musical ()->melodic ();
return !compare (*m, *this);
}
}
void
-Melodic_req::do_print() const
+Melodic_req::do_print () const
{
#ifndef NPRINT
DOUT << "notename: " << notename_i_
}
int
-Melodic_req::height() const
+Melodic_req::height () const
{
return notename_i_ + octave_i_*7;
}
static Byte pitch_byte_a[ ] = { 0, 2, 4, 5, 7, 9, 11 };
int
-Melodic_req::pitch() const
+Melodic_req::pitch () const
{
return pitch_byte_a[ notename_i_ % 7 ] + accidental_i_ + octave_i_ * 12;
}
int
Rhythmic_req::compare (Rhythmic_req const &r1, Rhythmic_req const &r2)
{
- return (r1.duration() - r2.duration ());
+ return (r1.duration () - r2.duration ());
}
bool
Rhythmic_req::do_equal_b (Request*r) const
{
- Rhythmic_req* rh = r->musical()->rhythmic ();
+ Rhythmic_req* rh = r->musical ()->rhythmic ();
return !compare (*this, *rh);
}
duration_ = d;
}
-Rhythmic_req::Rhythmic_req()
+Rhythmic_req::Rhythmic_req ()
{
}
-IMPLEMENT_IS_TYPE_B1(Rhythmic_req,Musical_req);
+IMPLEMENT_IS_TYPE_B1 (Rhythmic_req,Musical_req);
void
-Rhythmic_req::do_print() const
+Rhythmic_req::do_print () const
{
#ifndef NPRINT
- DOUT << "duration { " <<duration_.str() << "}";
+ DOUT << "duration { " <<duration_.str () << "}";
#endif
}
Moment
-Rhythmic_req::duration() const
+Rhythmic_req::duration () const
{
- return duration_.length();
+ return duration_.length ();
}
/* *************** */
}
-IMPLEMENT_IS_TYPE_B2(Lyric_req,Musical_req,Rhythmic_req);
+IMPLEMENT_IS_TYPE_B2 (Lyric_req,Musical_req,Rhythmic_req);
void
-Lyric_req::do_print() const
+Lyric_req::do_print () const
{
- Rhythmic_req::do_print();
- Text_req::do_print();
+ Rhythmic_req::do_print ();
+ Text_req::do_print ();
}
/* *************** */
}
-Note_req::Note_req()
+Note_req::Note_req ()
{
forceacc_b_ = false;
}
-IMPLEMENT_IS_TYPE_B2(Note_req,Melodic_req,Rhythmic_req);
+IMPLEMENT_IS_TYPE_B2 (Note_req,Melodic_req,Rhythmic_req);
void
-Note_req::do_print() const
+Note_req::do_print () const
{
#ifndef NPRINT
- Melodic_req::do_print();
+ Melodic_req::do_print ();
if (forceacc_b_)
{
DOUT << " force accidental\n";
}
- Rhythmic_req::do_print();
+ Rhythmic_req::do_print ();
#endif
}
/* *************** */
-IMPLEMENT_IS_TYPE_B1(Rest_req,Rhythmic_req);
+IMPLEMENT_IS_TYPE_B1 (Rest_req, Rhythmic_req);
void
-Rest_req::do_print() const
+Rest_req::do_print () const
{
- Rhythmic_req::do_print();
+ Rhythmic_req::do_print ();
}
/* *************** */
-IMPLEMENT_IS_TYPE_B1(Beam_req,Span_req);
+IMPLEMENT_IS_TYPE_B1 (Multi_measure_rest_req, Rhythmic_req);
-Beam_req::Beam_req()
+void
+Multi_measure_rest_req::do_print () const
+{
+ Rhythmic_req::do_print ();
+}
+
+/* *************** */
+
+IMPLEMENT_IS_TYPE_B1 (Beam_req,Span_req);
+
+Beam_req::Beam_req ()
{
}
void
-Beam_req::do_print() const
+Beam_req::do_print () const
{
}
{
}
-IMPLEMENT_IS_TYPE_B1(Slur_req,Span_req);
+IMPLEMENT_IS_TYPE_B1 (Slur_req,Span_req);
void
-Slur_req::do_print() const
+Slur_req::do_print () const
{
}
-IMPLEMENT_IS_TYPE_B1(Plet_req,Span_req);
+IMPLEMENT_IS_TYPE_B1 (Plet_req,Span_req);
Plet_req::Plet_req ()
{
bool
Span_req:: do_equal_b (Request*r) const
{
- Span_req * s = r->span();
+ Span_req * s = r->span ();
return spantype == s->spantype;
}
-Span_req::Span_req()
+Span_req::Span_req ()
{
spantype = NOSPAN;
}
Script_req::Script_req (Script_req const&s)
{
dir_ = s.dir_;
- scriptdef_p_ = s.scriptdef_p_ ? s.scriptdef_p_->clone() : 0;
+ scriptdef_p_ = s.scriptdef_p_ ? s.scriptdef_p_->clone () : 0;
}
/*
bool
Script_req::do_equal_b (Request*r) const
{
- Script_req * s = r->script();
+ Script_req * s = r->script ();
return scriptdef_p_->equal_b (*s->scriptdef_p_);
}
-Script_req::Script_req()
+Script_req::Script_req ()
{
dir_ = CENTER;
scriptdef_p_ = 0;
}
-IMPLEMENT_IS_TYPE_B1(Script_req,Request);
+IMPLEMENT_IS_TYPE_B1 (Script_req,Request);
void
-Script_req::do_print() const
+Script_req::do_print () const
{
#ifndef NPRINT
DOUT << " dir " << dir_ ;
- scriptdef_p_->print();
+ scriptdef_p_->print ();
#endif
}
void
-Musical_script_req::do_print() const
+Musical_script_req::do_print () const
{
- Script_req::do_print();
+ Script_req::do_print ();
}
-IMPLEMENT_IS_TYPE_B2(Musical_script_req,Musical_req, Script_req);
+IMPLEMENT_IS_TYPE_B2 (Musical_script_req,Musical_req, Script_req);
-Script_req::~Script_req()
+Script_req::~Script_req ()
{
delete scriptdef_p_;
}
/* *************** */
-Text_req::~Text_req()
+Text_req::~Text_req ()
{
delete tdef_p_;
tdef_p_ = 0;
Text_req::Text_req (int dir_i, Text_def* tdef_p)
{
- dir_ = Direction(dir_i);
+ dir_ = Direction (dir_i);
tdef_p_ = tdef_p;
}
-IMPLEMENT_IS_TYPE_B1(Text_req,Musical_req);
+IMPLEMENT_IS_TYPE_B1 (Text_req,Musical_req);
void
-Text_req::do_print() const
+Text_req::do_print () const
{
#ifndef NPRINT
DOUT << " dir " << dir_ ;
- tdef_p_->print();
+ tdef_p_->print ();
#endif
}
/* *************** */
-IMPLEMENT_IS_TYPE_B1(Skip_req,Musical_req);
+IMPLEMENT_IS_TYPE_B1 (Skip_req,Musical_req);
void
-Skip_req::do_print() const
+Skip_req::do_print () const
{
#ifndef NPRINT
- DOUT << "duration: " << duration();
+ DOUT << "duration: " << duration ();
#endif
}
-IMPLEMENT_IS_TYPE_B1(Dynamic_req,Musical_req);
+IMPLEMENT_IS_TYPE_B1 (Dynamic_req,Musical_req);
void
-Dynamic_req::do_print() const
+Dynamic_req::do_print () const
{
- Musical_req::do_print();
+ Musical_req::do_print ();
}
-IMPLEMENT_IS_TYPE_B1(Absolute_dynamic_req,Musical_req);
+IMPLEMENT_IS_TYPE_B1 (Absolute_dynamic_req,Musical_req);
void
-Absolute_dynamic_req::do_print() const
+Absolute_dynamic_req::do_print () const
{
#ifndef NPRINT
- Dynamic_req::do_print();
+ Dynamic_req::do_print ();
DOUT << " loudness " <<loudness_str ();
#endif
}
if (s.empty_b ())
{
s = "mf";
- warning (String (_("Never heard of dynamic scale "))
- + loudness_ + _(" assuming mf"));
+ warning (String (_ ("Never heard of dynamic scale "))
+ + loudness_ + _ (" assuming mf"));
}
return s;
}
-Absolute_dynamic_req::Absolute_dynamic_req()
+Absolute_dynamic_req::Absolute_dynamic_req ()
{
loudness_ = MF;
}
-Span_dynamic_req::Span_dynamic_req()
+Span_dynamic_req::Span_dynamic_req ()
{
dynamic_dir_ = CENTER;
}
-IMPLEMENT_IS_TYPE_B1(Span_dynamic_req,Musical_req);
+IMPLEMENT_IS_TYPE_B1 (Span_dynamic_req,Musical_req);
void
-Span_dynamic_req::do_print() const
+Span_dynamic_req::do_print () const
{
#ifndef NPRINT
- Span_req::do_print();
+ Span_req::do_print ();
DOUT << "softer/louder: " <<dynamic_dir_;
#endif
}
-IMPLEMENT_IS_TYPE_B1(Tie_req,Musical_req);
+IMPLEMENT_IS_TYPE_B1 (Tie_req,Musical_req);
skip_p->set_spot (here_input());
velt_p->add (skip_p);
}
+ else if ((duration_p->plet_.type_i_ == 1) && (duration_p->plet_.iso_i_ > 1))
+ {
+ Multi_measure_rest_req* m = new Multi_measure_rest_req;
+ plet_.iso_i_ = 1;
+ default_duration_.plet_.iso_i_ = 1;
+ m->duration_ = *duration_p;
+ m->set_spot (here_input());
+ velt_p->add (m);
+ }
else
{
Rest_req * rest_req_p = new Rest_req;
if (experimental_features_global_b)
tex_out << "\\turnOnExperimentalFeatures%\n";
- if (postscript_global_b)
- tex_out << "\\turnOnPostScript%\n";
+ tex_out << "\\turnOnPostScript%\n";
super_elem_l_->output_all ();
tex_out << "\n\\EndLilyPondOutput";
outputter_l_ = 0;
first = 0;
left_x = spanned_drul_[LEFT]->width ().length ();
left_x -= 2 * notewidth;
-// left_y = 0;
- Stem* stem = encompass_arr_[last]->stem_l_;
- left_y = stem->dir_ == dir_ ? stem->stem_end_f ()
- : stem->stem_begin_f () + 0.5 * dir_;
+ left_y = encompass_arr_[last]->stem_l_->height ()[dir_];
dy = 0;
}
if (encompass_arr_.top () != spanned_drul_[RIGHT])
dy = 0;
}
+#define RESIZE_ICE
+#ifndef RESIZE_ICE
Array<Offset> notes;
notes.push (Offset (0,0));
+#else
+ int n = last - first + 2;
+ Array<Offset> notes (n);
+ notes[0] = Offset (0,0);
+#endif
for (int i = first; i < last; i++)
{
Stem* stem = encompass_arr_[i]->stem_l_;
x -= left_x;
- Real y = stem->dir_ == dir_ ? stem->stem_end_f ()
- : stem->stem_begin_f () + 0.5 * dir_;
+ Real y = stem->height ()[dir_];
/*
leave a gap: slur mustn't touch head/stem
*/
- y += 2.5 * dir_;
+ y += 2.5 * internote * dir_;
- // ugh: huh?
if (dir_ == DOWN)
- y += 1.5 * dir_;
+ y += 1.5 * internote * dir_;
- y *= internote;
y -= left_y;
+#ifndef RESIZE_ICE
notes.push (Offset (x, y));
}
-
notes.push (Offset (dx, dy));
+#else
+ notes[i - first + 1] = Offset (x, y);
+ }
+ notes[n - 1] = Offset (dx, dy);
+#endif
return notes;
}
c += sqr (i->space_f_);
}
+ // experimental
+ if (quad.dim() > 10)
+ quad.set_band();
+
+
}
void
Spring_spacer::make_constraints (Mixed_qp& lp) const
{
int dim=cols_.size();
- int last_rank = cols_.top ().pcol_l_->rank_i ();
for (int j=0; j < dim -1; j++)
{
#include "string-convert.hh"
#include "main.hh"
-Atom
-Lookup::beam_element (int sidx, int widx, Real slope) const
-{
- String name = String("slope");
- Atom bs=(*symtables_p_)("beamslopes")->lookup (name);
-
- Array<String> args;
- args.push (sidx);
- args.push (widx);
- bs.tex_ = substitute_args (bs.tex_,args);
- int w = 2 << widx;
- Real width = w PT;
- bs.dim_.x() = Interval (0,width);
- bs.dim_.y() = Interval (0,width*slope);
- return bs;
-}
-
Atom
Lookup::rule_symbol (Real height, Real width) const
Atom
Lookup::beam(Real &slope, Real width, Real y_thick) const
{
- Atom a( postscript_global_b
- ? ps_beam (slope, width, y_thick)
- : tex_beam (slope, width));
+ Atom a( ps_beam (slope, width, y_thick));
Real slope_y =slope * width;
Real min_y = (0 <? slope_y )- y_thick/2;
Real max_y = (0 >? slope_y) + y_thick/2;
name[i]= 'x';
- String mf = "\\embeddedmf{" + name + "}{\n";
- mf += "input feta-beum;\n";
- mf += "drawbeam(" + width_str + "," + slope_str + "," + thick_str + ");\n";
- mf += "end.\n";
- mf += "}\n";
Atom s;
s.tex_ = ps;
- if (embedded_mf_global_b)
- s.tex_ += mf;
-
return s;
}
-
-Atom
-Lookup::tex_beam (Real &slope, Real width) const
-{
- const Real MAX_SLOPE = 0.6;
- const Real SLOPES = 20.0;
- int sidx = 0;
- if (abs (slope) > MAX_SLOPE)
- {
- WARN << _("beam too steep (") << slope << ")\n";
- slope = sign (slope) * MAX_SLOPE;
- }
-
- sidx = int (rint (slope / MAX_SLOPE * SLOPES));
- slope = MAX_SLOPE * sidx / SLOPES;
-
- Interval xdims = (*symtables_p_)("beamslopes")->lookup ("slope").dim_[X_AXIS];
- Real min_wid = xdims[LEFT];
- Real max_wid = xdims[RIGHT];
- assert(max_wid > 0);
- int widths = intlog2 (int (max_wid/min_wid)) + 1;
-
- if (width < min_wid)
- {
- WARN<<_("Beam too narrow. (") << print_dimen (width) <<")\n";
- width = min_wid;
- }
-
- Real elemwidth = max_wid;
-
- int widx =widths - 1;
- Molecule m;
- while (elemwidth > width)
- {
- widx --;
- elemwidth /= 2.0;
- }
- Real overlap = elemwidth/4;
- Real last_x = width - elemwidth;
- Real x = overlap;
- Atom elem (beam_element (sidx * widths, widx, slope));
- m.add (elem);
- while (x < last_x)
- {
- Atom a(elem);
- a.translate (Offset (x-overlap, (x-overlap)*slope));
- m.add (a);
- x += elemwidth - overlap;
- }
- Atom a(elem);
- a.translate (Offset (last_x, (last_x) * slope));
- m.add (a);
-
- Atom ret;
- ret.tex_ = m.TeX_string();
-
- return ret;
-}
#include "score-grav.hh"
#include "timing-grav.hh"
#include "command-request.hh"
+#include "score-elem-info.hh"
+#include "multi-measure-rest.hh"
-
+void
+Timing_engraver::acknowledge_element (Score_elem_info i)
+{
+ if (!i.elem_l_->is_type_b (Multi_measure_rest::static_name ()))
+ return;
+ if (((Multi_measure_rest*)i.elem_l_->item ())->measures_i_)
+ mmrest_b_ = true;
+}
void
Timing_engraver::fill_staff_info (Staff_info &inf)
#include "command-request.hh"
#include "translator-group.hh"
#include "global-translator.hh"
+#include "multi-measure-rest.hh"
Timing_translator::Timing_translator ()
{
default_grouping_ = Rhythmic_grouping (MInterval (0, 1), 4); // ugh
+ mmrest_b_ = false;
}
bool
Global_translator *global_l =
daddy_trans_l_->ancestor_l (100)->global_l (); // ugh 100.
- if (!time_.cadenza_b_)
+ if (!time_.cadenza_b_ && !mmrest_b_)
global_l->add_moment_to_process (time_.next_bar_moment ());
+// mmrest_b_ = false;
}
IMPLEMENT_IS_TYPE_B1(Timing_translator, Translator);
--- /dev/null
+# special rules for the documentation section.
+# There are too many to add to the general rules
+
+.SUFFIXES: .pod .txt .1 .html
+
+pod2html=pod2html
+pod2groff=pod2man --center="LilyPond documentation" --section="0"\
+ --release="LilyPond $(VERSION)" $< > $@
+
+$(outdir)/%.gif: %.xpm
+ xpmtoppm $< | ppmtogif > $@
+
+$(outdir)/%.dvi: $(outdir)/%.mudtex
+ latex '\nonstopmode \input $<'
+ mv $(notdir $@) $(outdir)
+
+$(outdir)/%.mudtex: %.doc
+ $(depth)/bin/out/mudela-book --noindex --outdir=$(outdir)/ --outname=$(notdir $@) $<
+
+$(outdir)/%.txt: $(outdir)/%.1
+ troff -man -Tascii $< | grotty -b -u -o > $@
+
+$(depth)/%.txt: $(outdir)/%.txt
+ cp $< $@
+
+
+# perl 5.003/4
+POD2HTML5004=$(POD2HTML) --noindex --infile $< --outfile=$@; sh $(depth)/bin/add-URLs.sh $@
+
+POD2HTML5003=$(POD2HTML) $< ; mv $(notdir $@) $(outdir)/
+
+
+do_pod2html=$(POD2HTML5003)
+
+
+$(outdir)/%.html: %.pod $(depth)/VERSION
+ $(do_pod2html)
+
+$(outdir)/%.5: %.pod
+ $(pod2groff)
+
+$(outdir)/%.1: %.pod
+ $(pod2groff)
+
--- /dev/null
+
+
+
+localinstall: localinstall-files
+
+localinstall-files: $(INSTALLATION_OUT_FILES)
+ $(INSTALL) -d $(INSTALLATION_DIR)
+ $(INSTALL) -m 644 $(INSTALLATION_OUT_FILES) $(INSTALLATION_DIR)
+
+localuninstall: localuninstall-files
+
+localuninstall-files:
+ for i in $(notdir $(INSTALLATION_OUT_FILES)) ; do \
+ rm -f $(INSTALLATION_DIR)/$$i; \
+ done
+ -rmdir $(INSTALLATION_DIR)
# identify module:
#
-NAME = make
SUBDIRS =
# two outdir files are distributed, since they make sense to have without running
# configure and make.
+
+LSMENTRY=$(outdir)/lilypond.lsm
+RPMSPEC=$(outdir)/lilypond.spec
IN_FILES = $(wildcard *.in)
EXTRA_DISTFILES = $(IN_FILES)
-OUT_DISTFILES=$(outdir)/lilypond.spec $(outdir)/lilypond.lsm $(outdir)/lelievijver.lsm
+OUT_DISTFILES= $(outdir)/lelievijver.lsm $(LSMENTRY) $(RPMSPEC)
#
# generic variables:
include ./$(depth)/make/Targets.make
include ./$(depth)/make/Rules.make
+default: $(RPMSPEC) $(LSMENTRY)
-local-maintainerclean:
- rm lilypond.spec $(wildcard *.lsm)
-
-spec: $(outdir)/lilypond.spec
-rpmdocs=$(addprefix Documentation/out/, $(notdir $(shell ls $(depth)/Documentation/$(outdir)/*.txt)))\
+rpmdocs=$(addprefix Documentation/out/, $(notdir $(shell find $(depth)/Documentation/ -name '*.txt' ))) \
BUGS TODO NEWS DEDICATION ANNOUNCE README
rpmmudocs=$(addprefix Documentation/, $(notdir $(shell ls $(depth)/Documentation/*.doc)))
rpmdvis=$(rpmmudocs:.doc=.dvi)
sed-examples = sed 's!@EXAMPLE_LYS@!${rpmexamples} ${rpmmudocs}!g'
sed-docs=sed 's!@TEXT_DOCS@!${rpmdocs}!g'
-$(outdir)/lilypond.spec: lilypond.spec.in $(depth)/VERSION
+$(outdir)/%.spec: %.spec.in $(depth)/VERSION
cat $< | $(sed-version) | $(sed-docs) | $(sed-examples) > $@
$(outdir)/%.lsm: %.lsm.in $(depth)/VERSION
--- /dev/null
+MANFILES = lilypond convert-mudela mi2mu mudela-book
+MANGROFF = $(addprefix $(outdir)/, $(addsuffix .$(SECTION)))
+
+
+
+localinstall: $(MANGROFFS)
+ $(INSTALL) -d $(mandir)/man$(SECTION)
+ $(INSTALL) -m 644 $(MANGROFFS) $(mandir)/man$(SECTION)
+
+
+localuninstall:
+ (cd $(mandir)/man$(SECTION)/; rm -f $(MANGROFF))
+
+
+
+
LYFILES = $(wildcard *.ly)
TEXFILES = $(wildcard *.tex)
M4FILES = $(wildcard *.m4)
-DISTFILES = Makefile $(LYFILES) $(TEXFILES) $(wildcard *.m4)
+DISTFILES = Makefile $(EXTRA_DISTFILES) $(LYFILES) $(TEXFILES) $(wildcard *.m4)
#
OUTFILES = $(addprefix $(outdir)/,$(M4FILES:%.m4=%))
all: $(OUTFILES)
+
+
+name-stem= $(notdir $(basename $<))
+
+$(outdir)/%.gif: $(outdir)/%.ps
+ sh $(depth)/bin/ps-to-gifs.sh $<
+ mv $(name-stem)-page*.gif $(outdir)/
+ touch $@
+
+$(outdir)/%.ly.txt: %.ly
+ ln -f $< $@
+
+$(outdir)/%.dvi: %.ly
+ (cd $(outdir); \
+ LILYINCLUDE="..:$$LILYINCLUDE" ly2dvi ../$< )
+
%.dep:
touch $@
+%.gz: %
+ gzip -c9 $< > $@
+
$(depth)/%.txt: check-doc-deps
rm -f $@
ln `find ${depth}/Documentation -name $@ -print|head -1 ` .
+
+$(outdir)/%.ps: $(outdir)/%.dvi
+ dvips -o $@ $<
+
--- /dev/null
+
+
+ly_examples=$(addprefix $(outdir)/, $(addsuffix .ly.txt, $(examples)))
+ps_examples=$(addprefix $(outdir)/, $(addsuffix .ps.gz, $(examples)))
+gif_examples=$(addprefix $(outdir)/, $(addsuffix .gif, $(examples)))
+
+
+
+WWW: $(ly_examples) $(ps_examples) $(gif_examples)
+ (cd $(outdir); $(PYTHON) ../$(depth)/bin/mutopia-index.py $(examples))
+
Release: 1
Copyright: GPL
Group: Applications/Publishing
-Source0: alpha.gnu.org:/gnu/lilypond/development/lilypond-@TOPLEVEL_VERSION@.tar.gz
+Source0: pcnov095.win.tue.nl:/pub/lilypond/development/lilypond-@TOPLEVEL_VERSION@.tar.gz
Summary: A program for typesetting music.
URL: http://www.cs.ruu.nl/~hanwen/lilypond
Packager: Han-Wen Nienhuys <hanwen@stack.nl>
%doc Documentation/out/lelie_logo.gif
/usr/bin/convert-mudela
/usr/bin/mudela-book
+/usr/bin/ly2dvi
/usr/bin/lilypond
-/usr/lib/libflower.so
/usr/bin/mi2mu
+# /usr/lib/libflower.so
/usr/man/man1/mi2mu.1
/usr/man/man1/lilypond.1
/usr/man/man1/mudela-book.1
+/usr/man/man1/ly2dvi.1
/usr/man/man1/convert-mudela.1
/usr/lib/texmf/texmf/tex/lilypond/
/usr/lib/texmf/texmf/fonts/source/public/lilypond
% input feta-eindelijk;
% input feta-klef;
% input feta-toevallig;
- input feta-schrift;
-% input feta-slag;
+% input feta-schrift;
+% input feta-schrift;
+ input feta-haak;
fi
input feta-macros;
input feta-params;
+input feta-autometric;
save code;
code :=0;
filldraw z5{dir(180+alpha)}..{left}z1--z2--z3..{up}z4{right}
..{dir(alpha)}z6..cycle;
- labels(1,2,3,4,5,6);
+% % try control points to do this in ps
+% currentpicture:=currentpicture shifted (-x5/2,(x5-x4)/2);
+%
+% s7 := 0.4*(x5-x1);
+% x7 = x1 + s7 * cosd(0);
+% y7 = y1 + s7 * sind(0);
+%
+% s8 := -0.25*(x5-x1);
+% x8 := x5 + s8 * cosd(alpha);
+% y8 := y5 + s8 * sind(alpha);
+%
+% s9 := 0.5*(x5-x4);
+% x9 := x4 + s9 * cosd(0);
+% y9 := y4 + s9 * sind(0);
+%
+% s10 := -0.15*(x5-x4);
+% x10 := x5 + s10 * cosd(alpha);
+% y10 := y5 + s10 * sind(alpha);
+%
+% draw z5..controls z8 and z7..z1--z2--z3..{up}z4
+% ..controls z9 and z10..z6..cycle;
+%
+% labels(1,2,3,4,5,6,7,8,9,10);
addto currentpicture also currentpicture yscaled -1;
endchar;
enddef;
-
-% for h := staffsize# step 1 pt# until (2 * staffsize#):
+% for h := staffsize# step 1 pt# until (1.1 * staffsize#):
for h := staffsize# step 1 pt# until (7 * staffsize#):
draw_bracket(h, 2interline# );
endfor
SUBDIRS =
#
+
# generic stuff/Makefile
#
include ./$(depth)/make/Mutopia.make
#
+
+examples=scsii-menuetto wtk1-fugue2 preludes-2
+
+include $(depth)/make/WWW.make
#
SUBDIRS = J.S.Bach Coriolan
EXTRA_DISTFILES += TODO
+
+examples=standje gallina
+
+
#
# generic stuff/Makefile
#
--- /dev/null
+ - more composers > 70y +
+ - (more) free composers
+ - beethoven's coriolan
+ - more composers > 70y +
+ - (more) free composers
+ - beethoven's coriolan
+ - more composers > 70y +
+ - (more) free composers
+ - beethoven's coriolan
\header{
filename = "los-toros-oboe.ly";
-title = "La Feria\normalsize\\[2ex]Los Toros";
+title = "La Feria\\normalsize\\[2ex]Los Toros";
opus = "";
composer = "Paul Lac\\^ome d'Estalenx (1838-1920)";
enteredby = "jcn";
include ./$(depth)/make/Rules.make
#
-EXECUTABLES=bow
-include $(depth)/make/Executable.make
-
typedef void *Paper_def;
+bool experimental_features_global_b = true;
+
#include "bezier.hh"
#include "bezier.cc"
#include "offset.cc"
+
struct Point
{
Real x, y;
Array<Offset> notes;
for (int i = 0; i < n; i++)
notes.push (Offset (points[i].x, points[i].y));
-// cout << "pickup pencircle scaled 8pt#;\n";
+#if 1
+ cout << "pickup pencircle scaled 8pt#;\n";
+#else
cout << "pickup pencircle scaled 2pt#;\n";
+#endif
for (int i = 0; i < n; i++)
cout << "drawdot (" << notes[i].x () << ", " << notes[i].y () << ");\n";
Bezier_bow b (0);
bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,40 }, 6, 1);
bow ((Point[2]){ 0,0, 20,0 }, 2, 1);
bow ((Point[2]){ 0,0, 20,-10 }, 2, 1);
-#endif
bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,100 }, 6, 1);
- cout << "\\end\n";
- return 0;
-}
-// vim:sw=2 makeprg=g++\ -g\ bow.cc\ -o\ bow
-#include <iostream.h>
-#define PT
+ bow ((Point[6]){ 0,0, 20,-10, 40,20, 60,-20, 80,20, 100,0 }, 6, 1);
+ bow ((Point[6]){ 0,0, 20,-10, 40,20, 60,-20, 80,20, 100,0 }, 6, -1);
+ bow ((Point[6]){ 0,0, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, 1);
+ bow ((Point[6]){ 0,0, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, -1);
+ bow ((Point[6]){ 0,0, 20,20, 40,0, 60,40, 80,20, 100,100 }, 6, -1);
-// mmm
-#define STANDALONE
+ bow ((Point[6]){ 0,-10, 20,-20, 40,0, 60,-40, 80,-20, 100,-50 }, 6, 1);
-#include <math.h>
+ bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, -1);
+#endif
-typedef void *Paper_def;
+ //clipping
+#if 0
+ bow ((Point[6]){ 0,0, 20,60, 40,0, 60,0, 80,0, 100,1 }, 6, 1);
-#include "bezier.hh"
-#include "bezier.cc"
-#include "mat.hh"
+ bow ((Point[6]){ 0,1, 20,0, 40,0, 60,0, 80,60, 100,0 }, 6, 1);
+ bow ((Point[6]){ 0,0, 20,20, 40,40, 60,60, 80,140, 100,100 }, 6, 1);
+ bow ((Point[6]){ 0,0, 20,20, 40,40, 60,60, 80,20, 100,100 }, 6, -1);
+ bow ((Point[6]){ 0,0, 20,-20, 40,-40, 60,-60, 80,-20, 100,-100 }, 6, 1);
+ bow ((Point[6]){ 0,0, 20,-20, 40,-40, 60,-60, 80,-140, 100,-100 }, 6, -1);
+#endif
-struct Point
-{
- Real x, y;
-};
+ // bugs
+// bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,40, 100,1 }, 6, 1);
+// bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,-40, 100,1 }, 6, -1);
+// bow ((Point[6]){ 0,0, 20,40, 40,0, 60,0, 80,0, 100,1 }, 6, 1);
+// bow ((Point[6]){ 0,0, 20,-40, 40,0, 60,0, 80,0, 100,1 }, 6, -1);
-void
-out (Bezier_bow& b)
-{
- cout << "save dx,dy,x,y;\n";
- for (int i = 0; i < 4; i++)
- cout << "z" << i + 1 << " = (" << b.control_[i].x ()
- << ", " << b.control_[i].y () << ");\n";
- for (int i = 1; i < 3; i++)
- cout << "z" << i + 4 << " = (" << b.return_[i].x ()
- << ", " << b.return_[i].y () << ");\n";
-// cout << "pickup pencircle scaled 0.5pt#;\n";
-// cout << "draw z2--z3; draw (50,0)-- 0.5[z2,z3];\n";
- cout << "pickup pencircle scaled 4pt#;\n";
- for (int i = 0; i < 4; i++)
- cout << "drawdot z" << i + 1 << ";\n";
-// cout << "pickup pencircle scaled 0.4pt#;\n";
- cout << "pickup pencircle scaled 1.6pt#;\n";
- cout << "path boogje;\n";
-// cout << "boogje=z1..controls z2 and z3..z4..controls z5 and z6..cycle;\n";
- cout << "boogje=z1..controls z2 and z3..z4;\n";
- cout << "dx=x4-x1;\n";
- cout << "dy=y4-y1;\n";
- cout << "draw boogje;\n";
- cout << "pickup pencircle scaled 0.4pt#;\n";
- cout << "boogje:=z4..controls z5 and z6..z1;\n";
- cout << "draw boogje;\n";
-// cout << "filldraw boogje;\n";
- cout << "showit; shipit;clearit;\n";
-}
-
-void
-bow (Point* points, int n, int d)
-{
- Array<Offset> notes;
- for (int i = 0; i < n; i++)
- notes.push (Offset (points[i].x, points[i].y));
- cout << "pickup pencircle scaled 8pt#;\n";
- for (int i = 0; i < n; i++)
- cout << "drawdot (" << notes[i].x () << ", " << notes[i].y () << ");\n";
- Bezier_bow b (0);
- b.set (notes, d);
- b.calc ();
- out (b);
- return;
-}
+ bow ((Point[6]){ 0,0, 20,-40, 40,0, 60,20, 80,20, 100,40 }, 6, -1);
+ bow ((Point[6]){ 0,0, 20,-20, 40,-20, 60,-20, 80,-80, 100,-40 }, 6, -1);
-int
-main ()
-{
- //cout.unsetf(ios::scientific);
- cout.setf(ios::fixed);
-#if 1
- bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,1 }, 6, 1);
- bow ((Point[6]){ 0,0, 20,0, 40,30, 60,30, 80,0, 100,1 }, 6, 1);
- bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,10, 100,1 }, 6, 1);
- bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,40, 100,1 }, 6, 1);
- bow ((Point[6]){ 0,0, 20,0, 40,0, 60,40, 80,0, 100,1 }, 6, 1);
- bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, 1);
- bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, -1);
- bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,100 }, 6, -1);
- bow ((Point[9]){ 0,0, 20,0, 40,-80, 60,0, 80,0, 100,0, 120,0, 140,0, 160,-1 }, 9, -1);
- bow ((Point[9]){ 0,0, 40,0, 80,180, 120,0, 160,0, 200,0, 240,0, 280,0, 320,1 }, 9, 1);
- bow ((Point[9]){
- {0, 0},
- {19.10645980317711, 1},
- {29.402919606354207, 28},
- {55.389379409531308, 1},
- {73.530839212708514, 1},
- {91.672299015885727, 1},
- {111.35901367452229, 1},
- {131.04572833315891, 1},
- {145.76744299179552, 0}
- },
- 9, 1);
-#endif
- bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,40 }, 6, 1);
+ bow ((Point[6]){ 0,0, 20,20, 40,40, 60,60, 80,140, 100,100 }, 6, 1);
cout << "\\end\n";
return 0;
}
\def\fetsixteendefs{%
\font\feta = feta16
- \font\vetfont = feta-beams16
\font\fetanummer = feta-nummer8
\font\dynfont = feta-din10 scaled \magstep 1
\font\bracefont = feta-braces16
\def\fettwentydefs{%
\font\feta = feta20
- \font\vetfont = feta-beams20
\font\fetanummer = feta-nummer10
\font\dynfont = feta-din10 scaled \magstep 2
\font\bracefont = feta-braces20
\def\fettwentysixdefs{%
\font\feta = feta26
- \font\vetfont = feta-beams26
\font\fetanummer = feta-nummer12
\font\dynfont = feta-din10 scaled \magstep 3
\font\bracefont = feta-braces16
\def\fetthirteendefs{%
\font\feta = feta13
- \font\vetfont = feta-beams26
\font\fetanummer = feta-nummer5
\font\dynfont = feta-din10 scaled \magstep 0
\font\bracefont = feta-braces16
\def\fetelevendefs{%
\font\feta = feta11
- \font\vetfont = feta-beams26
\font\fetanummer = feta-nummer5
\font\dynfont = feta-din10 % scaled \magstep-1
\font\bracefont = feta-braces16
/lily_distance {
1 copy mul exch 1 copy mul add sqrt
} bind def
- /draw_plet
- {
- staffrulethickness setlinewidth
- /dir exch def
- /plet_dy exch def
- /plet_dx exch def
- staffheight 2 div /plet_gapx exch def
- plet_dy plet_dx div plet_gapx mul /plet_gapy exch def
- staffheight 4 div dir mul /plet_h exch def
-%
- 0 0 moveto
- 0 plet_h lineto
- plet_dx plet_gapx sub 2 div
- plet_dy plet_gapy sub 2 div plet_h add lineto
- plet_dx plet_gapx add 2 div
- plet_dy plet_gapy add 2 div plet_h add moveto
- plet_dx plet_dy plet_h add lineto
- plet_dx plet_dy lineto
- stroke
- }
- bind def
- staffheight 2 div /slurhtlimit exch def
+staffrulethickness 1.2 mul /plet_t exch def
+/draw_plet
+{
+ plet_t setlinewidth
+ true setstrokeadjust
+ 1 setlinecap
+ 1 setlinejoin
+ /dir exch def
+ /plet_dy exch def
+ /plet_dx exch def
+ staffheight 2 div /plet_gapx exch def
+ plet_dy plet_dx div plet_gapx mul /plet_gapy exch def
+ staffheight 4 div dir mul /plet_h exch def
+%
+ 0 0 moveto
+ 0 plet_h lineto
+ plet_dx plet_gapx sub 2 div
+ plet_dy plet_gapy sub 2 div plet_h add lineto
+ plet_dx plet_gapx add 2 div
+ plet_dy plet_gapy add 2 div plet_h add moveto
+ plet_dx plet_dy plet_h add lineto
+ plet_dx plet_dy lineto
+ stroke
+} bind def
+staffheight 2 div /slurhtlimit exch def
/draw_slur
{
staffrulethickness setlinewidth
- 0 0 moveto
- rcurveto
- rcurveto
+ moveto
+ curveto
+ lineto
+ curveto
gsave
fill
grestore
stroke
} bind def
+%
+staffheight 4 div /interline exch def
+%
+/bracket_traject
+{
+ /traject_ds exch def
+ /traject_alpha exch def
+ traject_ds traject_alpha sin mul add
+ exch
+ traject_ds traject_alpha cos mul add
+ exch
+} bind def
+%
+interline 2 div /bracket_b exch def
+interline 2 mul /bracket_w exch def
+staffrulethickness /stafflinethickness exch def
+stafflinethickness 2 mul /bracket_t exch def
+interline 1.5 mul /bracket_v exch def
+bracket_v /bracket_u exch def
+50 /bracket_alpha exch def
+%
+/half_bracket
+{
+%6
+ 0 0
+%5a
+ bracket_b bracket_v add bracket_h bracket_t sub bracket_u add
+ bracket_alpha bracket_v -0.15 mul bracket_traject
+%5b
+ 1 bracket_h
+ 0 bracket_v 0.5 mul bracket_traject
+%5c
+ 0 bracket_h
+%4a
+ bracket_b bracket_h bracket_t sub
+ 0 bracket_v 0.4 mul bracket_traject
+%4b
+ bracket_b bracket_v add bracket_h bracket_t sub bracket_u add
+ bracket_alpha bracket_v -0.25 mul bracket_traject
+%4c
+ bracket_b bracket_v add bracket_h bracket_t sub bracket_u add
+%3
+ bracket_b bracket_h bracket_t sub
+%2
+ bracket_b 0
+%1
+ 0 0
+} bind def
+%
+/draw_half_bracket {
+ moveto
+ lineto
+ lineto
+ curveto
+ curveto
+ lineto
+ gsave
+ fill
+ grestore
+} bind def
+%
+/draw_bracket
+{
+ 2 div bracket_b add /bracket_h exch def
+ bracket_t setlinewidth
+ true setstrokeadjust
+ 1 setlinecap
+ 1 setlinejoin
+ half_bracket
+ 20 copy
+ 1 -1 scale
+ draw_half_bracket
+ stroke
+ 1 -1 scale
+% ugh, ugh:
+ 0.05 0 translate
+ draw_half_bracket
+ stroke
+} bind def
}}
\def\turnOnExperimentalFeatures{%
\font\smalltextfont=cmr8
\font\boldfont=cmbx10
\font\textmusic=cmmi12
- \font\largefont=cmbx12
+ \font\largefont=cmbx12
}
\def\cmrsixteen{
\font\smalltextfont=cmr6
\font\italicfont=cmti9
\font\textmusic=cmmi10
\font\boldfont=cmbx8
- \font\largefont=cmbx10
+ \font\largefont=cmbx10
}
\def\cmreleven{
\font\smalltextfont=cmr5
\font\italicfont=cmti6
\font\textmusic=cmmi8
\font\boldfont=cmbx6
- \font\largefont=cmbx8
+ \font\largefont=cmbx8
}
\def\cmrthirteen{
\font\italicfont=cmti7
\font\textmusic=cmmi9
\font\boldfont=cmbx7
- \font\largefont=cmbx9
+ \font\largefont=cmbx9
}
\def\musixsixteendefs{
\sixteenfonts
\input dyndefs
\input fetdefs
-%\input taupindefs
-%\input eglerdefs
\def\emptybar{}
\def\setdynamic#1{\dynfont #1}
\def\setfinger#1{\fingerfont #1}
\def\setlarge#1{\largefont #1}
+\def\setnumber#1{\fetanummer #1}
% the interline symbol. Redefine to remove it.
\def\defaultlineseparator{\vbox{\mussepline\vskip -5pt\mussepline}}