********
+[Linux Intel, EGCS-1.1b]
+
+Compiling with -O2 -finline-functions will cause crashes during
+parsing stage.
+
[All platforms]
% TODO: fix the labelling.
@Book {6,
-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},
-note = {subject: Musical notation},
+ 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},
+ note = {subject: Musical notation},
}
@Book {15,
-author ={Carl Brandt and Clinton Roemer},
-title = {Standardized Chord Symbol Notation},
-address={Sherman Oaks, CA},
-publisher={Roerick Music Co.},
-note ={subject: musical notation},
+ author ={Carl Brandt and Clinton Roemer},
+ title = {Standardized Chord Symbol Notation},
+ address={Sherman Oaks, CA},
+ publisher={Roerick Music Co.},
+ note ={subject: musical notation},
}
@Book {22,
-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},
-note = {subject: Musical notation --Handbooks, manuals},
+ 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},
+ note = {subject: Musical notation --Handbooks, manuals},
}
@Book {31,
-title = {Music Printing & Publishing},
-author ={Donald W. Krummel \& Stanley Sadie},
-year = {1990},
-publisher= {Macmillan Press},
-note ={subject: musical notation},
+ title = {Music Printing & Publishing},
+ author ={Donald W. Krummel \& Stanley Sadie},
+ year = {1990},
+ publisher= {Macmillan Press},
+ note ={subject: musical notation},
}
%series={The Norton/Grove Handbooks in Music.},
% publisher={W.W. Norton},
@Book {40,
-author={Foss, Hubert},
-title = {Music Printing},
-series = {Practical Printing and Binding},
-address={London},
-publisher={Oldhams Press Ltd., Long Acre},
-note ={subject: musical notation},
+ author={Foss, Hubert},
+ title = {Music Printing},
+ series = {Practical Printing and Binding},
+ address={London},
+ publisher={Oldhams Press Ltd., Long Acre},
+ note ={subject: musical notation},
}
@Book {48,
-author = {Steele, Robert},
-year = {1903},
-title = {The Earliest English Music Printing},
-address={London},
-note= {subject: history of music printing and engraving},
+ author = {Steele, Robert},
+ year = {1903},
+ title = {The Earliest English Music Printing},
+ address={London},
+ note= {subject: history of music printing and engraving},
}
@Book {54,
-author={Austin, Ernest},
-title = {The Story of Music Printing},
-address={London},
-publisher={Lowe and Brydone Printers, Ltd.},
-note= {subject: history of music printing and engraving},
+ author={Austin, Ernest},
+ title = {The Story of Music Printing},
+ address={London},
+ publisher={Lowe and Brydone Printers, Ltd.},
+ note= {subject: history of music printing and engraving},
}
@Book {63,
-author={?},
-title = {Pictoral History of Music Printing},
-address={Elhardt, Indiana},
-publisher={H. and A. Selmer, Inc.},
-note= {subject: history of music printing and engraving},
+ author={?},
+ title = {Pictoral History of Music Printing},
+ address={Elhardt, Indiana},
+ publisher={H. and A. Selmer, Inc.},
+ note= {subject: history of music printing and engraving},
}
@Book {77,
-author = {Wintermitz, Emmanuel},
-year = {1955},
-title = {Musical Autographs from Monteverdi to Hindemith},
-address={Princeton},
-publisher={Princeton University Press},
-note= {subject: history of music printing and engraving},
+ author = {Wintermitz, Emmanuel},
+ year = {1955},
+ title = {Musical Autographs from Monteverdi to Hindemith},
+ address={Princeton},
+ publisher={Princeton University Press},
+ note= {subject: history of music printing and engraving},
}
@Book {92,
-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},
-note={ subject: history of music printing and engraving},
+ 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},
+ note={ subject: history of music printing and engraving},
}
@Book {100,
-author={Chrsander, F.},
-year={18??},
-title={A Sketch of the HIstory of Music printing, from the 15th to the 16th century},
-note={ subject: history of music printing and engraving},
+ author={Chrsander, F.},
+ year={18??},
+ title={A Sketch of the HIstory of Music printing, from the 15th to the 16th century},
+ note={ subject: history of music printing and engraving},
}
@Article {squire1897,
-author = {Squire, W},
-year = {1897},
-title = {Notes on Early Music Printing},
-journal = {Bibliographica},
-volume={iii},
-number={99},
-note={ subject: history of music printing and engraving},
+ author = {Squire, W},
+ year = {1897},
+ title = {Notes on Early Music Printing},
+ journal = {Bibliographica},
+ volume={iii},
+ number={99},
+ note={ subject: history of music printing and engraving},
}
@Article{113,
-author = {Meyer, K. and O'Meara, J},
-year = {1935},
-title = {The Printing of Music, 1473-1934},
-journal = {The Dolphin},
-volume={ ii},
-pages={ 171--207},
-note={ subject: history of music printing and engraving},
+ author = {Meyer, K. and O'Meara, J},
+ year = {1935},
+ title = {The Printing of Music, 1473-1934},
+ journal = {The Dolphin},
+ volume={ ii},
+ pages={ 171--207},
+ note={ subject: history of music printing and engraving},
}
%% 4th ver.,
@Article {120,
-author = {Pattison, B},
-year = {1939},
-title = {Notes on Early Music Printing},
-journal = {The Library},
-note={subject: history of music printing and engraving},
-volume={xix},
-pages={389-421},
+ author = {Pattison, B},
+ year = {1939},
+ title = {Notes on Early Music Printing},
+ journal = {The Library},
+ note={subject: history of music printing and engraving},
+ volume={xix},
+ pages={389-421},
}
@Book {136,
-author = {King, H},
-year = {1964},
-title = {Four Hundred Years of Music Printing},
-address={London},
-note={ subject: history of music printing and engraving},
+ author = {King, H},
+ year = {1964},
+ title = {Four Hundred Years of Music Printing},
+ address={London},
+ note={ subject: history of music printing and engraving},
}
%(Rev.1961).
@Book{150,
-author={Deutsch, O.F.},
-year ={1946},
-title = {Music Publishers' Numbers},
-address={London},
-note={ subject: history of music printing and engraving},
+ author={Deutsch, O.F.},
+ year ={1946},
+ title = {Music Publishers' Numbers},
+ address={London},
+ note={ subject: history of music printing and engraving},
}
@Book {151,
-author = {Marco, G.A},
-year = {1962},
-title = {The Earliest Music Printers of Continental Europe: a Checklist of Facsimiles Illustrating Their Work},
-address={Charlottesville, Virginia},
-note={ subject: history of music printing and engraving},
+ author = {Marco, G.A},
+ year = {1962},
+ title = {The Earliest Music Printers of Continental Europe: a Checklist of Facsimiles Illustrating Their Work},
+ address={Charlottesville, Virginia},
+ note={ subject: history of music printing and engraving},
}
@Article {158,
-author = {Kinkeldey, O},
-year = {1932},
-title = {Music And Music Printing in Incunabula},
-journal = {Papers of the Bibliographical Society of America},
-volume={ xxvi},
-pages={89-118},
-note={ subject: history of music printing and engraving},
+ author = {Kinkeldey, O},
+ year = {1932},
+ title = {Music And Music Printing in Incunabula},
+ journal = {Papers of the Bibliographical Society of America},
+ volume={ xxvi},
+ pages={89-118},
+ note={ subject: history of music printing and engraving},
}
@Book {166,
-author = {Oldman, C.B},
-year = {1934},
-title = {Collecting Musical First Editions},
-address={London},
-note={ subject: history of music printing and engraving},
+ author = {Oldman, C.B},
+ year = {1934},
+ title = {Collecting Musical First Editions},
+ address={London},
+ note={ subject: history of music printing and engraving},
}
@Book{170,
-author={Carter, J},
-year={1934},
-title = {New Paths in Book Collecting},
-address={London},
-note={ subject: history of music printing and engraving},
+ author={Carter, J},
+ year={1934},
+ title = {New Paths in Book Collecting},
+ address={London},
+ note={ subject: history of music printing and engraving},
}
@Book {179,
-author={Krummel, D.W.},
-year={1958},
-month={9},
-title = {Graphic Analysis in Application to Early American Engraved Music},
-journal = {Notes},
-volume={xvi},
-pages={213},
-note={ subject: history of music printing and engraving},
+ author={Krummel, D.W.},
+ year={1958},
+ month={9},
+ title = {Graphic Analysis in Application to Early American Engraved Music},
+ journal = {Notes},
+ volume={xvi},
+ pages={213},
+ note={ subject: history of music printing and engraving},
}
@Book {189,
-author = {Krummel, D.W},
-year = {1971},
-title = {Oblong Format in Early Music Books},
-journal = {The Library},
-volume={5th ser., xxvi},
-pages={312},
-note={ subject: history of music printing and engraving},
+ author = {Krummel, D.W},
+ year = {1971},
+ title = {Oblong Format in Early Music Books},
+ journal = {The Library},
+ volume={5th ser., xxvi},
+ pages={312},
+ note={ subject: history of music printing and engraving},
}
@Book {198,
-author = {King, A.H},
-year = {1973},
-title = {The 50th Anniversary of Music Printing},
+ author = {King, A.H},
+ year = {1973},
+ title = {The 50th Anniversary of Music Printing},
}
@Book {204,
-author={Rastall, Richard},
-year={1982},
+ author={Rastall, Richard},
+ year={1982},
title = {The notation of Western music : an introduction},
-address={New York, N.Y.},
-publisher={St. Martin's Press},
-note = {Musical notation},
+ address={New York, N.Y.},
+ publisher={St. Martin's Press},
+ note = {Musical notation},
}
@Book {215,
-author = {Tappolet, Willy},
-year = {1947},
-title = {La Notation Musicale},
-address={Paris},
-note={subject: general notation},
-publisher={Neuch\^atel},
+ author = {Tappolet, Willy},
+ year = {1947},
+ title = {La Notation Musicale},
+ address={Paris},
+ note={subject: general notation},
+ publisher={Neuch\^atel},
}
@Book {223,
-author = {Williams, C.F. Abdy},
-year = {1903},
-title = {The Story of Notation},
-address={New York},
-publisher={Charles Scribner's Sons},
-note={subject: general notation},
+ author = {Williams, C.F. Abdy},
+ year = {1903},
+ title = {The Story of Notation},
+ address={New York},
+ publisher={Charles Scribner's Sons},
+ note={subject: general notation},
}
@Book {239,
-author={Apel, Willi},
-year={1953},
-title = {The notation of polyphonic music, 900-1600},
-address={Cambridge, Mass},
-institution={Mediaeval Academy of America},
-note = {Musical notation},
+ author={Apel, Willi},
+ year={1953},
+ title = {The notation of polyphonic music, 900-1600},
+ address={Cambridge, Mass},
+ institution={Mediaeval Academy of America},
+ note = {Musical notation},
}
@Book {248,
-author={Berger, Anna Maria Busse},
-year={1993},
-title = {Mensuration and proportion signs : origins and evolution},
-address={Oxford, England},
-publisher={Clarendon Press},
-scnd_address={New York},
-scnd_publisher={Oxford University Press },
-note={subject: early notation},
+ author={Berger, Anna Maria Busse},
+ year={1993},
+ title = {Mensuration and proportion signs : origins and evolution},
+ address={Oxford, England},
+ publisher={Clarendon Press},
+ scnd_address={New York},
+ scnd_publisher={Oxford University Press },
+ note={subject: early notation},
}
@Book {258,
-author={Parrish, Carl},
-year={1957},
+ author={Parrish, Carl},
+ year={1957},
title = {The notation of medieval music},
-address={New York},
-publisher={Norton},
-note = {Musical notation},
+ address={New York},
+ publisher={Norton},
+ note = {Musical notation},
}
@Book {269,
-author = {Parrish, Carl},
-year = {1946},
-title = {The Notation of Medieval Music},
-address={New York},
-publisher={Carl Fischer, Inc.},
-note={subject: early notation},
+ author = {Parrish, Carl},
+ year = {1946},
+ title = {The Notation of Medieval Music},
+ address={New York},
+ publisher={Carl Fischer, Inc.},
+ note={subject: early notation},
}
@Book {277,
-author = {Patch, Harry},
-year = {1949},
-title = {Genesis of a Music},
-address={Madison},
-publisher={University of Wisconsin Press},
-note={subject: early notation},
+ author = {Patch, Harry},
+ year = {1949},
+ title = {Genesis of a Music},
+ address={Madison},
+ publisher={University of Wisconsin Press},
+ note={subject: early notation},
}
@Book {285,
-author={Cage, John},
-year={1969},
+ author={Cage, John},
+ year={1969},
title = {Notations},
-address={New York},
-publisher={Something Else Press},
-note = {Music, Manuscripts, Facsimiles.
+ address={New York},
+ publisher={Something Else Press},
+ note = {Music, Manuscripts, Facsimiles.
-Facsimiles of holographs from the Foundation for Contemporary
-Performance Arts, with text by 269 composers, but rearranged using
-chance operations.,V)} },
+ Facsimiles of holographs from the Foundation for Contemporary
+ Performance Arts, with text by 269 composers, but rearranged using
+ chance operations.,V)} },
@Book {295,
-author = {Gaburo, Virginia},
-year = {1977},
-title = {Notation},
-address={publisher= {Lingua Press},
-publisher={La Jolla, California}},
-note = {A Lecture about notation, new ideas about},
+ author = {Gaburo, Virginia},
+ year = {1977},
+ title = {Notation},
+ address={publisher= {Lingua Press},
+ publisher={La Jolla, California}},
+ note = {A Lecture about notation, new ideas about},
}
@Book {306,
-author = {Risatti, Howard},
-year = {1975},
-title = {New Music Vocabulary},
-address={Urbana, Illinois},
-publisher={University of Illinois Press},
-note = {A Guide to Notational Signs for Contemporary Music},
+ author = {Risatti, Howard},
+ year = {1975},
+ title = {New Music Vocabulary},
+ address={Urbana, Illinois},
+ publisher={University of Illinois Press},
+ note = {A Guide to Notational Signs for Contemporary Music},
}
@Book {325,
-author = {Cowell, Henry},
-year = {1930},
-title = {New Musical Resources},
-address={New York},
-publisher={Alfred A. Knopf, Inc.},
-note={subject: 20th century notation},
+ author = {Cowell, Henry},
+ year = {1930},
+ title = {New Musical Resources},
+ address={New York},
+ publisher={Alfred A. Knopf, Inc.},
+ note={subject: 20th century notation},
}
@Article {333,
-author = {Cowell, Henry},
-year = {1927},
-title = {Our Inadequate Notation},
-journal = {Modern Music},
-volume={4},
-number={3},
-note={subject: 20th century notation},
+ author = {Cowell, Henry},
+ year = {1927},
+ title = {Our Inadequate Notation},
+ journal = {Modern Music},
+ volume={4},
+ number={3},
+ note={subject: 20th century notation},
}
@Book {342,
-author = {Bowers, Roger},
-year = {1992},
-title = {Music & Letters},
-volume={73},
-number={3},
-month={August},
-pages={347(52)},
-note={Some reflection upon notation and proportion in Monteverdi's mass and vespers},
+ author = {Bowers, Roger},
+ year = {1992},
+ title = {Music & Letters},
+ volume={73},
+ number={3},
+ month={August},
+ pages={347(52)},
+ note={Some reflection upon notation and proportion in Monteverdi's mass and vespers},
}
@Book {353,
-author = {Brainard, Paul},
-year = {1992},
-title = {Current Musicology},
-number={50},
-month={July-Dec},
-pages={21(26)},
-note={Proportional notation in the music of Schutz and his contemporaries in the 17th Century},
+ author = {Brainard, Paul},
+ year = {1992},
+ title = {Current Musicology},
+ number={50},
+ month={July-Dec},
+ pages={21(26)},
+ note={Proportional notation in the music of Schutz and his contemporaries in the 17th Century},
}
@Book {362,
-author = {Monelle, Raymond},
-year = {1989},
-title = {Comparative Literature},
-volume={41}, number={3},
-month={Summer},
-pages={252(18)},
+ author = {Monelle, Raymond},
+ year = {1989},
+ title = {Comparative Literature},
+ volume={41}, number={3},
+ month={Summer},
+ pages={252(18)},
-note={Music notation and the poetic foot},
+ note={Music notation and the poetic foot},
}
@Book {373,
-author = {Pinegar, Sandra},
-year = {1993},
-title = {Current Musicology},
-number={53},
-month={July},
-pages={99(10)},
-note={The seeds of notation and music paleography.},
+ author = {Pinegar, Sandra},
+ year = {1993},
+ title = {Current Musicology},
+ number={53},
+ month={July},
+ pages={99(10)},
+ note={The seeds of notation and music paleography.},
}
@Book {382,
-author = {Smith, Norman E},
-year = {1990},
-title = {Current Musicology},
-number={45-47},
-month={Jan-Dec},
-pages={283(22)},
-note={The notation of fractio modi.},
+ author = {Smith, Norman E},
+ year = {1990},
+ title = {Current Musicology},
+ number={45-47},
+ month={Jan-Dec},
+ pages={283(22)},
+ note={The notation of fractio modi.},
}
@Book {392,
-author = {Treitler, Leo},
-year = {1992},
-title = {The Journal of Musicology},
-volume={10},
-number={2},
-month={Spring},
-pages={131(61)},
+ author = {Treitler, Leo},
+ year = {1992},
+ title = {The Journal of Musicology},
+ volume={10},
+ number={2},
+ month={Spring},
+ pages={131(61)},
-note={ The unwritten and written transmission, of medieval chant
-and the start-up of musical notation.
+ note={ The unwritten and 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.},
+ Notational practice developed in medieval music to address the written tradition for chant which interacted with the unwritten vocal tradition.},
}
@Book {407,
-author = {West, M.L},
-year = {1994},
-title = {Music & Letters},
-volume={75},
-number={2},
-month={May},
-pages={161(19)},
-note={The Babylonian musical notation and the Hurrian melodic texts.
+ author = {West, M.L},
+ year = {1994},
+ title = {Music & Letters},
+ volume={75},
+ number={2},
+ month={May},
+ pages={161(19)},
+ note={The Babylonian musical notation and the Hurrian melodic texts.
-A new way of deciphering the ancient Babylonian musical notation.
+ A new way of deciphering the ancient Babylonian musical notation.
}
}
@Book {418,
-author = {Brown, Earle},
-year = {1986},
-title = {Musical Quarterly},
-volume={72},
-month={Spring},
-pages={180(22)},
-note={The notation and performance of new music.},
+ author = {Brown, Earle},
+ year = {1986},
+ title = {Musical Quarterly},
+ volume={72},
+ month={Spring},
+ pages={180(22)},
+ note={The notation and performance of new music.},
}
@Book {426,
-author = {Eggleston, Suzanne},
-year = {1994},
-title = {Notes},
-volume={51},
-number={2},
-month={Dec},
-pages={657(7)},
-journal={New periodicals},
-note={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 Music Notation News},
+ author = {Eggleston, Suzanne},
+ year = {1994},
+ title = {Notes},
+ volume={51},
+ number={2},
+ month={Dec},
+ pages={657(7)},
+ journal={New periodicals},
+ note={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 Music Notation News},
}
@Book {441,
-author = {Fuller, David},
-year = {1989},
-title = {The Journal of Musicology},
-volume={7},
-number={1},
-month={Winter},
-pages={21(8)},
-note={
-Notes and inegales unjoined: defending a definition. (written-out inequalities in music notation).
+ author = {Fuller, David},
+ year = {1989},
+ title = {The Journal of Musicology},
+ volume={7},
+ number={1},
+ month={Winter},
+ pages={21(8)},
+ note={
+ Notes and inegales unjoined: defending a definition. (written-out inequalities in music notation).
}},
@Book {454,
-author = {Jones, David Evan},
-year = {1990},
-title = {Perspectives of New Music},
-note={
-Speech extrapolated. (includes notation)
-}
+ author = {Jones, David Evan},
+ year = {1990},
+ title = {Perspectives of New Music},
+ note={Speech extrapolated. (includes notation)}
}
@Book {464,
-author = {Lependorf, Jeffrey},
-year = {1989},
-journal={Perspectives of New Music},
-volume={27},
+ author = {Lependorf, Jeffrey},
+ year = {1989},
+ journal={Perspectives of New Music},
+ volume={27},
number={2},
-month={Summer},
-pages={232(20)},
-note={
-Contemporary notation for the shakuhachi: a primer for composers. (Tradition and Renewal in the Music of Japan) },
+ month={Summer},
+ pages={232(20)},
+ note={
+ Contemporary notation for the shakuhachi: a primer for composers. (Tradition and Renewal in the Music of Japan) },
}
@Book {478,
-author = {Rastall, Richard},
-year = {1993},
-title = {Music & Letters},
-volume={74}, number={4},
-month={November},
-pages={639(2)},
+ author = {Rastall, Richard},
+ year = {1993},
+ title = {Music & Letters},
+ volume={74}, number={4},
+ month={November},
+ pages={639(2)},
-note={Equal Temperament Music Notation: The Ailler-Brennink
-Chromatic Notation. Results and Conclusions of the Music Notation
-Refor by the Chroma Foundation (book reviews). },
+ note={Equal Temperament Music Notation: The Ailler-Brennink
+ Chromatic Notation. Results and Conclusions of the Music Notation
+ Refor by the Chroma Foundation (book reviews). },
}
@Article {Francois92,
computer is used to write down music with accuracy never
before achieved, the range of modern sounds has surpassed
the relevance of the computer...},
-title={Writing without representation, and unreadable notation.},
+ title={Writing without representation, and unreadable notation.},
}
@Book {501,
\def\kdots{,\ldots,}
\title{Not the Font-En-Tja font}
\author{HWN \& JCN}
+\def\preMudelaExample{}
+\def\postMudelaExample{}
\begin{document}
\maketitle
is a matter of taste, I'd say that B\"arenreiter has the finest
typography of all.
+%
+% stupid test to check convert-mudela.py.
+%
+% (so sue me)
+\begin{mudela}[fragment,center]
+ \clef bass; c1 \clef alto; c'2 \clef treble; c''4
+\end{mudela}
+
\section{Bezier curves for slurs}
\end{eqnarray*}
+\section{Layout of the source files}
+
+The main font (with the fixed size music glyphs) uses a the \TeX\
+logfile as a communication device. Use the specialised macros to
+create and export glyphs.
+
\bibliographystyle{plain}
\bibliography{engraving}
it()nemail(Tom Cato Amundsen)(tomcato@xoommail.com),
cembalo-partita in mudela.
it()nemail(Mats Bengtsson)(matsb@s3.kth.se),
- lurl(http://www.s3.kth.se/~matsb)
+ lurl(http://www.s3.kth.se/~matsb/)
clef stuff, key stuff, swedish notenames, testing, general
comments.
it()nemail(Eric Bullinger)(eric@aut.ee.ethz.ch),
debian package: debian/*
it()nemail(Neil Jerram)(nj104@cus.cam.ac.uk).
parts of Documentation/Vocab*
-it()Donald Ervin Knuth, lurl(http://www.cs-staff.stanford.edu/~knuth)
+it()Donald Ervin Knuth, lurl(http://www.cs-staff.stanford.edu/~knuth/)
mf/ital-*.mf (these were taken from the CM fonts)
it()nemail(Werner Lemberg)(xlwy01@uxp1.hrz.uni-dortmund.de),
misc bugfixes, some Beam and Stem code.
it()nemail(David R. Linn)(drl@vuse.vanderbilt.edu),
Mailing list maintenance.
-it()nemail(Adrian Moriano)()
- Documentation fixes, glossary.
+it()nemail(Adrian Mariano)()
+ Reference manual, tutorial fixes, glossary.
it()nemail(Han-Wen Nienhuys)(hanwen@cs.uu.nl),
- lurl(http://www.cs.uu.nl/~hanwen)
- nl()
+ lurl(http://www.cs.uu.nl/~hanwen/)
Main author (initials: HWN).
it()nemail(Jan Nieuwenhuizen)(janneke@gnu.org),
- lurl(http://www.xs4all.nl/~jantien)
- nl()
+ lurl(http://www.xs4all.nl/~jantien/)
Main author (initials: JCN).
it()nemail(Alexandre Oliva)(oliva@dcc.unicamp.br),
- lurl(http://sunsite.unicamp.br/~oliva)
+ lurl(http://sunsite.unicamp.br/~oliva/)
testing
it()nemail(Franc,ois Pinard)(pinard@iro.umontreal.ca),
parts of Documentation/Vocab*, started internationalization stuff
sect(RUNNING)
-GNU LilyPond does use a lot of resources. For operation you need the following:
+GNU LilyPond does use a lot of resources. For operation you need the
+following:
itemize(
it()TeX
Ghostscript installed.
)
+
+For running LilyPond successfully you have to help TeX and MetaFont
+find various files. The recommended way of doing so is adjusting the
+environment variables in the start-up scripts of your shell. An
+example is given here for the Bourne shell:
+verb(export MFINPUTS="/usr/local/share/lilypond/mf:"
+export TEXINPUTS="/usr/local/share/lilypond/tex:"
+)
+The empty path component
+represents TeX() and MetaFont's default search paths. Scripts with
+the proper paths for the bourne and C-shell respectively are generated in
+file(buildscripts/out/lilypond-profile) and
+file(buildscripts/out/lilypond-login) during compilation.
+
+
sect(RECOMMENDED)
Although not strictly necessary, these are recommended to have.
Check out lurl(ftp://ftp.gnu.org)
or any mirror of this site.
+it()GUILE (version 1.2)
+Check out lurl(http://www.gnu.org/programs/guile.html)
+
it()Python (version 1.5 or newer). Check out
lurl(ftp://ftp.python.org) or lurl(ftp://ftp.cwi.nl/pub/python).
TeTeX users should not forget to rerun texhash.
)
+Building the website requires pnmtopng. The version of file(pnmtopng)
+that is distributed with RedHat 5.1 contains a bug (pnmtopng is
+dynamically linked to the wrong version of libpng). Recompile it from
+source, and make sure that the pnmtopng binary is linked statically to
+the libpng that is included in libgr.
+
+verb( tar xzf libgr-2.0.13.tar.gz
+ make
+ cd png
+ rm libpng.so*
+ make pnmtopng
+)
+
+You can then install the new pnmtopng into /usr/local/bin/
+
sect(CONFIGURING and COMPILING)
to install GNU LilyPond, simply type:
verb(
- configure --enable-tex-dir=XXXX --enable-mf-dir=YYYY
+ configure
make
make install
)
/usr/local/bin/mi2mu
/usr/local/share/lilypond/*
/usr/local/share/locale/{it,nl}/LC_MESSAGES/lilypond.mo
- /usr/lib/texmf/texmf/tex/lilypond/*
)
-You should specify directories that are in TeX()'s and MetaFont's
-include path with the options (--enable-tex-dir) and
-bf(--enable-mf-dir). If you don't specify any directories, the TeX()
-include directory is detected dynamically, which is unreliable. The
-above assumes that you are root and have the GNU development tools,
-and your make is GNU make. If this is not the case, you can adjust
-your environment variables to your taste:
+The above assumes that you are root and have the GNU development
+tools, and your make is GNU make. If this is not the case, you can
+adjust your environment variables to your taste:
verb(
export CPPFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR"
In this case, you will have to set up MFINPUTS, and TEXINPUTS accordingly.
-If you want to install GNU LilyPond in file(/usr/local), and your TeX has
-no default hooks for local stuff, you can do:
-
-verb(
- configure --prefix=/usr/local --enable-tex-prefix=/usr/lib/texmf
-)
-
Since GNU LilyPond currently is beta, you are advised to also use
verb(
--enable-checking
)
-Other options include:
+Options to configure include:
description(
-dit(bf(--enable-shared))
- Make a shared library (gnu/linux, solaris (?) only ) (TEMPORARILY
-OUT OF ORDER)
-
+dit(bf(--enable-guile))
+ Link in GUILE (experimental)
dit(bf(--enable-printing))
Enable debugging print routines (lilypond bf(-D) option)
dit(bf(--enable-optimise))
- Set maximum optimisation: compile with bf(-O2)
+ Set maximum optimisation: compile with bf(-O2). This can be
+unreliable on some compiler/platform combinations (eg, DEC Alpha and PPC)
dit(bf(--enable-profiling))
Compile with support for profiling.
-dit(bf(--enable-tex-prefix))
- Set the directory where TeX and Metafont live.
-dit(bf(--enable-tex-dir))
- Set then directory TeX input is in (detected as a subdir of
- tex-prefix). This should be a directory that is reachable both for
- tex and latex. On my system the best choice would be
- file(/usr/lib/texmf/texmf/tex/generic//).
-dit(bf(--enable-mf-dir))
- Set the directory metafont input is in (idem). On my system the best
- choice would be file(/usr/lib/texmf/texmf/fonts/source/public/).
dit(bf(--enable-config))
Output to a different configuration file. Needed for multi-platform
builds
This is not a Fanmail/Hype page. These pages were entirely created from
the LilyPond package-sources.
-A document on LilyPond's music description language Mudela is
-url(in the making)(DOEXPAND(docdir)/tex/DOEXPAND(outdir)/tutorial.html).
-
Note: These pages are created from the latest bf(development snapshots)
of LilyPond, specifically, this page was made from LilyPond
@TOPLEVEL_VERSION@.tar.gz
description(
dit(lurl(http://www.cs.uu.nl/people/hanwen/lilypond/))Han-Wen's site.
-dit(lurl(http://www.xs4all.nl/~jantien/lilypond/))Jan's site.
dit(lurl(http://www.realtime.net/~daboys/lilypond/))Jeff's Windows NT Distribution site.
)
BUGS:
-
- * egcs-1.1 -O2 -finline-functions causes crash
+ * document new TeX/mf layout
+ * egcs-1.1 -O2 -finline-functions causes crash
* formatting of input stuff.
* [/3 c8 c16 c c c]/1
- * I see that \prallprall and \prallmordent are identical. I think this is a
- mistake, that \prallprall should not have the vertical line.
- This can be fixed by removing the line
- draw_mordent(twidth-0.5toverlap);
- from the definition of \prallprall in mf/feta-slag.mf (see below)
-
* fix singleStaffBracket
* repeat bars: need distance after ":|" and before "|:"
portato= \script { "portato" 0 -1 0 1 0 }
- * MIDI spelling.
-
* Align_element::padding ?
* uniformise property names.
* install TeX stuff into tex/generic directory.
- * /etc/profile.d support for RPM.
-
* percussion note heads
* mi2mu empty staffs.
* make GNU style webpages.
- * There seems to be an install error in lilypond-1.0.0. Most of the
- files in the "init" directory don't get installed in the
- /usr/local/share/lilypond directory. The files installed are of
- the form feta*.ly. In particular init.ly doesn't get installed.
- I installed the files by hand and then the system seems to work.
-
* midi_instrument -> midiInstrument
* horizontal centering of dynamics
- abbreviation-beam -> (measured/unmeasured) tremolo
- partial -> anacrouse
- * libtoolize flowerlib
-
* shared lib
* robustify Beam (in case of no stems, 32nd notes)
* check for groff / troff/ nroff et
* more intelligent file searching
- - use kpsepath
- - make LilyPond fully relocatable
-
- * use kpsepath to find all TeX dirs
- - configure.in
- - clean-fonts.sh
+ - make LilyPond RPM fully relocatable
* nicen examples:
- break-up heavily-nested score blocks
* clefs (AG): The "8" should appear closer to the actual clef,
touching it.
- * scoping for properties?
-
- { c4
- \multi 2 < { \stemup .. } { \stemdown .. } >
- c2
- }
-
- this modifies \stem for the c2
-
* put errorlevel in Input class
* junk nesting slurs
* redhat (v?) graphical install bomb-out?
- * egcs-1.03 ice: stem.cc:327; should localize bug (mine's still 10K)
-
- * gcc 2.8.1: see ice and RESIZE_ICE
-
- * xdvi: PS in magnifying glass.
-
* GNU diff 2.7: diff -rN does not see a new directory with empty file
* GNU patch 2.1: <must find simple example> if patch chokes on a
* GNU indent: handle C++
- * GNU make: move hardcoded builtin rules to runtime ?
-
* GNU patch
- 'double-fix' mode: ignore identical fix, rather than suggest
to revert patch direction when (more or less? exactly) the same
- Move all Score_elems, into libmutype.a
- SGML
-
* Documentation
- Doc (C) stuff of sheet music
- a better format? SGML? TeX? Info?
--- /dev/null
+#!/bin/csh
+
+# env. vars for the C-shell.
+
+# set environment for LilyPond. To be installed in /etc/profile.d/
+setenv GS_LIB "@datadir@/afm"
+setenv GS_FONTPATH "@datadir@/ps"
+setenv LILYINCLUDE "@datadir@/ly:@datadir@/afm"
+
+# include an empty path component for the system wide includes.
+setenv MFINPUTS "@datadir@/mf:"${MFINPUTS:=":"}
+setenv TEXINPUTS "@datadir@/tex:"${TEXINPUTS:=":"}
+
# set environment for LilyPond. To be installed in /etc/profile.d/
GS_LIB="@datadir@/afm"
GS_FONTPATH="@datadir@/ps"
-LILYINCLUDE="@datadir@/ly"
+LILYINCLUDE="@datadir@/ly:@datadir@/afm"
# include an empty path component for the system wide includes.
MFINPUTS="@datadir@/mf:"${MFINPUTS:=":"}
ln ../.dstreamrc .
fi
-./configure --prefix=$prefix --enable-debugging --enable-printing --enable-checking --disable-optimise
+./configure --prefix=$prefix --enable-debugging --enable-printing --enable-checking --disable-optimise --enable-guile
Package: lilypond
Architecture: any
Depends: ${shlibs:Depends}, tetex-base (>= 0.9-5)
+Recommends: python-base (>= 1.5.1)
Conflicts: musixtex-fonts, tetex-base (<< 0.9)
-Description: The GNU Project music typesetter.
+Description: The GNU Project music typesetter.
LilyPond is the GNU Project music typesetter. This program can print
beautiful sheet music from a music definition file. It can also play
mechanical performances to a MIDI file. Features include multiple
beams, slurs, triplets, formatting scores, part extraction. It includes
a nice font of musical symbols.
.
- URL: http://www.cs.ruu.nl/people/hanwen/lilypond
- http://sca.uwaterloo.ca/~praetzel/lilypond/
+ URLs: http://www.cs.uu.nl/~hanwen/lilypond/
+ http://www.xs4all.nl/~jantien/lilypond/
+ http://sca.uwaterloo.ca/~praetzel/lilypond/
Authors: Han-Wen Nienhuys <hanwen@cs.uu.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
--- /dev/null
+#include "string.hh"
+#include "array.hh"
+#include "dictionary.hh"
+
+
+// Note: assumes long is at least 32 bits.
+const unsigned long my_prime_list[] =
+{
+ 53, 97, 193, 389, 769,
+ 1543, 3079, 6151, 12289, 24593,
+ 49157, 98317, 196613, 393241, 786433,
+ 1572869, 3145739, 6291469, 12582917, 25165843,
+ 50331653, 100663319, 201326611, 402653189u, 805306457u,
+ 1610612741u, 3221225473u, 4294967291u
+};
+
+unsigned long prime_list (int idx)
+{
+ return my_prime_list [idx];
+}
+
+unsigned int hash (String s)
+{
+ const char* str = s.ch_C ();
+ unsigned int result = 0;
+ while (1) {
+ char c = *str++;
+ if (c == 0) break;
+ result += (result<<3) + c;
+ }
+ return result;
+}
+
/*
- dictionary-iter.hh -- declare
+ dictionary-iter.hh -- declare Dictionary_iter
source file of the Flower Library
#ifndef DICTIONARY_ITER_HH
#define DICTIONARY_ITER_HH
-#include "string.hh"
-#include "assoc-iter.hh"
+#include "dictionary.hh"
+
+
+
#include "dictionary.hh"
template<class V>
-class Dictionary_iter : public Assoc_iter<String, V>
+class Dictionary_iter
{
+ Dictionary<V> *dict_l_;
+ int i;
public:
- Dictionary_iter (Dictionary<V> const &d)
- : Assoc_iter<String, V> (d)
- {
- }
+ Dictionary_iter(Dictionary<V> const &dict)
+ {
+ i =0;
+ dict_l_ =(Dictionary<V> *) & dict;
+ next_used ();
+ }
+
+ bool ok ()
+ {
+ return i < dict_l_->fixed_p_->dict_arr_.size ();
+ }
+
+ void next_used ()
+ {
+ while (ok () && dict_l_->fixed_p_->dict_arr_[i].free_b_)
+ {
+ i ++;
+ }
+ }
+ void operator ++(int)
+ {
+ i++;
+ next_used ();
+ }
+
+ String key ()
+ {
+ return dict_l_->fixed_p_->dict_arr_[i].name_;
+ }
+ V val ()
+ {
+ return dict_l_->fixed_p_->dict_arr_[i].value_;
+ }
};
#endif // DICTIONARY_ITER_HH
#define DICTIONARY_HH
#include "string.hh"
-#include "assoc.hh"
+#include "array.hh"
+
+unsigned long prime_list (int idx);
+template<class V>
+struct Dict_entry
+{
+ String name_;
+ V value_;
+ bool free_b_;
+
+ Dict_entry() {
+ free_b_ = true;
+ }
+ Dict_entry (String s, V v)
+ {
+ name_ = s;
+ value_ = v;
+ free_b_ = false;
+ }
+};
+
+unsigned int hash (String);
/**
- UGH: write a String_hash template,
+ A hash table of prime size.
- SEE:
-
- #include <search.h>
+ We use quadratic probing.
+ */
+template<class V>
+class Fixed_size_dictionary
+{
+public:
+ Array<Dict_entry<V> > dict_arr_;
+ int size_idx_;
+ Fixed_size_dictionary (int size_idx)
+ {
+ size_idx_ = size_idx;
+ int sz = prime_list(size_idx_);
+ dict_arr_.set_size (sz);
+ }
+
+ /// find #s#, or find first empty entry corresponding to #s#
+ int lookup (String s)
+ {
+ int sz =dict_arr_.size ();
+ int i = hash (s) % sz;
+ int j = 0;
+ while (j <= sz/2) {
+ if (dict_arr_[i].free_b_)
+ return i;
+
+ if (dict_arr_[i].name_ == s)
+ return i;
- ENTRY *hsearch(ENTRY item, ACTION action);
+ j++;
+ i = (i + j*j) % sz;
+ }
- int hcreate (unsigned nel);
+ return -1;
+ }
- void hdestroy (void);
+ /// remove #s# from the hash table.
+ V remove (String s)
+ {
+ assert (false); // Untested routine.
+ int sz =dict_arr_.size ();
+ int i = hash (s) % sz;
+ int j = 0;
+ V retval;
+ while (j <= sz/2 && dict_arr_[i].name_ != s)
+ {
+ assert (!dict_arr_[i].free_b_);
+
+
+ j ++;
+ i = (i + j*j) % sz;
+ }
- (should be frobnified to allow multiple hashes)
+ j++;
+ int nexti = (i + j*j) % sz;
+
+ while (j <= sz/2 && !dict_arr_[i].free_b_)
+ {
+ dict_arr_[i] = dict_arr_[nexti];
+ j++;
+ i = nexti;
+ nexti = (nexti + j*j)%sz;
+ }
+
+ finish:
+ return retval;
+ }
+};
+
+/**
+ Hash table with sliding sizes.
*/
-template<class T>
-class Dictionary : public Assoc<String, T>
+template<class V>
+class Dictionary
{
+ Fixed_size_dictionary<V> * fixed_p_;
+
+ /// set size to next prime, and copy contents
+ void enlarge ()
+ {
+ Fixed_size_dictionary<V> *f = new Fixed_size_dictionary<V> (fixed_p_->size_idx_ +1);
+ for (int i=0; i < fixed_p_->dict_arr_.size(); i++)
+ {
+ if (fixed_p_->dict_arr_[i].free_b_)
+ continue;
+
+ String nm (fixed_p_->dict_arr_[i].name_);
+ int nl = f->lookup (nm);
+
+ f->dict_arr_[nl] = Dict_entry<V> (nm, fixed_p_->dict_arr_[i].value_);
+ }
+ delete fixed_p_;
+ fixed_p_ = f;
+ }
public:
-
+ Dictionary ()
+ {
+ fixed_p_ = new Fixed_size_dictionary<V> (0);
+ }
+ ~Dictionary ()
+ {
+ delete fixed_p_;
+ }
+ void operator = (Dictionary<V> const &src)
+ {
+ if (&src == this)
+ return;
+
+ delete fixed_p_;
+ fixed_p_ = new Fixed_size_dictionary<V> (*src.fixed_p_);
+ }
+ Dictionary (Dictionary<V> const &src)
+ {
+ fixed_p_ = new Fixed_size_dictionary<V> (*src.fixed_p_);
+ }
+ bool elem_b (String s) const
+ {
+ int l = fixed_p_->lookup (s);
+
+ return (l >= 0 && !fixed_p_->dict_arr_[l].free_b_) ;
+ }
+
+ /**
+ Find and return element. If #s# is not in the table, create an entry in the table, and init
+ */
+ V& elem (String s)
+ {
+ int l;
+ while ((l= fixed_p_->lookup (s)) <0)
+ {
+ enlarge ();
+ }
+
+
+ fixed_p_->dict_arr_[l].free_b_ = false;
+ fixed_p_->dict_arr_[l].name_ = s;
+ return fixed_p_->dict_arr_[l].value_;
+ }
+ V& operator [] (String k)
+ {
+ return elem (k);
+ }
+
+ V operator [] (String k) const
+ {
+ return elem (k);
+ }
+
+ V remove (String s)
+ {
+ return fixed_p_->remove (s);
+ }
+ friend class Dictionary_iter<V>;
};
+
#endif // DICTIONARY_HH
};
-\translator {
+StupidScore = \translator {
\type "Score_engraver";
- \name StupidScore;
-
- \consists "Staff_sym_engraver";
-}
+ \name Score;
+ \consists "Note_heads_engraver";
+};
/// An item which places accidentals at the start of the line
struct Key_item : Item {
- Array<int> pitch;
- Array<int> acc;
- Array<int> old_pitch;
- Array<int> old_acc;
+ Array<int> pitch_arr_;
+ Array<int> acc_arr_;
+ Array<int> old_pitch_arr_;
+ Array<int> old_acc_arr_;
+
+ // ugh. Naming
int c_position;
+ // see above.
int c0_position;
bool default_b_;
bool multi_octave_b_;
void add (const Musical_pitch&);
void add_old (int pitch, int acc);
void add_old (const Musical_pitch&);
- void read (const Key_engraver&);
+ void set (bool multi_octave_b,
+ Array<Musical_pitch> const &idx_arr,
+ Array<Musical_pitch> const &old_idx_arr);
+
void set_c_position (int);
int Key_item::calculate_position(int p, int a) const;
class Local_key_item : public Item {
public:
DECLARE_MY_RUNTIME_TYPEINFO;
- Array<Musical_pitch> accs;
+ Array<Musical_pitch> accidental_pitch_arr_;
Link_array<Item> support_items_;
int c0_position_i_;
-
Local_key_item ();
void add_support (Item*);
void add (Musical_pitch);
#include "dictionary.hh"
#include "musical-pitch.hh"
-class Notename_table : public Dictionary< Musical_pitch >{
+class Notename_table : public Dictionary<Musical_pitch>{
public:
String get_name (Musical_pitch) const;
};
Array<Slur_req*> new_slur_req_l_arr_;
Array<Slur *> slur_l_stack_;
Array<Slur*> end_slur_l_arr_;
- Direction dir_;
protected:
virtual bool do_try_request (Request*);
public:
TRANSLATOR_CLONE(Slur_engraver);
- Slur_engraver();
DECLARE_MY_RUNTIME_TYPEINFO;
};
kit_p_ = new Key_item;
kit_p_->break_priority_i_ = -1; // ugh
announce_element (Score_element_info (kit_p_,keyreq_l_));
- kit_p_->read (*this);
+ kit_p_->set (key_.multi_octave_b_, accidental_idx_arr_, old_accidental_idx_arr_);
}
}
#include "molecule.hh"
#include "paper-def.hh"
#include "lookup.hh"
-
-#include "key-engraver.hh"
+#include "musical-pitch.hh"
const int FLAT_TOP_PITCH=2; /* fes,ges,as and bes typeset in lower octave */
const int SHARP_TOP_PITCH=4; /* ais and bis typeset in lower octave */
}
void
-Key_item::read (Key_engraver const & key_grav_r)
+Key_item::set (bool multi_octave_b,
+ Array<Musical_pitch> const &idx_arr,
+ Array<Musical_pitch> const &old_idx_arr)
{
- multi_octave_b_ = key_grav_r.key_.multi_octave_b_;
- const Array<Musical_pitch> &idx_arr = key_grav_r.accidental_idx_arr_;
+ multi_octave_b_ =multi_octave_b;
+
for (int i = 0; i < idx_arr.size(); i++)
{
Musical_pitch m_l =idx_arr[i];
if (multi_octave_b_)
- add (m_l);
+ add (m_l);
else
add (m_l.notename_i_, m_l.accidental_i_);
}
- const Array<Musical_pitch> &old_idx_arr = key_grav_r.old_accidental_idx_arr_;
+
for (int i = 0 ; i< old_idx_arr.size(); i++)
{
Musical_pitch m_l =old_idx_arr[i];
void
Key_item::add (int p, int a)
{
- pitch.push (p);
- acc.push (a);
+ pitch_arr_.push (p);
+ acc_arr_.push (a);
}
void
Key_item::add (const Musical_pitch& pitch_r)
{
- pitch.push (pitch_r.steps());
- acc.push (pitch_r.accidental_i_);
+ pitch_arr_.push (pitch_r.steps());
+ acc_arr_.push (pitch_r.accidental_i_);
}
void
Key_item::add_old (int p, int a)
{
- old_pitch.push (p);
- old_acc.push (a);
+ old_pitch_arr_.push (p);
+ old_acc_arr_.push (a);
}
void
Key_item::add_old (const Musical_pitch& pitch_r)
{
- old_pitch.push (pitch_r.steps());
- old_acc.push (pitch_r.accidental_i_);
+ old_pitch_arr_.push (pitch_r.steps());
+ old_acc_arr_.push (pitch_r.accidental_i_);
}
int
int j;
if ((break_status_dir_ == LEFT || break_status_dir_ == CENTER)
- || old_pitch.size ())
+ || old_pitch_arr_.size ())
{
- for (int i =0; i < old_pitch.size(); i++)
+ for (int i =0; i < old_pitch_arr_.size(); i++)
{
- for (j =0; (j < pitch.size()) && (old_pitch[i] != pitch[j]); j++)
+ for (j =0; (j < pitch_arr_.size())
+ && (old_pitch_arr_[i] != pitch_arr_[j]); j++)
;
- if (j == pitch.size()
- || (old_pitch[i] == pitch[j] && old_acc[i] != acc[j]))
+ if (j == pitch_arr_.size()
+ || (old_pitch_arr_[i] == pitch_arr_[j]
+ && old_acc_arr_[i] != acc_arr_[j]))
{
Atom a =lookup_l ()->accidental (0);
- a.translate_axis (calculate_position(old_pitch[i], old_acc[i]) * inter, Y_AXIS);
+ a.translate_axis (calculate_position(old_pitch_arr_[i], old_acc_arr_[i]) * inter, Y_AXIS);
Molecule m (a);
output->add_at_edge (X_AXIS, RIGHT, m);
}
output->add_at_edge (X_AXIS, RIGHT, lookup_l()->fill (Box(x,y)));
}
- for (int i =0; i < pitch.size(); i++)
+ for (int i =0; i < pitch_arr_.size(); i++)
{
- Atom a =lookup_l ()->accidental (acc[i]);
- a.translate_axis (calculate_position(pitch[i], acc[i]) * inter, Y_AXIS);
+ Atom a =lookup_l ()->accidental (acc_arr_[i]);
+ a.translate_axis (calculate_position(pitch_arr_[i], acc_arr_[i]) * inter, Y_AXIS);
Molecule m (a);
output->add_at_edge (X_AXIS, RIGHT, m);
}
- if (pitch.size())
+ if (pitch_arr_.size())
{
Molecule m (lookup_l ()->fill (Box (
Interval (0, paper()->note_width ()),
Local_key_item::Local_key_item ()
{
- c0_position_i_ = 0;
+ c0_position_i_ = 0;
}
void
void
Local_key_item::add (Musical_pitch p)
{
- for (int i=0; i< accs.size(); i++)
- if (!Musical_pitch::compare (p, accs[i]))
+ for (int i=0; i< accidental_pitch_arr_.size(); i++)
+ if (!Musical_pitch::compare (p, accidental_pitch_arr_[i]))
return;
- accs.push (p);
+ accidental_pitch_arr_.push (p);
}
void
Local_key_item::do_pre_processing()
{
- accs.sort (Musical_pitch::compare);
+ accidental_pitch_arr_.sort (Musical_pitch::compare);
}
Molecule*
Molecule *octave_mol_p = 0;
int lastoct = -100;
- for (int i = 0; i < accs.size(); i++)
+ for (int i = 0; i < accidental_pitch_arr_.size(); i++)
{
// do one octave
- if (accs[i].octave_i_ != lastoct)
+ if (accidental_pitch_arr_[i].octave_i_ != lastoct)
{
if (octave_mol_p)
{
}
octave_mol_p= new Molecule;
}
- lastoct = accs[i].octave_i_;
- Real dy = (accs[i].notename_i_ + c0_position_i_) * paper()->internote_f ();
- Atom a (lookup_l ()->accidental (accs[i].accidental_i_));
+
+ lastoct = accidental_pitch_arr_[i].octave_i_;
+ Real dy =
+ (c0_position_i_ + accidental_pitch_arr_[i].notename_i_)
+ * paper()->internote_f ();
+ Atom a (lookup_l ()->accidental (accidental_pitch_arr_[i].accidental_i_));
a.translate_axis (dy, Y_AXIS);
Molecule m(a);
delete octave_mol_p;
}
- if (accs.size())
+ if (accidental_pitch_arr_.size())
{
Box b(Interval (0, paper()->internote_f ()), Interval (0,0));
Molecule m (lookup_l ()->fill (b));
#endif
}
-int
-main_prog (int argc, char **argv)
+
+void
+setup_paths ()
{
- guile_init ();
-
// facilitate binary distributions
char const *env_lily = getenv ("LILYPONDPREFIX");
String prefix_directory;
textdomain (name.ch_C ());
#endif
- identify ();
- call_constructors ();
- debug_init (); // should be first
-
global_path.add ("");
// must override (come before) "/usr/local/share/lilypond"!
char const *env_sz = getenv ("LILYINCLUDE");
global_path.add (String (DIR_DATADIR) + "/ly/");
global_path.add (String (DIR_DATADIR) + "/afm/");
+}
- Getopt_long oparser (argc, argv,theopts);
- String init_str;
+
+int
+main_prog (int argc, char **argv)
+{
+ guile_init ();
+ identify ();
+ call_constructors ();
+ debug_init (); // should be first
+
+ setup_paths ();
+
+ String init_str;
String outname_str;
+
+ Getopt_long oparser (argc, argv,theopts);
while (Long_option_init const * opt = oparser ())
{
switch (opt->shortname)
}
void
-Music_iterator::inherit_info(Music_iterator const *parent)
+Music_iterator::inherit_info(Music_iterator const *)
{
}
#include "notename-table.hh"
#include "pointer.tcc"
#include "musical-request.hh"
-#include "assoc-iter.hh"
+#include "dictionary-iter.hh"
String
Notename_table::get_name (Musical_pitch m) const
{
- for (Assoc_iter<String, Musical_pitch> ai (*this); ai.ok (); ai++)
+ for (Dictionary_iter<Musical_pitch> ai (*this); ai.ok (); ai++)
{
if (ai.val () == m)
return ai.key ();
#include "identifier.hh"
#include "main.hh"
#include "scope.hh"
-#include "assoc.hh"
-#include "assoc-iter.hh"
+#include "dictionary-iter.hh"
Paper_def::Paper_def ()
{
Paper_def::ps_output_settings_str () const
{
String s ("\n ");
- for (Assoc_iter<String,Identifier*> i (*scope_p_); i.ok (); i++)
+ for (Dictionary_iter<Identifier*> i (*scope_p_); i.ok (); i++)
s += String ("/mudelapaper") + i.key ()
+ "{" + i.val ()->str () + "} bind def\n";
s += *scope_p_->elem ("pssetting")->access_String ();
Paper_def::tex_output_settings_str () const
{
String s ("\n ");
- for (Assoc_iter<String,Identifier*> i (*scope_p_); i.ok (); i++)
+ for (Dictionary_iter<Identifier*> i (*scope_p_); i.ok (); i++)
s += String ("\\def\\mudelapaper") + i.key ()
+ "{" + i.val ()->str () + "}\n";
s += *scope_p_->elem ("texsetting")->access_String ();
symtable_body:
{ $$ = new Symtable; }
| symtable_body STRING symboldef {
- $$->add (*$2, *$3);
+ $$->elem (*$2) = *$3;
delete $2;
delete $3;
}
*/
#include "scope.hh"
-#include "assoc-iter.hh"
+#include "dictionary-iter.hh"
#include "debug.hh"
#include "identifier.hh"
Scope::print () const
{
bool init_b = false; // ugh
- for (Assoc_iter<String,Identifier*> ai (*this); ai.ok(); ai++)
+ for (Dictionary_iter<Identifier*> ai (*this); ai.ok(); ai++)
{
if (ai.val()->init_b_ == init_b)
{
Scope::~Scope ()
{
- for (Assoc_iter<String,Identifier*> ai (*this); ai.ok(); ai++)
+ for (Dictionary_iter<Identifier*> ai (*this); ai.ok(); ai++)
{
DOUT << "deleting: " << ai.key() << '\n';
delete ai.val ();
Scope::Scope (Scope const&s)
: Dictionary<Identifier*> (s)
{
- for (Assoc_iter<String,Identifier*> ai (s); ai.ok(); ai++)
+ for (Dictionary_iter<Identifier*> ai (s); ai.ok(); ai++)
{
(*this)[ai.key ()] = ai.val ()->clone ();
}
}
}
-/*
- abracadabra
- */
-Slur_engraver::Slur_engraver()
-{
- dir_ =CENTER;
-}
void
Slur_engraver::do_process_requests()
{
{
Scalar dir (get_property ("slurydirection"));
Scalar dir2 (get_property ("ydirection"));
- if (dir.length_i ())
- {
- dir_ = (Direction) sign (int(dir));
- }
- else if (dir2.length_i ())
- dir_ = (Direction) sign (int (dir2));
+
+ Direction slurdir = CENTER;
+ if (dir.length_i () && dir.isnum_b ())
+ slurdir = (Direction) sign (int(dir));
+ else if (dir2.length_i () && dir2.isnum_b ())
+ slurdir = (Direction) sign (int (dir2));
for (int i = 0; i < end_slur_l_arr_.size(); i++)
{
- if (dir_)
- end_slur_l_arr_[i]->dir_ = dir_;
+ end_slur_l_arr_[i]->dir_ = slurdir;
typeset_element (end_slur_l_arr_[i]);
}
end_slur_l_arr_.clear();
#include "debug.hh"
#include "real.hh"
#include "atom.hh"
-#include "assoc.hh"
-#include "assoc-iter.hh"
+#include "dictionary-iter.hh"
#include "symtable.hh"
Symtables::Symtables()
{
font_ = s.font_;
font_path_ = s.font_path_;
- for (Assoc_iter<String, Symtable*> i (s); i.ok(); i++)
+ for (Dictionary_iter< Symtable*> i (s); i.ok(); i++)
{
add (i.key(), new Symtable (*i.val ()));
}
Symtables::~Symtables()
{
- for (Assoc_iter<String, Symtable*> i (*this); i.ok(); i++)
+ for (Dictionary_iter< Symtable*> i (*this); i.ok(); i++)
{
delete i.val();
}
void
Symtables::print() const
{
- for (Assoc_iter<String, Symtable*> i (*this); i.ok(); i++)
+ for (Dictionary_iter<Symtable*> i (*this); i.ok(); i++)
{
DOUT << "table \'" << i.key () << "\' {\n";
i.val()->print ();
void
Symtable::print() const
{
- for (Assoc_iter<String, Atom> i (*this); i.ok(); i++)
+ for (Dictionary_iter<Atom> i (*this); i.ok(); i++)
{
DOUT << "\'" << i.key() << "\'->" << i.val ().str () << '\n';
}
Symtables::add (String s, Symtable*p)
{
p-> id_str = s;
- Dictionary<Symtable*>::add (s,p);
+ Dictionary<Symtable*>::elem (s) = p;
}
{
Scalar tie_dir (get_property ("tieYDirection"));
Scalar y_dir (get_property ("ydirection"));
- Direction dir;
- if (tie_dir.length_i ())
- dir = (Direction) sign (int(tie_dir));
- else if (y_dir.length_i ())
- dir = (Direction) sign (int (y_dir));
-
- end_tie_p_arr_[i]->dir_ = dir;
- typeset_element (end_tie_p_arr_[i]);
+ Direction dir = CENTER;
+ if (tie_dir.length_i () && tie_dir.isnum_b ())
+ dir = (Direction) sign (int (tie_dir));
+ else if (y_dir.length_i () && y_dir.isnum_b ())
+ dir = (Direction) sign (int (y_dir));
+
+ end_tie_p_arr_[i]->dir_ = dir;
+ typeset_element (end_tie_p_arr_[i]);
}
end_tie_p_arr_ = tie_p_arr_;
void
Translator_group::check_removal()
{
- for (int i =0; i < group_l_arr ().size();)
+ Link_array<Translator_group> groups (group_l_arr ());
+
+ for (int i =0; i < groups.size(); i++)
{
- group_l_arr ()[i]->check_removal();
- if (group_l_arr ()[i]->removable_b())
- terminate_translator (group_l_arr ()[i]);
- else
- i++;
+ groups[i]->check_removal();
+ if (groups[i]->removable_b())
+ terminate_translator (groups[i]);
}
}
bool
Translator_group::removable_b() const
{
- return !(iterator_count_ || group_l_arr ().size());
+ for (PCursor<Translator*> i (trans_p_list_.top ()); i.ok (); i++)
+ {
+ if (i->access_Translator_group ())
+ return false;
+ }
+
+ return !iterator_count_;
}
Translator_group *
{
if (is_alias_b (n) && (id_str_ == id || id.empty_b ()))
return this;
+
+ Link_array<Translator_group> groups (group_l_arr ());
Translator_group* r = 0;
- for (int i =0; !r && i < group_l_arr ().size(); i++)
+ for (int i =0; !r && i < groups.size(); i++)
{
- r = group_l_arr ()[i]->find_existing_translator_l (n,id);
+ r = groups[i]->find_existing_translator_l (n,id);
}
return r;
Translator_group::do_try_request (Request* req_l)
{
bool hebbes_b =false;
- for (int i =0; !hebbes_b && i < nongroup_l_arr ().size() ; i++)
- hebbes_b =nongroup_l_arr ()[i]->try_request (req_l);
+
+ Link_array<Translator> nongroups (nongroup_l_arr ());
+
+ for (int i =0; !hebbes_b && i < nongroups.size() ; i++)
+ hebbes_b =nongroups[i]->try_request (req_l);
if (!hebbes_b && daddy_trans_l_)
hebbes_b = daddy_trans_l_->try_request (req_l);
return hebbes_b ;
Translator*
Translator_group::get_simple_translator (char const *type) const
{
- for (int i=0; i < nongroup_l_arr ().size(); i++)
+ Link_array<Translator> nongroups (nongroup_l_arr ());
+ for (int i=0; i < nongroups.size(); i++)
{
- if (nongroup_l_arr ()[i]->name() == type)
- return nongroup_l_arr ()[i];
+ if (nongroups[i]->name() == type)
+ return nongroups[i];
}
if (daddy_trans_l_)
return daddy_trans_l_->get_simple_translator (type);
.PRECIOUS: $(outdir)/%.dvi
$(outdir)/%.dvi: %.ly
- $(PYTHON) $(depth)/scripts/ly2dvi32.py -o $(outdir) $<
+ $(PYTHON) $(depth)/scripts/ly2dvi.py -o $(outdir) $<
-mv $(basename $<).midi $(outdir)
$(outdir)/%.dvi: %.fly
- $(PYTHON) $(depth)/scripts/ly2dvi32.py -o $(outdir) $<
+ $(PYTHON) $(depth)/scripts/ly2dvi.py -o $(outdir) $<
-mv $(basename $<).midi $(outdir)
TEXINSTALL=$(MAKE) INSTALLATION_OUT_DIR=$(datadir)/tex/ depth=.. INSTALLATION_OUT_FILES="$(TEXTABLES)" -f $(stepdir)/install-outfiles.sub.make $@
-AFMINSTALL=$(MAKE) depth=.. INSTALLATION_OUT_DIR=$(datadir)/ INSTALLATION_OUT_FILES="$(AFM_FILES)" -f $(stepdir)/install-outfiles.sub.make $@
+AFMINSTALL=$(MAKE) depth=.. INSTALLATION_OUT_DIR=$(datadir)/afm/ INSTALLATION_OUT_FILES="$(AFM_FILES)" -f $(stepdir)/install-outfiles.sub.make $@
-LYINSTALL=$(MAKE) depth=.. INSTALLATION_OUT_DIR=$(datadir) INSTALLATION_OUT_FILES="$(LYTABLES)" -f $(stepdir)/install-outfiles.sub.make $@
+LYINSTALL=$(MAKE) depth=.. INSTALLATION_OUT_DIR=$(datadir)/ly/ INSTALLATION_OUT_FILES="$(LYTABLES)" -f $(stepdir)/install-outfiles.sub.make $@
localinstall: $(ALL_GEN_FILES)
$(TEXINSTALL)
import __main__
import getopt
from string import *
-import regex
-import regsub
+import re
+
import time
-mudela_version_re_str ='\\\\version *\"\(.*\)\"'
-mudela_version_re = regex.compile(mudela_version_re_str)
+mudela_version_re_str = '\\\\version *\"(.*)\"'
+mudela_version_re = re.compile(mudela_version_re_str)
def program_id ():
return '%s version %s' %(program_name, version);
def guess_mudela_version(filename):
s = gulp_file (filename)
- if mudela_version_re.search(s) <> -1:
- return mudela_version_re.group(1)
+ m = mudela_version_re.search (s)
+ if m:
+ return m.group(1)
else:
return ''
def conv (lines):
found =0
for x in lines:
- if regex.search ('\\\\octave', x) <> -1:
+ if re.search ('\\\\octave', x):
found = 1
break
if found:
def conv (lines):
newlines = []
for x in lines:
- x = regsub.gsub ('\\\\textstyle\\([^;]+\\);',
+ x = re.sub ('\\\\textstyle([^;]+);',
'\\\\property Lyrics . textstyle = \\1', x)
- x = regsub.gsub ('\\\\key\\([^;]+\\);', '\\\\accidentals \\1;', x)
+ x = re.sub ('\\\\key([^;]+);', '\\\\accidentals \\1;', x)
newlines.append (x)
return newlines
def conv (lines):
newlines = []
for x in lines:
- x = regsub.gsub ('\\\\musical_pitch',
+ x = re.sub ('\\\\musical_pitch',
'\\\\musicalpitch',x)
- x = regsub.gsub ('\\\\meter',
+ x = re.sub ('\\\\meter',
'\\\\time',x)
newlines.append (x)
return newlines
def conv (lines):
newlines = []
for x in lines:
- x = regsub.gsub ('\\\\accidentals',
- '\\\\keysignature',x)
- x = regsub.gsub ('specialaccidentals *= *1',
+ x = re.sub ('\\\\accidentals',
+ '\\\\keysignature',x)
+ x = re.sub ('specialaccidentals *= *1',
'keyoctaviation = 0',x)
- x = regsub.gsub ('specialaccidentals *= *0',
+ x = re.sub ('specialaccidentals *= *0',
'keyoctaviation = 1',x)
newlines.append (x)
return newlines
def conv(lines):
found = 0
for x in lines:
- if regex.search ('\\\\header', x) <> -1:
+ if re.search ('\\\\header', x):
found = 1
break
if found:
def conv(lines):
newlines =[]
for x in lines:
- x = regsub.gsub ('\\\\melodic', '\\\\notes',x)
+ x = re.sub ('\\\\melodic', '\\\\notes',x)
newlines.append (x)
return newlines
def conv(lines):
newlines =[]
for x in lines:
- x = regsub.gsub ('default_paper *=', '',x)
- x = regsub.gsub ('default_midi *=', '',x)
+ x = re.sub ('default_paper *=', '',x)
+ x = re.sub ('default_midi *=', '',x)
newlines.append (x)
return newlines
def conv(lines):
newlines =[]
for x in lines:
- x = regsub.gsub ('ChoireStaff', 'ChoirStaff',x)
- x = regsub.gsub ('\\output', 'output = ',x)
+ x = re.sub ('ChoireStaff', 'ChoirStaff',x)
+ x = re.sub ('\\output', 'output = ',x)
newlines.append (x)
return newlines
if 1:
def conv(lines):
newlines =[]
- found = 0
+ found = None
for x in lines:
- found = regex.search ('[a-zA-Z]+ = *\\translator',x) <> -1
+ found = re.search ('[a-zA-Z]+ = *\\translator',x)
newlines.append (x)
if found: break
if found:
def conv(lines):
newlines =[]
for x in lines:
- x = regsub.gsub ('\\\\lyric', '\\\\lyrics',x)
+ x = re.sub ('\\\\lyric', '\\\\lyrics',x)
newlines.append (x)
return newlines
for x in lines:
if last_conversion:
- x = regsub.sub (mudela_version_re_str, '\\version \"%s\"' % tup_to_str (last_conversion), x)
+ x = re.sub (mudela_version_re_str, '\\\\version \"%s\"' % tup_to_str (last_conversion), x)
outfile.write(x)
class UnknownVersion:
os.rename (infile_name + '.NEW', infile_name)
sys.stderr.write ('\n')
+ sys.stderr.flush ()
edit = 0
to_version = ()
--- /dev/null
+#!/bin/sh
+#
+# Script to make a LaTeX file for Lilypond
+#
+# Written by Jan Arne Fagertun <Jan.A.Fagertun@energy.sintef.no>
+# Sat Nov 22 22:26:43 CET 1997
+#
+# $Id: ly2dvi-old.sh,v 1.1 1998/10/19 10:09:06 fred Exp $
+#
+# Original LaTeX file made by Mats Bengtsson, 17/8 1997
+#
+
+VERSION="0.12.jcn1"
+NAME=ly2dvi.sh
+IDENTIFICATION="$NAME $VERSION"
+NOW=`date`
+echo "$IDENTIFICATION" 1>&2
+
+# TODO:
+# prevent orphaned "Lily is here" strings
+
+# NEWS
+
+# 0.12.jcn1
+# - mudelaDefs really fixed (sorry, PC)
+
+# 0.12
+# - -S/--sourcedir switch
+
+#
+#0.11.jcn3
+# - mudelaDefs fixes, (thanks PC)
+#0.11.jcn2
+# - pass -I, --include to Lily
+# - bf: split $LILYINCLUDE and try all dirs
+# - bf: geometry left/top
+#
+#0.11.pc
+# - fix backslash gobbling, reduce number of separate processes used
+# - require readable rc files, allow rc file in /usr/local/share/lilypond/lilyrc
+# - use latex path, not tex path
+# - Don't override if kpsepath returns non-NULL
+# - Don't clobber x.tex if it wasn't created by ly2dvi
+#
+#
+#0.11.jcn1
+# - find .fly files too
+#
+#0.11.hwn1
+# - height vs heigth
+# - robustification: give \nonstopmode as LaTeX arg; no hanging if no TeX file.
+# - robustification: notice failed cp.
+
+#0.11
+# - more papersizes (thanks Han-Wen) - don't expect LaTeX to accept all...
+# - -W,--Width= : set paper width (points)
+# - -H,--Height= : set paper height (points)
+# - -H and -W is used only when an unknown papersize is to be specified,
+# and has to be combined with a papersize option known to LaTeX
+#NB! - -F,--headers= : name of additional LaTeX headers input file.
+#NB! Changed from -H to -F
+# - -d,--dependencies : passed to lilypond
+
+
+#0.10.jcn1
+# - HEIGHT -> HEIGHT
+# - vertical margins (for a4), same on both sides
+# - textheight from lilypond output file (mudelapapertextheight)
+# - piece titling
+# - mudelapiece, mudelaopus
+#
+#0.10
+# - -K,--keeplilypond : Keep lilypond output files (default delete)
+# - -k,--keeply2dvi : Keep ly2dvi output files (default delete)
+# - -L,--landscape : Set landscape orientation
+# - -N,--nonumber : Turn off page numbering (\pagestyle{empty})
+# - Could not reinsert "\usepackage[T1]{fontenc}" because
+# "los-toros" won't work with it
+# - Ekstra LaTeX headers from input file
+#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
+# variable orientation="landscape";
+# - Paper width and height put into variables (only A4!)
+# - Adjusted top margin to default.....
+#
+#TODO
+# - Include more papersizes.
+# - Manual page.......
+# 0.6.jaf2
+# - LILYINCLUDE update
+#
+# 0.6.hwn1
+# - handle LILYINCLUDE
+# - --output
+#
+# 0.6
+# - Source rc-files, if present. Files are:
+# /usr/local/share/lilyrc /etc/lilyrc $HOME/.lilyrc ./.lilyrc
+# - tee output from Lilypond
+# - 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
+# is replaced by grabbing output file names from Lilypond.
+# = Detects multiple output files - adds them when running
+# LaTeX.
+# - Works with multiple input files - no matter if they are
+# (a mix of) input to or output from Lilypond.
+#
+#TODO
+# - Still no margins handling.
+# - We have to discuss how to handle multiple output files
+# from Lilypond - 'ly2dvi standchen' gives a rather odd
+# result....
+
+# 0.4.1
+# - Always exit after printing help info
+# 0.4
+# - Changes to ensure for more strict grep'ing of parameters
+# Thanks to from G.B.Stott@bolton.ac.uk
+# - More efficient use of sed -e 's///' -e 's///'
+# Thanks to Johan Vromans <jvromans@squirrel.nl> and GBS
+# - Ask tex for location of titledefs.tex (Thanks to JV)
+# - Accept only exact match of "\def\mudelacomposer{"
+# (or whatever mudela* defined in titledefs.tex)
+# - Even more efficient use of sed (Thanks to JV)
+# - Default file name for single output file implemented.
+# - Moved help into function - finally included from 0.1.jcn1
+#
+#TODO
+# - Still doesn't handle \include
+# - The Q&D for finding output file name from the sequence of
+# \paper \output \midi \output really needs to be looked at.
+# I have improved it a lot, but it's only capable of finding
+# one (the last) file name.
+# Well, I have to rewrite this entirely to handle \include,
+# then I can fix it.
+# - Still no margins handling.
+#
+#WARNING
+# - Some lines of output from lilypond do NOT start
+# at first character position, therefore I have removed "^"
+# in sed'ing and grep'ing.
+
+# 0.3.hwn1
+# - add "Creator: " line to output
+#
+# 0.3
+# - multiple input files to make score from several files
+# (extra files assumed to be Lilypond output)
+# - cp dvi-file instead of mv, to allow for xdvi reload
+# - check for illegal long options
+# - put in pt in text width, if not given
+# - put in \nonstopmode in LaTeX file
+# - restored LaTeX exit value check
+
+# 0.2.1
+# - temporarily omit LaTeX exit value check
+# - remove ALL temporary files
+
+# 0.2
+# - fix for solaris - included from 0.1.jcn1
+# - long option hack - included from 0.1.jcn1 - modified
+# - moved help into function - NOT included from 0.1.jcn1 yet
+# - various improvements - included from 0.1.jcn1
+# - find mudela definitions from titledefs.tex
+# - find papersize from lilypond output file (mudelapapersize),
+# overridden by option '-p size' or '--papersize=size'
+# - option -l lang or --language=lang overrides
+# lilypond output file definition (mudelalanguage)
+# - textwidth from lilypond output file (mudelapaperlinewidth)
+
+# 0.1.jcn1
+# - fix for solaris
+# - long option hack
+# - moved help into function
+
+#
+# Clean up
+#
+cleanup() {
+ if [ "$KEEP_LY2DVI_OUTPUT" != "Y" ]
+ then
+ [ -n "$LatF" -a -f "$LatF" ] && rm -f $LatF
+ [ -n "$LOGFILE" -a -f "$LOGFILE" ] && rm -f $LOGFILE
+ [ -n "$FN" ] && rm -f $FN.*
+ for F in *$$* $TMP/*$$*
+ do
+ rm -f $F
+ done
+ fi
+ if [ "$KEEP_LILY_OUTPUT" != "Y" ]
+ then
+ for F in $LILY_OUTPUT_FILES
+ do
+ [ -f $F ] && rm -f $F
+ done
+ fi
+}
+
+#
+# print usage
+#
+help() {
+ cat << EOF
+Generate dvi file from mudela or lilypond output
+Usage: $0 [OPTION]... [FILE]...
+
+Options:
+ -D,--debug increase verbosity
+ -F,--headers= name of additional LaTeX headers file
+ -H,--Height= set paper height (points) (see manual page)
+ -I,--include=DIR add DIR to search path of LilyPond
+ -K,--keeplilypond keep lilypond output files
+ -L,--landscape set landscape orientation
+ -N,--nonumber switch off page numbering
+ -O,--orientation= set orientation (obsolete - use -L instead)
+ -W,--Width= set paper width (points) (see manual page)
+ -d,--dependencies tell lilypond make a dependencies file
+ -h,--help this help text
+ -k,--keeply2dvi keep ly2dvi output files
+ -l,--language= give LaTeX language (babel)
+ -o,--output= set output directory
+ -p,--papersize= give LaTeX papersize (eg. a4)
+ -s,--separate run all files separately through LaTeX
+ -S,--sourcedir set sourcedir
+
+ files may be (a mix of) input to or output from lilypond(1)
+EOF
+}
+
+
+#
+# SVr4 echo swallows backslashes, and there's no way to turn it off.
+# Therefore use Echo whenever backslashes may be important.
+# printf is in the posix.2 standard -- which means it's in
+# all modern shells.
+#
+Echo() {
+ printf "%s\n" "$@"
+}
+
+#
+setPaperZize() {
+case "$PAPERSIZE" in
+ a0*)
+ PWIDTH=2389
+ PHEIGHT=3381
+ PAPERSIZE=a0paper
+ ;;
+ a1|a1p*)
+ PWIDTH=1690
+ PHEIGHT=2389
+ PAPERSIZE=a1paper
+ ;;
+ a2*)
+ PWIDTH=1194
+ PHEIGHT=1690
+ PAPERSIZE=a2paper
+ ;;
+ a3*)
+ PWIDTH=845
+ PHEIGHT=1194
+ PAPERSIZE=a3paper
+ ;;
+ a4*)
+ PWIDTH=597
+ PHEIGHT=845
+ PAPERSIZE=a4paper
+ ;;
+ a5*)
+ PWIDTH=423
+ PHEIGHT=597
+ PAPERSIZE=a5paper
+ ;;
+ a6*)
+ PWIDTH=298
+ PHEIGHT=423
+ PAPERSIZE=a6paper
+ ;;
+ a7*)
+ PWIDTH=211
+ PHEIGHT=298
+ PAPERSIZE=a7paper
+ ;;
+ a8*)
+ PWIDTH=305
+ PHEIGHT=211
+ PAPERSIZE=a8paper
+ ;;
+ a9*)
+ PWIDTH=105
+ PHEIGHT=305
+ PAPERSIZE=a9paper
+ ;;
+ a10*)
+ PWIDTH=74
+ PHEIGHT=105
+ PAPERSIZE=a10paper
+ ;;
+ b0*)
+ PWIDTH=2847
+ PHEIGHT=4023
+ PAPERSIZE=b0paper
+ ;;
+ b1*)
+ PWIDTH=2012
+ PHEIGHT=2847
+ PAPERSIZE=b1paper
+ ;;
+ b2*)
+ PWIDTH=1423
+ PHEIGHT=2012
+ PAPERSIZE=b2paper
+ ;;
+ b3*)
+ PWIDTH=1006
+ PHEIGHT=1423
+ PAPERSIZE=b3paper
+ ;;
+ b4*)
+ PWIDTH=712
+ PHEIGHT=1006
+ PAPERSIZE=b4paper
+ ;;
+ b5*)
+ PWIDTH=503
+ PHEIGHT=712
+ PAPERSIZE=b5paper
+ ;;
+ archA)
+ PWIDTH=650
+ PHEIGHT=867
+ ;;
+ archB)
+ PWIDTH=867
+ PHEIGHT=1301
+ ;;
+ archC)
+ PWIDTH=1301
+ PHEIGHT=1734
+ ;;
+ archD)
+ PWIDTH=1734
+ PHEIGHT=2602
+ ;;
+ archE)
+ PWIDTH=2602
+ PHEIGHT=3469
+ ;;
+ flsa|flse)
+ PWIDTH=614
+ PHEIGHT=940
+ ;;
+ halfletter)
+ PWIDTH=397
+ PHEIGHT=614
+ ;;
+ ledger)
+ PWIDTH=1229
+ PHEIGHT=795
+ ;;
+ legal)
+ PWIDTH=614
+ PHEIGHT=1012
+ ;;
+ letter)
+ PWIDTH=614
+ PHEIGHT=795
+ ;;
+ note)
+ PWIDTH=542
+ PHEIGHT=723
+ ;;
+ *)
+ echo ""
+ echo $0": unknown papersize -- "$PAPERSIZE
+ echo ""
+ ;;
+esac
+}
+
+doRcFiles()
+{
+#
+# RC-files ?
+#
+for D in /usr/local/share/ /usr/local/share/lilypond/ /etc/ $HOME/. ./.
+do
+ RCfile=$D"lilyrc"
+ [ -r $RCfile ] && . $RCfile
+done
+fORI=$ORIENTATION
+fLNG=$LANGUAGE
+fPSZ=$PAPERSIZE
+fLHF=$LATEXHF
+unset ORIENTATION LANGUAGE PAPERSIZE LATEXHF
+}
+
+
+
+#
+# Trap function (cleanup)
+#
+
+
+
+trap cleanup 0 9 15
+
+
+
+#
+# Various defaults
+#
+[ -z "$TMP" ] && TMP=/tmp
+if [ ! -d $TMP ]
+then
+ $debug_echo $IDENTIFICATION": temporary directory "$TMP" not found, set to /tmp"
+ TMP=/tmp
+fi
+LOGFILE=$TMP/lilylog.$$ # Logfile for lilypond
+PAPERSIZE=a4 # Default papersize name
+PWIDTH=597 # Default paperwidth
+PHEIGHT=845 # Default paperheight
+PNUM="%" # Page numbering on
+LILYOPTS="" # Options to lilypond
+SOURCEDIR=""
+LILYPOND_EXECUTABLE=lilypond
+doRcFiles
+
+
+
+# Keywords defined in titledefs.tex
+#
+TF="`kpsewhich -n latex tex titledefs.tex`"
+MU_DEF=""
+if [ -r "${TF:=/usr/local/share/texmf/tex/lilypond/titledefs.tex}" ]
+then
+ MU_DEF=`sed -n -e 's/.*newcommand\*{.\(mudela[^}]*\)}.*$/\1/p' "$TF"`
+fi
+
+: "${MU_DEF:=mudelatitle mudelasubtitle mudelacomposer \
+ mudelameter mudelaopus mudelaarranger mudelapiece \
+ mudelapoet mudelainstrument \
+ }"
+
+#
+# debugging
+#
+debug_echo=:
+#
+# All files in one LaTeX run
+#
+SEPFILE=N
+#
+# Find command line options and switches
+#
+# "x:" x takes argument
+#
+switches="DF:H:I:KLNO:W:dhkl:o:p:S:s\?"
+options=""
+#
+# ugh, "\-" is a hack to support long options
+# while getopts \-:$options$switches O
+# must be in double quotes for bash-2.0
+while getopts "\-:$options$switches" O
+do
+ $debug_echo "O: \`$O'"
+ $debug_echo "arg: \`$OPTARG'"
+ case $O in
+ D )
+ [ $debug_echo = echo ] && set -x
+ debug_echo=echo
+ ;;
+ F )
+ LATEXHF=$OPTARG
+ ;;
+ H )
+ PHEIGHT=$OPTARG
+ ;;
+ I )
+ LILYOPTS="$LILYOPTS -I $OPTARG"
+ LILYINCLUDE="$LILYINCLUDE:$OPTARG"
+ ;;
+ K )
+ KEEP_LILY_OUTPUT=Y
+ ;;
+ L )
+ ORIENTATION=landscape
+ ;;
+ O )
+ ORIENTATION=$OPTARG
+ ;;
+ N )
+ PNUM="\pagestyle{empty}"
+ ;;
+ W )
+ PWIDTH=$OPTARG
+ ;;
+ d )
+ LILYOPTS=$LILYOPTS" -d"
+ ;;
+ h )
+ help;
+ exit 0
+ ;;
+ k )
+ KEEP_LY2DVI_OUTPUT=Y
+ ;;
+ l )
+ LANGUAGE=$OPTARG
+ ;;
+ o )
+ OUTPUTDIR=$OPTARG
+ ;;
+ p )
+ PAPERSIZE=$OPTARG
+ ;;
+ s )
+ SEPFILE=Y
+ ;;
+ S )
+ SOURCEDIR=$OPTARG
+ ;;
+ \? )
+ help;
+ exit -1
+ ;;
+ # a long option!
+ -)
+ $debug_echo "long option: \`$OPTARG'"
+ case "$OPTARG" in
+ He*|-He*)
+ PHEIGHT"`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"=
+ ;;
+ W*|-W*)
+ PWIDTH="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"
+ ;;
+ dep*|-dep*)
+ LILYOPTS="$LILYOPTS -d"
+ ;;
+ d*|-d*)
+ [ $debug_echo = echo ] && set -x
+ debug_echo=echo
+ ;;
+ hea*|-hea*)
+ LATEXHF="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"
+ ;;
+ h*|-h*)
+ help;
+ exit 0
+ ;;
+ i*|-i*)
+ dir="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"
+ LILYOPTS="$LILYOPTS --include=$dir"
+ LILYINCLUDE="$LILYINCLUDE:$dir"
+ ;;
+ keepli*|-keepli*)
+ KEEP_LILY_OUTPUT=Y
+ ;;
+ k*|-k*)
+ KEEP_LY2DVI_OUTPUT=Y
+ ;;
+ land*|-land*)
+ ORIENTATION=landscape
+ ;;
+ lang*|-lang*)
+ LANGUAGE="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"
+ ;;
+ n*|-n*)
+ PNUM="\pagestyle{empty}"
+ ;;
+ or*|-or*)
+ ORIENTATION="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"
+ ;;
+ ou*|-ou*)
+ OUTPUTDIR="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"
+ ;;
+ p*|-p*)
+ PAPERSIZE="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"
+ ;;
+ separa*|-sep*)
+ SEPFILE=Y
+ ;;
+ sourcedir*|-sourcedir*)
+ SOURCEDIR=$OPTARG
+ ;;
+ *|-*)
+ echo "$0: illegal option -- \"$OPTARG\""
+ help;
+ exit -1
+ ;;
+ esac
+ esac
+done
+shift `expr $OPTIND - 1`
+
+if [ "$SOURCEDIR" != "" ]; then
+# apparently MakeTeXTFM can't handle relative dirs
+ SOURCEDIR=`cd $SOURCEDIR; pwd`
+ LILYINCLUDE="$SOURCEDIR/init:$SOURCEDIR/mf/out:$LILYINCLUDE"
+ TEXINPUTS="$SOURCEDIR/tex:$TEXINPUTS:"
+ MFINPUTS="$SOURCEDIR/mf:$MFINPUTS:"
+ LILYPOND_EXECUTABLE="$SOURCEDIR/lily/out/lilypond"
+ export MFINPUTS LILYPOND_EXECUTABLE TEXINPUTS SOURCEDIR
+fi
+
+#
+# Input file name
+#
+if [ "$1" = "" ]
+then
+ help
+ $debug_echo "$IDENTIFICATION: No input file name given"
+ exit 1
+fi
+# regexp_quote -- quote a string as a regular expression for egrep or sed
+regexp_quote(){
+ Echo "$@" | sed 's/\([]\[\.*?+^$]\)/\\\1/g'
+}
+#
+#
+mudelaDefs(){
+# Include \def\mudela-definitions
+# The aim here is to pick up the definition for the
+# current file, then any other file.
+#
+mudelatmp=$TMP/mudelaDefs$$
+# Use `cat' to prevent filenames being prepended
+#
+cat "$File" $OF | fgrep "$MU_DEF" > $mudelatmp
+for L in $MU_DEF
+do
+ # This converts \def\mudelatitle{fred}
+ # to \mudelatitle{fred} or to
+ # \def\mudelatitle{fred}
+ # and stops after the first one found.
+ sed -n '/\\def\\'"$L"'{\([^}]*\)}.*$/{
+ s//'"`regexp_quote \"$1\"`"'\\'"$L"'{\1}%/p
+ q
+ }' $mudelatmp >> $LatF
+done
+rm -f $mudelatmp
+}
+#
+#
+startFile(){
+#
+# LaTeX file name
+#
+BN=`basename "$File" .tex`
+FN="$BN.$$"
+if [ "$KEEP_LY2DVI_OUTPUT" != "Y" ]
+then
+ LatF="$TMP/$FN.tex"
+else
+ LatF="$FN.tex"
+fi
+#
+# Find:
+# paper size (PAPERSIZE, overridden by command line option -p)
+# paper orientation (ORIENTATION, overridden by option -o)
+# language (LANGUAGE, overridden by option -l)
+# textwidth
+#
+eval `sed -n \\
+ -e 's/\\\\def\\\\mudelalanguage{\([^}]*\).*$/fLNG=\1;/p' \\
+ -e 's/\\\\def\\\\mudelalatexheaders{\([^}]*\).*$/fLHF=\1;/p' \\
+ -e 's/\\\\def\\\\mudelaorientation{\([^}]*\).*$/fORI=\1;/p' \\
+ -e 's/\\\\def\\\\mudelapaperlinewidth{\([^}]*\).*$/TWN=\1;/p' \\
+ -e 's/\\\\def\\\\mudelapapertextheight{\([^}]*\).*$/THN=\1;/p' \\
+ -e 's/\\\\def\\\\mudelapapersize{\([^}]*\).*$/fPSZ=\1;/p' \\
+ "$File"`
+#
+if [ -z "$LATEXHF" ]
+then
+ LATEXHF="$fLHF"
+fi
+LLHF="%"
+if [ -n "$LATEXHF" ]
+then
+ [ -f "$LATEXHF" ] && LLHF="\input{$LATEXHF}"
+fi
+#
+if [ -z "$PAPERSIZE" ]
+then
+ PAPERSIZE="$fPSZ"
+fi
+if [ -n "$PAPERSIZE" ]
+then
+ setPaperZize
+ PAPEROPT="$PAPERSIZE"
+fi
+#
+if [ -z "$ORIENTATION" ]
+then
+ ORIENTATION="$fORI"
+fi
+if [ -n "$ORIENTATION" ]
+then
+ if [ -z "$PAPEROPT" ]
+ then
+ PAPEROPT="$ORIENTATION"
+ else
+ PAPEROPT="$PAPEROPT,$ORIENTATION"
+ fi
+fi
+#
+if [ -n "$PAPEROPT" ]
+then
+ PAPER="[$PAPEROPT]"
+fi
+#
+if [ -z "$LANGUAGE" ]
+then
+ LANGUAGE="$fLNG"
+fi
+if [ -n "$LANGUAGE" ]
+then
+ LLNG="\usepackage[$LANGUAGE]{babel}"
+else
+ LLNG="%"
+fi
+
+#
+# Find textwidth
+#
+if [ -n "$TWN" ]
+then
+ TW="$TWN"
+ case "$TW" in
+ *mm)
+ ;;
+ *cm)
+ ;;
+ *pt)
+ ;;
+ *)
+ TW="${TW}pt"
+ ;;
+ esac
+ $debug_echo "Text width = $TW"
+fi
+TWp=`Echo $TW | sed -e 's/\..*$//'`
+PWp="$PWIDTH"
+#
+# Find textheight
+#
+if [ -n "$THN" ]
+then
+ TH=$THN
+ case $TH in
+ *mm)
+ ;;
+ *cm)
+ ;;
+ *pt)
+ ;;
+ *)
+ TH="${TH}pt"
+ ;;
+ esac
+ $debug_echo "Text height = $TH"
+fi
+THp="`echo $TH | sed -e 's/\..*$//'`"
+PHp="$PHEIGHT"
+if [ "$ORIENTATION" = "landscape" ]
+then
+ PWp="$PHEIGHT"
+ PHp="$PWIDTH"
+fi
+HMARG="`expr '(' $PWp - $TWp ')' / 2`"pt
+$debug_echo "Text left = $HMARG"
+VMARG="`expr '(' $PHp - $THp ')' / 2`"pt
+$debug_echo "Text top = $VMARG"
+#
+# Geometry: /var/lib/texmf/latex/geometry/geometry.dvi
+#
+#
+# Write LaTeX file
+#
+cat << EOF > $LatF
+% Creator: $IDENTIFICATION
+% Automatically generated from $IF, $NOW
+
+\documentclass$PAPER{article}
+
+$LLNG
+\usepackage{geometry}
+\usepackage[latin1]{inputenc}
+%\usepackage[T1]{fontenc}
+$PNUM
+%\addtolength{\oddsidemargin}{-1cm}
+%\addtolength{\topmargin}{-1cm}
+%\setlength{\textwidth}{$TW}
+%\setlength{\textheight}{$TH}
+\geometry{width=$TW, left=$HMARG, height=$TH, top=$VMARG}
+\input lilyponddefs
+\input titledefs
+$LLHF
+\begin{document}
+EOF
+mudelaDefs
+cat << EOF >> $LatF
+\cmrtwenty% ugh
+\makelilytitle
+EOF
+}
+nextFile(){
+cat << EOF >> $LatF
+\def\theopus{}%
+\def\thepiece{}%
+\def\mudelaopus{}%
+\def\mudelapiece{}%
+EOF
+mudelaDefs "\\def"
+cat << EOF >> $LatF
+\def\theopus{\mudelaopus}% ugh
+\def\thepiece{\mudelapiece}%
+\makelilypiecetitle
+EOF
+}
+#
+# Conclusion
+#
+endFile(){
+cat << EOF >> $LatF
+\vfill\hfill{\LilyIdString}
+\end{document}
+EOF
+#
+# Run LaTeX
+#
+latex '\nonstopmode \input '$LatF || exit 5
+#
+# Rename dvi file
+#
+if [ -f $FN.dvi ]
+then
+ RESULT="$BN.dvi"
+ [ -n "$OUTPUTDIR" ] && RESULT="$OUTPUTDIR/$RESULT"
+
+ cp "$FN.dvi" "$RESULT" || exit 5
+fi
+#
+# Output some info
+#
+cat << EOF
+
+$IDENTIFICATION: dvi file name is $RESULT
+
+EOF
+}
+
+# ugh. GF is side-effect.
+findInput() {
+# should check for LILYINCLUDE
+ OIFS="$IFS"
+ IFS=':'
+ x=`echo $LILYINCLUDE | sed "s!:! !g"`
+ IFS="$OIFS"
+ for lypath in . $x
+ do
+ if [ -f "$lypath/$1" ]
+ then
+ GF="$lypath/$1"
+ return
+ fi
+
+ if [ -f "$lypath/$1.ly" ]
+ then
+ GF="$lypath/$1.ly"
+ return
+ fi
+ if [ -f "$lypath/$1.fly" ]
+ then
+ GF="$lypath/$1.fly"
+ return
+ fi
+ done
+ $debug_echo "$IDENTIFICATION: Input file \"$GF\" not found"
+ echo "$NAME: Input file \"$GF\" not found" 1>&2
+ exit 2
+}
+#
+# Loop through all files
+#
+
+LILY_OUTPUT_FILES=
+
+for GF
+do
+ findInput $GF
+
+ #
+ # Check whether the file is input to or output from lilypond
+ #
+ L1=`head -1 $GF`
+ OP=`echo $L1 | grep "^% Creator: GNU LilyPond"`
+ if [ -n "$OP" ]
+ then
+ #
+ # OK - it's the output from lilypond.
+ #
+ # Get lilypond source file name
+ #
+ OF=$GF
+ IFL=`grep mudelafilename $OF`
+ if [ "$IFL" != "" ]
+ then
+ IF=`echo $IFL | sed -e 's/.*{//' -e 's/}*.$//'`
+ #
+ # Check if source file exists
+ #
+ if [ ! -f $IF ]
+ then
+ $debug_echo $IDENTIFICATION": Mudela file not found."
+ TW=15.5cm
+ TH=25.0cm
+ fi
+ else
+ $debug_echo $IDENTIFICATION": Mudela file name not found."
+ TW=15.5cm
+ TH=25.0cm
+ fi
+ else
+ #
+ # I have to assume this is the lilypond input file
+ # Find output file name, if defined
+ #
+ IF=$GF
+ #
+ # Run lilypond
+ # Grab output file names
+ #
+ $debug_echo "lilypond "$LILYOPTS $IF
+
+ $LILYPOND_EXECUTABLE $LILYOPTS $IF 2>&1 | tee $LOGFILE
+ OF="`sed -n -e 's/TeX output to \([^\.]*\.tex\)\.\.\.$/\1/p' $LOGFILE`"
+ $debug_echo "==> $OF"
+ LILY_OUTPUT_FILES="$LILY_OUTPUT_FILES $OF"
+ STATUS=`egrep -i "error|segmentation|abort" $LOGFILE`
+ echo $STATUS
+ if [ ! -z "$STATUS" ]
+ then
+ exit 10
+ fi
+ fi
+ #
+ # "Spin through" all the files
+ #
+ for File in $OF
+ do
+ $debug_echo "--- "$File
+ #
+ # Check if output file is generated
+ #
+ if [ ! -f "$File" ]
+ then
+ $debug_echo "$IDENTIFICATION: hmm, I could not find the output file $File"
+ exit 4
+ fi
+ #
+ # Is this the first file?
+ #
+ if [ -z "$FFile" ]
+ then
+ FFile="$File"
+ startFile
+ else
+ nextFile
+ fi
+ cat << EOF >> $LatF
+\input{$File}
+EOF
+ if [ $SEPFILE = Y ]
+ then
+ FFile=""
+ endFile
+ fi
+ done
+done
+if [ $SEPFILE = N ]
+then
+ endFile
+fi
+#
+# OK - finished
+#
--- /dev/null
+#!@PYTHON@
+
+"""
+=======================================================================
+LilyPond to dvi converter
+
+Features include Title information, paper size specification, and image
+orientation.
+
+Usage: ly2dvi.py [OPTION]... [FILE]...
+Input: LilyPond source or LilyPond generated TeX files
+Output: DVI file
+=======================================================================
+"""
+
+name = 'ly2dvi'
+version = '0.0.5'
+errorlog = ''
+
+import sys
+import os
+import getopt
+import re
+import string
+import time
+import glob
+
+
+class Input:
+ """
+ This class handles all ly2dvi.py input file methods
+
+ Public methods:
+
+ __init__() Constructor
+ open(file) Open a .ly file or .tex file using lilyinclude path
+ close() Close current file
+ type() Determine file type .ly (input) or .tex (output)
+ setVars() Set title definitions found in .tex (output) file
+ """
+
+ #
+ # Constructors
+ #
+
+ def __init__(this):
+ this.__fd = None
+
+ #
+ # open
+ #
+ def open(this,file):
+ """
+ open file and set private class variable __fd. The search
+ sequence is: current directory followed by the directories
+ found in include property list. Each directory is searched
+ for file, file.ly, and file.fly.
+
+ input: file filename
+ output: void
+ error: ExitNotFound Exception
+ """
+
+ for i in [''] + Props.get('include')[0:]:
+ ifile = os.path.join(i,file)
+ for j in ['','.ly','.fly']:
+ jfile = ifile+j
+ try:
+ this.__fd = open( jfile, 'r' )
+ return
+ except:
+ pass
+ sys.exit('ExitNotFound', file)
+
+
+ #
+ # close
+ #
+ def close(this):
+ """
+ close file object __fd
+
+ input: void
+ output: void
+ error: None
+ """
+ this.__fd.close()
+
+
+ #
+ # type
+ #
+ def type(this):
+ """
+ Determine input file type. LilyPond source is 'input' type
+ and LilyPond generated TeX file is 'output' type
+
+ input: void
+ output: 'input' | 'output'
+ error: None
+ """
+
+ firstline = this.__fd.readline()
+ this.__fd.seek(0)
+ if re.match('% Creator: GNU LilyPond [0-9]+[.0-9]+',firstline ):
+ return 'output'
+ else:
+ return 'source'
+
+
+ #
+ # setVars
+ #
+ def setVars(this):
+ """
+ Search for properties in the current input file and set the
+ appropriate values. The supported properties names are in
+ local variable varTable along with the property list
+ titledefs.
+
+ input: void
+ output: None
+ error: None
+ """
+
+ varTable = [
+ # regexp set method
+ # ------ ----------
+ ( 'language', Props.setLanguage ),
+ ( 'latexheaders', Props.setHeader ),
+ ( 'orientation', Props.setOrientation ),
+ ( 'paperpapersize', Props.setPaperZize ),
+ ( 'papertextheight', Props.setTextHeight ),
+ ( 'paperlinewidth', Props.setLineWidth ),
+ ( 'filename', Props.setFilename ),
+ ]
+
+ titles={}
+ for line in this.__fd.readlines():
+ m=re.match('\\\\def\\\\mudela([\w]+){(.*)}',line)
+ if m:
+ for var in varTable:
+ if m.group(1) == var[0]:
+ var[1](m.group(2),'file')
+ break
+ for var in Props.get('titledefs'):
+ if m.group(1) == var:
+ titles[var]=m.group(2)
+ break
+ Props.setTitles(titles,'file')
+ this.__fd.seek(0)
+
+\f
+
+class TeXOutput:
+ """
+ This class handles all ly2dvi.py output file methods
+
+ private methods:
+ __mudelaDefs(opt) Send title info to output file
+
+ Public methods:
+ __init__() Constructor
+ write(str) Write a string to output file
+ start(file) Start the latex file
+ next() Process next output file
+ end() Finish latex file and run latex
+ """
+
+ #
+ # constructor
+ #
+ def __init__(this):
+ this.__fd = None
+ this.__base = ''
+ this.__outfile = ''
+
+ #
+ # __medelaDefs
+ #
+ def __mudelaDefs(this,opt):
+ """
+ Write titles to output
+
+ input: opt Supports header and subheader output
+ output: None
+ error: None
+ """
+
+ titles = Props.get('titles')
+ for key in titles.keys():
+ this.write('%s\\mudela%s{%s}%%\n' % (opt,key,titles[key]))
+
+ #
+ # write
+ #
+ def write(this,str):
+ """
+ Write str to current output file
+
+ input: str String to write
+ output: None
+ error: None
+ """
+
+ this.__fd.write(str)
+
+ #
+ # start
+ #
+ def start(this,file):
+ """
+ Start LaTeX file. Calculates the horizontal and vertical
+ margin using pagewidth, pageheight, linewidth, and textheight.
+ Creates temporary output filename and opens it for write.
+ Sends the LaTeX header information to output. Lastly sends
+ the title information to output.
+
+ input: file output file name
+ output: None
+ error: None
+ """
+
+ now=time.asctime(time.localtime(time.time()))
+ linewidth = Props.get('linewidth')
+ textheight = Props.get('textheight')
+
+ if Props.get('orientation') == 'landscape':
+ pagewidth = Props.get('pageheight')
+ pageheight = Props.get('pagewidth')
+ else:
+ pageheight = Props.get('pageheight')
+ pagewidth = Props.get('pagewidth')
+
+ horizontalMarginArg = ( (pagewidth - linewidth)/2 )
+ verticalMarginArg = ( (pageheight - textheight)/2 )
+
+ top="""\
+%% Creator: %s
+%% Automatically generated from %s, %s
+
+\\documentclass[%s]{article}
+
+%s
+\\usepackage{geometry}
+\\usepackage[latin1]{inputenc}
+%%\\usepackage[T1]{fontenc}
+%s
+%%\\addtolength{\\oddsidemargin}{-1cm}
+%%\\addtolength{\\topmargin}{-1cm}
+%%\\setlength{\\textwidth}{%s}
+%%\\setlength{\\textheight}{%s}
+\\geometry{width=%spt, left=%spt, height=%spt, top=%spt}
+\\input lilyponddefs
+\\input titledefs
+%s
+\\begin{document}
+""" % ( program_id(), Props.get('filename'), now, Props.get('papersize'),
+ Props.get('language'), Props.get('pagenumber'), linewidth, textheight,
+ linewidth, horizontalMarginArg, textheight, verticalMarginArg,
+ Props.get('header') )
+
+ pathcomp = os.path.splitext(file)
+ this.__base = pathcomp[0]
+ this.__outfile = '%s.%d%s' % (pathcomp[0], os.getpid(), pathcomp[1])
+ try:
+ this.__fd = open(this.__outfile,"w")
+ except:
+ sys.exit('ExitNoWrite', this.__outfile)
+ this.write(top)
+ this.__mudelaDefs('')
+ this.write("""\
+\\cmrtwenty% ugh
+\\makelilytitle
+""")
+
+ #
+ # next
+ #
+ def next(this):
+ """
+ Write LaTeX subheader information to support more than one
+ score in a document. Lastly send current title information to
+ output.
+
+ input: None
+ output: None
+ error: None
+ """
+
+ this.write("""\
+\\def\\theopus{}%
+\\def\\thepiece{}%
+\\def\\mudelaopus{}%
+\\def\\mudelapiece{}%
+""")
+ this.__mudelaDefs("\\def")
+ this.write("""\
+\\def\\theopus{\\mudelaopus}% ugh
+\\def\\thepiece{\\mudelapiece}%
+\\makelilypiecetitle
+""")
+
+
+ #
+ # end
+ #
+ def end(this):
+ """
+ Close output file and run latex on it.
+
+ input: None
+ output: None
+ error: ExitBadLatex Exception
+ """
+
+ outfile=this.__base + '.dvi'
+ if Props.get('output') != '':
+ outfile = os.path.join(Props.get('output'), outfile )
+
+ this.write("""\
+\\vfill\\hfill{\\LilyIdString}
+\\end{document}
+""")
+ this.__fd.close()
+ if ( os.name == 'posix' ):
+ stat = os.system('latex \'\\nonstopmode \\input %s\'' %
+ (this.__outfile))
+ else: # Windows shells don't eat the single quotes
+ stat = os.system('latex \\nonstopmode \\input %s' %
+ (this.__outfile))
+ if stat:
+ sys.exit('ExitBadLatex')
+ if os.path.isfile(outfile):
+ os.remove(outfile)
+ os.rename(this.__base + '.' + str(os.getpid()) + '.dvi', outfile)
+ sys.stderr.write( '\n' + program_id() + ': dvi file name is %s\n\n'
+ % (outfile))
+
+ if Props.get('postscript'):
+ psoutfile=this.__base + '.ps'
+ if Props.get('output') != '':
+ psoutfile = os.path.join(Props.get('output'), psoutfile )
+ stat = os.system('dvips -o %s %s 2>&1' % (psoutfile,outfile))
+ if stat:
+ sys.exit('ExitBadPostscript')
+
+
+\f
+
+class Properties:
+ """
+ This class handles all ly2dvi.py property manipulation
+
+ Public methods:
+
+ __init__() Constructor
+ set<property> methods
+ """
+
+ def __init__(this):
+
+ #
+ # Following is the order of priority for property assignment. The
+ # list is organized from lowest to highest priority. Each
+ # assignment is overridden by the next requester in the list.
+ #
+ # Requester Description
+ # --------- -----------
+ # init Initial default values
+ # file The values found in the lilypond generated TeX files
+ # environment Envrionment variables LILYINCLUDE, LILYPONDPREFIX
+ # rcfile $LILYPONDPREFIX/share/lilypond/.lilyrc
+ # rcfile $HOME/.lilyrc
+ # rcfile ./.lilyrc
+ # commandline command line arguments
+ #
+ this.__overrideTable = {
+ 'init' : 0,
+ 'file' : 1,
+ 'environment' : 2,
+ 'rcfile' : 3,
+ 'commandline' : 4,
+ 'program' : 5
+ }
+
+ this.__roverrideTable = {} # reverse lookup used for debug
+ for i in this.__overrideTable.items():
+ this.__roverrideTable[i[1]]=i[0]
+
+ this.__data = {
+ 'pagewidth' : [597, this.__overrideTable['init']],
+ 'pageheight' : [845, this.__overrideTable['init']],
+ 'papersize' : ['a4paper', this.__overrideTable['init']],
+ 'textheight' : [0, this.__overrideTable['init']],
+ 'linewidth' : [0, this.__overrideTable['init']],
+ 'orientation' : ['portrait', this.__overrideTable['init']],
+ 'language' : ['%', this.__overrideTable['init']],
+ 'include' : [[], this.__overrideTable['init']],
+ 'debug' : [0, this.__overrideTable['init']],
+ 'keeplilypond' : [0, this.__overrideTable['init']],
+ 'keeply2dvi' : [0, this.__overrideTable['init']],
+ 'pagenumber' : ['%', this.__overrideTable['init']],
+ 'separate' : [0, this.__overrideTable['init']],
+ 'output' : ['', this.__overrideTable['init']],
+ 'header' : ['%', this.__overrideTable['init']],
+ 'dependencies' : [0, this.__overrideTable['init']],
+ 'root' : ['', this.__overrideTable['init']],
+ 'tmp' : ['d:\tmp', this.__overrideTable['init']],
+ 'filename' : ['', this.__overrideTable['init']],
+ 'titledefs' : [[], this.__overrideTable['init']],
+ 'titles' : [{}, this.__overrideTable['init']],
+ 'lilyOutputFiles' : [[], this.__overrideTable['init']],
+ 'postscript' : [0, this.__overrideTable['init']],
+ }
+
+ #
+ # Try to set root and HOME first before calling rcfile
+ #
+ if os.environ.has_key('LILYPONDPREFIX'):
+ this.setRoot(os.environ['LILYPONDPREFIX'], 'environment')
+ else:
+ p=os.path.split(sys.argv[0])
+ p=os.path.split(p[0])
+ this.setRoot(p[0],'init')
+
+ if not os.environ.has_key('HOME'):
+ if os.environ.has_key('HOMEDRIVE') and \
+ os.environ.has_key('HOMEPATH'):
+ os.environ['HOME'] = os.environ['HOMEDRIVE'] + \
+ os.environ['HOMEPATH']
+ else:
+ os.environ['HOME'] = os.curdir
+
+ this.rcfile() # Read initialization file(s)
+
+ if os.environ.has_key('LILYINCLUDE'):
+ tmp=this.get('include')
+ for s in string.split(os.environ['LILYINCLUDE'],os.pathsep):
+ tmp.append(s)
+ this.__set('include', tmp, 'environment')
+
+
+ t=''
+ if os.environ.has_key ('TEXINPUTS'):
+ t = os.pathsep + os.environ['TEXINPUTS']
+ os.environ['TEXINPUTS'] = os.path.join(this.get('root'), 'texmf',
+ 'tex', 'lilypond' ) + t
+
+ t=''
+ if os.environ.has_key ('MFINPUTS'):
+ t = os.pathsep + os.environ['MFINPUTS']
+ os.environ['MFINPUTS'] = os.path.join(this.get('root'), 'texmf',
+ 'mf', 'public', 'lilypond' ) + t
+
+ if os.environ.has_key('TMP'):
+ this.__set('tmp',os.environ['TMP'],'environment')
+
+
+ fd=this.get_texfile_path ('titledefs.tex')
+ mudefs=[]
+
+ for line in fd.readlines():
+ m=re.match('\\\\newcommand\*{\\\\mudela([\w]+)}',line)
+ if m:
+ mudefs.append(m.group(1))
+ fd.close
+ this.__set('titledefs', mudefs, 'init')
+
+ #
+ # __set
+ #
+ def __set(this,var,value,requester):
+ """
+ All of the set methods call this to set a property. If the value
+ was last set by a requestor of lesser priority the new value is
+ assigned, else the old value has priority and is unchanged.
+ """
+
+ if this.__overrideTable[requester] < this.__data[var][1]:
+ return 0
+ else:
+ this.__data[var] = [value, this.__overrideTable[requester]]
+
+ #
+ # get
+ #
+ def get(this,var):
+ """
+ All of the get methods call this to get a property value. List
+ variable types are return by value to facilitate an append operation.
+ """
+
+ if var == 'include' or var == 'lilyOutputFiles':
+ return this.__data[var][0][0:] # return a copy not a ref
+ else:
+ return this.__data[var][0]
+
+ #
+ # get_texfile_path
+ #
+ def get_texfile_path (this, var):
+ """
+ locate and open titledefs.tex file
+ """
+
+ if os.name == 'nt':
+ path = os.path.join(this.get('root'), 'texmf', 'tex',
+ 'lilypond', var)
+ else:
+ path =''
+ cmd =('kpsewhich tex %s %s' % (var,errorlog))
+ pipe = os.popen (cmd, 'r')
+ path = pipe.readline ()[:-1] # chop off \n
+ return_status = pipe.close()
+ if return_status and not path:
+ path = os.path.join(this.get('root'), 'texmf', 'tex',
+ 'lilypond', var)
+ fd = open(path, 'r')
+ return fd
+
+
+ #
+ # Read rc file
+ #
+ def rcfile(this):
+ """
+ Read initialization file(s)
+ """
+ varTable = [
+ # name set method
+ # ---- ----------
+ ( 'DEBUG', this.setDebug ),
+ ( 'DEPENDENCIES', this.setDependencies ),
+ ( 'KEEPLILYPOND', this.setKeeplilypond ),
+ ( 'KEEPLY2DVI', this.setKeeply2dvi ),
+ ( 'LANGUAGE', this.setLanguage ),
+ ( 'LATEXHF', this.setHeader ),
+ ( 'LILYINCLUDE', this.setInclude ),
+ ( 'LILYPONDPREFIX', this.setRoot ),
+ ( 'NONUMBER', this.setNonumber ),
+ ( 'ORIENTATION', this.setOrientation ),
+ ( 'OUTPUTDIR', this.setOutput ),
+ ( 'PAPERSIZE', this.setPaperZize ),
+ ( 'PHEIGHT', this.setTextHeight ),
+ ( 'POSTSCRIPT', this.setPostscript ),
+ ( 'PWIDTH', this.setLineWidth ),
+ ( 'SEPARATE', this.setSeparate ),
+ ( 'TMP', this.setTmp ),
+ ]
+
+ if ( os.name == 'posix' ):
+ dotFilename='.lilyrc'
+ else: # Windows apps like edit choke on .lilyrc
+ dotFilename='_lilyrc'
+
+ for d in [os.path.join(this.get('root'),'share','lilypond'), \
+ os.environ['HOME'], os.curdir ]:
+ file=os.path.join(d,dotFilename)
+ try:
+ fd = open( file, 'r' )
+ except:
+ continue
+
+ for line in fd.readlines():
+ if re.match('#.*',line):
+ continue
+ m=re.search('([\w]+)=(.*)',line)
+ if m:
+ for var in varTable:
+ if m.group(1) == var[0]:
+ var[1](m.group(2),'rcfile')
+ break
+ fd.close
+
+ #
+ # setPaperZize
+ #
+ def setPaperZize(this,size,requester):
+ """
+ Set paper size properties
+ """
+
+ paperTable = [
+ # regex width height name
+ # ----- ----- ------ ----
+ ( 'a0.*', 2389, 3381, 'a0paper' ),
+ ( 'a1$|a1p.*', 1690, 2389, 'a1paper' ),
+ ( 'a2.*', 1194, 1690, 'a2paper' ),
+ ( 'a3.*', 845, 1194, 'a3paper' ),
+ ( 'a4.*', 597, 845, 'a4paper' ),
+ ( 'a5.*', 423, 597, 'a5paper' ),
+ ( 'a6.*', 298, 423, 'a6paper' ),
+ ( 'a7.*', 211, 298, 'a7paper' ),
+ ( 'a8.*', 305, 211, 'a8paper' ),
+ ( 'a9.*', 105, 305, 'a9paper' ),
+ ( 'a10.*', 74, 105, 'a10paper' ),
+ ( 'b0.*', 2847, 4023, 'b0paper' ),
+ ( 'b1.*', 2012, 2847, 'b1paper' ),
+ ( 'b2.*', 1423, 2012, 'b2paper' ),
+ ( 'b3.*', 1006, 1423, 'b3paper' ),
+ ( 'b4.*', 712, 1006, 'b4paper' ),
+ ( 'b5.*', 503, 712, 'b5paper' ),
+ ( 'archA$', 650, 867, 'archApaper' ),
+ ( 'archB$', 867, 1301, 'archBpaper' ),
+ ( 'archC$', 1301, 1734, 'archCpaper' ),
+ ( 'archD$', 1734, 2602, 'archDpaper' ),
+ ( 'archE$', 2602, 3469, 'archEpaper' ),
+ ( 'flsa$|flse$', 614, 940, 'flsapaper' ),
+ ( 'halfletter$', 397, 614, 'halfletterpaper' ),
+ ( 'ledger$', 1229, 795, 'ledgerpaper' ),
+ ( 'legal$', 614, 1012, 'legalpaper' ),
+ ( 'letter$', 614, 795, 'letterpaper' ),
+ ( 'note$', 542, 723, 'notepaper' )
+ ]
+
+ found=0
+ for paper in paperTable:
+ if re.match(paper[0],size):
+ found=1
+ this.__set('pagewidth',paper[1],requester)
+ this.__set('pageheight',paper[2],requester)
+ this.__set('papersize',paper[3],requester)
+ break
+
+ if not found:
+ sys.exit('ExitBadPaper',size)
+
+ #
+ # setTextHeight
+ #
+ def setTextHeight(this,size,requester):
+ """
+ Set textheight property
+ """
+
+ m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
+ if m:
+ if m.group(2) == 'cm':
+ this.__set('textheight',\
+ float(m.group(1)) * 72.27/2.54, requester )
+ elif m.group(2) == 'mm':
+ this.__set('textheight',\
+ float(m.group(1)) * 72.27/25.4, requester )
+ elif m.group(2) == 'pt':
+ this.__set('textheight', float(m.group(1)), requester )
+ elif m.group(2) == '':
+ this.__set('textheight', float(m.group(1)), requester )
+ else:
+ sys.exit('ExitBadHeight', m.group(2))
+ else:
+ sys.exit('ExitBadHeight', size)
+
+ #
+ # setLineWidth
+ #
+ def setLineWidth(this,size,requester):
+ """
+ Set linewidth propery
+ """
+
+ m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
+ if m:
+ if m.group(2) == 'cm':
+ this.__set('linewidth', \
+ float(m.group(1)) * 72.27/2.54, requester )
+ elif m.group(2) == 'mm':
+ this.__set('linewidth', \
+ float(m.group(1)) * 72.27/25.4, requester )
+ elif m.group(2) == 'pt':
+ this.__set('linewidth', float(m.group(1)), requester )
+ elif m.group(2) == '':
+ this.__set('linewidth', float(m.group(1)), requester )
+ else:
+ sys.exit('ExitBadWidth', m.group(2))
+ else:
+ sys.exit('ExitBadWidth', size)
+
+ #
+ # setOrientation
+ #
+ def setOrientation(this,orient,requester):
+ """
+ Set orientation property
+ """
+
+ if orient == 'landscape' or orient == 'portrait':
+ this.__set('orientation', orient, requester )
+ else:
+ sys.exit('ExitBadOrient', orient)
+
+ #
+ # setLanguage
+ #
+ def setLanguage(this,lang,requester):
+ """
+ Set language property
+ """
+
+ this.__set('language', '\\usepackage[%s]{babel}' % (lang), requester )
+
+ #
+ # setInclude
+ #
+ def setInclude(this,inc, requester):
+ """
+ Append an include path
+ """
+
+ tmp = this.get('include')
+ tmp.append(inc)
+ this.__set('include', tmp, requester )
+
+ #
+ # setDebug
+ #
+ def setDebug(this,value,requester):
+ """
+ Set or Clear debug flag
+ """
+
+ if int(value) == 1:
+ this.__set('debug',1,requester)
+ else:
+ this.__set('debug',0,requester)
+
+ #
+ # setKeeplilypond
+ #
+ def setKeeplilypond(this, value, requester):
+ """
+ Set or Clear keeplilypond flag
+ """
+
+ if int(value) == 1:
+ this.__set('keeplilypond',1,requester)
+ else:
+ this.__set('keeplilypond',0,requester)
+
+ #
+ # setKeeply2dvi
+ #
+ def setKeeply2dvi(this, value, requester):
+ """
+ Set or Clear keeply2dvi flag
+ """
+
+ if int(value) == 1:
+ this.__set('keeply2dvi',1,requester)
+ else:
+ this.__set('keeply2dvi',0,requester)
+
+ #
+ # setNonumber
+ #
+ def setNonumber(this, value, requester):
+ """
+ Set nonumber flag
+ """
+
+ if int(value) == 1:
+ this.__set('pagenumber',1,requester)
+ else:
+ this.__set('pagenumber',0,requester)
+
+ #
+ # setSeparate
+ #
+ def setSeparate(this, value, requester):
+ """
+ Set or Clear separate flag
+ """
+
+ if int(value) == 1:
+ this.__set('separate',1,requester)
+ else:
+ this.__set('separate',0,requester)
+
+ #
+ # Set output directory name
+ #
+ def setOutput(this,out,requester):
+ this.__set('output',out,requester)
+
+ #
+ # Set latex header name
+ #
+ def setHeader(this,head, requester):
+ this.__set('header',head,requester)
+
+ #
+ # Set or Clear Dependencies flag to generate makefile dependencies
+ #
+ def setDependencies(this, requester):
+ """
+ Set or Clear dependencies flag
+ """
+
+ if int(value) == 1:
+ this.__set('dependencies',1,requester)
+ else:
+ this.__set('dependencies',0,requester)
+
+ #
+ # Set tmp directory
+ #
+ def setTmp(this,dir, requester):
+ this.__set('tmp',dir,requester)
+
+ #
+ # Set mudela source file name
+ #
+ def setFilename(this,file, requester):
+ this.__set('filename',file,requester)
+
+ #
+ # Set title commands
+ #
+ def setTitles(this,titles, requester):
+ this.__set('titles',titles,requester)
+
+ #
+ # Set title commands
+ #
+ def addLilyOutputFiles(this,filelist,requester):
+ """
+ Add a to the lily output list
+ """
+
+ tmp = this.get('lilyOutputFiles')
+ tmp = tmp + filelist
+ this.__set('lilyOutputFiles',tmp,requester)
+
+ #
+ # Set/Clear postscript flag
+ #
+ def setPostscript(this,value,requester):
+ """
+ Set postscript flag
+ """
+
+ if int(value) == 1:
+ this.__set('postscript',1,requester)
+ else:
+ this.__set('postscript',0,requester)
+
+ #
+ # Set root
+ #
+ def setRoot(this,path, requester):
+ """
+ Set lilypond root directory
+ """
+
+ os.environ['LILYPONDPREFIX'] = path
+ this.__set('root',path,requester)
+
+ #
+ # printProps
+ #
+ def printProps(this):
+ """
+ Print properties
+ """
+
+ for key in this.__data.keys():
+ print "%s <%s>:<%s>" % (key,this.get(key),
+ this.__roverrideTable[this.__data[key][1]])
+
+\f
+
+#
+# Misc functions
+#
+
+def getLilyopts():
+ inc = ''
+ if len(Props.get('include')) > 0:
+ inc = '-I ' + string.join(Props.get('include'),os.pathsep)
+ else:
+
+ if Props.get('dependencies'):
+ dep=' -d'
+ else:
+ dep=''
+ return inc + dep
+ return inc
+
+def writeLilylog(contents):
+ if Props.get('keeplilypond'):
+ file='lilylog.' + str(os.getpid())
+ output = Props.get('output')
+ if output != '':
+ file = os.path.join( output, file )
+ try:
+ fd = open( file, 'w' )
+ except:
+ sys.exit('ExitNoWrite', file)
+ fd.write(contents)
+ fd.close()
+
+def getTeXFile(contents):
+ texfiles=[]
+ for line in string.split(contents,'\n'):
+ m = re.search('^TeX output to (.+)\.\.\.', line)
+ if m:
+ texfiles.append(m.group(1))
+
+ if texfiles == []:
+ sys.exit('ExitNoTeXName')
+ else:
+ return texfiles
+
+def program_id ():
+ return name + ' ' + version;
+
+
+def mailaddress():
+ try:
+ return os.environ['MAILADDRESS']
+ except KeyError:
+ return '(address unknown)'
+
+
+def identify ():
+ sys.stderr.write (program_id () + '\n')
+
+def help ():
+ sys.stderr.write (
+ 'Generate dvi file from mudela or lilypond output\n'
+ 'Usage: ' + name + ' [OPTION]... [FILE]...\n'
+ '\n'
+ 'Options:\n'
+ ' -D,--debug increase verbosity\n'
+ ' -F,--headers= name of additional LaTeX headers file\n'
+ ' -H,--Height= set paper height (points) (see manual page)\n'
+ ' -I,--include=DIR add DIR to LilyPond\'s search path\n'
+ ' -K,--keeplilypond keep lilypond output files\n'
+ ' -L,--landscape set landscape orientation\n'
+ ' -N,--nonumber switch off page numbering\n'
+ ' -O,--orientation= set orientation (obsolete - use -L instead)\n'
+ ' -P,--postscript generate postscript file\n'
+ ' -W,--Width= set paper width (points) (see manual page)\n'
+ ' -d,--dependencies tell lilypond make a dependencies file\n'
+ ' -h,--help this help text\n'
+ ' -k,--keeply2dvi keep ly2dvi output files\n'
+ ' -l,--language= give LaTeX language (babel)\n'
+ ' -o,--output= set output directory\n'
+ ' -p,--papersize= give LaTeX papersize (eg. a4)\n'
+ ' -s,--separate run all files separately through LaTeX\n'
+ '\n'
+ 'files may be (a mix of) input to or output from lilypond(1)\n'
+ )
+
+\f
+
+#
+# main
+#
+
+def main():
+ """Generate dvi files from lilypond source/output"""
+
+ infile = Input()
+ outfile = TeXOutput()
+ texInputFiles=[]
+
+ (options, files) = getopt.getopt (sys.argv[1:],
+ 'DF:H:I:KLNPW:dhkl:o:p:s',
+ ['debug', 'headers=', 'Height=',
+ 'include=', 'keeplilypond', 'landscape',
+ 'nonumber', 'Width=', 'dependencies',
+ 'help', 'keeply2dvi', 'language=',
+ 'output=', 'papersize=', 'separate',
+ 'postscript'])
+ for opt in options:
+ o = opt[0]
+ a = opt[1]
+ if o == '--debug' or o == '-D':
+ Props.setDebug(1,'commandline')
+ elif o == '--headers' or o == '-F':
+ Props.setHeader(a,'commandline')
+ elif o == '--include' or o == '-I':
+ Props.setInclude(a,'commandline')
+ elif o == '--Height' or o == '-H':
+ Props.setTextHeight(a,'commandline')
+ elif o == '--keeplilypond' or o == '-K':
+ Props.setKeeplilypond(1,'commandline')
+ elif o == '--landscape' or o == '-L':
+ Props.setOrientation('landscape','commandline')
+ elif o == '--nonumber' or o == '-N':
+ Props.setNonumber('commandline')
+ elif o == '--Width' or o == '-W':
+ Props.setLineWidth(a,'commandline')
+ elif o == '--dependencies' or o == '-d':
+ Props.setDependencies(1,'commandline')
+ elif o == '--help' or o == '-h':
+ help()
+ return 0
+ elif o == '--keeply2dvi' or o == '-k':
+ Props.setKeeply2dvi(1,'commandline')
+ elif o == '--language' or o == '-l':
+ Props.setLanguage(a,'commandline')
+ elif o == '--output' or o == '-o':
+ Props.setOutput(a,'commandline')
+ elif o == '--papersize' or o == '-p':
+ Props.setPaperZize(a,'commandline')
+ elif o == '--separate' or o == '-s':
+ Props.setSeparate(1,'commandline')
+ elif o == '--postscript' or o == '-P':
+ Props.setPostscript(1,'commandline')
+
+ if len(files):
+ for file in files:
+ infile.open(file)
+ type = infile.type()
+ infile.close()
+ if type == 'source':
+ cmd = 'lilypond %s %s 2>&1' % (getLilyopts(), file)
+ fd = os.popen( cmd , 'r' )
+ log = ''
+ line=fd.readline()
+ while line:
+ log = log + line
+ sys.stderr.write( line )
+ line=fd.readline()
+ stat = fd.close()
+ if stat:
+ sys.exit('ExitBadLily', cmd )
+ texFiles=getTeXFile(log)
+ writeLilylog(log)
+ Props.addLilyOutputFiles(texFiles,'program')
+ texInputFiles = texInputFiles + texFiles
+ else:
+ texInputFiles.append(file)
+
+ firstfile=1
+ for file in texInputFiles:
+ infile.open(file)
+ infile.setVars() # first pass set variables
+ infile.close()
+ if Props.get('debug'):
+ Props.printProps()
+ if firstfile:
+ outfile.start(file)
+ else:
+ outfile.next()
+ outfile.write("""\
+\\input{%s}
+""" % (file))
+ if Props.get('separate'):
+ outfile.end()
+ else:
+ firstfile=0
+ if not Props.get('separate'):
+ outfile.end()
+ else:
+ help()
+ sys.exit('ExitBadArgs','No files specified')
+
+#
+# Exit values
+#
+ExitTable = {
+ 'ExitInterupt' : ['Ouch!', 1 ],
+ 'ExitBadArgs' : ['Wrong number of arguments', 2 ],
+ 'ExitNotFound' : ['File not found', 3 ],
+ 'ExitBadPaper' : ['Unknown papersize', 4 ],
+ 'ExitBadHeight' : ['Invalid Height specification', 5 ],
+ 'ExitBadWidth' : ['Invalid Width specification', 6 ],
+ 'ExitBadOrient' : ['Invalid Orientation specification', 7 ],
+ 'ExitNoWrite' : ['Permission denied', 8 ],
+ 'ExitNoTeXName' : ['hmm, I could not find an output file name', 9 ],
+ 'ExitBadLily' : ['Lilypond failed', 10 ],
+ 'ExitBadLatex' : ['Latex failed', 11 ],
+ 'ExitBadPostscript' : ['Postscript failed', 12 ],
+ 'ExitUnknown' : ['Unknown Exit Code', 20 ],
+ }
+
+def cleanup():
+ lilyfiles = []
+ tmpfiles = []
+ if not Props.get('keeplilypond'):
+ lilyfiles = Props.get('lilyOutputFiles')
+ if not Props.get('keeply2dvi'):
+ tmpfiles = glob.glob('*.' + str(os.getpid()) + '.*' )
+ for file in lilyfiles + tmpfiles:
+ if os.path.isfile(file):
+ os.remove(file)
+
+
+identify()
+Props = Properties()
+
+try:
+ main()
+
+except KeyboardInterrupt:
+ print ExitTable['ExitInterupt'][0]
+ cleanup()
+ sys.exit(ExitTable['ExitInterupt'][1])
+
+except SystemExit, errno:
+ if ExitTable.has_key(errno.args[0]):
+ msg = ExitTable[errno.args[0]]
+ else:
+ msg = ExitTable['ExitUnknown']
+ if len(errno.args) > 1:
+ sys.stderr.write( '%s: %s: %s\n' % (name, msg[0], errno.args[1]))
+ else:
+ sys.stderr.write( '%s %s\n' % (name, msg[0]))
+ if Props.get('debug'):
+ Props.printProps()
+ cleanup()
+ sys.exit(msg[1])
+else:
+ cleanup()
import os
import string
-import regex
+import re
import getopt
import sys
-import regsub
outdir = 'out/'
program_version = '0.3'
self.file.write ('default_paper = \\paper { \\paper_%s\n linewidth = -15.\\cm; }\n' % s)
if self.fragment:
- self.file.write ('\\score { \\melodic { ')
+ self.file.write ('\\score { \\notes { ')
def write (self,s):
self.file.write (s)
-begin_mudela_re = regex.compile ('^ *\\\\begin{mudela}')
-begin_mudela_opts_re = regex.compile ('^ *\\\\begin{mudela}\[\(.*\)\]')
-end_mudela_re = regex.compile ('^ *\\\\end{mudela}')
-section_re = regex.compile ('\\\\section')
-chapter_re = regex.compile ('\\\\chapter')
-input_re = regex.compile ('^\\\\input[ \t\n]+\\(.*\\)$')
+begin_mudela_re = re.compile ('^ *\\\\begin{mudela}')
+begin_mudela_opts_re = re.compile ('^ *\\\\begin{mudela}\[(.*)\]')
+end_mudela_re = re.compile ('^ *\\\\end{mudela}')
+section_re = re.compile ('\\\\section')
+chapter_re = re.compile ('\\\\chapter')
+input_re = re.compile ('^\\\\input[ \t\n]+(.*)$')
class Tex_input:
def __init__ (self,name):
- if regex.search ('\\.[^/\\\\]+',name) == -1:
+ if not re.search ('\\.[^/\\\\]+',name):
name = name + '.tex'
print 'opening %s' % name
self.filename = name
lines = self.infile.readlines ()
(retlines, retdeps) = ([],[self.filename])
for line in lines:
- if input_re.search (line) <> -1:
- t = Tex_input (input_re.group (1))
+ m = input_re.search (line)
+ if m:
+ t = Tex_input (m.group (1))
ls =t.get_lines ()
retlines = retlines + ls[0]
retdeps = retdeps + ls[1]
self.mudela = None
self.deps = []
def set_sections (self, l):
- if section_re.search (l) <> -1:
+ if section_re.search (l):
self.section = self.section + 1
- if chapter_re.search (l) <> -1:
+ if chapter_re.search (l):
self.section = 0
self.chapter = self.chapter + 1
def do_it(self):
(lines, self.deps) = self.get_lines ()
for line in lines:
- if begin_mudela_re.search (line) <> -1:
- if begin_mudela_opts_re.search (line) <> -1:
- opts = begin_mudela_opts_re.group (1)
+ if begin_mudela_re.search (line):
+ m =begin_mudela_opts_re.search (line)
+ if m:
+ opts = m.group (1)
else:
opts = ''
optlist = string.split (opts, ',')
continue
- elif end_mudela_re.search (line) <> -1:
+ elif end_mudela_re.search (line):
self.mudela.close ()
self.mudtex.close_mudela ()
self.mudela = None
* urg, fix flower.py dirname, tarball etc. (package-diff, release)
+ * use RE iso REG{SUB,EX} for python stuff.
+
* (re-)enable use outside of make system, e.g.
- /usr/bin/make-patch for direct use on tarballs
--- /dev/null
+#include <stdio.h>
+#include <iostream.h>
+#include "dictionary-iter.hh"
+
+
+
+main ()
+{
+ Dictionary<String> *dict = new Dictionary<String>;
+
+ char s[1000];
+
+ dict->elem("foo") = "bar";
+ dict->elem("bla") = "ba";
+ dict->elem("blo") = "bar";
+
+ while (gets (s))
+ {
+ String str (s);
+
+ int l = str.length_i ();
+
+ dict->elem (str.left_str (l/2)) = str.right_str (l/2);
+ }
+
+ int i=1000;
+ while (i--)
+ {
+ Dictionary<String> *dict2=new Dictionary<String> (*dict);
+ delete dict;
+ dict = dict2;
+ }
+
+ for (Dictionary_iter<String> i (*dict); i.ok (); i++)
+ {
+ cout << i.key () << " == " << i.val () << endl;
+ cout << "elem_b: " << dict->elem_b (i.key ()) << ", key " << i.key () << " val " << dict->elem (i.key ()) <<endl;
+ }
+}